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 + -
显示快捷键?