small patch that enables control over related artists

Ian Monroe ian at monroe.nu
Wed Aug 9 15:56:07 UTC 2006


Do we never refresh the cache? Does the cache ever get purged? Eg.
what database version is it part of.

I think the current number of suggested artists and songs shown is
good. Maybe its a good idea to broaden it for the dynamic playlist.

On 8/9/06, Laurent <lorijho at yes.lu> wrote:
> Hi to all Amarok Fans.
>
> This is my first post to the list and it includes a patch.
>
> I've written a small patch against amarok-1.4.1. It enables control over
> related artists. Last.fm artist relations are not always accurate, so
> with the patch applied the user can exclude related artists by right
> clicking a related artist name and select "E&xclude from similar artists
> list". The item is then removed from the related_artists table in the
> collectionDB. This works, of course, also for recursively related
> artists (when browsing related artists).
>
> Other small changes (which are not absolutely necessary):
> - fetch up to twice as much (60) related artists from last.fm
> - display up to twice as much (60) related artists in the ContextBrowser.
> - display up to 60 suggested songs in the ContextBrowser
> - consider up to 60 related artists when appending tracks in dynamic
> playlist mode
>
> Some screenshot:
> http://213.213.211.196/amarok/snapshot1.jpg
> http://213.213.211.196/amarok/snapshot2.jpg
> http://213.213.211.196/amarok/snapshot3.jpg
> http://213.213.211.196/amarok/snapshot4.jpg
>
> Give it a try...
>
> Greetings Laurent Baum (lorijho)
>
>
>
>
>
> diff -Naur amarok-1.4.1/amarok/src/collectiondb.cpp amarok-1.4.1.new/amarok/src/collectiondb.cpp
> --- amarok-1.4.1/amarok/src/collectiondb.cpp    2006-07-02 21:37:44.000000000 +0200
> +++ amarok-1.4.1.new/amarok/src/collectiondb.cpp        2006-08-08 22:26:17.323684750 +0200
> @@ -3470,6 +3470,13 @@
>                .arg( escapeString( path ) ) );
>  }
>
> +void
> +CollectionDB::removeRelatedArtist(const QString &artist, const QString &relArtist)
> +{
> +    query( QString( "DELETE FROM related_artists WHERE artist = '%1' AND suggestion = '%2';"  )
> +                .arg(  escapeString( artist  ), escapeString( relArtist  ) )  );
> +
> +}
>
>  bool
>  CollectionDB::isDirInCollection( QString path )
> diff -Naur amarok-1.4.1/amarok/src/collectiondb.h amarok-1.4.1.new/amarok/src/collectiondb.h
> --- amarok-1.4.1/amarok/src/collectiondb.h      2006-07-02 21:37:44.000000000 +0200
> +++ amarok-1.4.1.new/amarok/src/collectiondb.h  2006-08-08 22:26:17.355686750 +0200
> @@ -270,7 +270,8 @@
>          void removeSongsInDir( QString path );
>          void removeSongs( const KURL::List& urls );
>          void updateDirStats( QString path, const long datetime, const bool temporary = false );
> -
> +        /*member function that deletes related Artists from DB*/
> +        void removeRelatedArtist(const QString &artist, const QString &relArtist);
>          //song methods
>          bool addSong( MetaBundle* bundle, const bool incremental = false );
>          void doATFStuff( MetaBundle *bundle, const bool tempTables = true );
> diff -Naur amarok-1.4.1/amarok/src/contextbrowser.cpp amarok-1.4.1.new/amarok/src/contextbrowser.cpp
> --- amarok-1.4.1/amarok/src/contextbrowser.cpp  2006-07-02 21:37:44.000000000 +0200
> +++ amarok-1.4.1.new/amarok/src/contextbrowser.cpp      2006-08-09 14:10:04.794680500 +0200
> @@ -706,7 +706,8 @@
>
>  void ContextBrowser::slotContextMenu( const QString& urlString, const QPoint& point )
>  {
> -    enum { APPEND, ASNEXT, MAKE, MEDIA_DEVICE, INFO, TITLE, RELATED, SUGGEST, FAVES, FRESHPODCASTS, NEWALBUMS, FAVALBUMS };
> +    //enum { APPEND, ASNEXT, MAKE, MEDIA_DEVICE, INFO, TITLE, RELATED, SUGGEST, FAVES, FRESHPODCASTS, NEWALBUMS, FAVALBUMS };
> +    enum { APPEND, ASNEXT, MAKE, MEDIA_DEVICE, INFO, TITLE, RELATED, SUGGEST, FAVES, FRESHPODCASTS, NEWALBUMS, FAVALBUMS, DEL_REL_ARTIST }; /*added ID for deleting related artist*/
>      debug() << "url string: " << urlString << endl;
>
>      if( urlString.startsWith( "musicbrainz" ) ||
> @@ -788,6 +789,14 @@
>              menu.changeTitle( TITLE, i18n("Artist") );
>              menu.changeItem( INFO,   i18n("Edit Artist &Information..." ) );
>              menu.changeItem( ASNEXT, i18n("&Queue Artist's Songs") );
> +            /*add menu item for deleting related artist only for the current track artist's related artists or recursively related artists*/
> +            const MetaBundle &currentTrack = EngineController::instance()->bundle();
> +            /*this->m_artist is set when browsing (recursively) related artists*/
> +            if (!currentTrack.artist().isEmpty() || !this->m_artist.isEmpty())
> +            {
> +                menu.insertSeparator();
> +                menu.insertItem( SmallIconSet( amaroK::icon( "remove_from_playlist" ) ), i18n( "E&xclude from similar artists list" ), DEL_REL_ARTIST );
> +            }
>          }
>          if ( url.protocol() == "album" )
>          {
> @@ -909,6 +918,33 @@
>          MediaBrowser::queue()->addURLs( urls );
>          break;
>
> +    /*do the deletion here*/
> +    case DEL_REL_ARTIST:
> +    {
> +        /*this->m_artist is set so we have to consider a related artist as primary artist that has related artist*/
> +        QString curArtist;
> +        if ( !this->m_artist.isEmpty() )
> +        {
> +            curArtist=this->m_artist;
> +        }
> +        else
> +        {
> +            const MetaBundle &currentTrack = EngineController::instance()->bundle();
> +            curArtist = currentTrack.artist();
> +        }
> +        QString relArtist=url.fileName();
> +        if ( !curArtist.isEmpty() )
> +        {
> +            CollectionDB::instance()->removeRelatedArtist( curArtist, relArtist );
> +        }
> +        /*
> +        debug() << "currentTrack.artist(): " << currentTrack.artist() << endl;
> +        debug() << "this->m_artist: " << this->m_artist << endl;
> +        debug() << "selected curArtist: " << curArtist << endl;
> +        debug() << "url.fileName(): " << url.fileName() << endl;
> +        */
> +        break;
> +    }
>      }
>  }
>
> @@ -2159,9 +2195,9 @@
>      {
>          bool isInCollection = !CollectionDB::instance()->albumListOfArtist( relArtists[i] ).isEmpty();
>          m_HTMLSource.append(
> -                ( isInCollection ? "" : "<i>\n" )
> +                ( isInCollection ? "<b>\n" : "<i>\n" ) /*bold name if artist in collection*/
>                  + QString( "<a href='artist:" ) + escapeHTMLAttr( relArtists[i] ) + "'>\n" + escapeHTML( relArtists[i] ).replace( " ", " " ) + "</a>\n"
> -                + ( isInCollection ? "" : "</i>\n" )
> +                + ( isInCollection ? "</b>\n" : "</i>\n" ) /*bold name if artist in collection*/
>                  );
>          if( i != relArtists.count()-1 )
>              m_HTMLSource.append( ", " );
> @@ -2195,7 +2231,7 @@
>      values = qb.run();
>
>      // not enough items returned, let's fill the list with score-less tracks
> -    if ( values.count() < 10 * qb.countReturnValues() )
> +    if ( values.count() < 60 * qb.countReturnValues() ) /*10->60related to relArtists QStringList? which new size is 60*/
>      {
>          qb.clear();
>          qb.exclusiveFilter( QueryBuilder::tabSong, QueryBuilder::tabStats, QueryBuilder::valURL );
> @@ -2204,7 +2240,7 @@
>          qb.addReturnValue( QueryBuilder::tabArtist, QueryBuilder::valName );
>          qb.addMatches( QueryBuilder::tabArtist, relArtists );
>          qb.setOptions( QueryBuilder::optRandomize );
> -        qb.setLimit( 0, 10 - values.count() / 4 );
> +        qb.setLimit( 0, 60 - values.count() / 4 ); /*10->60 see comment above*/
>
>          QStringList sl;
>          sl = qb.run();
> @@ -2761,7 +2797,7 @@
>      else
>          showCurrentArtistHeader( currentTrack );
>
> -    QStringList relArtists = CollectionDB::instance()->similarArtists( artist, 10 );
> +    QStringList relArtists = CollectionDB::instance()->similarArtists( artist, 60 ); /* 10->60 as many as we asked for from last.fm*/
>      if ( !relArtists.isEmpty() )
>      {
>          if( ContextBrowser::instance()->m_showRelated )
> diff -Naur amarok-1.4.1/amarok/src/playlist.cpp amarok-1.4.1.new/amarok/src/playlist.cpp
> --- amarok-1.4.1/amarok/src/playlist.cpp        2006-07-02 21:37:44.000000000 +0200
> +++ amarok-1.4.1.new/amarok/src/playlist.cpp    2006-08-08 22:26:17.395689250 +0200
> @@ -597,7 +597,7 @@
>      if( type == DynamicMode::SUGGESTION )
>      {
>          if( !m_currentTrack ) return;
> -        QStringList suggestions = CollectionDB::instance()->similarArtists( currentTrack()->artist(), 16 );
> +        QStringList suggestions = CollectionDB::instance()->similarArtists( currentTrack()->artist(), 60 ); /*16->60 consider all 60 related artists that we asked for from last.fm*/
>          qb.addMatches( QueryBuilder::tabArtist, suggestions );
>      }
>      else if( type != DynamicMode::RANDOM ) //we have playlists to choose from.
>
>
>
> _______________________________________________
> Amarok mailing list
> Amarok at kde.org
> https://mail.kde.org/mailman/listinfo/amarok
>
>
>



More information about the Amarok mailing list