void DatabaseCommand_Resolve::exec( DatabaseImpl* lib ) { /* * Resolving is a 2 stage process. * 1) find list of trk/art/alb IDs that are reasonable matches to the metadata given * 2) find files in database by permitted sources and calculate score, ignoring * results that are less than MINSCORE */ if ( !m_query->resultHint().isEmpty() ) { qDebug() << "Using result-hint to speed up resolving:" << m_query->resultHint(); Tomahawk::result_ptr result = lib->resultFromHint( m_query ); if ( !result.isNull() && ( result->collection().isNull() || result->collection()->source()->isOnline() ) ) { QList<Tomahawk::result_ptr> res; res << result; emit results( m_query->id(), res ); return; } } if ( m_query->isFullTextQuery() ) fullTextResolve( lib ); else resolve( lib ); }
void MetadataEditor::loadResult( const Tomahawk::result_ptr& result ) { if ( result.isNull() ) return; m_result = result; setEditable( result->collection() && result->collection()->source()->isLocal() ); setTitle( result->track()->track() ); setArtist( result->track()->artist() ); setAlbum( result->track()->album() ); setAlbumPos( result->track()->albumpos() ); setDuration( result->track()->duration() ); setYear( result->track()->year() ); setBitrate( result->bitrate() ); if ( result->collection() && result->collection()->source()->isLocal() ) { QString furl = m_result->url(); if ( furl.startsWith( "file://" ) ) furl = furl.right( furl.length() - 7 ); QFileInfo fi( furl ); setFileName( fi.absoluteFilePath() ); setFileSize( TomahawkUtils::filesizeToString( fi.size() ) ); } setWindowTitle( result->track()->track() ); if ( m_interface ) { m_index = m_interface->indexOfResult( result ); if ( m_index >= 0 ) enablePushButtons(); } }
bool TrackProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { TrackModelItem* pi = itemFromIndex( sourceModel()->index( sourceRow, 0, sourceParent ) ); if ( !pi ) return false; const Tomahawk::query_ptr& q = pi->query(); if( q.isNull() ) // uh oh? filter out invalid queries i guess return false; Tomahawk::result_ptr r; if ( q->numResults() ) r = q->results().first(); if ( !m_showOfflineResults && !r.isNull() && !r->collection()->source()->isOnline() ) return false; if ( filterRegExp().isEmpty() ) return true; QStringList sl = filterRegExp().pattern().split( " ", QString::SkipEmptyParts ); foreach( QString s, sl ) { s = s.toLower(); if ( !r.isNull() ) { if ( !r->artist()->name().toLower().contains( s ) && !r->album()->name().toLower().contains( s ) && !r->track().toLower().contains( s ) ) { return false; } } else { if ( !q->artist().toLower().contains( s ) && !q->album().toLower().contains( s ) && !q->track().toLower().contains( s ) ) { return false; } } }
void DatabaseCommand_Resolve::exec( DatabaseImpl* lib ) { QList<Tomahawk::result_ptr> res; if ( !m_query->resultHint().isEmpty() ) { qDebug() << "Using result-hint to speed up resolving:" << m_query->resultHint(); Tomahawk::result_ptr result = lib->result( m_query->resultHint() ); if ( !result.isNull() && result->collection()->source()->isOnline() ) { res << result; emit results( m_query->id(), res ); return; } } /* Resolving is a 2 stage process. 1) find list of trk/art/alb IDs that are reasonable matches to the metadata given 2) find files in database by permitted sources and calculate score, ignoring results that are less than MINSCORE */ typedef QPair<int, float> scorepair_t; // STEP 1 QList< int > artists = lib->searchTable( "artist", m_query->artist(), 10 ); QList< int > tracks = lib->searchTable( "track", m_query->track(), 10 ); QList< int > albums = lib->searchTable( "album", m_query->album(), 10 ); if( artists.length() == 0 || tracks.length() == 0 ) { qDebug() << "No candidates found in first pass, aborting resolve" << m_query->artist() << m_query->track(); emit results( m_query->id(), res ); return; } // STEP 2 TomahawkSqlQuery files_query = lib->newquery(); QStringList artsl, trksl; foreach( int i, artists ) artsl.append( QString::number( i ) ); foreach( int i, tracks ) trksl.append( QString::number( i ) ); QString sql = QString( "SELECT " "url, mtime, size, md5, mimetype, duration, bitrate, file_join.artist, file_join.album, file_join.track, " "artist.name as artname, " "album.name as albname, " "track.name as trkname, " "file.source, " "file_join.albumpos, " "artist.id as artid, " "album.id as albid " "FROM file, file_join, artist, track " "LEFT JOIN album ON album.id = file_join.album " "WHERE " "artist.id = file_join.artist AND " "track.id = file_join.track AND " "file.id = file_join.file AND " "file_join.artist IN (%1) AND " "file_join.track IN (%2)" ) .arg( artsl.join( "," ) ) .arg( trksl.join( "," ) ); files_query.prepare( sql ); files_query.exec(); while( files_query.next() ) { Tomahawk::result_ptr result( new Tomahawk::Result() ); source_ptr s; const QString url_str = files_query.value( 0 ).toString(); if( files_query.value( 13 ).toUInt() == 0 ) { s = SourceList::instance()->getLocal(); result->setUrl( url_str ); } else { s = SourceList::instance()->get( files_query.value( 13 ).toUInt() ); if( s.isNull() ) { Q_ASSERT( false ); continue; } result->setUrl( QString( "servent://%1\t%2" ).arg( s->userName() ).arg( url_str ) ); } Tomahawk::artist_ptr artist = Tomahawk::Artist::get( files_query.value( 15 ).toUInt(), files_query.value( 10 ).toString(), s->collection() ); Tomahawk::album_ptr album = Tomahawk::Album::get( files_query.value( 16 ).toUInt(), files_query.value( 11 ).toString(), artist, s->collection() ); result->setModificationTime( files_query.value( 1 ).toUInt() ); result->setSize( files_query.value( 2 ).toUInt() ); result->setMimetype( files_query.value( 4 ).toString() ); result->setDuration( files_query.value( 5 ).toUInt() ); result->setBitrate( files_query.value( 6 ).toUInt() ); result->setArtist( artist ); result->setAlbum( album ); result->setTrack( files_query.value( 12 ).toString() ); result->setRID( uuid() ); result->setAlbumPos( files_query.value( 14 ).toUInt() ); result->setId( files_query.value( 9 ).toUInt() ); float score = how_similar( m_query, result ); result->setScore( score ); if( score < MINSCORE ) continue; result->setCollection( s->collection() ); res << result; } emit results( m_query->id(), res ); }
void AudioControls::onPlaybackLoading( const Tomahawk::result_ptr& result ) { if ( !m_currentTrack.isNull() ) { disconnect( m_currentTrack->toQuery().data(), SIGNAL( updated() ), this, SLOT( onCoverUpdated() ) ); disconnect( m_currentTrack->toQuery().data(), SIGNAL( socialActionsLoaded() ), this, SLOT( onSocialActionsLoaded() ) ); } m_currentTrack = result; connect( m_currentTrack->toQuery().data(), SIGNAL( updated() ), SLOT( onCoverUpdated() ) ); connect( m_currentTrack->toQuery().data(), SIGNAL( socialActionsLoaded() ), SLOT( onSocialActionsLoaded() ) ); ui->artistTrackLabel->setResult( result ); ui->albumLabel->setResult( result ); const QString duration = TomahawkUtils::timeToString( result.data()->duration() ); ui->timeLabel->setFixedWidth( ui->timeLabel->fontMetrics().width( QString( duration.length(), QChar( '0' ) ) ) ); ui->timeLabel->setText( TomahawkUtils::timeToString( 0 ) ); ui->timeLeftLabel->setFixedWidth( ui->timeLeftLabel->fontMetrics().width( QString( duration.length() + 1, QChar( '0' ) ) ) ); ui->timeLeftLabel->setText( "-" + duration ); m_lastTextSecondShown = 0; ui->stackedLayout->setCurrentWidget( ui->pauseButton ); ui->loveButton->setEnabled( true ); ui->loveButton->setVisible( true ); ui->socialButton->setEnabled( true ); ui->socialButton->setVisible( true ); ui->ownerButton->setEnabled( true ); ui->ownerButton->setVisible( true ); ui->timeLabel->setToolTip( tr( "Time Elapsed" ) ); ui->timeLeftLabel->setToolTip( tr( "Time Remaining" ) ); ui->shuffleButton->setToolTip( tr( "Shuffle" ) ); ui->repeatButton->setToolTip( tr( "Repeat" ) ); ui->socialButton->setToolTip( tr( "Share" ) ); ui->loveButton->setToolTip( tr( "Love" ) ); ui->ownerButton->setToolTip( QString( tr( "Playing from %1" ) ).arg( result->friendlySource() ) ); // If the ViewManager doesn't know a page for the current interface, we can't offer the jump link ui->artistTrackLabel->setJumpLinkVisible( ( ViewManager::instance()->pageForInterface( AudioEngine::instance()->currentTrackPlaylist() ) ) ); onControlStateChanged(); QPixmap sourceIcon = result->sourceIcon( TomahawkUtils::RoundedCorners, ui->ownerButton->size() ); if ( !sourceIcon.isNull() ) { ui->ownerButton->setPixmap( sourceIcon ); } else { ui->ownerButton->clear(); ui->ownerButton->setPixmap( TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultResolver, TomahawkUtils::Original, QSize( 34, 34 ) ) ); } if ( QUrl( result->linkUrl() ).isValid() || !result->collection().isNull() ) ui->ownerButton->setCursor( Qt::PointingHandCursor ); else ui->ownerButton->setCursor( Qt::ArrowCursor ); setCover(); setSocialActions(); }