Version: (using KDE KDE 3.5.2) Installed from: Ubuntu Packages OS: Linux Maybe I misunderstand the meaning of 'synchronize'. I have previously used Amarok but went back to windows (for reasons unrelated to Amarok, it is stil a kickass audio player). Now I have installed Ubuntu. Installed Amarok. Connected my ipod, and it was properly recognised. I went into the settings to 'configure media device' and saw the 'synchronize' option. I checked it. Fiddled around for a bit, rated some songs, and then synced with the ipod. Disconnected the ipod, success! My ratings had propagated. Then I went to one of my rating-based playlists and everything was gone. Why? Because Amarok has just wiped out all existing ratings. I suggest that if you find a rating on the ipod and no rating exists on Amarok you should probably set the Amarok rating to the ipod one, not remove the ipod rating. I spent a lot of time rating those songs so I am a little ticked off.
SVN commit 609407 by aumuell: only synchronize already set values to media devices BUG: 138150 M +1 -0 ChangeLog M +20 -11 src/mediabrowser.cpp M +1 -0 src/mediabrowser.h --- trunk/extragear/multimedia/amarok/ChangeLog #609406:609407 @@ -47,6 +47,7 @@ * Amarok now saves playlists with relative paths by default. BUGFIXES: + * Only synchronize already set values to media devices. (BR 138150) * Correctly update total playlist play time when removing last.fm streams. Patch by Modestas Vainius <geromanas@mailas.com>. (BR 134333) * File organization jobs could not be canceled. Patch by Wenli Liu --- trunk/extragear/multimedia/amarok/src/mediabrowser.cpp #609406:609407 @@ -2803,6 +2803,24 @@ } void +MediaItem::syncStatsFromPath( const QString &url ) +{ + if( url.isEmpty() ) + return; + + // copy Amarok rating, play count and last played time to device + int rating = CollectionDB::instance()->getSongRating( url )*10; + if( rating ) + setRating( rating ); + int playcount = CollectionDB::instance()->getPlayCount( url ); + if( playcount > played() ) + setPlayCount( playcount ); + QDateTime lastplay = CollectionDB::instance()->getLastPlay( url ); + if( lastplay > playTime() ) + setLastPlayed( lastplay.toTime_t() ); +} + +void MediaDevice::syncStatsToDevice( MediaItem *root ) { MediaItem *it = static_cast<MediaItem *>( m_view->firstChild() ); @@ -2820,15 +2838,7 @@ { const MetaBundle *bundle = it->bundle(); QString url = CollectionDB::instance()->getURL( *bundle ); - - if( url != QString::null ) - { - // copy Amarok rating, play count and last played time to device - int rating = CollectionDB::instance()->getSongRating( url )*10; - it->setRating( rating ); - it->setPlayCount( CollectionDB::instance()->getPlayCount( url ) ); - it->setLastPlayed( CollectionDB::instance()->getLastPlay( url ).toTime_t() ); - } + it->syncStatsFromPath( url ); } break; @@ -3015,8 +3025,7 @@ if( !item ) continue; - int rating = CollectionDB::instance()->getSongRating( (*it).url().path() ) * 10; - item->setRating( rating ); + item->syncStatsFromPath( (*it).url().path() ); if( m_playlistItem && !playlist.isEmpty() ) { --- trunk/extragear/multimedia/amarok/src/mediabrowser.h #609406:609407 @@ -81,6 +81,7 @@ virtual void setRating( int /*rating*/ ) {} virtual bool ratingChanged() const { return false; } virtual void setLastPlayed( uint ) {} + virtual void syncStatsFromPath( const QString &path ); virtual long size() const; virtual MediaDevice *device() const { return m_device; } virtual bool listened() const { return m_listened; }
wow, that was fast!