lastfm.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,099 行 · 第 1/3 页
CPP
1,099 行
} QStringList friends; QString user = document.elementsByTagName( "friends" ).item( 0 ).attributes().namedItem( "user" ).nodeValue(); QDomNodeList values = document.elementsByTagName( "user" ); for ( uint i = 0; i < values.count(); i++ ) { friends << values.item( i ).attributes().namedItem( "username" ).nodeValue(); } emit friendsResult( user, friends );}voidWebService::neighbours( QString username ){ if ( username.isEmpty() ) username = m_username; AmarokHttp *http = new AmarokHttp( m_baseHost, 80, this ); connect( http, SIGNAL( requestFinished( bool ) ), this, SLOT( neighboursFinished( bool ) ) ); http->get( QString( "/1.0/user/%1/neighbours.xml" ) .arg( QString( QUrl( username ).encodedPathAndQuery() ) ) );}voidWebService::neighboursFinished( int /*id*/, bool error ) //SLOT{ AmarokHttp* http = (AmarokHttp*) sender(); http->deleteLater(); if( error ) return; QDomDocument document; document.setContent( http->readAll() ); if ( document.elementsByTagName( "neighbours" ).length() == 0 ) { emit friendsResult( QString( "" ), QStringList() ); return; } QStringList neighbours; QString user = document.elementsByTagName( "neighbours" ).item( 0 ).attributes().namedItem( "user" ).nodeValue(); QDomNodeList values = document.elementsByTagName( "user" ); for ( uint i = 0; i < values.count(); i++ ) { neighbours << values.item( i ).attributes().namedItem( "username" ).nodeValue(); } emit neighboursResult( user, neighbours );}voidWebService::userTags( QString username ){ if ( username.isEmpty() ) username = m_username; AmarokHttp *http = new AmarokHttp( m_baseHost, 80, this ); connect( http, SIGNAL( requestFinished( bool ) ), this, SLOT( userTagsFinished( bool ) ) ); http->get( QString( "/1.0/user/%1/tags.xml?debug=%2" ) .arg( QString( QUrl( username ).encodedPathAndQuery() ) ) );}voidWebService::userTagsFinished( int /*id*/, bool error ) //SLOT{ AmarokHttp* http = (AmarokHttp*) sender(); http->deleteLater(); if( error ) return; QDomDocument document; document.setContent( http->readAll() ); if ( document.elementsByTagName( "toptags" ).length() == 0 ) { emit userTagsResult( QString(), QStringList() ); return; } QStringList tags; QDomNodeList values = document.elementsByTagName( "tag" ); QString user = document.elementsByTagName( "toptags" ).item( 0 ).attributes().namedItem( "user" ).nodeValue(); for ( uint i = 0; i < values.count(); i++ ) { QDomNode item = values.item( i ).namedItem( "name" ); tags << item.toElement().text(); } emit userTagsResult( user, tags );}voidWebService::recentTracks( QString username ){ if ( username.isEmpty() ) username = m_username; AmarokHttp *http = new AmarokHttp( m_baseHost, 80, this ); connect( http, SIGNAL( requestFinished( bool ) ), this, SLOT( recentTracksFinished( bool ) ) ); http->get( QString( "/1.0/user/%1/recenttracks.xml" ) .arg( QString( QUrl( username ).encodedPathAndQuery() ) ) );}voidWebService::recentTracksFinished( int /*id*/, bool error ) //SLOT{ AmarokHttp* http = (AmarokHttp*) sender(); http->deleteLater(); if( error ) return; QValueList< QPair<QString, QString> > songs; QDomDocument document; document.setContent( http->readAll() ); if ( document.elementsByTagName( "recenttracks" ).length() == 0 ) { emit recentTracksResult( QString(), songs ); return; } QDomNodeList values = document.elementsByTagName( "track" ); QString user = document.elementsByTagName( "recenttracks" ).item( 0 ).attributes().namedItem( "user" ).nodeValue(); for ( uint i = 0; i < values.count(); i++ ) { QPair<QString, QString> song; song.first = values.item( i ).namedItem( "artist" ).toElement().text(); song.second = values.item( i ).namedItem( "name" ).toElement().text(); songs << song; } emit recentTracksResult( user, songs );}voidWebService::recommend( int type, QString username, QString artist, QString token ){ QString modeToken = ""; switch ( type ) { case 0: modeToken = QString( "artist_name=%1" ).arg( QString( QUrl( artist ).encodedPathAndQuery() ) ); break; case 1: modeToken = QString( "album_artist=%1&album_name=%2" ) .arg( QString( QUrl( artist ).encodedPathAndQuery() ) ) .arg( QString( QUrl( token ).encodedPathAndQuery() ) ); break; case 2: modeToken = QString( "track_artist=%1&track_name=%2" ) .arg( QString( QUrl( artist ).encodedPathAndQuery() ) ) .arg( QString( QUrl( token ).encodedPathAndQuery() ) ); break; } QHttp *http = new QHttp( "wsdev.audioscrobbler.com", 80, this ); connect( http, SIGNAL( requestFinished( bool ) ), this, SLOT( recommendFinished( bool ) ) ); uint currentTime = QDateTime::currentDateTime( Qt::UTC ).toTime_t(); QString challenge = QString::number( currentTime ); QCString md5pass = KMD5( KMD5( m_password.utf8() ).hexDigest() + currentTime ).hexDigest(); token = QString( "user=%1&auth=%2&nonce=%3recipient=%4" ) .arg( QString( QUrl( currentUsername() ).encodedPathAndQuery() ) ) .arg( QString( QUrl( md5pass ).encodedPathAndQuery() ) ) .arg( QString( QUrl( challenge ).encodedPathAndQuery() ) ) .arg( QString( QUrl( username ).encodedPathAndQuery() ) ); QHttpRequestHeader header( "POST", "/1.0/rw/recommend.php?" + token.utf8() ); header.setValue( "Host", "wsdev.audioscrobbler.com" ); header.setContentType( "application/x-www-form-urlencoded" ); http->request( header, modeToken.utf8() );}voidWebService::recommendFinished( int /*id*/, bool /*error*/ ) //SLOT{ AmarokHttp* http = (AmarokHttp*) sender(); http->deleteLater(); debug() << "Recommendation:" << http->readAll() << endl;}QStringWebService::parameter( const QString keyName, const QString data ) const{ QStringList list = QStringList::split( '\n', data ); for ( uint i = 0; i < list.size(); i++ ) { QStringList values = QStringList::split( '=', list[i] ); if ( values[0] == keyName ) { values.remove( values.at(0) ); return QString::fromUtf8( values.join( "=" ).ascii() ); } } return QString( "" );}QStringListWebService::parameterArray( const QString keyName, const QString data ) const{ QStringList result; QStringList list = QStringList::split( '\n', data ); for ( uint i = 0; i < list.size(); i++ ) { QStringList values = QStringList::split( '=', list[i] ); if ( values[0].startsWith( keyName ) ) { values.remove( values.at(0) ); result.append( QString::fromUtf8( values.join( "=" ).ascii() ) ); } } return result;}QStringListWebService::parameterKeys( const QString keyName, const QString data ) const{ QStringList result; QStringList list = QStringList::split( '\n', data ); for ( uint i = 0; i < list.size(); i++ ) { QStringList values = QStringList::split( '=', list[i] ); if ( values[0].startsWith( keyName ) ) { values = QStringList::split( '[', values[0] ); values = QStringList::split( ']', values[1] ); result.append( values[0] ); } } return result;}voidWebService::showError( int code, QString message ){ switch ( code ) { case E_NOCONTENT: message = i18n( "There is not enough content to play this station." ); break; case E_NOMEMBERS: message = i18n( "This group does not have enough members for radio." ); break; case E_NOFANS: message = i18n( "This artist does not have enough fans for radio." ); break; case E_NOAVAIL: message = i18n( "This item is not available for streaming." ); break; case E_NOSUBSCRIBER: message = i18n( "This feature is only available to last.fm subscribers." ); break; case E_NONEIGHBOURS: message = i18n( "There are not enough neighbors for this radio." ); break; case E_NOSTOPPED: message = i18n( "This stream has stopped. Please try another station." ); break; default: if( message.isEmpty() ) message = i18n( "Failed to play this last.fm stream." ); } Amarok::StatusBar::instance()->longMessage( message, KDE::StatusBar::Sorry );}////////////////////////////////////////////////////////////////////////////////// CLASS LastFm::Bundle////////////////////////////////////////////////////////////////////////////////Bundle::Bundle( const Bundle& lhs ) : m_imageUrl( lhs.m_imageUrl ) , m_albumUrl( lhs.m_albumUrl ) , m_artistUrl( lhs.m_artistUrl ) , m_titleUrl( lhs.m_titleUrl ){}void Bundle::detach() { m_imageUrl = QDeepCopy<QString>(m_imageUrl); m_albumUrl = QDeepCopy<QString>(m_albumUrl); m_artistUrl = QDeepCopy<QString>(m_artistUrl); m_titleUrl = QDeepCopy<QString>(m_titleUrl);}////////////////////////////////////////////////////////////////////////////////// CLASS LastFm::LoginDialog////////////////////////////////////////////////////////////////////////////////LoginDialog::LoginDialog( QWidget *parent ) : KDialogBase( parent, "LastfmLogin", true, QString::null, Ok|Cancel){ makeGridMainWidget( 1, Qt::Horizontal ); new QLabel( i18n( "To use last.fm with Amarok, you need a last.fm profile." ), mainWidget() ); makeGridMainWidget( 2, Qt::Horizontal ); QLabel *nameLabel = new QLabel( i18n("&Username:"), mainWidget() ); m_userLineEdit = new KLineEdit( mainWidget() ); nameLabel->setBuddy( m_userLineEdit ); QLabel *passLabel = new QLabel( i18n("&Password:"), mainWidget() ); m_passLineEdit = new KLineEdit( mainWidget() ); m_passLineEdit->setEchoMode( QLineEdit::Password ); passLabel->setBuddy( m_passLineEdit ); m_userLineEdit->setFocus();}void LoginDialog::slotOk(){ AmarokConfig::setScrobblerUsername( m_userLineEdit->text() ); AmarokConfig::setScrobblerPassword( m_passLineEdit->text() ); KDialogBase::slotOk();}////////////////////////////////////////////////////////////////////////////////// CLASS LastFm::CustomStationDialog////////////////////////////////////////////////////////////////////////////////CustomStationDialog::CustomStationDialog( QWidget *parent ) : KDialogBase( parent, "LastfmCustomStation", true, i18n( "Create Custom Station" ) , Ok|Cancel){ makeVBoxMainWidget(); new QLabel( i18n( "Enter the name of a band or artist you like:" ), mainWidget() ); m_edit = new KLineEdit( mainWidget(), "CustomStationEdit" ); m_edit->setFocus();}QStringCustomStationDialog::text() const{ return m_edit->text();}#include "lastfm.moc"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?