bool ProxyBase::rowMatch( int sourceModelRow, const QString &searchTerms, int searchFields ) const { if ( !m_belowModel ) return false; Meta::TrackPtr track = m_belowModel->trackAt( sourceModelRow ); QStringList searchList = searchTerms.split(" ", QString::SkipEmptyParts); foreach( const QString& searchTerm, searchList ) { bool match = false; if ( searchFields & MatchTrack && track->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchArtist && track->artist() && track->artist()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchAlbum && track->album() && track->album()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchGenre && track->genre() && track->genre()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchComposer && track->composer() && track->composer()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if ( searchFields & MatchYear && track->year() && track->year()->prettyName().contains( searchTerm, Qt::CaseInsensitive ) ) match = true; if( searchFields & MatchRating ) { bool ok; int rating = QString( searchTerm ).remove( "rating:" ).toInt( &ok ); if( ok && ( track->statistics()->rating() == rating ) ) match = true; } if( !match ) return false; }
void PhotosEngine::metadataChanged( Meta::TrackPtr track ) { const bool hasChanged = !track->artist() || track->artist()->name() != m_artist; if ( hasChanged ) update(); }
void LyricsEngine::onTrackMetadataChanged( Meta::TrackPtr track ) { DEBUG_BLOCK // Only update if the lyrics have changed. QString artist = track->artist() ? track->artist()->name() : QString(); if( m_prevLyrics.artist != artist || m_prevLyrics.title != track->name() || m_prevLyrics.text != track->cachedLyrics() ) update(); }
bool Dynamic::LastFmBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || position >= playlist.count()) return false; // determine the last track and artist Meta::TrackPtr lastTrack = playlist[position-1]; Meta::ArtistPtr lastArtist = lastTrack->artist(); QString lastTrackName = lastTrack->name(); QString lastArtistName = lastArtist ? lastArtist->name() : QString(); Meta::TrackPtr currentTrack = playlist[position]; Meta::ArtistPtr currentArtist = currentTrack->artist(); QString currentTrackName = currentTrack->name(); QString currentArtistName = currentArtist ? currentArtist->name() : QString(); { QMutexLocker locker( &m_mutex ); if( m_match == SimilarArtist ) { if( lastArtistName.isEmpty() ) return true; if( currentArtistName.isEmpty() ) return false; if( lastArtistName == currentArtistName ) return true; if( m_similarArtistMap.contains( lastArtistName ) ) return m_similarArtistMap.value( lastArtistName ).contains( currentArtistName ); } else if( m_match == SimilarTrack ) { if( lastTrackName.isEmpty() ) return true; if( currentTrackName.isEmpty() ) return false; if( lastTrackName == currentTrackName ) return true; TitleArtistPair lastKey( lastTrackName, lastArtistName ); TitleArtistPair currentKey( currentTrackName, currentArtistName ); if( m_similarTrackMap.contains( lastKey ) ) return m_similarTrackMap.value( lastKey ).contains( currentKey ); } } debug() << "didn't have a cached suggestions for track:" << lastTrackName; return false; }
void LastfmInfoParser::getInfo(Meta::TrackPtr track) { DEBUG_BLOCK QMap<QString, QString> query; query[ "method" ] = "track.getInfo"; query[ "track" ] = track->name(); query[ "album" ] = track->album() ? track->album()->name() : QString(); query[ "artist" ] = track->artist() ? track->artist()->name() : QString(); query[ "apikey" ] = Amarok::lastfmApiKey(); m_jobs[ "getTrackInfo" ] = lastfm::ws::post( query ); connect( m_jobs[ "getTrackInfo" ], SIGNAL( finished() ), SLOT( onGetTrackInfo() ) ); }
bool SimilarArtistsEngine::update( bool force ) { QString newArtist; Meta::TrackPtr track = The::engineController()->currentTrack(); if( track ) { if( Meta::ArtistPtr artistPtr = track->artist() ) newArtist = artistPtr->name(); } if( newArtist.isEmpty() ) { m_artist.clear(); removeAllData( "similarArtists" ); return false; } else //valid artist { // wee make a request only if the artist is different if( force || (newArtist != m_artist) ) { // if the artist has changed m_artist = newArtist; similarArtistsRequest( m_artist ); return true; } } return false; }
bool Dynamic::EchoNestBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); // collect the artist QStringList artists = currentArtists( position, playlist ); if( artists.isEmpty() ) return true; // the artist of this track if( position < 0 || position >= playlist.count() ) return false; Meta::TrackPtr track = playlist[position]; Meta::ArtistPtr artist = track->artist(); if( !artist || artist->name().isEmpty() ) return false; { QMutexLocker locker( &m_mutex ); QString key = artists.join("|"); if( m_similarArtistMap.contains( key ) ) return m_similarArtistMap.value( key ).contains( artist->name() ); } warning() << "didn't have artist suggestions saved for this artist:" << artist->name(); return false; }
void IpodCopyTracksJob::slotStartDuplicateTrackSearch( const Meta::TrackPtr &track ) { Collections::QueryMaker *qm = m_coll.data()->queryMaker(); qm->setQueryType( Collections::QueryMaker::Track ); // we cannot qm->addMatch( track ) - it matches by uidUrl() qm->addFilter( Meta::valTitle, track->name(), true, true ); qm->addMatch( track->album() ); qm->setArtistQueryMode( Collections::QueryMaker::TrackArtists ); qm->addMatch( track->artist() ); qm->addMatch( track->composer() ); qm->addMatch( track->genre() ); qm->addMatch( track->year() ); qm->addNumberFilter( Meta::valTrackNr, track->trackNumber(), Collections::QueryMaker::Equals ); qm->addNumberFilter( Meta::valDiscNr, track->discNumber(), Collections::QueryMaker::Equals ); // we don't want to match by filesize, track length, filetype etc - these change during // transcoding. We don't match album artist because handling of it is inconsistent connect( qm, SIGNAL(newResultReady(Meta::TrackList)), SLOT(slotDuplicateTrackSearchNewResult(Meta::TrackList)) ); connect( qm, SIGNAL(queryDone()), SLOT(slotDuplicateTrackSearchQueryDone()) ); qm->setAutoDelete( true ); m_duplicateTrack = Meta::TrackPtr(); // reset duplicate track from previous query qm->run(); }
bool Dynamic::QuizPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || position >= playlist.count()) return true; // -- determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) return true; // -- determine the first character Meta::TrackPtr track = playlist[position]; Meta::DataPtr data; if( m_follow == TitleToTitle ) data = Meta::DataPtr::staticCast<Meta::Track>(track); else if( m_follow == ArtistToArtist ) data = Meta::DataPtr::staticCast<Meta::Artist>(track->artist()); else if( m_follow == AlbumToAlbum ) data = Meta::DataPtr::staticCast<Meta::Album>(track->album()); if( !data || data->name().isEmpty() ) return false; // -- now compare QString lastName = lastData->name(); QString name = data->name(); return lastChar( lastName ).toLower() == name[0].toLower(); }
void Amarok::OSD::show( Meta::TrackPtr track ) //slot { setAlignment( static_cast<OSDWidget::Alignment>( AmarokConfig::osdAlignment() ) ); setOffset( AmarokConfig::osdYOffset() ); QString text; if( !track || track->playableUrl().isEmpty() ) { text = i18n( "No track playing" ); setRating( 0 ); // otherwise stars from last rating change are visible } else { setRating( track->rating() ); text = track->prettyName(); if( track->artist() && !track->artist()->prettyName().isEmpty() ) text = track->artist()->prettyName() + " - " + text; if( track->album() && !track->album()->prettyName().isEmpty() ) text += "\n (" + track->album()->prettyName() + ") "; else text += '\n'; if( track->length() > 0 ) text += Meta::msToPrettyTime( track->length() ); } if( text.isEmpty() ) text = track->playableUrl().fileName(); if( text.startsWith( "- " ) ) //When we only have a title tag, _something_ prepends a f*****g hyphen. Remove that. text = text.mid( 2 ); if( text.isEmpty() ) //still text = i18n("No information available for this track"); QImage image; if( track && track->album() ) image = The::svgHandler()->imageWithBorder( track->album(), 100, 5 ).toImage(); OSDWidget::show( text, image ); }
/** * called whenever metadata of the current track has changed */ void TabsEngine::update() { DEBUG_BLOCK // get the current track Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) { debug() << "no track"; m_titleName.clear(); m_artistName.clear(); removeAllData( "tabs" ); setData( "tabs", "state", "Stopped" ); return; } m_currentTrack = track; Meta::ArtistPtr artistPtr = track->artist(); QString newArtist; if( artistPtr ) { if( ( track->playableUrl().protocol() == "lastfm" ) || ( track->playableUrl().protocol() == "daap" ) || !The::engineController()->isStream() ) newArtist = artistPtr->name(); else newArtist = artistPtr->prettyName(); } QString newTitle = track->name(); if( newTitle.isEmpty() ) newTitle = track->prettyName(); // check if something changed if( newTitle == m_titleName && newArtist == m_artistName ) { debug() << "nothing changed"; return; } // stop fetching for unknown artists or titles if( newTitle.isEmpty() || newArtist.isEmpty() ) { setData("tabs", "state", "noTabs" ); return; } requestTab( newArtist, newTitle ); }
void CurrentEngine::update( Meta::AlbumPtr album ) { if( !m_requested.value( QLatin1String("albums") ) ) return; DEBUG_BLOCK m_lastQueryMaker = 0; Meta::TrackPtr track = The::engineController()->currentTrack(); if( !album ) return; Meta::ArtistPtr artist = track->artist(); // Prefer track artist to album artist BUG: 266682 if( !artist ) artist = album->albumArtist(); if( artist && !artist->name().isEmpty() ) { m_albums.clear(); m_albumData.clear(); m_albumData[ QLatin1String("currentTrack") ] = qVariantFromValue( track ); m_albumData[ QLatin1String("headerText") ] = QVariant( i18n( "Albums by %1", artist->name() ) ); // -- search the collection for albums with the same artist Collections::QueryMaker *qm = CollectionManager::instance()->queryMaker(); qm->setAutoDelete( true ); qm->addFilter( Meta::valArtist, artist->name(), true, true ); qm->setAlbumQueryMode( Collections::QueryMaker::AllAlbums ); qm->setQueryType( Collections::QueryMaker::Album ); connect( qm, SIGNAL(newResultReady( Meta::AlbumList)), SLOT(resultReady( Meta::AlbumList)), Qt::QueuedConnection ); connect( qm, SIGNAL(queryDone()), SLOT(setupAlbumsData()) ); m_lastQueryMaker = qm; qm->run(); } else { removeAllData( QLatin1String("albums") ); setData( QLatin1String("albums"), QLatin1String("headerText"), i18nc( "Header text for current album applet", "Albums" ) ); } }
bool Dynamic::WeeklyTopBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position < 0 || position >= playlist.count()) return false; // - determine the current artist Meta::TrackPtr currentTrack = playlist[position-1]; Meta::ArtistPtr currentArtist = currentTrack->artist(); QString currentArtistName = currentArtist ? currentArtist->name() : QString(); // - collect all the artists QStringList artists; bool weeksMissing = false; uint fromTime = m_range.from.toTime_t(); uint toTime = m_range.to.toTime_t(); uint lastWeekTime = 0; foreach( uint weekTime, m_weeklyFromTimes ) { if( weekTime > fromTime && weekTime < toTime && lastWeekTime ) { if( m_weeklyArtistMap.contains( lastWeekTime ) ) { artists.append( m_weeklyArtistMap.value( lastWeekTime ) ); // debug() << "found already-saved data for week:" << lastWeekTime << m_weeklyArtistMap.value( lastWeekTime ); } else { weeksMissing = true; } } lastWeekTime = weekTime; } if( weeksMissing ) warning() << "didn't have a cached suggestions for weeks:" << m_range.from << "to" << m_range.to; return artists.contains( currentArtistName ); }
Dynamic::TrackSet Dynamic::LastFmBias::matchingTracks( const Meta::TrackList& playlist, int contextCount, int finalCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); Q_UNUSED( finalCount ); if( playlist.isEmpty() ) return Dynamic::TrackSet( universe, true ); // determine the last track and artist Meta::TrackPtr lastTrack = playlist.last(); Meta::ArtistPtr lastArtist = lastTrack->artist(); m_currentTrack = lastTrack->name(); m_currentArtist = lastArtist ? lastArtist->name() : QString(); { QMutexLocker locker( &m_mutex ); if( m_match == SimilarArtist ) { if( m_currentArtist.isEmpty() ) return Dynamic::TrackSet( universe, true ); if( m_tracksMap.contains( m_currentArtist ) ) return m_tracksMap.value( m_currentArtist ); } else if( m_match == SimilarTrack ) { if( m_currentTrack.isEmpty() ) return Dynamic::TrackSet( universe, true ); QString key = m_currentTrack + '|' + m_currentArtist; if( m_tracksMap.contains( key ) ) return m_tracksMap.value( key ); } } m_tracks = Dynamic::TrackSet( universe, false ); QTimer::singleShot(0, const_cast<LastFmBias*>(this), SLOT(newQuery())); // create the new query from my parent thread return Dynamic::TrackSet(); }
Dynamic::TrackSet Dynamic::QuizPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position <= 0 || position > playlist.count()) return Dynamic::TrackSet( universe, true ); // determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) { // debug() << "QuizPlay: no data for"<<lastTrack->name(); return Dynamic::TrackSet( universe, true ); } m_currentCharacter = lastChar(lastData->name()).toLower(); // debug() << "QuizPlay: data for"<<lastTrack->name()<<"is"<<m_currentCharacter; // -- look if we already buffered it if( m_tracksValid && m_characterTrackMap.contains( m_currentCharacter ) ) return m_characterTrackMap.value( m_currentCharacter ); // -- start a new query m_tracks = Dynamic::TrackSet( universe, false ); QTimer::singleShot(0, const_cast<QuizPlayBias*>(this), SLOT(newQuery())); // create the new query from my parent thread return Dynamic::TrackSet(); }
Playlist::PlaylistLayout::Part Playlist::PlaylistLayout::partForItem( const QModelIndex &index ) const { switch ( index.data( GroupRole ).toInt() ) { case Grouping::Head: // GroupMode case Grouping::Body: case Grouping::Tail: { Meta::TrackPtr track = index.data( TrackRole ).value<Meta::TrackPtr>(); if( !track->artist() || !track->album() || !track->album()->albumArtist() || ( track->artist()->name() != track->album()->albumArtist()->name() ) ) return VariousArtistsBody; else return StandardBody; } case Grouping::None: default: return Single; } }
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 ); }
void CurrentTrack::setupLayoutActions( Meta::TrackPtr track ) { if( !track ) return; PERF_LOG( "Begin actions layout setup" ); //first, add any global CurrentTrackActions (iow, actions that are shown for all tracks) QList<QAction *> actions = The::globalCurrentTrackActions()->actions(); using namespace Capabilities; QScopedPointer<ActionsCapability> ac( track->create<ActionsCapability>() ); if( ac ) { QList<QAction*> trackActions = ac->actions(); // ensure that the actions get deleted afterwards foreach( QAction* action, trackActions ) { if( !action->parent() ) action->setParent( this ); actions << action; } } QScopedPointer<BookmarkThisCapability> btc( track->create<BookmarkThisCapability>() ); if( btc && btc->bookmarkAction() ) { actions << btc->bookmarkAction(); } if( m_showEditTrackDetailsAction && track->editor() ) { QAction *editAction = new QAction( KIcon("media-track-edit-amarok"), i18n("Edit Track Details"), this ); connect( editAction, SIGNAL(triggered()), SLOT(editTrack()) ); m_customActions << editAction; } if( track->has<FindInSourceCapability>() ) { if( !m_findInSourceSignalMapper ) { m_findInSourceSignalMapper = new QSignalMapper( this ); connect( m_findInSourceSignalMapper, SIGNAL(mapped(QString)), SLOT(findInSource(QString)) ); } Meta::AlbumPtr album = track->album(); Meta::ArtistPtr artist = track->artist(); Meta::ComposerPtr composer = track->composer(); Meta::GenrePtr genre = track->genre(); Meta::YearPtr year = track->year(); QAction *act( 0 ); if( album && !album->name().isEmpty() ) { act = new QAction( KIcon("current-track-amarok"), i18n("Show Album in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("album") ); m_customActions << act; } if( artist && !artist->name().isEmpty() ) { act = new QAction( KIcon("filename-artist-amarok"), i18n("Show Artist in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("artist") ); m_customActions << act; KPluginInfo::List services = The::pluginManager()->plugins( QLatin1String("Service") ); foreach( const KPluginInfo &service, services ) { if( service.pluginName() == QLatin1String("amarok_service_amazonstore") ) { if( service.isPluginEnabled() ) { act = new QAction( KIcon("view-services-amazon-amarok"), i18n("Search for Artist in the MP3 Music Store"), this ); connect( act, SIGNAL(triggered()), this, SLOT(findInStore()) ); m_customActions << act; } break; } } } if( composer && !composer->name().isEmpty() && (composer->name() != i18n("Unknown Composer")) ) { act = new QAction( KIcon("filename-composer-amarok"), i18n("Show Composer in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("composer") ); m_customActions << act; } if( genre && !genre->name().isEmpty() ) { act = new QAction( KIcon("filename-genre-amarok"), i18n("Show Genre in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("genre") ); m_customActions << act; } if( year && !year->name().isEmpty() ) { act = new QAction( KIcon("filename-year-amarok"), i18n("Show Year in Media Sources"), this ); connect( act, SIGNAL(triggered()), m_findInSourceSignalMapper, SLOT(map()) ); m_findInSourceSignalMapper->setMapping( act, QLatin1String("year") ); m_customActions << act; } }
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 ); }
void WikipediaEngine::update() { DEBUG_BLOCK m_triedRefinedSearch = false; QString tmpWikiStr; unsubscribeFrom( m_currentTrack ); Meta::TrackPtr currentTrack = The::engineController()->currentTrack(); m_currentTrack = currentTrack; subscribeTo( currentTrack ); if ( !currentTrack ) return; DataEngine::Data data; if( selection() == "artist" ) // default, or applet told us to fetch artist { data["wikipedia"] = "label, artist"; if( currentTrack->artist() ) { data["wikipedia"] = "title", currentTrack->artist()->prettyName(); if ( ( currentTrack->playableUrl().protocol() == "lastfm" ) || ( currentTrack->playableUrl().protocol() == "daap" ) || !The::engineController()->isStream() ) { tmpWikiStr = currentTrack->artist()->name(); tmpWikiStr += wikiArtistPostfix(); //makes wikipedia bail out debug() << "tmpWikiStr: " << tmpWikiStr; } else { tmpWikiStr = currentTrack->artist()->prettyName(); tmpWikiStr += wikiArtistPostfix(); //makes wikipedia bail out } } } else if( selection() == "title" ) { tmpWikiStr = currentTrack->prettyName(); data["wikipedia"] = QString( "label" ), QString( "Title" ); data["wikipedia"] = "title", currentTrack->prettyName(); } else if( selection() == "album" ) { if( currentTrack->album() ) { data["wikipedia"] = QString( "label" ), QString( "Album" ); data["wikipedia"] = "title", currentTrack->album()->prettyName(); if ( ( currentTrack->playableUrl().protocol() == "lastfm" ) || ( currentTrack->playableUrl().protocol() == "daap" ) || !The::engineController()->isStream() ) { tmpWikiStr = currentTrack->album()->name(); tmpWikiStr += wikiAlbumPostfix(); } } } //Hack to make wiki searches work with magnatune preview tracks if ( tmpWikiStr.contains( "PREVIEW: buy it at www.magnatune.com" ) ) { tmpWikiStr = tmpWikiStr.remove(" (PREVIEW: buy it at www.magnatune.com)" ); int index = tmpWikiStr.indexOf( '-' ); if ( index != -1 ) tmpWikiStr = tmpWikiStr.left (index - 1); } if( m_wikiCurrentEntry == tmpWikiStr ) { debug() << "Same entry requested again. Ignoring."; return; } removeAllData( "wikipedia" ); foreach( const QString &key, data.keys() ) setData( key, data[key] ); m_wikiCurrentEntry = tmpWikiStr; m_wikiCurrentUrl = wikiUrl( tmpWikiStr ); debug() << "wiki url: " << m_wikiCurrentUrl; setData( "wikipedia", "message", i18n( "Fetching content.." ) ); m_wikiJob = KIO::storedGet( m_wikiCurrentUrl, KIO::NoReload, KIO::HideProgressInfo ); connect( m_wikiJob, SIGNAL( result( KJob* ) ), SLOT( wikiResult( KJob* ) ) ); }
QVariant Meta::valueForField( qint64 field, Meta::TrackPtr track ) { if( !track ) return QVariant(); switch( field ) { case 0: { // that is the simple search for MetaQueryWidget QSet<QString> allInfos; allInfos += track->playableUrl().path() += track->name() += track->comment(); if( track->artist() ) allInfos += track->artist()->name(); if( track->album() ) allInfos += track->album()->name(); if( track->genre() ) allInfos += track->genre()->name(); return QVariant( allInfos.toList() ); } case Meta::valUrl: return track->playableUrl().path(); case Meta::valTitle: return track->name(); case Meta::valArtist: return track->artist() ? QVariant(track->artist()->name()) : QVariant(); case Meta::valAlbum: return track->album() ? QVariant(track->album()->name()) : QVariant(); case Meta::valGenre: return track->genre() ? QVariant(track->genre()->name()) : QVariant(); case Meta::valComposer: return track->composer() ? QVariant(track->composer()->name()) : QVariant(); case Meta::valYear: return track->year() ? QVariant(track->year()->name().toInt()) : QVariant(); case Meta::valComment: return track->comment(); case Meta::valTrackNr: return track->trackNumber(); case Meta::valDiscNr: return track->discNumber(); case Meta::valBpm: return track->bpm(); case Meta::valLength: return track->length(); case Meta::valBitrate: return track->bitrate(); case Meta::valSamplerate: return track->sampleRate(); case Meta::valFilesize: return track->filesize(); case Meta::valFormat: return int(Amarok::FileTypeSupport::fileType(track->type())); case Meta::valCreateDate: return track->createDate(); case Meta::valScore: return track->statistics()->score(); case Meta::valRating: return track->statistics()->rating(); case Meta::valFirstPlayed: return track->statistics()->firstPlayed(); case Meta::valLastPlayed: return track->statistics()->lastPlayed(); case Meta::valPlaycount: return track->statistics()->playCount(); case Meta::valUniqueId: return track->uidUrl(); // todo case Meta::valTrackGain: return "track gain"; case Meta::valTrackGainPeak: return "track gain peak"; case Meta::valAlbumGain: return "album gain"; case Meta::valAlbumGainPeak: return "album gain peak"; case Meta::valAlbumArtist: return (track->album() && track->album()->albumArtist()) ? QVariant(track->album()->albumArtist()->name()) : QVariant(); case Meta::valLabel: { Meta::LabelList labels = track->labels(); QStringList strLabels; foreach( Meta::LabelPtr label, labels ) strLabels.append( label->name() ); return QVariant( strLabels ); } case Meta::valModified: return track->modifyDate(); default: return QVariant(); } }
void LyricsEngine::update() { if( m_isUpdateInProgress ) return; m_isUpdateInProgress = true; // -- get current title and artist Meta::TrackPtr currentTrack = The::engineController()->currentTrack(); if( !currentTrack ) { debug() << "no current track"; m_prevLyrics.clear(); removeAllData( "lyrics" ); setData( "lyrics", "stopped", "stopped" ); m_isUpdateInProgress = false; return; } QString title = currentTrack->name(); QString artist = currentTrack->artist() ? currentTrack->artist()->name() : QString(); // -- clean up title const QString magnatunePreviewString = QLatin1String( "PREVIEW: buy it at www.magnatune.com" ); if( title.contains(magnatunePreviewString, Qt::CaseSensitive) ) title = title.remove( " (" + magnatunePreviewString + ")" ); if( artist.contains(magnatunePreviewString, Qt::CaseSensitive) ) artist = artist.remove( " (" + magnatunePreviewString + ")" ); if( title.isEmpty() && currentTrack ) { /* If title is empty, try to use pretty title. The fact that it often (but not always) has "artist name" together, can be bad, but at least the user will hopefully get nice suggestions. */ QString prettyTitle = currentTrack->prettyName(); int h = prettyTitle.indexOf( QLatin1Char('-') ); if ( h != -1 ) { title = prettyTitle.mid( h + 1 ).trimmed(); if( title.contains(magnatunePreviewString, Qt::CaseSensitive) ) title = title.remove( " (" + magnatunePreviewString + ")" ); if( artist.isEmpty() ) { artist = prettyTitle.mid( 0, h ).trimmed(); if( artist.contains(magnatunePreviewString, Qt::CaseSensitive) ) artist = artist.remove( " (" + magnatunePreviewString + ")" ); } } } LyricsData lyrics = { currentTrack->cachedLyrics(), title, artist, KUrl() }; // Check if the title, the artist and the lyrics are still the same. if( !lyrics.text.isEmpty() && (lyrics.text == m_prevLyrics.text) ) { debug() << "nothing changed:" << lyrics.title; newLyrics( lyrics ); m_isUpdateInProgress = false; return; } // don't rely on caching for streams const bool cached = !LyricsManager::self()->isEmpty( lyrics.text ) && !The::engineController()->isStream(); if( cached ) { newLyrics( lyrics ); } else { // no lyrics, and no lyrics script! if( !ScriptManager::instance()->lyricsScriptRunning() ) { debug() << "no lyrics script running"; removeAllData( "lyrics" ); setData( "lyrics", "noscriptrunning", "noscriptrunning" ); disconnect( ScriptManager::instance(), SIGNAL(lyricsScriptStarted()), this, 0 ); connect( ScriptManager::instance(), SIGNAL(lyricsScriptStarted()), SLOT(update()) ); m_isUpdateInProgress = false; return; } // fetch by lyrics script removeAllData( "lyrics" ); setData( "lyrics", "fetching", "fetching" ); ScriptManager::instance()->notifyFetchLyrics( lyrics.artist, lyrics.title ); } m_isUpdateInProgress = false; }
void PhotosEngine::update( bool force ) { QString tmpYoutStr; // prevent Meta::TrackPtr currentTrack = The::engineController()->currentTrack(); if( !currentTrack || !currentTrack->artist() ) { debug() << "invalid current track"; setData( "photos", Plasma::DataEngine::Data() ); return; } else if( !force && currentTrack->artist()->name() == m_artist ) { debug() << "artist name unchanged"; setData( "photos", Plasma::DataEngine::Data() ); return; } else { unsubscribeFrom( m_currentTrack ); m_currentTrack = currentTrack; subscribeTo( currentTrack ); if ( !currentTrack ) return; // Save artist m_artist = currentTrack->artist()->name(); removeAllData( "photos" ); // Show the information if( !m_artist.isEmpty() ) { setData( "photos", "message", "Fetching"); setData( "photos", "artist", m_artist ); } else { removeAllData( "photos" ); return; } QStringList tags = m_keywords; tags << m_artist; tags.removeDuplicates(); // Query flickr, order by relevance, 10 max // Flickr :http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=9c5a288116c34c17ecee37877397fe31&text=ARTIST&per_page=20 KUrl flickrUrl; flickrUrl.setScheme( "http" ); flickrUrl.setHost( "api.flickr.com" ); flickrUrl.setPath( "/services/rest/" ); flickrUrl.addQueryItem( "method", "flickr.photos.search" ); flickrUrl.addQueryItem( "api_key", Amarok::flickrApiKey() ); flickrUrl.addQueryItem( "per_page", QString::number( m_nbPhotos ) ); flickrUrl.addQueryItem( "sort", "date-posted-desc" ); flickrUrl.addQueryItem( "media", "photos" ); flickrUrl.addQueryItem( "content_type", QString::number(1) ); flickrUrl.addQueryItem( "text", tags.join(" ") ); debug() << "Flickr url:" << flickrUrl; m_flickrUrls << flickrUrl; The::networkAccessManager()->getData( flickrUrl, this, SLOT(resultFlickr(KUrl,QByteArray,NetworkAccessManagerProxy::Error)) ); } }