// (c) 2005 Ian Monroe // See COPYING file for licensing information. #define DEBUG_PREFIX "RefreshImages" #include "amarok.h" #include "collectiondb.h" #include "debug.h" #include "refreshimages.h" #include "statusbar.h" #include #include #include #include #include #include #include #include #include #include #include RefreshImages::RefreshImages() { //"SELECT asin, locale, filename FROM amazon WHERE refetchdate > %1 ;" const TQStringList staleImages = CollectionDB::instance()->staleImages(); TQStringList::ConstIterator it = staleImages.begin(); TQStringList::ConstIterator end = staleImages.end(); while( it != end ) { TQString asin=*it; it++; TQString locale = *it; it++; TQString md5sum = *it; if ( asin.isEmpty() || locale.isEmpty() || md5sum.isEmpty() ) { //somehow we have entries without ASIN if ( !md5sum.isEmpty() ) //I've never seen this, just to be sure CollectionDB::instance()->removeInvalidAmazonInfo(md5sum); it++; if ( it==end ) deleteLater(); continue; } TQString url = TQString("http://webservices.amazon.%1/onca/xml?Service=AWSECommerceService&SubscriptionId=%2&Operation=ItemLookup&ItemId=%3&ResponseGroup=Small,Images") .arg(localeToTLD(locale)) .arg("0RTQSQ0B8CRY7VX2VF3G2") //Ian Monroe .arg(asin); debug() << url << endl; TDEIO::TransferJob* job = TDEIO::storedGet( url, false, false ); TDEIO::Scheduler::scheduleJob( job ); //Amarok::StatusBar::instance()->newProgressOperation( job ); job->setName( md5sum.ascii() ); it++; //iterate to the next set m_jobInfo[md5sum] = JobInfo( asin, locale, it == end ); connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ), TQT_SLOT( finishedXmlFetch( TDEIO::Job* ) ) ); } } void RefreshImages::finishedXmlFetch( TDEIO::Job* xmlJob ) //SLOT { if ( xmlJob->error() ) { Amarok::StatusBar::instance()->shortMessage( i18n( "There was an error communicating with Amazon." ) ); if ( m_jobInfo[ xmlJob->name() ].m_last ) deleteLater(); return; } TDEIO::StoredTransferJob* const storedJob = static_cast( xmlJob ); const TQString xml = TQString::fromUtf8( storedJob->data().data(), storedJob->data().size() ); TQDomDocument doc; if ( !doc.setContent( xml ) ) return; TQStringList imageSizes; imageSizes << "LargeImage" << "MediumImage" << "SmallImage"; TQString imageUrl; foreach( imageSizes ) { TQDomNode imageNode = doc.documentElement() .namedItem( "Items" ) .namedItem( "Item" ) .namedItem( *it ); if ( !imageNode.isNull() ) { imageUrl = imageNode.namedItem( "URL" ).firstChild().toText().data(); if( !imageUrl.isEmpty() ) break; } } debug() << imageUrl << endl; KURL testUrl( imageUrl ); if( !testUrl.isValid() ) //TDEIO crashs on empty strings!!! { //Amazon sometimes takes down covers CollectionDB::instance()->removeInvalidAmazonInfo(xmlJob->name()); return; } TDEIO::TransferJob* imageJob = TDEIO::storedGet( imageUrl, false, false ); TDEIO::Scheduler::scheduleJob(imageJob); //Amarok::StatusBar::instance()->newProgressOperation( imageJob ); imageJob->setName(xmlJob->name()); //get the URL of the detail page m_jobInfo[xmlJob->name()].m_detailUrl = doc.documentElement() .namedItem( "Items" ) .namedItem( "Item" ) .namedItem( "DetailPageURL" ).firstChild().toText().data(); connect( imageJob, TQT_SIGNAL( result(TDEIO::Job*) ), TQT_SLOT( finishedImageFetch(TDEIO::Job*) ) ); } void RefreshImages::finishedImageFetch(TDEIO::Job* imageJob) { if( imageJob->error() ) { Amarok::StatusBar::instance()->shortMessage(i18n("There was an error communicating with Amazon.")); if(m_jobInfo[imageJob->name()].m_last) deleteLater(); return; } TQImage img; img.loadFromData(static_cast(imageJob)->data()); img.setText( "amazon-url", 0, m_jobInfo[imageJob->name()].m_detailUrl); img.save( Amarok::saveLocation("albumcovers/large/") + imageJob->name(), "PNG"); CollectionDB::instance()->newAmazonReloadDate( m_jobInfo[imageJob->name()].m_asin , m_jobInfo[imageJob->name()].m_locale , imageJob->name()); if(m_jobInfo[imageJob->name()].m_last) deleteLater(); } TQString RefreshImages::localeToTLD(const TQString& locale) { if(locale=="us") return "com"; else if(locale=="jp") return "co.jp"; else if(locale=="uk") return "co.uk"; else return locale; } #include "refreshimages.moc"