TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicmainrecommendrequest.cpp
Go to the documentation of this file.
3 
4 
5 static constexpr const char *NEW_ALBUM_URL = "VC9sOTJXRzdLc0dYWWVtbmdsSUJnNFlYeDFqZ2gyd3Y5c1ZNdjBEeldpR25qSExSWWJqdVRkWmdoSmM9";
6 static constexpr const char *NEW_ALBUM_DATA_URL = "N1VpQldOeUpVZFp3REZNczdrOHZXK0JpbjJkYjEveENIQmdaYlNhOWkyWUlrRWVYSnhCZTdBRS9SenFVVG11d0JHVXZ0NW1kTEdaeG4xeFc=";
7 
8 static constexpr const char *ARTIST_URL = "c1l3a204QlJmWnJ0WVhxOTZlNU9RdWJVeGZRWDIvaU83RWxWTTIrRW84aExRajVWWEZXMnJmZlowRFpmWFdEV2NoM29IQT09";
9 static constexpr const char *ARTIST_DATA_URL = "TG9pYmlKeWRiaG45TFlHalhUNWtzYUxDUEZZL0VVdGJEOFlTTkFuaWdmb3hDempSRUMwNkJmSkdpeFU9";
10 
11 
12 static constexpr const char *PLAYLIST_URL = "Z3N3cXVjb1ZoV2pxRVY1d1RoSStuMXp3MGsreUVPRVNtQjVNMUR2WXgwWHJrTHBlODYxcFJpUnozbGlCNTBzYkF4eFRNMDd0dHk2eEF3WkVnc3hVdlE9PQ==";
13 static constexpr const char *PLAYLIST_DATA_URL = "dEZwUWp1MTJ6a2xaNytOOWZ5U1h1dFB5V0pUbkl6TXR0d3BmazkvYTM3ND0=";
14 
15 static constexpr const char *PLAYLIST_HQ_URL = "bUZ0V2JxeUFxWFF6U3MxVUcrZklyUGhPc245MEF2TVlHVnNGdnZNVjZTWVJ6RmN1ZGZZNGFScWJsWCt3b1h6YnhYSFA4ZVQ2SC85N1Y4eFp3ZVhjNkZuUlNHTT0=";
16 static constexpr const char *PLAYLIST_HQ_DATA_URL = "MUlkMGR1NU00VzZJbjh1algwclpzY1NNTngzREN3TEoxUExOWVVmbDdPUTZlKzJOeFkwUjdGeUlRaDNGd2JoSzhBcEdtVk5paVc1VnFOdEE=";
17 
18 
21 {
24 }
25 
27 {
28  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
29 
30  deleteAll();
32 
33  QNetworkRequest request;
34  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
36  TTK::Algorithm::mdII(NEW_ALBUM_DATA_URL, false).arg(m_queryValue).arg(offset).arg(m_pageSize));
37 
38  m_reply = m_manager.post(request, parameter);
39  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
41 }
42 
44 {
45  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
46 
47  m_queryValue = value;
48  startToPage(0);
49 }
50 
52 {
53  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
54 
59 
62 }
63 
65 {
66  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
67 
69  if(m_reply && m_reply->error() == QNetworkReply::NoError)
70  {
71  QJsonParseError ok;
72  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
74  {
75  QVariantMap value = json.toVariant().toMap();
76  if(value["code"].toInt() == 200 && value.contains("albums"))
77  {
78  m_totalSize = value["total"].toInt();
79 
80  const QVariantList &datas = value["albums"].toList();
81  for(const QVariant &var : qAsConst(datas))
82  {
83  if(var.isNull())
84  {
85  continue;
86  }
87 
88  value = var.toMap();
90 
92  item.m_id = value["id"].toString();
93  item.m_name = TTK::String::charactersReplace(value["name"].toString());
94  item.m_coverUrl = value["picUrl"].toString();
95  item.m_nickName.clear();
96 
97  const QVariantList &artistsArray = value["artists"].toList();
98  for(const QVariant &artistValue : qAsConst(artistsArray))
99  {
100  if(artistValue.isNull())
101  {
102  continue;
103  }
104 
105  const QVariantMap &artistObject = artistValue.toMap();
106  item.m_nickName = ReqWYInterface::makeSongArtist(item.m_nickName, artistObject["name"].toString());
107  }
108 
109  Q_EMIT createAlbumItem(item);
110  }
111  }
112  }
113  }
114 
115  Q_EMIT downloadDataChanged({});
116  deleteAll();
117 }
118 
119 
121  : MusicAbstractQueryRequest(parent)
122 {
125  m_totalSize = 100;
126 }
127 
129 {
130  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
131 
132  deleteAll();
134 
135  QNetworkRequest request;
136  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
138  TTK::Algorithm::mdII(ARTIST_DATA_URL, false).arg(m_pageSize * offset).arg(m_pageSize));
139 
140  m_reply = m_manager.post(request, parameter);
141  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
143 }
144 
146 {
147  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
148 
149  m_queryValue = value;
150  startToPage(0);
151 }
152 
154 {
155  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
156 
161 
162  fetchUrlPathSize(&info->m_songProps, info->m_duration);
164 }
165 
167 {
168  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
169 
171  if(m_reply && m_reply->error() == QNetworkReply::NoError)
172  {
173  QJsonParseError ok;
174  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
176  {
177  QVariantMap value = json.toVariant().toMap();
178  if(value["code"].toInt() == 200 && value.contains("artists"))
179  {
180  const QVariantList &datas = value["artists"].toList();
181  for(const QVariant &var : qAsConst(datas))
182  {
183  if(var.isNull())
184  {
185  continue;
186  }
187 
188  value = var.toMap();
190 
191  MusicResultDataItem item;
192  item.m_coverUrl = value["picUrl"].toString();
193  item.m_id = value["id"].toString();
194  item.m_name = value["name"].toString();
195  Q_EMIT createArtistItem(item);
196  }
197  }
198  }
199  }
200 
201  Q_EMIT downloadDataChanged({});
202  deleteAll();
203 }
204 
205 
207  : MusicAbstractQueryRequest(parent)
208 {
212 }
213 
215 {
216  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
217 
218  deleteAll();
220 
221  QNetworkRequest request;
222  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
225 
226  m_reply = m_manager.post(request, parameter);
227  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
229 }
230 
232 {
233  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
234 
235  m_queryValue = value;
236  startToPage(0);
237 }
238 
240 {
241  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
242 
247 
248  fetchUrlPathSize(&info->m_songProps, info->m_duration);
250 }
251 
253 {
254  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
255 
257  if(m_reply && m_reply->error() == QNetworkReply::NoError)
258  {
259  QJsonParseError ok;
260  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
262  {
263  QVariantMap value = json.toVariant().toMap();
264  if(value["code"].toInt() == 200 && value.contains("result"))
265  {
266  const QVariantList &datas = value["result"].toList();
267  for(const QVariant &var : qAsConst(datas))
268  {
269  if(var.isNull())
270  {
271  continue;
272  }
273 
274  value = var.toMap();
276 
277  MusicResultDataItem item;
278  item.m_coverUrl = value["picUrl"].toString();
279  item.m_id = value["id"].toString();
280  item.m_name = value["name"].toString();
281  item.m_nickName = "热门歌单推荐";
282  Q_EMIT createPlaylistItem(item);
283  }
284  }
285  }
286  }
287 
288  Q_EMIT downloadDataChanged({});
289  deleteAll();
290 }
291 
292 
294  : MusicAbstractQueryRequest(parent)
295 {
298 }
299 
301 {
302  if(offset == 0)
303  {
304  if(--m_pageIndex < 0)
305  {
306  m_pageIndex = 0;
307  }
308  }
309  else if(m_more && m_updateTime.contains(m_pageIndex + 1))
310  {
311  ++m_pageIndex;
312  }
313 
314  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << m_pageIndex);
315 
316  deleteAll();
317  const qint64 time = m_updateTime[m_pageIndex];
318 
319  QNetworkRequest request;
320  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
323 
324  m_reply = m_manager.post(request, parameter);
325  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
327 }
328 
330 {
331  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
332 
333  m_more = true;
334  m_updateTime.clear();
335  m_updateTime[0] = 0;
336  m_pageIndex = 0;
337  m_queryValue = value;
338  startToPage(0);
339 }
340 
342 {
343  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
344 
349 
350  fetchUrlPathSize(&info->m_songProps, info->m_duration);
352 }
353 
355 {
356  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
357 
359  if(m_reply && m_reply->error() == QNetworkReply::NoError)
360  {
361  QJsonParseError ok;
362  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
364  {
365  QVariantMap value = json.toVariant().toMap();
366  if(value["code"].toInt() == 200 && value.contains("playlists"))
367  {
368  m_totalSize = value["total"].toInt();
369  if(m_totalSize > m_pageSize * 2)
370  {
371  m_totalSize = m_pageSize * 2;
372  }
373 
374  m_more = value["more"].toBool();
375  m_updateTime[m_pageIndex + 1] = value["lasttime"].toLongLong();
376 
377  const QVariantList &datas = value["playlists"].toList();
378  for(const QVariant &var : qAsConst(datas))
379  {
380  if(var.isNull())
381  {
382  continue;
383  }
384 
385  value = var.toMap();
387 
388  MusicResultDataItem item;
389  item.m_coverUrl = value["coverImgUrl"].toString();
390  item.m_id = value["id"].toString();
391  item.m_name = value["name"].toString();
392 
393  value = value["creator"].toMap();
394  item.m_nickName = value["nickname"].toString();
395  Q_EMIT createPlaylistItem(item);
396  }
397  }
398  }
399  }
400 
401  Q_EMIT downloadDataChanged({});
402  deleteAll();
403 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
static constexpr const char * PLAYLIST_HQ_URL
static constexpr const char * ARTIST_URL
#define TTK_NETWORK_QUERY_CHECK(VALUE)
The class of the search result data item.
virtual void deleteAll()
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
QNetworkReply * m_reply
static constexpr const char * PLAYLIST_HQ_DATA_URL
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
#define TTK_PAGE_SIZE_30
QString makeSongArtist(const QString &in, const QString &name)
virtual void startToSearch(const QString &value) overridefinal
static constexpr const char * ARTIST_DATA_URL
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
static constexpr const char * PLAYLIST_URL
void createPlaylistItem(const MusicResultDataItem &item)
virtual void startToSearch(const QString &value) overridefinal
static constexpr const char * NEW_ALBUM_DATA_URL
voidpf uLong offset
Definition: ioapi.h:142
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate)
ParseError error
virtual void downloadFinished() overridefinal
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
#define qAsConst
Definition: ttkqtglobal.h:57
static constexpr const char * QUERY_WY_INTERFACE
MusicPlaylistHQRecommendRequest(QObject *parent=nullptr)
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
virtual void startToSearch(const QString &value) overridefinal
virtual void startToPage(int offset) overridefinal
QNetworkAccessManager m_manager
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
virtual void startToPage(int offset) overridefinal
MusicNewAlbumsRecommendRequest(QObject *parent=nullptr)
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
virtual void downloadFinished() overridefinal
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
virtual void startToPage(int offset) overridefinal
virtual void downloadFinished()
static constexpr const char * PLAYLIST_DATA_URL
void createArtistItem(const MusicResultDataItem &item)
MusicArtistsRecommendRequest(QObject *parent=nullptr)
void createPlaylistItem(const MusicResultDataItem &item)
static constexpr const char * NEW_ALBUM_URL
virtual void downloadFinished() overridefinal
void createAlbumItem(const MusicResultDataItem &item)
MusicPlaylistRecommendRequest(QObject *parent=nullptr)
virtual void downloadFinished() override
The class of the abstract query data from net.
virtual void startToPage(int offset) overridefinal
virtual void startToSearch(const QString &value) overridefinal
QByteArray makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &data)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
virtual void downloadFinished() overridefinal
The class of the music song information.
Definition: musicobject.h:300
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59