File indexing completed on 2024-05-19 04:50:23

0001 /****************************************************************************************
0002  * Copyright (c) 2007,2008 Casey Link <unnamedrambler@gmail.com>                        *
0003  *                                                                                      *
0004  * This program is free software; you can redistribute it and/or modify it under        *
0005  * the terms of the GNU General Public License as published by the Free Software        *
0006  * Foundation; either version 2 of the License, or (at your option) any later           *
0007  * version.                                                                             *
0008  *                                                                                      *
0009  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0010  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0011  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0012  *                                                                                      *
0013  * You should have received a copy of the GNU General Public License along with         *
0014  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0015  ****************************************************************************************/
0016 
0017 #include "Mp3tunesWorkers.h"
0018 
0019 #include "core/logger/Logger.h"
0020 #include "core/support/Components.h"
0021 #include "core/support/Debug.h"
0022 #include "Mp3tunesMeta.h"
0023 
0024 #include <KLocalizedString>
0025 #include <QStringList>
0026 
0027 Mp3tunesLoginWorker::Mp3tunesLoginWorker( Mp3tunesLocker* locker,
0028                                           const QString & username,
0029                                           const QString & password )
0030     : QObject()
0031     , ThreadWeaver::Job()
0032     , m_locker( locker )
0033     , m_sessionId()
0034     , m_username( username )
0035     , m_password( password )
0036 {
0037     connect( this, &Mp3tunesLoginWorker::done, this, &Mp3tunesLoginWorker::completeJob );
0038 }
0039 
0040 Mp3tunesLoginWorker::~Mp3tunesLoginWorker()
0041 {
0042 }
0043 
0044 void Mp3tunesLoginWorker::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0045 {
0046     Q_UNUSED(self);
0047     Q_UNUSED(thread);
0048     DEBUG_BLOCK
0049     if(m_locker != 0) {
0050         debug() << "Calling Locker login..";
0051         m_sessionId = m_locker->login(m_username, m_password);
0052         debug() << "Login Complete. SessionId = " << m_sessionId;
0053     } else {
0054         debug() << "Locker is NULL";
0055     }
0056 }
0057 void Mp3tunesLoginWorker::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0058 {
0059     Q_EMIT started(self);
0060     ThreadWeaver::Job::defaultBegin(self, thread);
0061 }
0062 
0063 void Mp3tunesLoginWorker::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0064 {
0065     ThreadWeaver::Job::defaultEnd(self, thread);
0066     if (!self->success()) {
0067         Q_EMIT failed(self);
0068     }
0069     Q_EMIT done(self);
0070 }
0071 
0072 void Mp3tunesLoginWorker::completeJob()
0073 {
0074     DEBUG_BLOCK
0075     debug() << "Login Job complete";
0076     emit( finishedLogin( m_sessionId ) );
0077     deleteLater();
0078 }
0079 /* ARTIST FETCHER */
0080 Mp3tunesArtistFetcher::Mp3tunesArtistFetcher( Mp3tunesLocker * locker )
0081 {
0082     connect( this, &Mp3tunesArtistFetcher::done, this, &Mp3tunesArtistFetcher::completeJob );
0083     m_locker = locker;
0084 }
0085 
0086 Mp3tunesArtistFetcher::~Mp3tunesArtistFetcher()
0087 {
0088 }
0089 
0090 void Mp3tunesArtistFetcher::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0091 {
0092     Q_UNUSED(self);
0093     Q_UNUSED(thread);
0094     DEBUG_BLOCK
0095     if(m_locker != 0) {
0096         debug() << "Artist Fetch Start";
0097         QList<Mp3tunesLockerArtist> list = m_locker->artists();
0098         debug() << "Artist Fetch End. Total artists: " << list.count();
0099         m_artists = list;
0100     } else {
0101         debug() << "Locker is NULL";
0102     }
0103 }
0104 
0105 void Mp3tunesArtistFetcher::completeJob()
0106 {
0107     emit( artistsFetched( m_artists ) );
0108     deleteLater();
0109 }
0110 
0111 void Mp3tunesArtistFetcher::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0112 {
0113     Q_EMIT started(self);
0114     ThreadWeaver::Job::defaultBegin(self, thread);
0115 }
0116 
0117 void Mp3tunesArtistFetcher::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0118 {
0119     ThreadWeaver::Job::defaultEnd(self, thread);
0120     if (!self->success()) {
0121         Q_EMIT failed(self);
0122     }
0123     Q_EMIT done(self);
0124 }
0125 
0126 /*  ALBUM w/ Artist Id FETCHER */
0127 Mp3tunesAlbumWithArtistIdFetcher::Mp3tunesAlbumWithArtistIdFetcher( Mp3tunesLocker * locker, int artistId )
0128 {
0129     connect( this, &Mp3tunesAlbumWithArtistIdFetcher::done, this, &Mp3tunesAlbumWithArtistIdFetcher::completeJob );
0130     m_locker = locker;
0131     m_artistId = artistId;
0132 }
0133 
0134 Mp3tunesAlbumWithArtistIdFetcher::~Mp3tunesAlbumWithArtistIdFetcher()
0135 {
0136 }
0137 
0138 void Mp3tunesAlbumWithArtistIdFetcher::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0139 {
0140     Q_UNUSED(self);
0141     Q_UNUSED(thread);
0142 
0143     DEBUG_BLOCK
0144     if(m_locker != 0) {
0145         debug() << "Album Fetch Start";
0146         QList<Mp3tunesLockerAlbum> list = m_locker->albumsWithArtistId( m_artistId );
0147         debug() << "Album Fetch End. Total albums: " << list.count();
0148         m_albums = list;
0149     } else {
0150                 debug() << "Locker is NULL";
0151     }
0152 }
0153 
0154 void Mp3tunesAlbumWithArtistIdFetcher::completeJob()
0155 {
0156     emit( albumsFetched( m_albums ) );
0157     deleteLater();
0158 }
0159 
0160 void Mp3tunesAlbumWithArtistIdFetcher::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0161 {
0162     Q_EMIT started(self);
0163     ThreadWeaver::Job::defaultBegin(self, thread);
0164 }
0165 
0166 void Mp3tunesAlbumWithArtistIdFetcher::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0167 {
0168     ThreadWeaver::Job::defaultEnd(self, thread);
0169     if (!self->success()) {
0170         Q_EMIT failed(self);
0171     }
0172     Q_EMIT done(self);
0173 }
0174 
0175 /*  TRACK w/ albumId FETCHER */
0176 Mp3tunesTrackWithAlbumIdFetcher::Mp3tunesTrackWithAlbumIdFetcher( Mp3tunesLocker * locker, int albumId )
0177 {
0178     DEBUG_BLOCK
0179     connect( this, &Mp3tunesTrackWithAlbumIdFetcher::done, this, &Mp3tunesTrackWithAlbumIdFetcher::completeJob );
0180     m_locker = locker;
0181     debug() << "Constructor albumId: " << albumId;
0182     m_albumId = albumId;
0183 }
0184 
0185 Mp3tunesTrackWithAlbumIdFetcher::~Mp3tunesTrackWithAlbumIdFetcher()
0186 {
0187 }
0188 
0189 void Mp3tunesTrackWithAlbumIdFetcher::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0190 {
0191     Q_UNUSED(self);
0192     Q_UNUSED(thread);
0193 
0194     DEBUG_BLOCK
0195     if(m_locker != 0) {
0196         debug() << "Track Fetch Start for album " << m_albumId;
0197         QList<Mp3tunesLockerTrack> list = m_locker->tracksWithAlbumId( m_albumId );
0198         debug() << "Track Fetch End. Total tracks: " << list.count();
0199         m_tracks = list;
0200     } else {
0201             debug() << "Locker is NULL";
0202     }
0203 }
0204 
0205 void Mp3tunesTrackWithAlbumIdFetcher::completeJob()
0206 {
0207     DEBUG_BLOCK
0208     emit( tracksFetched( m_tracks ) );
0209     deleteLater();
0210 }
0211 
0212 void Mp3tunesTrackWithAlbumIdFetcher::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0213 {
0214     Q_EMIT started(self);
0215     ThreadWeaver::Job::defaultBegin(self, thread);
0216 }
0217 
0218 void Mp3tunesTrackWithAlbumIdFetcher::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0219 {
0220     ThreadWeaver::Job::defaultEnd(self, thread);
0221     if (!self->success()) {
0222         Q_EMIT failed(self);
0223     }
0224     Q_EMIT done(self);
0225 }
0226 
0227 /*  TRACK w/ artistId FETCHER */
0228 Mp3tunesTrackWithArtistIdFetcher::Mp3tunesTrackWithArtistIdFetcher( Mp3tunesLocker * locker, int artistId )
0229 {
0230     DEBUG_BLOCK
0231     connect( this, &Mp3tunesTrackWithArtistIdFetcher::done, this, &Mp3tunesTrackWithArtistIdFetcher::completeJob );
0232     m_locker = locker;
0233     debug() << "Constructor artistId: " << artistId;
0234     m_artistId = artistId;
0235 }
0236 
0237 Mp3tunesTrackWithArtistIdFetcher::~Mp3tunesTrackWithArtistIdFetcher()
0238 {
0239 }
0240 
0241 void Mp3tunesTrackWithArtistIdFetcher::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0242 {
0243     Q_UNUSED(self);
0244     Q_UNUSED(thread);
0245     DEBUG_BLOCK
0246     if(m_locker != 0) {
0247         debug() << "Track Fetch Start for artist " << m_artistId;
0248         QList<Mp3tunesLockerTrack> list = m_locker->tracksWithArtistId( m_artistId );
0249         debug() << "Track Fetch End. Total tracks: " << list.count();
0250         m_tracks = list;
0251     } else {
0252         debug() << "Locker is NULL";
0253     }
0254 }
0255 
0256 void Mp3tunesTrackWithArtistIdFetcher::completeJob()
0257 {
0258     DEBUG_BLOCK
0259     emit( tracksFetched( m_tracks ) );
0260     deleteLater();
0261 }
0262 
0263 void Mp3tunesTrackWithArtistIdFetcher::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0264 {
0265     Q_EMIT started(self);
0266     ThreadWeaver::Job::defaultBegin(self, thread);
0267 }
0268 
0269 void Mp3tunesTrackWithArtistIdFetcher::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0270 {
0271     ThreadWeaver::Job::defaultEnd(self, thread);
0272     if (!self->success()) {
0273         Q_EMIT failed(self);
0274     }
0275     Q_EMIT done(self);
0276 }
0277 
0278 /*  SEARCH MONKEY */
0279 Mp3tunesSearchMonkey::Mp3tunesSearchMonkey( Mp3tunesLocker * locker, QString query, int searchFor )
0280 {
0281     DEBUG_BLOCK
0282     connect( this, &Mp3tunesSearchMonkey::done, this, &Mp3tunesSearchMonkey::completeJob );
0283     m_locker = locker;
0284     m_searchFor = searchFor;
0285     m_query = query;
0286 }
0287 
0288 Mp3tunesSearchMonkey::~Mp3tunesSearchMonkey()
0289 {}
0290 
0291 void Mp3tunesSearchMonkey::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0292 {
0293     Q_UNUSED(self);
0294     Q_UNUSED(thread);
0295     DEBUG_BLOCK
0296     if(m_locker != 0) {
0297         Mp3tunesSearchResult container;
0298         debug() << "Searching query: " << m_query << "    bitmask: " << m_searchFor;
0299         container.searchFor = (Mp3tunesSearchResult::SearchType) m_searchFor;
0300         if( !m_locker->search(container, m_query) )
0301         {
0302             //TODO proper error handling
0303             debug() << "!!!Search Failed query: " << m_query << "    bitmask: " << m_searchFor;
0304         }
0305         m_result = container;
0306     } else {
0307         debug() << "Locker is NULL";
0308     }
0309 }
0310 
0311 void Mp3tunesSearchMonkey::completeJob()
0312 {
0313     DEBUG_BLOCK
0314     emit( searchArtistComplete( m_result.artistList ) );
0315     emit( searchAlbumComplete( m_result.albumList ) );
0316     emit( searchTrackComplete( m_result.trackList ) );
0317     deleteLater();
0318 }
0319 void Mp3tunesSearchMonkey::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0320 
0321 {
0322     Q_EMIT started(self);
0323     ThreadWeaver::Job::defaultBegin(self, thread);
0324 }
0325 
0326 void Mp3tunesSearchMonkey::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0327 {
0328     ThreadWeaver::Job::defaultEnd(self, thread);
0329     if (!self->success()) {
0330         Q_EMIT failed(self);
0331     }
0332     Q_EMIT done(self);
0333 }
0334 
0335 /*  SIMPLE UPLOADER */
0336 Mp3tunesSimpleUploader:: Mp3tunesSimpleUploader( Mp3tunesLocker * locker, const QStringList &tracklist )
0337 {
0338     DEBUG_BLOCK
0339     connect( this, &Mp3tunesSimpleUploader::done, this, &Mp3tunesSimpleUploader::completeJob );
0340 
0341     m_locker = locker;
0342     m_tracklist = tracklist;
0343 
0344     Amarok::Logger::newProgressOperation( this, i18n( "Upload to MP3tunes Initiated" ), m_tracklist.count() );
0345     //TODO: port to Amarok::Logger signals
0346 //    connect( this, SIGNAL(incrementProgress()), The::statusBar(), SLOT(incrementProgress()), Qt::QueuedConnection );
0347 }
0348 
0349 Mp3tunesSimpleUploader::~Mp3tunesSimpleUploader()
0350 {
0351     Q_EMIT endProgressOperation( this );
0352 }
0353 
0354 void Mp3tunesSimpleUploader::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0355 {
0356     Q_UNUSED(self);
0357     Q_UNUSED(thread);
0358     DEBUG_BLOCK
0359     if(m_locker == 0)
0360         return;
0361     if(m_tracklist.count() == 0)
0362     {
0363         debug() << "Track list was empty.";
0364         return;
0365     }
0366 
0367     debug() << "Starting upload of " << m_tracklist.count() << " tracks.";
0368     int progress = 1;
0369     foreach(const QString &track, m_tracklist) {
0370         QString msg = i18n( "Uploading Track %1/%2", progress, m_tracklist.count() );
0371         debug() << msg;
0372         //TODO: port to Amarok::Logger signals
0373 //        Amarok::Components::logger()->setProgressStatus( this, msg );
0374         emit ( incrementProgress() );
0375         debug() << "Uploading: " << track;
0376 
0377         bool result = false;
0378         if( track.startsWith( "http" ) )
0379         {
0380             debug() << "Remote file.";
0381             result = m_locker->lockerLoad( track );
0382         } else {
0383             debug() << "Local file.";
0384             result = m_locker->uploadTrack( track );
0385         }
0386 
0387         if(result) {
0388             debug() << "Uploaded Succeeded.";
0389         } else {
0390             debug() << "Uploaded Failed.";
0391             debug() << "Error msg: " << m_locker->errorMessage();
0392         }
0393         progress++;
0394     }
0395     debug() << "Upload loop complete";
0396 }
0397 
0398 void Mp3tunesSimpleUploader::completeJob()
0399 {
0400     DEBUG_BLOCK
0401     emit( uploadComplete() );
0402     deleteLater();
0403 }
0404 
0405 void Mp3tunesSimpleUploader::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0406 {
0407     Q_EMIT started(self);
0408     ThreadWeaver::Job::defaultBegin(self, thread);
0409 }
0410 
0411 void Mp3tunesSimpleUploader::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0412 {
0413     ThreadWeaver::Job::defaultEnd(self, thread);
0414     if (!self->success()) {
0415         Q_EMIT failed(self);
0416     }
0417     Q_EMIT done(self);
0418 }
0419 
0420 /*  TRACK from filekey FETCHER */
0421 Mp3tunesTrackFromFileKeyFetcher::Mp3tunesTrackFromFileKeyFetcher( Mp3tunesLocker * locker, QString filekey )
0422 {
0423     DEBUG_BLOCK
0424     connect( this, &Mp3tunesTrackFromFileKeyFetcher::done, this, &Mp3tunesTrackFromFileKeyFetcher::completeJob );
0425     m_locker = locker;
0426     debug() << "Constructor filekey: " << filekey;
0427     m_filekey = filekey;
0428 }
0429 
0430 Mp3tunesTrackFromFileKeyFetcher::~Mp3tunesTrackFromFileKeyFetcher()
0431 {
0432 }
0433 
0434 void Mp3tunesTrackFromFileKeyFetcher::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread)
0435 {
0436     Q_UNUSED(self);
0437     Q_UNUSED(thread);
0438     DEBUG_BLOCK
0439     if(m_locker != 0) {
0440         debug() << "Track Fetch from filekey " << m_filekey;
0441         Mp3tunesLockerTrack track =  m_locker->trackWithFileKey( m_filekey );
0442         debug() << "Track Fetch from filekey End.";
0443         m_track = track;
0444     } else {
0445         debug() << "Locker is NULL";
0446     }
0447 }
0448 
0449 void Mp3tunesTrackFromFileKeyFetcher::completeJob()
0450 {
0451     DEBUG_BLOCK
0452     emit( trackFetched( m_track ) );
0453     deleteLater();
0454 }
0455 
0456 void Mp3tunesTrackFromFileKeyFetcher::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0457 {
0458     Q_EMIT started(self);
0459     ThreadWeaver::Job::defaultBegin(self, thread);
0460 }
0461 
0462 void Mp3tunesTrackFromFileKeyFetcher::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread)
0463 {
0464     ThreadWeaver::Job::defaultEnd(self, thread);
0465     if (!self->success()) {
0466         Q_EMIT failed(self);
0467     }
0468     Q_EMIT done(self);
0469 }