1 // (c) 2005 Ian Monroe <ian@monroe.nu>
2 // See COPYING file for licensing information.
4 #define DEBUG_PREFIX "RefreshImages"
6 #include "refreshimages.h"
9 #include "collectiondb.h"
11 #include "statusbar.h"
14 #include <kio/jobclasses.h>
15 #include <KIO/Scheduler>
18 #include <q3valuelist.h>
19 #include <QDomDocument>
24 #include <QStringList>
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();
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
);
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
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
* ) ) );
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
)
87 KIO::StoredTransferJob
* const storedJob
= static_cast<KIO::StoredTransferJob
*>( xmlJob
);
88 const QString xml
= QString::fromUtf8( storedJob
->data().data(), storedJob
->data().size() );
91 if ( !doc
.setContent( xml
) )
94 QStringList imageSizes
;
95 imageSizes
<< "LargeImage" << "MediumImage" << "SmallImage";
97 oldForeach( imageSizes
)
99 QDomNode imageNode
= doc
.documentElement()
100 .namedItem( "Items" )
103 if ( !imageNode
.isNull() )
105 imageUrl
= imageNode
.namedItem( "URL" ).firstChild().toText().data();
106 if( !imageUrl
.isEmpty() )
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());
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" )
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
)
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
)
153 QString
RefreshImages::localeToTLD(const QString
& locale
)
157 else if(locale
=="jp")
159 else if(locale
=="uk")
165 #include "refreshimages.moc"