tags 556414 + patch thanks Bug is fixed in git://gitorious.org/~stuffcorpse/amarok/stuffcorpse-clone.git b354b2212e7c269f11b15c835994f5f24d658776 195a2810e1abea09e1af78fd3af549a93f1e4995 da0b5e0a28816e3fa3d520609e2230b56d86b333
A complete rebuild of the collection is needed to insert the new uniqueid's into the database.
From 195a2810e1abea09e1af78fd3af549a93f1e4995 Mon Sep 17 00:00:00 2001 From: Rick W. Chen <[email protected]> Date: Thu, 17 Dec 2009 19:20:46 +1300 Subject: [PATCH 2/3] Fix broken uid parsing in dynamic playlists When converting a QString uid to QByteArray, a QString::toAscii() is enough; no need to invoke QByteArray::fromHex(). This also fixes the bug where the dynamic playlist does not produce tracks tagged with MusicBrainz. MusicBrainz tagged tracks have uids that contain non-hex characters, e.g. "amarok-sqltrackuid://mb_cf9a810c-afa4-446c-9a5b-7284137c8651". Hyphens, underscores, and 'm' are not hex so they are parsed wrongly, causing failures in anything trying to get those tracks. --- ChangeLog | 1 + src/dynamic/Bias.cpp | 8 ++++---- src/dynamic/BiasSolver.cpp | 8 ++++---- src/dynamic/biases/EchoNest.cpp | 12 ++++++------ src/services/lastfm/biases/SimilarArtistsBias.cpp | 12 ++++++------ src/services/lastfm/biases/WeeklyTopBias.cpp | 2 +- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6f057e0..dcfa5fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -124,6 +124,7 @@ VERSION 2.2.2-beta1 * Remove broken right click menu from the Info applet. (BR 206642) * Fixed problems with loading tracks tagged by MusicBrainz in the XSPFPlaylist (full rescan required). + * Fixed problems with loading tracks tagged by MusicBrainz in dynamic playlists. * Fixed several bugs handling changing compilations. Patch by Morten Sjøgren <[email protected]> -- thanks! * Fixed bug with panel header icon size. (BR 208616) diff --git a/src/dynamic/Bias.cpp b/src/dynamic/Bias.cpp index 98cd37d..26d8fc5 100644 --- a/src/dynamic/Bias.cpp +++ b/src/dynamic/Bias.cpp @@ -354,9 +354,9 @@ bool Dynamic::GlobalBias::trackSatisfies( Meta::TrackPtr t ) { QMutexLocker locker( &m_mutex ); - // we only wan't the uid part: - QString uidString = t->uidUrl().mid( t->uidUrl().lastIndexOf( '/' ) ); - QByteArray uid = QByteArray::fromHex( uidString.toAscii() ); + // we only want the uid part: + const QString uidString = t->uidUrl().mid( t->uidUrl().lastIndexOf( '/' ) ); + const QByteArray uid = uidString.toAscii(); return m_property.contains( uid ); } @@ -388,7 +388,7 @@ Dynamic::GlobalBias::updateReady( QString collectionId, QStringList uids ) QByteArray uid; foreach( const QString &uidString, uids ) { - uid = QByteArray::fromHex( uidString.mid(protocolLength).toAscii() ); + uid = uidString.mid( protocolLength ).toAscii(); m_property.insert( uid ); } } diff --git a/src/dynamic/BiasSolver.cpp b/src/dynamic/BiasSolver.cpp index 695e42e..d5ca420 100644 --- a/src/dynamic/BiasSolver.cpp +++ b/src/dynamic/BiasSolver.cpp @@ -765,7 +765,8 @@ Dynamic::BiasSolver::getMutation() Meta::TrackPtr Dynamic::BiasSolver::trackForUid( const QByteArray& uid ) { - return s_universeCollection->trackForUrl(s_universeCollection->uidUrlProtocol() + "://" + QString(uid.toHex()) ); + const KUrl url = s_universeCollection->uidUrlProtocol() + "://" + QString( uid ); + return s_universeCollection->trackForUrl( url ); } @@ -881,10 +882,9 @@ Dynamic::BiasSolver::universeResults( QString collectionId, QStringList uids ) // for some reason we sometimes get uids without the protocol part if( uidString.at( s_uidUrlProtocolPrefixLength - 1 ) != '/' ) - uid = QByteArray::fromHex( uidString.toAscii() ); + uid = uidString.toAscii(); else - uid = QByteArray::fromHex( uidString.mid(s_uidUrlProtocolPrefixLength).toAscii() ); - + uid = uidString.mid( s_uidUrlProtocolPrefixLength ).toAscii(); if( !uid.isEmpty() ) s_universe += uid; diff --git a/src/dynamic/biases/EchoNest.cpp b/src/dynamic/biases/EchoNest.cpp index c0a82aa..02820dd 100644 --- a/src/dynamic/biases/EchoNest.cpp +++ b/src/dynamic/biases/EchoNest.cpp @@ -381,7 +381,7 @@ Dynamic::EchoNestBias::updateReady( QString collectionId, QStringList uids ) QByteArray uid; foreach( const QString &uidString, uids ) { - uid = QByteArray::fromHex( uidString.mid(protocolLength).toAscii() ); + uid = uidString.mid( protocolLength ).toAscii(); m_savedArtists[ key ].insert( uid ); } } @@ -394,8 +394,8 @@ Dynamic::EchoNestBias::trackSatisfies( const Meta::TrackPtr track ) QMutexLocker locker( &m_mutex ); //debug() << "checking if " << track->name() << "by" << track->artist()->name() << "is in suggested:" << m_savedArtists[ m_currentArtist ] << "of" << m_currentArtist; - QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); - QByteArray uid = QByteArray::fromHex( uidString.toAscii() ); + const QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); + const QByteArray uid = uidString.toAscii(); QString key; if( m_currentOnly ) @@ -429,10 +429,10 @@ Dynamic::EchoNestBias::numTracksThatSatisfy( const Meta::TrackList& tracks ) { foreach( const Meta::TrackPtr track, tracks ) { - QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); - QByteArray uid = QByteArray::fromHex( uidString.toAscii() ); + const QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); + const QByteArray uid = uidString.toAscii(); - if( m_savedArtists[ key ].contains(uid ) ) + if( m_savedArtists[ key ].contains( uid ) ) satisfy++; } diff --git a/src/services/lastfm/biases/SimilarArtistsBias.cpp b/src/services/lastfm/biases/SimilarArtistsBias.cpp index a9a657a..a17885d 100644 --- a/src/services/lastfm/biases/SimilarArtistsBias.cpp +++ b/src/services/lastfm/biases/SimilarArtistsBias.cpp @@ -237,7 +237,7 @@ Dynamic::SimilarArtistsBias::updateReady( QString collectionId, QStringList uids QByteArray uid; foreach( const QString &uidString, uids ) { - uid = QByteArray::fromHex( uidString.mid(protocolLength).toAscii() ); + uid = uidString.mid( protocolLength ).toAscii(); m_savedArtists[ m_currentArtist ].insert( uid ); } } @@ -250,8 +250,8 @@ Dynamic::SimilarArtistsBias::trackSatisfies( const Meta::TrackPtr track ) QMutexLocker locker( &m_mutex ); //debug() << "checking if " << track->name() << "by" << track->artist()->name() << "is in suggested:" << m_savedArtists[ m_currentArtist ] << "of" << m_currentArtist; - QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); - QByteArray uid = QByteArray::fromHex( uidString.toAscii() ); + const QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); + const QByteArray uid = uidString.toAscii(); if( m_savedArtists.keys().contains( m_currentArtist ) ) { @@ -275,10 +275,10 @@ Dynamic::SimilarArtistsBias::numTracksThatSatisfy( const Meta::TrackList& tracks { foreach( const Meta::TrackPtr track, tracks ) { - QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); - QByteArray uid = QByteArray::fromHex( uidString.toAscii() ); + const QString uidString = track->uidUrl().mid( track->uidUrl().lastIndexOf( '/' ) ); + const QByteArray uid = uidString.toAscii(); - if( m_savedArtists[ m_currentArtist ].contains(uid ) ) + if( m_savedArtists[ m_currentArtist ].contains( uid ) ) satisfy++; } diff --git a/src/services/lastfm/biases/WeeklyTopBias.cpp b/src/services/lastfm/biases/WeeklyTopBias.cpp index bf1ca4b..e8ce9cc 100644 --- a/src/services/lastfm/biases/WeeklyTopBias.cpp +++ b/src/services/lastfm/biases/WeeklyTopBias.cpp @@ -292,7 +292,7 @@ Dynamic::WeeklyTopBias::updateReady( QString collectionId, QStringList uids ) QByteArray uid; foreach( const QString &uidString, uids ) { - uid = QByteArray::fromHex( uidString.mid(protocolLength).toAscii() ); + uid = uidString.mid( protocolLength ).toAscii(); m_trackList.insert( uid ); } -- 1.6.5.7
From da0b5e0a28816e3fa3d520609e2230b56d86b333 Mon Sep 17 00:00:00 2001 From: Rick W. Chen <[email protected]> Date: Fri, 25 Dec 2009 00:52:05 +1300 Subject: [PATCH 3/3] Fix MusicBrainz uid prefix for Qt 4.6 Due to changes to QUrl in 4.6, underscores are no longer allowed in the hostname: - QUrl's parser is more strict when for hostnames in URLs. QUrl now enforces STD 3 rules: * each individual hostname section (between dots) must be at most 63 ASCII characters in length; * only letters, digits, and the hyphen character are allowed in the ASCII range; letters outside the ASCII range follow the normal IDN rules That means QUrl no longer accepts some URLs that were invalid before, but weren't interpreted as such. http://qt.nokia.com/developer/changes/changes-4.6.0 --- src/services/lastfm/ScrobblerAdapter.cpp | 4 ++-- utilities/collectionscanner/AFTUtility.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/lastfm/ScrobblerAdapter.cpp b/src/services/lastfm/ScrobblerAdapter.cpp index 7f6c5e6..6b88ff4 100644 --- a/src/services/lastfm/ScrobblerAdapter.cpp +++ b/src/services/lastfm/ScrobblerAdapter.cpp @@ -81,9 +81,9 @@ ScrobblerAdapter::engineNewTrackPlaying() m_current.setAlbum( track->album()->name() ); QString uid = track->uidUrl(); - if( uid.startsWith( "amarok-sqltrackuid://mb_" ) ) + if( uid.startsWith( "amarok-sqltrackuid://mb-" ) ) { - uid.remove( "amarok-sqltrackuid://mb_" ); + uid.remove( "amarok-sqltrackuid://mb-" ); m_current.setMbid( lastfm::Mbid( uid ) ); } diff --git a/utilities/collectionscanner/AFTUtility.cpp b/utilities/collectionscanner/AFTUtility.cpp index e929647..55761c4 100644 --- a/utilities/collectionscanner/AFTUtility.cpp +++ b/utilities/collectionscanner/AFTUtility.cpp @@ -77,7 +77,7 @@ AFTUtility::readEmbeddedUniqueId( const TagLib::FileRef &fileref ) } } if( !storedMBId.isEmpty() && ( storedMBId != mbDefaultUUID ) ) - return QString( "mb_" ) + storedMBId; + return QString( "mb-" ) + storedMBId; } //from here below assumes a file with a XiphComment; put non-conforming formats up above... TagLib::Ogg::XiphComment *comment = 0; @@ -107,7 +107,7 @@ AFTUtility::readEmbeddedUniqueId( const TagLib::FileRef &fileref ) { QString identifier = TStringToQString( comment->fieldListMap()[Qt4QStringToTString(mbId.toUpper())].front()).toLower(); if( !identifier.isEmpty() && ( identifier != mbDefaultUUID ) ) - return QString( "mb_" ) + identifier; + return QString( "mb-" ) + identifier; } return QString(); -- 1.6.5.7
From b354b2212e7c269f11b15c835994f5f24d658776 Mon Sep 17 00:00:00 2001 From: Rick W. Chen <[email protected]> Date: Tue, 15 Dec 2009 13:28:49 +1300 Subject: [PATCH 1/3] Change MusicBrainz collection uid prefix to lowercase When a QString containing a uid gets converted to QUrl/KUrl, it is automatically converted to lowercase. From Qt docs: Note that the case folding rules in Nameprep, which QUrl conforms to, require host names to always be converted to lower case, regardless of the Qt::FormattingOptions used. The result is that whenever such a conversion occurs, the corresponding track is no longer valid, causing it to be dropped. This happens, for example, when loading the XSPF playlist and when the dynamic playlist searches for a track. Dragging tracks with MBIDs from the album applet or the collection browser works because it does not go through the same path flow. Consequently, the dynamic playlist will never load a track that was tagged using MusicBrainz; a current.xspf with such tracks saved (could happen if you drag them to the playlist and then close Amarok) will not show those tracks when Amarok is reopened. Instead of going through and manage these conversions wherever they pop up I decided to change the prefix directly. Addendum: it turns out the issue with dynamic playlists is plagued by another bug. This is addressed in a separate patch. --- ChangeLog | 4 +++- src/services/lastfm/ScrobblerAdapter.cpp | 4 ++-- utilities/collectionscanner/AFTUtility.cpp | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2e8a56e..6f057e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -122,7 +122,9 @@ VERSION 2.2.2-beta1 BUGFIXES: * Fixed two bookmark actions having the same text description. (BR 214716) * Remove broken right click menu from the Info applet. (BR 206642) - * Fix several bugs handling changing compilations. Patch by Morten Sjøgren + * Fixed problems with loading tracks tagged by MusicBrainz in the + XSPFPlaylist (full rescan required). + * Fixed several bugs handling changing compilations. Patch by Morten Sjøgren <[email protected]> -- thanks! * Fixed bug with panel header icon size. (BR 208616) * Fixed bug with OSD not being shown by dbus call. (BR 208424) diff --git a/src/services/lastfm/ScrobblerAdapter.cpp b/src/services/lastfm/ScrobblerAdapter.cpp index 74d29a1..7f6c5e6 100644 --- a/src/services/lastfm/ScrobblerAdapter.cpp +++ b/src/services/lastfm/ScrobblerAdapter.cpp @@ -81,9 +81,9 @@ ScrobblerAdapter::engineNewTrackPlaying() m_current.setAlbum( track->album()->name() ); QString uid = track->uidUrl(); - if( uid.startsWith( "amarok-sqltrackuid://MB_" ) ) + if( uid.startsWith( "amarok-sqltrackuid://mb_" ) ) { - uid.remove( "amarok-sqltrackuid://MB_" ); + uid.remove( "amarok-sqltrackuid://mb_" ); m_current.setMbid( lastfm::Mbid( uid ) ); } diff --git a/utilities/collectionscanner/AFTUtility.cpp b/utilities/collectionscanner/AFTUtility.cpp index c139a15..e929647 100644 --- a/utilities/collectionscanner/AFTUtility.cpp +++ b/utilities/collectionscanner/AFTUtility.cpp @@ -77,7 +77,7 @@ AFTUtility::readEmbeddedUniqueId( const TagLib::FileRef &fileref ) } } if( !storedMBId.isEmpty() && ( storedMBId != mbDefaultUUID ) ) - return QString( "MB_" ) + storedMBId; + return QString( "mb_" ) + storedMBId; } //from here below assumes a file with a XiphComment; put non-conforming formats up above... TagLib::Ogg::XiphComment *comment = 0; @@ -107,7 +107,7 @@ AFTUtility::readEmbeddedUniqueId( const TagLib::FileRef &fileref ) { QString identifier = TStringToQString( comment->fieldListMap()[Qt4QStringToTString(mbId.toUpper())].front()).toLower(); if( !identifier.isEmpty() && ( identifier != mbDefaultUUID ) ) - return QString( "MB_" ) + identifier; + return QString( "mb_" ) + identifier; } return QString(); -- 1.6.5.7

