void ScrobblerAdapter::copyTrackMetadata( lastfm::MutableTrack &to, const Meta::TrackPtr &track ) { to.setTitle( track->name() ); QString artistOrComposer; Meta::ComposerPtr composer = track->composer(); if( m_config->scrobbleComposer() && composer ) artistOrComposer = composer->name(); Meta::ArtistPtr artist = track->artist(); if( artistOrComposer.isEmpty() && artist ) artistOrComposer = artist->name(); to.setArtist( artistOrComposer ); Meta::AlbumPtr album = track->album(); Meta::ArtistPtr albumArtist; if( album ) { to.setAlbum( album->name() ); albumArtist = album->hasAlbumArtist() ? album->albumArtist() : Meta::ArtistPtr(); } if( albumArtist ) to.setAlbumArtist( albumArtist->name() ); to.setDuration( track->length() / 1000 ); if( track->trackNumber() >= 0 ) to.setTrackNumber( track->trackNumber() ); lastfm::Track::Source source = lastfm::Track::Player; if( track->type() == "stream/lastfm" ) source = lastfm::Track::LastFmRadio; else if( track->type().startsWith( "stream" ) ) source = lastfm::Track::NonPersonalisedBroadcast; else if( track->collection() && track->collection()->collectionId() != "localCollection" ) source = lastfm::Track::MediaDevice; to.setSource( source ); }
QString TrackOrganizer::buildDestination(const QString& format, const Meta::TrackPtr& track) const { // get hold of the shared pointers Meta::AlbumPtr album = track->album(); Meta::ArtistPtr artist = track->artist(); Meta::ComposerPtr composer = track->composer(); Meta::ArtistPtr albumArtist = album ? album->albumArtist() : Meta::ArtistPtr(); Meta::GenrePtr genre = track->genre(); Meta::YearPtr year = track->year(); bool isCompilation = album && album->isCompilation(); QMap<QString, QString> args; QString strArtist = artist ? artist->name() : QString(); QString strAlbumArtist = isCompilation ? i18n( "Various Artists" ) : ( albumArtist ? albumArtist->name() : strArtist ); args["theartist"] = strArtist; args["thealbumartist"] = strAlbumArtist; if( m_postfixThe ) { Amarok::manipulateThe( strArtist, true ); Amarok::manipulateThe( strAlbumArtist, true ); } if ( track->trackNumber() ) { QString trackNum = QString("%1").arg( track->trackNumber(), 2, 10, QChar('0') ); args["track"] = trackNum; } args["title"] = track->name(); args["artist"] = strArtist; args["composer"] = composer ? composer->name() : QString(); // if year == 0 then we don't want include it QString strYear = year ? year->name() : QString(); args["year"] = strYear.localeAwareCompare( "0" ) == 0 ? QString() : strYear; args["album"] = track->album() ? track->album()->name() : QString(); args["albumartist"] = strAlbumArtist; args["comment"] = track->comment(); args["genre"] = genre ? genre->name() : QString(); if( m_targetFileExtension.isEmpty() ) args["filetype"] = track->type(); else args["filetype"] = m_targetFileExtension; QString strFolder = QFileInfo( track->playableUrl().toLocalFile() ).path(); strFolder = strFolder.mid( commonPrefixLength( m_folderPrefix, strFolder ) ); args["folder"] = strFolder; args["initial"] = strAlbumArtist.mid( 0, 1 ).toUpper(); //artists starting with The are already handled above if( track->discNumber() ) args["discnumber"] = QString::number( track->discNumber() ); args["collectionroot"] = m_folderPrefix; // some additional properties not supported by organize dialog. args["rating"] = track->statistics()->rating(); args["filesize"] = track->filesize(); args["length"] = track->length() / 1000; // Fill up default empty values for StringX formater // TODO make this values changeable by user args["default_album"] = i18n( "Unknown album" ); args["default_albumartist"] = i18n( "Unknown artist" ); args["default_artist"] = args["albumartist"]; args["default_thealbumartist"] = args["albumartist"]; args["default_theartist"] = args["albumartist"]; args["default_comment"] = i18n( "No comments" ); args["default_composer"] = i18n( "Unknown composer" ); args["default_discnumber"] = i18n( "Unknown disc number" ); args["default_genre"] = i18n( "Unknown genre" ); args["default_title"] = i18n( "Unknown title" ); args["default_year"] = i18n( "Unknown year" ); foreach( const QString &key, args.keys() ) if( key != "collectionroot" && key != "folder" ) args[key] = args[key].replace( '/', '-' ); Amarok::QStringx formatx( format ); QString result = formatx.namedOptArgs( args ); return cleanPath( result ); }
/** Set all track values but before that create them in the registry. */ void TestSqlTrack::testSetAllValuesSingleExisting() { { Meta::GenrePtr genre = m_collection->registry()->getGenre( "New Genre" ); Meta::ComposerPtr composer = m_collection->registry()->getComposer( "New Composer" ); Meta::YearPtr year = m_collection->registry()->getYear( 1999 ); Meta::AlbumPtr album = m_collection->registry()->getAlbum( "New Album", "New Artist" ); m_collection->registry()->getLabel( "New Label" ); Meta::TrackPtr track1 = m_collection->registry()->getTrack( "/IDoNotExist.mp3" ); Meta::SqlTrack *sqlTrack1 = static_cast<Meta::SqlTrack*>( track1.data() ); setAllValues( sqlTrack1 ); getAllValues( sqlTrack1 ); // check that the existing object are really updated with the new tracklist QCOMPARE( genre->tracks().count(), 1 ); QCOMPARE( genre->tracks().first().data(), track1.data() ); QCOMPARE( composer->tracks().count(), 1 ); QCOMPARE( composer->tracks().first().data(), track1.data() ); QCOMPARE( year->tracks().count(), 1 ); QCOMPARE( year->tracks().first().data(), track1.data() ); // the logic, how renaming the track artist influences its album is still // unfinished. For sure the track must be in an album with the defined // name QCOMPARE( sqlTrack1->album()->name(), QString("New Album") ); QCOMPARE( sqlTrack1->album()->tracks().count(), 1 ); QCOMPARE( sqlTrack1->album()->tracks().first().data(), track1.data() ); } // and also after empty cache m_collection->registry()->emptyCache(); { Meta::TrackPtr track1 = m_collection->registry()->getTrack( "/new_url" ); Meta::SqlTrack *sqlTrack1 = static_cast<Meta::SqlTrack*>( track1.data() ); QVERIFY( track1 ); getAllValues( sqlTrack1 ); Meta::GenrePtr genre = m_collection->registry()->getGenre( "New Genre" ); Meta::ComposerPtr composer = m_collection->registry()->getComposer( "New Composer" ); Meta::YearPtr year = m_collection->registry()->getYear( 1999 ); Meta::AlbumPtr album = m_collection->registry()->getAlbum( "New Album", "New Artist" ); // check that the existing object are really updated with the new tracklist QCOMPARE( genre->tracks().count(), 1 ); QCOMPARE( genre->tracks().first().data(), track1.data() ); QCOMPARE( composer->tracks().count(), 1 ); QCOMPARE( composer->tracks().first().data(), track1.data() ); QCOMPARE( year->tracks().count(), 1 ); QCOMPARE( year->tracks().first().data(), track1.data() ); // the logic, how renaming the track artist influences its album is still // unfinished. For sure the track must be in an album with the defined // name QCOMPARE( sqlTrack1->album()->name(), QString("New Album") ); QCOMPARE( sqlTrack1->album()->tracks().count(), 1 ); QCOMPARE( sqlTrack1->album()->tracks().first().data(), track1.data() ); } }