File indexing completed on 2024-05-05 03:50:49
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de> 0004 // SPDX-FileCopyrightText: 2012 Mohammed Nafees <nafees.technocool@gmail.com> 0005 // 0006 0007 // Self 0008 #include "PhotoPluginModel.h" 0009 0010 // Photo Plugin 0011 #include "FlickrParser.h" 0012 #include "PhotoPluginItem.h" 0013 #include "PhotoPlugin.h" 0014 0015 // Marble 0016 #include "AbstractDataPluginItem.h" 0017 #include "GeoDataLatLonAltBox.h" 0018 #include "MarbleModel.h" 0019 #include "MarbleDebug.h" 0020 #include "MarbleWidget.h" 0021 0022 // Qt 0023 #include <QHash> 0024 #include <QString> 0025 #include <QUrl> 0026 0027 using namespace Marble; 0028 0029 const QString flickrApiKey( "620131a1b82b000c9582b94effcdc636" ); 0030 0031 PhotoPluginModel::PhotoPluginModel( const MarbleModel *marbleModel, QObject *parent ) 0032 : AbstractDataPluginModel( "photo", marbleModel, parent ), 0033 m_marbleWidget( nullptr ) 0034 { 0035 } 0036 0037 QUrl PhotoPluginModel::generateUrl( const QString& service, 0038 const QString& method, 0039 const QHash<QString,QString>& options ) 0040 { 0041 QString url; 0042 0043 if (service == QLatin1String("flickr")) 0044 url += QLatin1String("https://www.flickr.com/services/rest/"); 0045 else 0046 return QUrl(); 0047 0048 url += QLatin1String("?method=") + method + 0049 QLatin1String("&format=rest") + 0050 QLatin1String("&api_key=") + flickrApiKey; 0051 0052 QHash<QString,QString>::const_iterator it = options.constBegin(); 0053 QHash<QString,QString>::const_iterator const end = options.constEnd(); 0054 for (; it != end; ++it ) { 0055 url += QLatin1Char('&') + it.key() + QLatin1Char('=') + it.value(); 0056 } 0057 0058 return QUrl( url ); 0059 } 0060 0061 void PhotoPluginModel::getAdditionalItems( const GeoDataLatLonAltBox& box, 0062 qint32 number ) 0063 { 0064 // Flickr only supports images for earth 0065 if (marbleModel()->planetId() != QLatin1String("earth")) { 0066 return; 0067 } 0068 0069 if( box.west() <= box.east() ) { 0070 const QString bbox = 0071 QString::number(box.west() * RAD2DEG) + QLatin1Char(',') + 0072 QString::number(box.south() * RAD2DEG) + QLatin1Char(',') + 0073 QString::number(box.east() * RAD2DEG) + QLatin1Char(',') + 0074 QString::number(box.north() * RAD2DEG); 0075 0076 QHash<QString,QString> options; 0077 options.insert( "per_page", QString::number( number ) ); 0078 options.insert( "bbox", bbox ); 0079 options.insert( "sort", "interestingness-desc" ); 0080 options.insert( "license", m_licenses ); 0081 0082 downloadDescriptionFile( generateUrl( "flickr", "flickr.photos.search", options ) ); 0083 } 0084 else { 0085 // Flickr api doesn't support bboxes with west > east so we have to split in two boxes 0086 const QString bboxWest = 0087 QString::number(box.west() * RAD2DEG) + QLatin1Char(',') + 0088 QString::number(box.south() * RAD2DEG) + QLatin1Char(',') + 0089 QString::number(180 ) + QLatin1Char(',') + 0090 QString::number(box.north() * RAD2DEG); 0091 0092 QHash<QString,QString> optionsWest; 0093 optionsWest.insert( "per_page", QString::number( number/2 ) ); 0094 optionsWest.insert( "bbox", bboxWest ); 0095 optionsWest.insert( "sort", "interestingness-desc" ); 0096 optionsWest.insert( "license", m_licenses ); 0097 0098 downloadDescriptionFile( generateUrl( "flickr", "flickr.photos.search", optionsWest ) ); 0099 0100 0101 const QString bboxEast = 0102 QString::number(-180) +QLatin1Char( ',') + 0103 QString::number(box.south() * RAD2DEG) + QLatin1Char(',') + 0104 QString::number(box.east() * RAD2DEG) + QLatin1Char(',') + 0105 QString::number(box.north() * RAD2DEG); 0106 0107 QHash<QString,QString> optionsEast; 0108 optionsEast.insert( "per_page", QString::number( number/2 ) ); 0109 optionsEast.insert( "bbox", bboxEast ); 0110 optionsEast.insert( "sort", "interestingness-desc" ); 0111 optionsEast.insert( "license", m_licenses ); 0112 0113 downloadDescriptionFile( generateUrl( "flickr", "flickr.photos.search", optionsEast ) ); 0114 } 0115 } 0116 0117 void PhotoPluginModel::parseFile( const QByteArray& file ) 0118 { 0119 QList<PhotoPluginItem*> list; 0120 FlickrParser parser( m_marbleWidget, &list, this ); 0121 0122 parser.read( file ); 0123 0124 QList<PhotoPluginItem*>::iterator it; 0125 QList<AbstractDataPluginItem*> items; 0126 0127 for( it = list.begin(); it != list.end(); ++it ) { 0128 if( itemExists( (*it)->id() ) ) { 0129 delete (*it); 0130 continue; 0131 } 0132 0133 downloadItem( (*it)->photoUrl(), "thumbnail", (*it) ); 0134 downloadItem( (*it)->infoUrl(), "info", (*it) ); 0135 items << *it; 0136 } 0137 addItemsToList( items ); 0138 } 0139 0140 void PhotoPluginModel::setMarbleWidget( MarbleWidget *widget ) 0141 { 0142 m_marbleWidget = widget; 0143 } 0144 0145 void PhotoPluginModel::setLicenseValues( const QString &licenses ) 0146 { 0147 m_licenses = licenses; 0148 } 0149 0150 #include "moc_PhotoPluginModel.cpp"