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; }
void AlbumItem::update() { if( !m_album ) return; Meta::TrackList tracks = m_album->tracks(); if( !tracks.isEmpty() ) { Meta::TrackPtr first = tracks.first(); Meta::YearPtr year = first->year(); if( year ) setData( year->year(), AlbumYearRole ); } QString albumName = m_album->name(); albumName = albumName.isEmpty() ? i18n("Unknown") : albumName; QString name = ( m_showArtist && m_album->hasAlbumArtist() ) ? QString( "%1 - %2" ).arg( m_album->albumArtist()->name(), albumName ) : albumName; setData( name, NameRole ); qint64 totalTime = 0; foreach( Meta::TrackPtr item, tracks ) totalTime += item->length(); QString trackCount = i18np( "%1 track", "%1 tracks", tracks.size() ); QString lengthText = QString( "%1, %2" ).arg( trackCount, Meta::msToPrettyTime( totalTime ) ); setData( lengthText, AlbumLengthRole ); QPixmap cover = The::svgHandler()->imageWithBorder( m_album, m_iconSize, 3 ); setIcon( QIcon( cover ) ); }
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 PhotosEngine::metadataChanged( Meta::TrackPtr track ) { const bool hasChanged = !track->artist() || track->artist()->name() != m_artist; if ( hasChanged ) update(); }
void OSDWidget::ratingChanged( const QString& path, int rating ) { Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) return; if( track->playableUrl().isLocalFile() && track->playableUrl().path() == path ) ratingChanged( rating ); }
void CurrentTrack::trackRatingChanged( int rating ) { Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) return; track->statistics()->setRating( rating ); }
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(); }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( const Meta::TrackList& playlist, int contextCount, int finalCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); Q_UNUSED( finalCount ); if( playlist.isEmpty() ) // no track means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist.last(); Meta::AlbumPtr album = track->album(); if( !album ) // no album means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( ( albumTracks.count() <= 1 ) || // the album has only one track (or even less) so there can't be any other tracks in the same album ( m_follow != DontCare && sameTrack( track, albumTracks.last() ) ) ) // track is the last one and we want to find a later one. return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( sameTrack( albumTracks[i], track ) ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( !sameTrack( albumTracks[i], track ) ) result.unite( albumTracks[i] ); } } return result; }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position < 1 || position >= playlist.count() ) return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); if( !album ) return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( albumTracks.count() == 1 || (track == albumTracks.last() && m_follow != DontCare) ) return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( albumTracks[i-1] == track ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( albumTracks[i] == track ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( albumTracks[i] != track ) result.unite( albumTracks[i] ); } } return result; }
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(); }
void OrganizeCollectionDialog::previewNextBatch() //private slot { const int batchSize = 10; QMap<Meta::TrackPtr, QString> dests = m_trackOrganizer->getDestinations( batchSize ); QMapIterator<Meta::TrackPtr, QString> it( dests ); while( it.hasNext() ) { it.next(); Meta::TrackPtr track = it.key(); QString originalPath = track->prettyUrl(); QString newPath = it.value(); int newRow = ui->previewTableWidget->rowCount(); ui->previewTableWidget->insertRow( newRow ); //new path preview in the 1st column QPalette p = ui->previewTableWidget->palette(); QTableWidgetItem *item = new QTableWidgetItem( newPath ); KColorScheme::adjustBackground( p, KColorScheme::NegativeBackground ); if( QFileInfo( newPath ).exists() ) { item->setBackgroundColor( p.color( QPalette::Base ) ); m_conflict = true; } ui->previewTableWidget->setItem( newRow, 0, item ); //original in the second column item = new QTableWidgetItem( originalPath ); ui->previewTableWidget->setItem( newRow, 1, item ); } if( m_conflict ) { if( ui->overwriteCheck->isChecked() ) ui->conflictLabel->setText( i18n( "There is a filename conflict, existing files will be overwritten." ) ); else ui->conflictLabel->setText( i18n( "There is a filename conflict, existing files will not be changed." ) ); } else ui->conflictLabel->setText(""); // we clear the text instead of hiding it to retain the layout spacing //non-blocking way of updating the preview table. if( dests.count() == batchSize ) QTimer::singleShot( 10, this, SLOT(previewNextBatch()) ); else unsetCursor(); // finished }
void TestSqlTrack::testRemoveLabelFromTrack() { Meta::TrackPtr track = m_collection->registry()->getTrack( "/IDoNotExist.mp3" ); Meta::LabelPtr label = m_collection->registry()->getLabel( "A" ); track->addLabel( label ); QCOMPARE( track->labels().count(), 1 ); track->removeLabel( label ); QCOMPARE( track->labels().count(), 0 ); QStringList urlsLabelsCount = m_storage->query( "SELECT COUNT(*) FROM urls_labels;" ); QCOMPARE( urlsLabelsCount.first().toInt(), 0 ); }
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 Dynamic::AlbumPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || playlist.count() <= position ) return true; Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); Meta::TrackPtr currentTrack = playlist[position]; Meta::AlbumPtr currentAlbum = currentTrack->album(); if( !album || album->tracks().isEmpty() ) return false; Meta::TrackList albumTracks = album->tracks(); if( sameTrack( track, albumTracks.last() ) && m_follow != DontCare ) return false; // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) return sameTrack( albumTracks[i], currentTrack ); return false; } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found && sameTrack( albumTracks[i], currentTrack ) ) return true; if( sameTrack( albumTracks[i], track ) ) found = true; } return false; } else if( m_follow == DontCare ) { return album == currentAlbum; } return false; }
void TrackItem::metadataChanged( Meta::TrackPtr track ) { int trackNumber = track->trackNumber(); QString trackName = track->prettyName(); QString text; if( trackNumber > 0 ) text = QString( "%1\t%2" ).arg( QString::number( trackNumber ), trackName ); else text = QString( "\t%1" ).arg( trackName ); setText( text ); }
void CurrentTrack::coverDropped( const QPixmap &cover ) { DEBUG_BLOCK Meta::TrackPtr track = The::engineController()->currentTrack(); if( !track ) return; Meta::AlbumPtr album = track->album(); if( !album ) return; if ( !cover.isNull() ) album->setImage( cover.toImage() ); }
void TestSqlTrack::testRemoveLabelFromTrackWhenNotInCache() { m_storage->query( "INSERT INTO labels(id,label) VALUES (1,'A');" ); m_storage->query( "INSERT INTO urls_labels(url,label) VALUES (1,1);" ); Meta::TrackPtr track = m_collection->registry()->getTrack( "/IDoNotExist.mp3" ); Meta::LabelPtr label = m_collection->registry()->getLabel( "A" ); track->removeLabel( label ); QCOMPARE( track->labels().count(), 0 ); QStringList urlsLabelsCount = m_storage->query( "SELECT COUNT(*) FROM urls_labels;" ); QCOMPARE( urlsLabelsCount.first().toInt(), 0 ); }
/** * 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 ScrobblerAdapter::updateNowPlaying( const Meta::TrackPtr &track ) { lastfm::MutableTrack lfmTrack; if( track ) { if( isToBeSkipped( track ) ) { debug() << "updateNowPlaying(): refusing track" << track->prettyUrl() << "- contains label:" << m_config->filteredLabel() << "which is marked to be skipped"; return; } copyTrackMetadata( lfmTrack, track ); debug() << "nowPlaying: " << lfmTrack.artist() << "-" << lfmTrack.album() << "-" << lfmTrack.title() << "source:" << lfmTrack.source() << "duration:" << lfmTrack.duration(); m_scrobbler.nowPlaying( lfmTrack ); } else { debug() << "removeNowPlaying"; QNetworkReply *reply = lfmTrack.removeNowPlaying(); // works even with empty lfmTrack connect( reply, SIGNAL(finished()), reply, SLOT(deleteLater()) ); // don't leak } }
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 CurrentEngine::sourceRequestEvent( const QString& name ) { Meta::TrackPtr track = The::engineController()->currentTrack(); m_requested[ name ] = true; if( !track ) stopped(); if( name == QLatin1String("current") ) update( track ); else if( name == QLatin1String("albums") ) track ? update(track->album()) : setData(name, Plasma::DataEngine::Data()); else return false; return true; }
bool Playlists::canExpand( Meta::TrackPtr track ) { if( !track ) return false; return Playlists::getFormat( track->uidUrl() ) != Playlists::NotPlaylist; }
StatSyncing::ScrobblingService::ScrobbleError ScrobblerAdapter::scrobble( const Meta::TrackPtr &track, double playedFraction, const QDateTime &time ) { Q_ASSERT( track ); if( isToBeSkipped( track ) ) { debug() << "scrobble(): refusing track" << track->prettyUrl() << "- contains label:" << m_config->filteredLabel() << "which is marked to be skipped"; return SkippedByUser; } if( track->length() * qMin( 1.0, playedFraction ) < 30 * 1000 ) { debug() << "scrobble(): refusing track" << track->prettyUrl() << "- played time (" << track->length() / 1000 << "*" << playedFraction << "s) shorter than 30 s"; return TooShort; } int playcount = qRound( playedFraction ); if( playcount <= 0 ) { debug() << "scrobble(): refusing track" << track->prettyUrl() << "- played " << "fraction (" << playedFraction * 100 << "%) less than 50 %"; return TooShort; } lastfm::MutableTrack lfmTrack; copyTrackMetadata( lfmTrack, track ); // since liblastfm >= 1.0.3 it interprets following extra property: lfmTrack.setExtra( "playCount", QString::number( playcount ) ); lfmTrack.setTimeStamp( time.isValid() ? time : QDateTime::currentDateTime() ); debug() << "scrobble: " << lfmTrack.artist() << "-" << lfmTrack.album() << "-" << lfmTrack.title() << "source:" << lfmTrack.source() << "duration:" << lfmTrack.duration(); m_scrobbler.cache( lfmTrack ); m_scrobbler.submit(); // since liblastfm 1.0.7, submit() is not called automatically upon cache() switch( lfmTrack.scrobbleStatus() ) { case lastfm::Track::Cached: case lastfm::Track::Submitted: return NoError; case lastfm::Track::Null: case lastfm::Track::Error: break; } return BadMetadata; }
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(); }
void CurrentEngine::trackPlaying( Meta::TrackPtr track ) { DEBUG_BLOCK m_lastQueryMaker = 0; if( m_requested.value( QLatin1String("current") ) ) update( track ); if( track && m_requested.value( QLatin1String("albums") ) ) update( track->album() ); }
bool LabelFilter::filterMatches( Meta::TrackPtr track ) const { foreach( const Meta::LabelPtr &label, track->labels() ) { if( m_expression.indexIn( label->name() ) != -1 ) return true; } return false; }
bool ScrobblerAdapter::isToBeSkipped( const Meta::TrackPtr &track ) const { Q_ASSERT( track ); if( !m_config->filterByLabel() ) return false; foreach( const Meta::LabelPtr &label, track->labels() ) if( label->name() == m_config->filteredLabel() ) return true; return false; }
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(); }
void CurrentEngine::metadataChanged( Meta::TrackPtr track ) { QVariantMap trackInfo = Meta::Field::mapFromTrack( track ); if( m_trackInfo != trackInfo ) { m_trackInfo = trackInfo; setData( "current", "current", trackInfo ); if( track && m_requested.value( QLatin1String("albums") ) ) update( track->album() ); } }