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"