/thirdparty/liblastfm2/src/types/User.cpp

http://github.com/tomahawk-player/tomahawk · C++ · 317 lines · 235 code · 54 blank · 28 comment · 9 complexity · 1cca4e4f5d0470d3b396cddd8990df01 MD5 · raw file

  1. /*
  2. Copyright 2009 Last.fm Ltd.
  3. - Primarily authored by Max Howell, Jono Cole and Doug Mansell
  4. This file is part of liblastfm.
  5. liblastfm is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. liblastfm is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with liblastfm. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "User.h"
  17. #include "Track.h"
  18. #include "../core/UrlBuilder.h"
  19. #include "../core/XmlQuery.h"
  20. #include <QStringList>
  21. #include <lastfm/UserList>
  22. #include <QAbstractNetworkCache>
  23. using lastfm::User;
  24. using lastfm::UserList;
  25. using lastfm::UserDetails;
  26. using lastfm::XmlQuery;
  27. using lastfm::ImageSize;
  28. User::User( const XmlQuery& xml )
  29. :AbstractType(), m_match( -1.0f )
  30. {
  31. m_name = xml["name"].text();
  32. m_images << xml["image size=small"].text()
  33. << xml["image size=medium"].text()
  34. << xml["image size=large"].text();
  35. m_realName = xml["realname"].text();
  36. }
  37. QUrl
  38. User::imageUrl( ImageSize size, bool square ) const
  39. {
  40. if( !square ) return m_images.value( size );
  41. QUrl url = m_images.value( size );
  42. QRegExp re( "/serve/(\\d*)s?/" );
  43. return QUrl( url.toString().replace( re, "/serve/\\1s/" ));
  44. }
  45. QMap<QString, QString>
  46. User::params(const QString& method) const
  47. {
  48. QMap<QString, QString> map;
  49. map["method"] = "user."+method;
  50. map["user"] = m_name;
  51. return map;
  52. }
  53. QNetworkReply*
  54. User::getFriends( bool recentTracks, int limit, int page ) const
  55. {
  56. QMap<QString, QString> map = params( "getFriends" );
  57. map["limit"] = QString::number( limit );
  58. map["page"] = QString::number( page );
  59. if ( recentTracks ) map["recenttracks"] = "1";
  60. return ws::get( map );
  61. }
  62. QNetworkReply*
  63. User::getFriendsListeningNow( int limit, int page ) const
  64. {
  65. QMap<QString, QString> map = params( "getFriendsListeningNow" );
  66. map["limit"] = QString::number( limit );
  67. map["page"] = QString::number( page );
  68. return ws::get( map );
  69. }
  70. QNetworkReply*
  71. User::getTopTags() const
  72. {
  73. return ws::get( params( "getTopTags" ) );
  74. }
  75. QNetworkReply*
  76. User::getTopArtists( QString period, int limit, int page ) const
  77. {
  78. QMap<QString, QString> map = params( "getTopArtists" );
  79. map["period"] = period;
  80. map["limit"] = QString::number( limit );
  81. map["page"] = QString::number( page );
  82. return ws::get( map );
  83. }
  84. QNetworkReply*
  85. User::getRecentArtists() const
  86. {
  87. return ws::get( params( "getRecentArtists" ) );
  88. }
  89. QNetworkReply*
  90. User::getRecentTracks( int limit , int page ) const
  91. {
  92. QMap<QString, QString> map = params( "getRecentTracks" );
  93. map["limit"] = QString::number( limit );
  94. map["page"] = QString::number( page );
  95. QAbstractNetworkCache* cache = lastfm::nam()->cache();
  96. if ( cache )
  97. cache->remove( lastfm::ws::url( map ) );
  98. return ws::get( map );
  99. }
  100. QNetworkReply*
  101. User::getRecentStations( int limit, int page ) const
  102. {
  103. QMap<QString, QString> map = params( "getRecentStations" );
  104. map["limit"] = QString::number( limit );
  105. map["page"] = QString::number( page );
  106. return ws::get( map );
  107. }
  108. QNetworkReply*
  109. User::getRecommendedArtists( int limit, int page ) const
  110. {
  111. QMap<QString, QString> map = params( "getRecommendedArtists" );
  112. map["limit"] = QString::number( limit );
  113. map["page"] = QString::number( page );
  114. return ws::get( map );
  115. }
  116. QNetworkReply*
  117. User::getNeighbours( int limit, int page ) const
  118. {
  119. QMap<QString, QString> map = params( "getNeighbours" );
  120. map["limit"] = QString::number( limit );
  121. map["page"] = QString::number( page );
  122. return ws::get( map );
  123. }
  124. QNetworkReply*
  125. User::getPlaylists() const
  126. {
  127. return ws::get( params( "getPlaylists" ) );
  128. }
  129. UserList //static
  130. User::list( QNetworkReply* r )
  131. {
  132. UserList users;
  133. try {
  134. XmlQuery lfm = r->readAll();
  135. foreach (XmlQuery e, lfm.children( "user" ))
  136. {
  137. User u( e );
  138. users += u;
  139. }
  140. users.total = lfm["friends"].attribute("total").toInt();
  141. users.page = lfm["friends"].attribute("page").toInt();
  142. users.perPage = lfm["friends"].attribute("perPage").toInt();
  143. users.totalPages = lfm["friends"].attribute("totalPages").toInt();
  144. }
  145. catch (ws::ParseError& e)
  146. {
  147. qWarning() << e.what();
  148. }
  149. return users;
  150. }
  151. QNetworkReply* //static
  152. UserDetails::getInfo( const QString& username )
  153. {
  154. QMap<QString, QString> map;
  155. map["method"] = "user.getInfo";
  156. map["user"] = username;
  157. return ws::post( map );
  158. }
  159. /*
  160. QNetworkReply* //static
  161. UserDetails::getRecommendedArtists()
  162. {
  163. QMap<QString, QString> map;
  164. map["method"] = "user.getRecommendedArtists";
  165. return ws::post( map );
  166. }
  167. */
  168. QUrl
  169. User::www() const
  170. {
  171. return UrlBuilder( "user" ).slash( m_name ).url();
  172. }
  173. UserDetails::UserDetails()
  174. : User()
  175. , m_age( 0 )
  176. , m_scrobbles( 0 )
  177. , m_registered( QDateTime() )
  178. , m_isSubscriber( false )
  179. , m_canBootstrap( false )
  180. {}
  181. UserDetails::UserDetails( QNetworkReply* reply )
  182. {
  183. try
  184. {
  185. XmlQuery user = XmlQuery( reply->readAll() )["user"];
  186. m_age = user["age"].text().toUInt();
  187. m_scrobbles = user["playcount"].text().toUInt();
  188. m_registered = QDateTime::fromTime_t(user["registered"].attribute("unixtime").toUInt());
  189. m_country = user["country"].text();
  190. m_isSubscriber = ( user["subscriber"].text() == "1" );
  191. m_canBootstrap = ( user["bootstrap"].text() == "1" );
  192. m_gender = user["gender"].text();
  193. m_realName = user["realname"].text();
  194. m_name = user["name"].text();
  195. m_images << user["image size=small"].text()
  196. << user["image size=medium"].text()
  197. << user["image size=large"].text();
  198. }
  199. catch (ws::ParseError& e)
  200. {
  201. qWarning() << e.what();
  202. }
  203. }
  204. QString
  205. UserDetails::getInfoString() const
  206. {
  207. QString text;
  208. text = QObject::tr("%1").arg( m_realName.isEmpty() ? m_name : m_realName );
  209. if ( m_age ) text.append( QObject::tr(", %1").arg( m_age ) );
  210. if ( m_gender.known() ) text.append( QObject::tr(", %1").arg( m_gender.toString() ) );
  211. if ( !m_country.isEmpty() ) text.append( QObject::tr(", %1").arg( m_country ) );
  212. if ( m_scrobbles ) text.append( QObject::tr(", %L1 scrobbles").arg( m_scrobbles ) );
  213. return text;
  214. }
  215. void
  216. UserDetails::setScrobbleCount( quint32 scrobbleCount )
  217. {
  218. m_scrobbles = scrobbleCount;
  219. }
  220. void
  221. UserDetails::setDateRegistered( const QDateTime& date )
  222. {
  223. m_registered = date;
  224. }
  225. void
  226. UserDetails::setImages( const QList<QUrl>& images )
  227. {
  228. m_images = images;
  229. }
  230. void
  231. UserDetails::setRealName( const QString& realName )
  232. {
  233. m_realName = realName;
  234. }
  235. void
  236. UserDetails::setAge( unsigned short age )
  237. {
  238. m_age = age;
  239. }
  240. void
  241. UserDetails::setIsSubscriber( bool subscriber )
  242. {
  243. m_isSubscriber = subscriber;
  244. }
  245. void
  246. UserDetails::setCanBootstrap( bool canBootstrap )
  247. {
  248. m_canBootstrap = canBootstrap;
  249. }
  250. void
  251. UserDetails::setGender( const QString& s )
  252. {
  253. m_gender = Gender( s );
  254. }
  255. void
  256. UserDetails::setCountry( const QString& country )
  257. {
  258. m_country = country;
  259. }