diff --git a/src/libtomahawk/Album.cpp b/src/libtomahawk/Album.cpp index c182efb18..d5a6d5fae 100644 --- a/src/libtomahawk/Album.cpp +++ b/src/libtomahawk/Album.cpp @@ -37,6 +37,7 @@ using namespace Tomahawk; QHash< QString, album_wptr > Album::s_albumsByName = QHash< QString, album_wptr >(); QHash< unsigned int, album_wptr > Album::s_albumsById = QHash< unsigned int, album_wptr >(); +QHash< QString, album_ptr > Album::s_albumsByCoverId = QHash< QString, album_ptr >(); static QMutex s_nameCacheMutex; static QReadWriteLock s_idMutex; @@ -79,6 +80,7 @@ Album::get( const Tomahawk::artist_ptr& artist, const QString& name, bool autoCr album->setWeakRef( album.toWeakRef() ); album->loadId( autoCreate ); s_albumsByName.insert( key, album ); + s_albumsByCoverId.insert( album->coverId(), album ); return album; } @@ -110,6 +112,7 @@ Album::get( unsigned int id, const QString& name, const Tomahawk::artist_ptr& ar album_ptr a = album_ptr( new Album( id, name, artist ), &Album::deleteLater ); a->setWeakRef( a.toWeakRef() ); s_albumsByName.insert( key, a ); + s_albumsByCoverId.insert( a->coverId(), a ); if ( id > 0 ) { @@ -122,6 +125,18 @@ Album::get( unsigned int id, const QString& name, const Tomahawk::artist_ptr& ar } +album_ptr +Album::getByCoverId( const QString& uuid ) +{ + QMutexLocker lock( &s_nameCacheMutex ); + + if ( s_albumsByCoverId.contains( uuid ) ) + return s_albumsByCoverId.value( uuid ); + + return album_ptr(); +} + + Album::Album( unsigned int id, const QString& name, const Tomahawk::artist_ptr& artist ) : QObject() , m_waitingForId( false ) @@ -327,6 +342,10 @@ Album::infoSystemInfo( const Tomahawk::InfoSystem::InfoRequestData& requestData, m_coverBuffer = ba; } + s_albumsByCoverId.remove( coverId() ); + m_coverId = uuid(); + s_albumsByCoverId.insert( m_coverId, m_ownRef.toStrongRef() ); + m_coverLoaded = true; emit coverChanged(); } @@ -383,3 +402,13 @@ Album::infoid() const return m_uuid; } + + +QString +Album::coverId() const +{ + if ( m_coverId.isEmpty() ) + m_coverId = uuid(); + + return m_coverId; +} diff --git a/src/libtomahawk/Album.h b/src/libtomahawk/Album.h index a137f6b9f..dd164259d 100644 --- a/src/libtomahawk/Album.h +++ b/src/libtomahawk/Album.h @@ -45,12 +45,14 @@ Q_OBJECT public: static album_ptr get( const Tomahawk::artist_ptr& artist, const QString& name, bool autoCreate = false ); static album_ptr get( unsigned int id, const QString& name, const Tomahawk::artist_ptr& artist ); + static album_ptr getByCoverId( const QString& uuid ); Album( unsigned int id, const QString& name, const Tomahawk::artist_ptr& artist ); Album( const QString& name, const Tomahawk::artist_ptr& artist ); virtual ~Album(); unsigned int id() const; + QString coverId() const; QString name() const { return m_name; } QString sortname() const { return m_sortname; } @@ -98,6 +100,7 @@ private: mutable bool m_coverLoaded; mutable bool m_coverLoading; mutable QString m_uuid; + mutable QString m_coverId; mutable QByteArray m_coverBuffer; #ifndef ENABLE_HEADLESS @@ -110,6 +113,7 @@ private: static QHash< QString, album_wptr > s_albumsByName; static QHash< unsigned int, album_wptr > s_albumsById; + static QHash< QString, album_ptr > s_albumsByCoverId; friend class ::IdThreadWorker; }; diff --git a/src/libtomahawk/Artist.cpp b/src/libtomahawk/Artist.cpp index c2498ccf6..faf5622c8 100644 --- a/src/libtomahawk/Artist.cpp +++ b/src/libtomahawk/Artist.cpp @@ -39,6 +39,7 @@ using namespace Tomahawk; QHash< QString, artist_wptr > Artist::s_artistsByName = QHash< QString, artist_wptr >(); QHash< unsigned int, artist_wptr > Artist::s_artistsById = QHash< unsigned int, artist_wptr >(); +QHash< QString, artist_ptr > Artist::s_artistsByCoverId = QHash< QString, artist_ptr >(); static QMutex s_nameCacheMutex; static QReadWriteLock s_idMutex; @@ -77,6 +78,7 @@ Artist::get( const QString& name, bool autoCreate ) artist->setWeakRef( artist.toWeakRef() ); artist->loadId( autoCreate ); s_artistsByName.insert( key, artist ); + s_artistsByCoverId.insert( artist->coverId(), artist ); return artist; } @@ -110,6 +112,7 @@ Artist::get( unsigned int id, const QString& name ) artist_ptr a = artist_ptr( new Artist( id, name ), &Artist::deleteLater ); a->setWeakRef( a.toWeakRef() ); s_artistsByName.insert( key, a ); + s_artistsByCoverId.insert( a->coverId(), a ); if ( id > 0 ) { @@ -122,6 +125,18 @@ Artist::get( unsigned int id, const QString& name ) } +artist_ptr +Artist::getByCoverId( const QString& uuid ) +{ + QMutexLocker lock( &s_nameCacheMutex ); + + if ( s_artistsByCoverId.contains( uuid ) ) + return s_artistsByCoverId.value( uuid ); + + return artist_ptr(); +} + + Artist::Artist( unsigned int id, const QString& name ) : QObject() , m_waitingForFuture( false ) @@ -481,6 +496,10 @@ Artist::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVari m_coverBuffer = ba; } + s_artistsByCoverId.remove( coverId() ); + m_coverId = uuid(); + s_artistsByCoverId.insert( m_coverId, m_ownRef.toStrongRef() ); + m_coverLoaded = true; emit coverChanged(); } @@ -642,3 +661,13 @@ Artist::infoid() const return m_uuid; } + + +QString +Artist::coverId() const +{ + if ( m_coverId.isEmpty() ) + m_coverId = uuid(); + + return m_coverId; +} diff --git a/src/libtomahawk/Artist.h b/src/libtomahawk/Artist.h index c9bd14fb7..1336893d8 100644 --- a/src/libtomahawk/Artist.h +++ b/src/libtomahawk/Artist.h @@ -43,12 +43,14 @@ Q_OBJECT public: static artist_ptr get( const QString& name, bool autoCreate = false ); static artist_ptr get( unsigned int id, const QString& name ); + static artist_ptr getByCoverId( const QString& uuid ); Artist( unsigned int id, const QString& name ); explicit Artist( const QString& name ); virtual ~Artist(); unsigned int id() const; + QString coverId() const; QString name() const { return m_name; } QString sortname() const { return m_sortname; } @@ -117,6 +119,7 @@ private: bool m_biographyLoaded; mutable QString m_uuid; + mutable QString m_coverId; mutable int m_infoJobs; QList m_databaseAlbums; @@ -138,6 +141,7 @@ private: static QHash< QString, artist_wptr > s_artistsByName; static QHash< unsigned int, artist_wptr > s_artistsById; + static QHash< QString, artist_ptr > s_artistsByCoverId; friend class ::IdThreadWorker; }; diff --git a/src/libtomahawk/Track.cpp b/src/libtomahawk/Track.cpp index b4068afdd..96d500020 100644 --- a/src/libtomahawk/Track.cpp +++ b/src/libtomahawk/Track.cpp @@ -494,10 +494,25 @@ Track::coverLoaded() const return m_artistPtr->coverLoaded(); } - #endif +QString +Track::coverId() const +{ + if ( m_albumPtr && m_albumPtr->coverLoaded() && !m_albumPtr->cover( QSize( 0, 0 ) ).isNull() ) + { + return m_albumPtr->coverId(); + } + else if ( m_artistPtr ) + { + return m_artistPtr->coverId(); + } + + return QString(); +} + + QList Track::similarTracks() const { diff --git a/src/libtomahawk/Track.h b/src/libtomahawk/Track.h index 8d94f011c..abc63119c 100644 --- a/src/libtomahawk/Track.h +++ b/src/libtomahawk/Track.h @@ -84,6 +84,7 @@ public: QPixmap cover( const QSize& size, bool forceLoad = true ) const; #endif bool coverLoaded() const; + QString coverId() const; void setLoved( bool loved, bool postToInfoSystem = true ); bool loved();