PlaylistItem::PlaylistItem( const MetaBundle &bundle, QListViewItem *lvi ) : KListViewItem( lvi->listView(), lvi->itemAbove(), filename( bundle.url() ) ) , m_url( bundle.url() ) , m_missing( false ) , m_enabled( true ) { setDragEnabled( true ); setText( bundle ); const int length = seconds().toInt(); listView()->m_totalCount++; listView()->m_totalLength += length; if( isSelected() ) { listView()->m_selCount++; listView()->m_selLength += length; } if( isVisible() ) { listView()->m_visCount++; listView()->m_visLength += length; } listView()->setFilterForItem( listView()->m_filter, this ); listView()->countChanged(); }
QString GenericMediaDevice::fileName( const MetaBundle &bundle ) { QString result = cleanPath( bundle.artist() ); if( !result.isEmpty() ) { if( m_spacesToUnderscores ) result += "_-_"; else result += " - "; } if( bundle.track() ) { result.sprintf( "%02d", bundle.track() ); if( m_spacesToUnderscores ) result += '_'; else result += ' '; } result += cleanPath( bundle.title() + '.' + bundle.type() ); return result; }
void App::engineNewMetaData( const MetaBundle &bundle, bool /*trackChanged*/ ) { amaroK::OSD::instance()->show( bundle ); if ( !bundle.prettyTitle().isEmpty() ) m_pPlaylistWindow->setCaption( "amaroK - " + bundle.veryNiceTitle() ); TrackToolTip::instance()->setTrack( bundle ); }
TagDialog::TagDialog( const MetaBundle& mb, PlaylistItem* item, QWidget* parent ) : TagDialogBase( parent ) , m_bundle( mb ) , m_score ( CollectionDB::instance()->getSongPercentage( mb.url().path() ) ) , m_playcount( CollectionDB::instance()->getPlayCount( mb.url().path() ) ) , m_firstPlay ( CollectionDB::instance()->getFirstPlay( mb.url().path() ) ) , m_lastPlay ( CollectionDB::instance()->getLastPlay( mb.url().path() ) ) , m_playlistItem( item ) , m_currentCover( 0 ) { init(); }
bool MetaBundle::operator==( const MetaBundle& bundle ) { return m_artist == bundle.artist() && m_title == bundle.title() && m_album == bundle.album() && m_year == bundle.year() && m_comment == bundle.comment() && m_genre == bundle.genre() && m_track == bundle.track() && m_bitrate == bundle.bitrate() && m_sampleRate == bundle.sampleRate(); }
void PlaylistItem::setText( const MetaBundle &bundle ) { for( int i = 0; i < NUM_COLUMNS; ++i ) setText( i, bundle.infoByColumn( i, true ) ); m_missing = !bundle.exists(); const int score = CollectionDB::instance()->getSongPercentage( bundle.url().path() ); if ( score ) setText( Score, QString::number( score ) ); const int playcount = CollectionDB::instance()->getPlayCount( bundle.url().path() ); if ( playcount ) setText( Playcount, QString::number( playcount ) ); else setText( Playcount, QString::number( 0 ) ); //Never played before. }
void TagDialog::fillSelected( KTRMResult selected ) //SLOT { #if HAVE_TUNEPIMP kdDebug() << k_funcinfo << endl; if ( m_bundle.url().path() == m_mbTrack ) { if ( !selected.title().isEmpty() ) kLineEdit_title->setText( selected.title() ); if ( !selected.artist().isEmpty() ) kComboBox_artist->setCurrentText( selected.artist() ); if ( !selected.album().isEmpty() ) kComboBox_album->setCurrentText( selected.album() ); if ( selected.track() != 0 ) kIntSpinBox_track->setValue( selected.track() ); if ( selected.year() != 0 ) kIntSpinBox_year->setValue( selected.year() ); } else { MetaBundle mb; mb.setPath( m_mbTrack ); if ( !selected.title().isEmpty() ) mb.setTitle( selected.title() ); if ( !selected.artist().isEmpty() ) mb.setArtist( selected.artist() ); if ( !selected.album().isEmpty() ) mb.setAlbum( selected.album() ); if ( selected.track() != 0 ) mb.setTrack( selected.track() ); if ( selected.year() != 0 ) mb.setYear( selected.year() ); storedTags.replace( m_mbTrack, mb ); } #endif }
void Reader::songListFinished( int /*id*/, bool error ) { ContentFetcher* http = (ContentFetcher*) sender(); disconnect( http, SIGNAL( requestFinished( int, bool ) ), this, SLOT( songListFinished( int, bool ) ) ); if( error ) { http->deleteLater(); return; } Map songResults = parse( http->results(), 0, true ); SongList result; QValueList<QVariant> songList; songList = songResults["adbs"].asList()[0].asMap()["mlcl"].asList()[0].asMap()["mlit"].asList(); debug() << "songList.count() = " << songList.count() << endl; QValueList<QVariant>::iterator it; for( it = songList.begin(); it != songList.end(); ++it ) { MetaBundle* bundle = new MetaBundle(); bundle->setTitle( (*it).asMap()["minm"].asList()[0].toString() ); //input url: daap://host:port/databaseId/music.ext bundle->setUrl( Amarok::QStringx("daap://%1:%2/%3/%4.%5").args( QStringList() << m_host << QString::number( m_port ) << m_databaseId << QString::number( (*it).asMap()["miid"].asList()[0].asInt() ) << (*it).asMap()["asfm"].asList()[0].asString() ) ); bundle->setLength( (*it).asMap()["astm"].asList()[0].toInt()/1000 ); bundle->setTrack( (*it).asMap()["astn"].asList()[0].toInt() ); QString album = (*it).asMap()["asal"].asList()[0].toString(); bundle->setAlbum( album ); QString artist = (*it).asMap()["asar"].asList()[0].toString(); bundle->setArtist( artist ); result[ artist.lower() ][ album.lower() ].append(bundle); bundle->setYear( (*it).asMap()["asyr"].asList()[0].toInt() ); bundle->setGenre( (*it).asMap()["asgn"].asList()[0].toString() ); } emit daapBundles( m_host , result ); http->deleteLater(); }
bool TagDialog::writeTag( MetaBundle mb, bool updateCB ) { QCString path = QFile::encodeName( mb.url().path() ); if ( !TagLib::File::isWritable( path ) ) { amaroK::StatusBar::instance()->longMessage( i18n( "The file %1 is not writable." ).arg( path ), KDE::StatusBar::Error ); return false; } //visual feedback QApplication::setOverrideCursor( KCursor::waitCursor() ); bool result = mb.save(); mb.updateFilesize(); if( result ) //update the collection db CollectionDB::instance()->updateTags( mb.url().path(), mb, updateCB ); QApplication::restoreOverrideCursor(); return result; }
/** * Called when the signal is received. */ void Scrobbler::engineNewMetaData( const MetaBundle& bundle, bool trackChanged ) { //debug() << "engineNewMetaData: " << bundle.artist() << ":" << bundle.album() << ":" << bundle.title() << ":" << trackChanged << endl; if ( !trackChanged ) { debug() << "It's still the same track." << endl; m_item->setArtist( bundle.artist() ); m_item->setAlbum( bundle.album() ); m_item->setTitle( bundle.title() ); return; } //to work around xine bug, we have to explictly prevent submission the first few seconds of a track //http://sourceforge.net/tracker/index.php?func=detail&aid=1401026&group_id=9655&atid=109655 m_timer.stop(); m_timer.start( 10000, true ); m_startPos = 0; // Plugins must not submit tracks played from online radio stations, even // if they appear to be providing correct metadata. if ( !bundle.streamUrl().isEmpty() ) { debug() << "Won't submit: It's a stream." << endl; m_validForSending = false; } else if( bundle.podcastBundle() != NULL ) { debug() << "Won't submit: It's a podcast." << endl; m_validForSending = false; } else { *m_item = SubmitItem( bundle.artist(), bundle.album(), bundle.title(), bundle.length() ); m_validForSending = true; // check length etc later } }
void EngineSubject::newMetaDataNotify( const MetaBundle &bundle, bool trackChanged ) { DEBUG_BLOCK QPtrListIterator<EngineObserver> it( Observers ); EngineObserver *observer; PodcastEpisodeBundle peb; MetaBundle b( bundle ); if( CollectionDB::instance()->getPodcastEpisodeBundle( bundle.url(), &peb ) ) { b.setPodcastBundle( peb ); } while( ( observer = it.current() ) != 0 ) { ++it; observer->engineNewMetaData( b, trackChanged ); } }
void TagDialog::readMultipleTracks() { //Check which fields are the same for all selected tracks const KURL::List::ConstIterator end = m_urlList.end(); KURL::List::ConstIterator it = m_urlList.begin(); m_bundle = MetaBundle(); MetaBundle first = bundleForURL( *it ); uint scoreFirst = CollectionDB::instance()->getSongPercentage( first.url().path() ); bool artist=true, album=true, genre=true, comment=true, year=true, score=true, composer=true, discNumber=true; for ( ; it != end; ++it ) { MetaBundle mb = bundleForURL( *it ); if( !mb.url().isLocalFile() ) { // If we have a non local file, don't even lose more time comparing, just leave artist = album = genre = comment = year = score = composer = discNumber = false; break; } if ( artist && mb.artist()!=first.artist() ) { artist=false; }; if ( album && mb.album()!=first.album() ) { album=false; }; if ( genre && mb.genre()!=first.genre() ) { genre=false; }; if ( comment && mb.comment()!=first.comment() ) { comment=false; }; if ( year && mb.year()!=first.year() ) { year=false; }; if ( composer && mb.composer()!=first.composer() ) { composer=false; }; if ( discNumber && mb.discNumber()!=first.discNumber() ) { discNumber=false; }; uint scoreCurrent = CollectionDB::instance()->getSongPercentage( mb.url().path() ); if ( score && scoreFirst != scoreCurrent ) score = false; if (!artist && !album && !genre && !comment && !year && !score && !composer && !discNumber) break; } // Set them in the dialog and in m_bundle ( so we don't break hasChanged() ) if (artist) { m_bundle.setArtist( first.artist() ); kComboBox_artist->setCurrentText( first.artist() ); } if (album) { m_bundle.setAlbum( first.album() ); kComboBox_album->setCurrentText( first.album() ); } if (genre) { m_bundle.setGenre( first.genre() ); kComboBox_genre->setCurrentText( first.genre() ); } if (comment) { m_bundle.setComment( first.comment() ); kTextEdit_comment->setText( first.comment() ); } if (composer) { m_bundle.setComposer( first.composer() ); kComboBox_composer->setCurrentText( first.composer() ); } if (year) { m_bundle.setYear( first.year() ); kIntSpinBox_year->setValue( first.year() ); } if (discNumber) { m_bundle.setDiscNumber( first.discNumber() ); kIntSpinBox_discNumber->setValue( first.discNumber() ); } if (score) { m_score = scoreFirst; kIntSpinBox_score->setValue( scoreFirst ); } m_currentURL = m_urlList.begin(); }
void TagDialog::applyToAllTracks() { const KURL::List::ConstIterator end = m_urlList.end(); for ( KURL::List::ConstIterator it = m_urlList.begin(); it != end; ++it ) { /* we have to update the values if they changed, so: 1) !kLineEdit_field->text().isEmpty() && kLineEdit_field->text() != mb.field i.e.: The user wrote something on the field, and it's different from what we have in the tag. 2) !m_bundle.field().isEmpty() && kLineEdit_field->text().isEmpty() i.e.: The user was shown some value for the field (it was the same for all selected tracks), and he deliberately emptied it. TODO: All this mess is because the dialog uses "" to represent what the user doesn't want to change, maybe we can think of something better? */ MetaBundle mb = bundleForURL( *it ); int changed = 0; if( !kComboBox_artist->currentText().isEmpty() && kComboBox_artist->currentText() != mb.artist() || kComboBox_artist->currentText().isEmpty() && !m_bundle.artist().isEmpty() ) { mb.setArtist( kComboBox_artist->currentText() ); changed |= TagDialog::TAGSCHANGED; } if( !kComboBox_album->currentText().isEmpty() && kComboBox_album->currentText() != mb.album() || kComboBox_album->currentText().isEmpty() && !m_bundle.album().isEmpty() ) { mb.setAlbum( kComboBox_album->currentText() ); changed |= TagDialog::TAGSCHANGED; } if( !kComboBox_genre->currentText().isEmpty() && kComboBox_genre->currentText() != mb.genre() || kComboBox_genre->currentText().isEmpty() && !m_bundle.genre().isEmpty() ) { mb.setGenre( kComboBox_genre->currentText() ); changed |= TagDialog::TAGSCHANGED; } if( !kTextEdit_comment->text().isEmpty() && kTextEdit_comment->text() != mb.comment() || kTextEdit_comment->text().isEmpty() && !m_bundle.comment().isEmpty() ) { mb.setComment( kTextEdit_comment->text() ); changed |= TagDialog::TAGSCHANGED; } if( !kComboBox_composer->currentText().isEmpty() && kComboBox_composer->currentText() != mb.composer() || kComboBox_composer->currentText().isEmpty() && !m_bundle.composer().isEmpty() ) { mb.setComposer( kComboBox_composer->currentText() ); changed |= TagDialog::TAGSCHANGED; } if( kIntSpinBox_year->value() && kIntSpinBox_year->value() != mb.year() || !kIntSpinBox_year->value() && m_bundle.year() ) { mb.setYear( kIntSpinBox_year->value() ); changed |= TagDialog::TAGSCHANGED; } if( kIntSpinBox_discNumber->value() && kIntSpinBox_discNumber->value() != mb.discNumber() || !kIntSpinBox_discNumber->value() && m_bundle.discNumber() ) { mb.setDiscNumber( kIntSpinBox_discNumber->value() ); changed |= TagDialog::TAGSCHANGED; } if( kIntSpinBox_score->value() && kIntSpinBox_score->value() != m_score || !kIntSpinBox_score->value() && m_score ) { m_score = kIntSpinBox_score->value(); changed |= TagDialog::SCORECHANGED; } storeTags( *it, changed, mb, m_score ); } }
void amaroK::TrayIcon::engineNewMetaData( const MetaBundle &bundle, bool /*trackChanged*/ ) { trackLength = bundle.length() * 1000; }
void TrackToolTip::setTrack( const MetaBundle &tags, bool force ) { if( force || m_tags != tags || m_tags.url() != tags.url() ) { m_haspos = false; m_tooltip = QString::null; QStringList left, right; const QString tableRow = "<tr><td width=70 align=right>%1:</td><td align=left>%2</td></tr>"; QString filename = "", title = ""; //special case these, put the first one encountered on top Playlist *playlist = Playlist::instance(); const int n = playlist->numVisibleColumns(); for( int i = 0; i < n; ++i ) { const int column = playlist->mapToLogicalColumn( i ); if( column == PlaylistItem::Score ) { const int score = CollectionDB::instance()->getSongPercentage( tags.url().path() ); if( score > 0 ) { right << QString::number( score ); left << playlist->columnText( column ); } } else if( column == PlaylistItem::Rating ) { const int rating = CollectionDB::instance()->getSongRating( tags.url().path() ); if( rating > 0 ) { QString s; for( int i = 0; i < rating / 2; ++i ) s += QString( "<img src=\"%1\" height=\"%2\" width=\"%3\">" ) .arg( locate( "data", "amarok/images/star.png" ) ) .arg( QFontMetrics( QToolTip::font() ).height() ) .arg( QFontMetrics( QToolTip::font() ).height() ); if( rating % 2 ) s += QString( "<img src=\"%1\" height=\"%2\" width=\"%3\">" ) .arg( locate( "data", "amarok/images/smallstar.png" ) ) .arg( QFontMetrics( QToolTip::font() ).height() ) .arg( QFontMetrics( QToolTip::font() ).height() ); right << s; left << playlist->columnText( column ); } } else if( column == PlaylistItem::PlayCount ) { const int count = CollectionDB::instance()->getPlayCount( tags.url().path() ); if( count > 0 ) { right << QString::number( count ); left << playlist->columnText( column ); } } else if( column == PlaylistItem::LastPlayed ) { const uint lastPlayed = CollectionDB::instance()->getLastPlay( tags.url().path() ).toTime_t(); right << amaroK::verboseTimeSince( lastPlayed ); left << playlist->columnText( column ); } else if( column == PlaylistItem::Filename && title.isEmpty() ) filename = tags.prettyText( column ); else if( column == PlaylistItem::Title && filename.isEmpty() ) title = tags.prettyText( column ); else if( column != PlaylistItem::Length ) { const QString tag = tags.prettyText( column ); if( !tag.isEmpty() ) { right << tag; left << playlist->columnText( column ); } } } if( !filename.isEmpty() ) { right.prepend( filename ); left.prepend( playlist->columnText( PlaylistItem::Filename ) ); } else if( !title.isEmpty() ) { right.prepend( title ); left.prepend( playlist->columnText( PlaylistItem::Title ) ); } if( tags.length() > 0 ) //special case this too, always on the bottom { m_haspos = true; right << "%9 / " + tags.prettyLength(); left << playlist->columnText( PlaylistItem::Length ); } //NOTE it seems to be necessary to <center> each element indivdually m_tooltip += "<center><b>Amarok</b></center><table cellpadding='2' cellspacing='2' align='center'><tr>"; m_tooltip += "%1"; //the cover gets substituted in, in tooltip() m_cover = CollectionDB::instance()->podcastImage( tags ); if( m_cover.isEmpty() || m_cover.contains( "nocover" ) != -1 ) { m_cover = CollectionDB::instance()->albumImage( tags ); if ( m_cover == CollectionDB::instance()->notAvailCover() ) m_cover = QString::null; } m_tooltip += "<td><table cellpadding='0' cellspacing='0'>"; if (tags.title().isEmpty() || tags.artist().isEmpty()) // no title or no artist, so we add prettyTitle m_tooltip += QString ("<tr><td align=center colspan='2'>%1</td></tr>") .arg(tags.veryNiceTitle()); for( uint x = 0; x < left.count(); ++x ) if ( !right[x].isEmpty() ) m_tooltip += tableRow.arg( left[x] ).arg( right[x] ); m_tooltip += "</table></td>"; m_tooltip += "</tr></table></center>"; m_tags = tags; updateWidgets(); } }