/* Copyright 2009 Last.fm Ltd. This file is part of liblastfm. liblastfm is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. liblastfm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with liblastfm. If not, see . */ #include "RadioStation.h" #include "XmlQuery.h" #include #include #include const float k_defaultRep(0.5); const float k_defaultMainstr(0.5); const bool k_defaultDisco(false); class lastfm::RadioStationData : public QSharedData { public: QUrl m_url; QString m_title; QString m_tagFilter; float m_rep; float m_mainstr; bool m_disco; }; lastfm::RadioStation::RadioStation() : d( new RadioStationData ) { } lastfm::RadioStation::RadioStation( const QString& s ) : d( new RadioStationData ) { // If it's a tag filtered station then extract that part QString tempString = s; if ( !tempString.startsWith("lastfm://tag/") ) { int index = tempString.indexOf("/tag/"); if ( index != -1 ) { d->m_tagFilter = tempString.mid( index + 5, tempString.count() - (index + 5) ); tempString = tempString.mid( 0, index ); } } d->m_url = tempString; } lastfm::RadioStation::RadioStation( const RadioStation& other ) : d(other.d) { } lastfm::RadioStation& lastfm::RadioStation::operator=( const RadioStation& that ) { d = that.d; return *this; } lastfm::RadioStation::~RadioStation() { } lastfm::RadioStation lastfm::RadioStation::library( const lastfm::User& user ) { QList users; users << user; return library( users ); } lastfm::RadioStation lastfm::RadioStation::library( QList& users ) { qSort(users.begin(), users.end()); QString url = (users.count() > 1) ? "lastfm://users/" : "lastfm://user/"; url.append( users[0].name() ); for ( int i = 1 ; i < users.count() ; ++i ) url.append( "," + users[i].name() ); url.append("/personal"); RadioStation s( url ); if( users.count() != 1 ) { QString title; for( QList::const_iterator i = users.constBegin(); i != users.constEnd(); i++ ) { if( i == users.constEnd() - 1 ) title += " and " + *i; else title += ", " + *i; } s.setTitle( title ); } return s; } lastfm::RadioStation lastfm::RadioStation::recommendations( const lastfm::User& user ) { return RadioStation( "lastfm://user/" + user + "/recommended" ); } lastfm::RadioStation lastfm::RadioStation::friends( const lastfm::User& user ) { return RadioStation( "lastfm://user/" + user + "/friends" ); } lastfm::RadioStation lastfm::RadioStation::neighbourhood( const lastfm::User& user ) { return RadioStation( "lastfm://user/" + user + "/neighbours" ); } lastfm::RadioStation lastfm::RadioStation::tag( const lastfm::Tag& tag ) { QList tags; tags << tag; return lastfm::RadioStation::tag( tags ); } lastfm::RadioStation lastfm::RadioStation::tag( QList& tag ) { qSort(tag.begin(), tag.end()); QString url = (tag.count() > 1) ? "lastfm://tag/" : "lastfm://globaltags/"; url.append( tag[0].name() ); for ( int i = 1 ; i < tag.count() ; ++i ) url.append( "*" + tag[i].name() ); return RadioStation( url ); } lastfm::RadioStation lastfm::RadioStation::similar( const lastfm::Artist& artist ) { QList artists; artists << artist; return similar( artists ); } lastfm::RadioStation lastfm::RadioStation::similar( QList& artists ) { qSort(artists.begin(), artists.end()); QString url = (artists.count() > 1) ? "lastfm://artistnames/" : "lastfm://artist/"; url.append( artists[0].name() ); for ( int i = 1 ; i < artists.count() ; ++i ) url.append( "," + artists[i].name() ); if (artists.count() == 1) url.append( "/similarartists" ); return RadioStation( url ); } lastfm::RadioStation lastfm::RadioStation::mix( const lastfm::User& user ) { return RadioStation( "lastfm://user/" + user + "/mix" ); } QString lastfm::RadioStation::url() const { return d->m_url.toString() + (d->m_tagFilter.isEmpty() ? "" : "/tag/" + d->m_tagFilter); } void lastfm::RadioStation::setTitle( const QString& title ) { // Stop the radio station getting renamed when the web services don't know what it's called if ( !d->m_title.isEmpty() && title.compare( "a radio station", Qt::CaseInsensitive ) == 0 ) return; // do not rename the current user's stations if they already have a name if ( !d->m_title.isEmpty() && d->m_url.toString().startsWith( "lastfm://user/" + User().name() ) ) return; d->m_title = title.trimmed(); } void lastfm::RadioStation::setUrl( const QString& url ) { d->m_url = url; } QString lastfm::RadioStation::title() const { return d->m_title; // + (d->m_tagFilter.isEmpty() ? "" : ": " + d->m_tagFilter); } void lastfm::RadioStation::setTagFilter( const QString& tag ) { d->m_tagFilter = tag; } QNetworkReply* lastfm::RadioStation::getSampleArtists( int limit ) const { QMap map; map["method"] = "radio.getSampleArtists"; map["station"] = d->m_url.toString(); map["limit"] = QString::number( limit ); return ws::get( map ); } QNetworkReply* lastfm::RadioStation::getTagSuggestions( int limit ) const { QMap map; map["method"] = "radio.getTagSuggestions"; map["station"] = d->m_url.toString(); map["limit"] = QString::number( limit ); return ws::get( map ); } bool lastfm::RadioStation::isLegacyPlaylist() const { return d->m_url.toString().startsWith( "lastfm://play/" ) || d->m_url.toString().startsWith( "lastfm://preview/" ) || d->m_url.toString().startsWith( "lastfm://track/" ) || d->m_url.toString().startsWith( "lastfm://playlist/" ); } //static QList lastfm::RadioStation::list( QNetworkReply* r ) { QList result; XmlQuery lfm; if ( lfm.parse( r ) ) { foreach (XmlQuery xq, lfm.children("station")) { lastfm::RadioStation rs( QUrl::fromPercentEncoding( xq["url"].text().toUtf8() ) ); rs.setTitle(xq["name"].text()); result.append(rs); } } else { qWarning() << lfm.parseError().message(); } return result; } bool lastfm::RadioStation::operator==( const RadioStation& that ) const { return this->d->m_url == that.d->m_url && this->d->m_tagFilter == that.d->m_tagFilter; } void lastfm::RadioStation::setRep(float rep) { d->m_rep = rep; } void lastfm::RadioStation::setMainstr(float mainstr) { d->m_mainstr = mainstr; } void lastfm::RadioStation::setDisco(bool disco) { d->m_disco = disco; } float lastfm::RadioStation::rep() const { return d->m_rep; } float lastfm::RadioStation::mainstr() const { return d->m_mainstr; } bool lastfm::RadioStation::disco() const { return d->m_disco; } QDebug operator<<( QDebug d, const lastfm::RadioStation& station ) { return d << station.url(); }