add mp3 and ogg torrent url info to JamendoAlbum
[amarok.git] / src / refreshimages.cpp
blob77b7044a7a0ffc2e742d156ea90bfc70af736a95
1 // (c) 2005 Ian Monroe <ian@monroe.nu>
2 // See COPYING file for licensing information.
4 #define DEBUG_PREFIX "RefreshImages"
6 #include "refreshimages.h"
8 #include "amarok.h"
9 #include "collectiondb.h"
10 #include "debug.h"
11 #include "statusbar.h"
13 #include <KIO/Job>
14 #include <kio/jobclasses.h>
15 #include <KIO/Scheduler>
16 #include <KLocale>
18 #include <q3valuelist.h>
19 #include <QDomDocument>
20 #include <QDomNode>
21 #include <QImage>
22 #include <QMap>
23 #include <QObject>
24 #include <QStringList>
25 #include <QVariant>
29 RefreshImages::RefreshImages()
31 //"SELECT asin, locale, filename FROM amazon WHERE refetchdate > %1 ;"
32 const QStringList staleImages = CollectionDB::instance()->staleImages();
33 QStringList::ConstIterator it = staleImages.begin();
34 QStringList::ConstIterator end = staleImages.end();
36 while( it != end )
38 QString asin=*it;
39 it++;
40 QString locale = *it;
41 it++;
42 QString md5sum = *it;
43 if ( asin.isEmpty() || locale.isEmpty() || md5sum.isEmpty() )
45 //somehow we have entries without ASIN
46 if ( !md5sum.isEmpty() ) //I've never seen this, just to be sure
47 CollectionDB::instance()->removeInvalidAmazonInfo(md5sum);
48 it++;
49 if ( it==end )
50 deleteLater();
52 continue;
55 QString url =
56 QString("http://webservices.amazon.%1/onca/xml?Service=AWSECommerceService&SubscriptionId=%2&Operation=ItemLookup&ItemId=%3&ResponseGroup=Small,Images")
57 .arg(localeToTLD(locale))
58 .arg("0RQSQ0B8CRY7VX2VF3G2") //Ian Monroe
59 .arg(asin);
61 debug() << url;
63 KIO::TransferJob* job = KIO::storedGet( url, KIO::NoReload, KIO::HideProgressInfo );
64 KIO::Scheduler::scheduleJob( job );
66 //Amarok::StatusBar::instance()->newProgressOperation( job );
67 job->setObjectName( md5sum );
68 it++; //iterate to the next set
70 m_jobInfo[md5sum] = JobInfo( asin, locale, it == end );
71 connect( job, SIGNAL( result( KIO::Job* ) ), SLOT( finishedXmlFetch( KIO::Job* ) ) );
75 void
76 RefreshImages::finishedXmlFetch( KIO::Job* xmlJob ) //SLOT
78 if ( xmlJob->error() )
80 Amarok::StatusBar::instance()->shortMessage( i18n( "There was an error communicating with Amazon." ) );
81 if ( m_jobInfo[ xmlJob->objectName() ].m_last )
82 deleteLater();
84 return;
87 KIO::StoredTransferJob* const storedJob = static_cast<KIO::StoredTransferJob*>( xmlJob );
88 const QString xml = QString::fromUtf8( storedJob->data().data(), storedJob->data().size() );
90 QDomDocument doc;
91 if ( !doc.setContent( xml ) )
92 return;
94 QStringList imageSizes;
95 imageSizes << "LargeImage" << "MediumImage" << "SmallImage";
96 QString imageUrl;
97 oldForeach( imageSizes )
99 QDomNode imageNode = doc.documentElement()
100 .namedItem( "Items" )
101 .namedItem( "Item" )
102 .namedItem( *it );
103 if ( !imageNode.isNull() )
105 imageUrl = imageNode.namedItem( "URL" ).firstChild().toText().data();
106 if( !imageUrl.isEmpty() )
107 break;
110 debug() << imageUrl;
111 KUrl testUrl( imageUrl );
112 if( !testUrl.isValid() ) //KIO crashs on empty strings!!!
114 //Amazon sometimes takes down covers
115 CollectionDB::instance()->removeInvalidAmazonInfo(xmlJob->objectName());
116 return;
119 KIO::TransferJob* imageJob = KIO::storedGet( imageUrl, KIO::NoReload, KIO::HideProgressInfo );
120 KIO::Scheduler::scheduleJob(imageJob);
121 //Amarok::StatusBar::instance()->newProgressOperation( imageJob );
122 imageJob->setObjectName(xmlJob->objectName());
123 //get the URL of the detail page
124 m_jobInfo[xmlJob->objectName()].m_detailUrl = doc.documentElement()
125 .namedItem( "Items" )
126 .namedItem( "Item" )
127 .namedItem( "DetailPageURL" ).firstChild().toText().data();
128 connect( imageJob, SIGNAL( result(KIO::Job*) ), SLOT( finishedImageFetch(KIO::Job*) ) );
131 void RefreshImages::finishedImageFetch(KIO::Job* imageJob)
133 if( imageJob->error() ) {
134 Amarok::StatusBar::instance()->shortMessage(i18n("There was an error communicating with Amazon."));
135 if(m_jobInfo[imageJob->objectName()].m_last)
136 deleteLater();
138 return;
140 QImage img;
141 img.loadFromData(static_cast<KIO::StoredTransferJob*>(imageJob)->data());
142 img.setText( "amazon-url", 0, m_jobInfo[imageJob->objectName()].m_detailUrl);
143 img.save( Amarok::saveLocation("albumcovers/large/") + imageJob->objectName(), "PNG");
145 CollectionDB::instance()->newAmazonReloadDate( m_jobInfo[imageJob->objectName()].m_asin
146 , m_jobInfo[imageJob->objectName()].m_locale
147 , imageJob->objectName());
149 if(m_jobInfo[imageJob->objectName()].m_last)
150 deleteLater();
153 QString RefreshImages::localeToTLD(const QString& locale)
155 if(locale=="us")
156 return "com";
157 else if(locale=="jp")
158 return "co.jp";
159 else if(locale=="uk")
160 return "co.uk";
161 else
162 return locale;
165 #include "refreshimages.moc"