TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicwyqueryplaylistrequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *WY_PLAYLIST_URL = "aFZGMG5CbXZXNmNGaS9jZEV6S0c2RE53Tm5Ud3I3WGJSS2ErQVQ5RjdYRlhUMENuS25yRnYwVHUzMnIrQUJQaFRVTlMrSTJUM1pNPQ==";
4 static constexpr const char *WY_PLAYLIST_DATA_URL = "NXA2YlMvSVEyRWhvckRqclAzdDdreHY5L0JMb0tYS2tJRGhnRDlidVRUcHBFR0I5b3dXb1pPU0dDWGdpMjc3VDBpaUpBT05oNnlOc2czZmgxVGVpR2dTR01pbWhsVUdFRWhWYnpscUkzeTA9";
5 static constexpr const char *WY_PLAYLIST_INFO_V1_URL = "VUdTa0xMeG1Nblc4cThoS2E1QzhJK0lrTHJBRmk4TUJZMC9NQW1GanZydDJmR0VJVVRZNmJQSEhOZU96aE55bTJxdW55RldJOHl6aElNdTlHbkZkSmc9PQ==";
6 static constexpr const char *WY_PLAYLIST_INFO_V1_DATA_URL = "VkpFemFKQWtOY2ZXeUNpZ210VjVGYndOZ2VibUZlZHV6amZJaE5VL1czaWFzRkNqV2lYKy9CR29McXl6LzUrUldWcmtKS0Fjb0s5dFBFeXpCaHRCc1dhYlp1bGd3U1ZY";
7 static constexpr const char *WY_PLAYLIST_INFO_V2_URL = "VENmNTdHK2VacjVvTFp3WmFKT2wrNmNnWHM1N3FDUHNGUHZ4MWdvU2x2bzdMM0xCSXFaaFRWWnNYTkpLeGdnVw==";
8 static constexpr const char *WY_PLAYLIST_INFO_V2_DATA_URL = "cTlvTkRSVU9ncjYvTDBJaDZldWtNTXh0d1dLcmd6N0k=";
9 static constexpr const char *WY_PLAYLIST_RECOMMED_URL = "Z3N3cXVjb1ZoV2pxRVY1d1RoSStuMXp3MGsreUVPRVNtQjVNMUR2WXgwWHJrTHBlODYxcFJpUnozbGlCNTBzYkF4eFRNMDd0dHk2eEF3WkVnc3hVdlE9PQ==";
10 static constexpr const char *WY_PLAYLIST_RECOMMED_DATA_URL = "dEZwUWp1MTJ6a2xaNytOOWZ5U1h1dFB5V0pUbkl6TXR0d3BmazkvYTM3ND0=";
11 static constexpr const char *WY_PLAYLIST_HQ_URL = "bUZ0V2JxeUFxWFF6U3MxVUcrZklyUGhPc245MEF2TVlHVnNGdnZNVjZTWVJ6RmN1ZGZZNGFScWJsWCt3b1h6YnhYSFA4ZVQ2SC85N1Y4eFp3ZVhjNkZuUlNHTT0=";
12 static constexpr const char *WY_PLAYLIST_HQ_DATA_URL = "MUlkMGR1NU00VzZJbjh1algwclpzY1NNTngzREN3TEoxUExOWVVmbDdPUTZlKzJOeFkwUjdGeUlRaDNGd2JoSzhBcEdtVk5paVc1VnFOdEE=";
13 
16 {
19 }
20 
22 {
23  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
24 
25  deleteAll();
26  m_totalSize = 0;
28 
29  QNetworkRequest request;
30  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
33 
34  m_reply = m_manager.post(request, parameter);
35  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
37 }
38 
40 {
41  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
42 
43  deleteAll();
44 
45  QNetworkRequest request;
46  request.setUrl(TTK::Algorithm::mdII(WY_PLAYLIST_INFO_V2_URL, false));
48 
49  QNetworkReply *reply = m_manager.post(request, TTK::Algorithm::mdII(WY_PLAYLIST_INFO_V2_DATA_URL, false).arg(value).toUtf8());
50  connect(reply, SIGNAL(finished()), SLOT(downloadDetailsFinished()));
52 }
53 
55 {
56  MusicQueryPlaylistRequest::startToSearchByID(value.isEmpty() ? "all" : value);
57 }
58 
60 {
61  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
62 
67 
70 }
71 
73 {
74  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
75 
77 
78  QNetworkRequest request;
79  request.setUrl(TTK::Algorithm::mdII(WY_PLAYLIST_INFO_V2_URL, false));
81 
82  const QByteArray &parameter = TTK::Algorithm::mdII(WY_PLAYLIST_INFO_V2_DATA_URL, false).arg(item.m_id).toUtf8();
83  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
84  if(bytes.isEmpty())
85  {
86  return;
87  }
88 
89  QJsonParseError ok;
90  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
92  {
93  QVariantMap value = json.toVariant().toMap();
94  if(value["code"].toInt() == 200 && value.contains("playlist"))
95  {
96  value = value["playlist"].toMap();
97  item.m_name = value["name"].toString();
98  item.m_title = value["detailPageTitle"].toString();
99  item.m_count = value["playCount"].toString();
100  item.m_description = value["description"].toString();
101  item.m_time = TTKDateTime::format(value["updateTime"].toULongLong(), TTK_DATE_FORMAT);
102  item.m_coverUrl = value["coverImgUrl"].toString();
103  item.m_category.clear();
104 
105  const QVariantList &tags = value["tags"].toList();
106  for(const QVariant &var : qAsConst(tags))
107  {
108  if(var.isNull())
109  {
110  continue;
111  }
112 
113  item.m_category.append(var.toString() + "|");
114  }
115 
116  if(!item.m_category.isEmpty())
117  {
118  item.m_category.insert(0, "|");
119  }
120 
121  value = value["creator"].toMap();
122  item.m_nickName = value["nickname"].toString();
123  }
124  }
125 }
126 
128 {
129  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
130 
132  if(m_reply && m_reply->error() == QNetworkReply::NoError)
133  {
134  QJsonParseError ok;
135  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
137  {
138  QVariantMap value = json.toVariant().toMap();
139  if(value["code"].toInt() == 200 && value.contains("playlists"))
140  {
141  m_totalSize = value["total"].toInt();
142 
143  const QVariantList &datas = value["playlists"].toList();
144  for(const QVariant &var : qAsConst(datas))
145  {
146  if(var.isNull())
147  {
148  continue;
149  }
150 
151  value = var.toMap();
153 
154  MusicResultDataItem item;
155  item.m_id = value["id"].toString();
156  item.m_name = value["name"].toString();
157  item.m_count = value["playCount"].toString();
158  item.m_coverUrl = value["coverImgUrl"].toString();
159 
160  value = value["creator"].toMap();
161  item.m_nickName = value["nickname"].toString();
162  Q_EMIT createPlaylistItem(item);
163  }
164  }
165  }
166  }
167 
168 // Q_EMIT downloadDataChanged({});
169  deleteAll();
170 }
171 
173 {
174  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
175 
177  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
178  if(reply && reply->error() == QNetworkReply::NoError)
179  {
180  QJsonParseError ok;
181  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
183  {
184  QVariantMap value = json.toVariant().toMap();
185  if(value["code"].toInt() == 200 && value.contains("playlist"))
186  {
187  value = value["playlist"].toMap();
188 
189  const QVariantList &datas = value["tracks"].toList();
190  for(const QVariant &var : qAsConst(datas))
191  {
192  if(var.isNull())
193  {
194  continue;
195  }
196 
197  value = var.toMap();
199 
201  info.m_songId = value["id"].toString();
202  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
203 
204  const QVariantList &artistsArray = value["ar"].toList();
205  for(const QVariant &artistValue : qAsConst(artistsArray))
206  {
207  if(artistValue.isNull())
208  {
209  continue;
210  }
211 
212  const QVariantMap &artistObject = artistValue.toMap();
213  if(info.m_artistId.isEmpty())
214  {
215  info.m_artistId = artistObject["id"].toString();
216  }
217 
218  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, artistObject["name"].toString());
219  }
220 
221  const QVariantMap &albumObject = value["al"].toMap();
222  info.m_albumId = albumObject["id"].toString();
223  info.m_albumName = TTK::String::charactersReplace(albumObject["name"].toString());
224 
225  info.m_coverUrl = ReqWYInterface::makeCoverPixmapUrl(albumObject["pic_str"].toString());
227  info.m_duration = TTKTime::formatDuration(value["dt"].toInt());
228  info.m_year = TTKDateTime::format(value["publishTime"].toULongLong(), TTK_YEAR_FORMAT);
229  info.m_trackNumber = value["no"].toString();
230 
234 
235  Q_EMIT createResultItem({info, serverToString()});
236  m_items << info;
237  }
238  }
239  }
240  }
241 
242  Q_EMIT downloadDataChanged({});
243 }
244 
245 
246 
248  : MusicQueryPlaylistRequest(parent)
249 {
253 }
254 
256 {
257  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
258 
259  deleteAll();
261 
262  QNetworkRequest request;
263  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
266 
267  m_reply = m_manager.post(request, parameter);
268  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
270 }
271 
273 {
274  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
275 
276  m_queryValue = value;
277  startToPage(0);
278 }
279 
281 {
282  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
283 }
284 
286 {
287  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
288 
290  if(m_reply && m_reply->error() == QNetworkReply::NoError)
291  {
292  QJsonParseError ok;
293  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
295  {
296  QVariantMap value = json.toVariant().toMap();
297  if(value["code"].toInt() == 200 && value.contains("result"))
298  {
299  const QVariantList &datas = value["result"].toList();
300  for(const QVariant &var : qAsConst(datas))
301  {
302  if(var.isNull())
303  {
304  continue;
305  }
306 
307  value = var.toMap();
309 
310  MusicResultDataItem item;
311  item.m_id = value["id"].toString();
312  item.m_name = value["name"].toString();
313  item.m_coverUrl = value["picUrl"].toString();
314  item.m_nickName = "热门歌单推荐";
315  Q_EMIT createPlaylistItem(item);
316  }
317  }
318  }
319  }
320 
321  Q_EMIT downloadDataChanged({});
322  deleteAll();
323 }
324 
325 
326 
328  : MusicQueryPlaylistRequest(parent)
329 {
332 }
333 
335 {
336  if(offset == 0)
337  {
338  if(--m_pageIndex < 0)
339  {
340  m_pageIndex = 0;
341  }
342  }
343  else if(m_more && m_updateTime.contains(m_pageIndex + 1))
344  {
345  ++m_pageIndex;
346  }
347 
348  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << m_pageIndex);
349 
350  deleteAll();
351  const qint64 time = m_updateTime[m_pageIndex];
352 
353  QNetworkRequest request;
354  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
357 
358  m_reply = m_manager.post(request, parameter);
359  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
361 }
362 
364 {
365  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
366 
367  switch(value.toInt())
368  {
369  case 0: m_queryValue = "全部"; break;
370  case 1: m_queryValue = "华语"; break;
371  case 2: m_queryValue = "欧美"; break;
372  case 3: m_queryValue = "韩语"; break;
373  case 4: m_queryValue = "日语"; break;
374  default: break;
375  }
376 
377  m_more = true;
378  m_updateTime.clear();
379  m_updateTime[0] = 0;
380  m_pageIndex = 0;
381  startToPage(0);
382 }
383 
385 {
386  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
387 }
388 
390 {
391  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
392 
394  if(m_reply && m_reply->error() == QNetworkReply::NoError)
395  {
396  QJsonParseError ok;
397  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
399  {
400  QVariantMap value = json.toVariant().toMap();
401  if(value["code"].toInt() == 200 && value.contains("playlists"))
402  {
403  m_totalSize = value["total"].toInt();
404  if(m_totalSize > m_pageSize * 2)
405  {
406  m_totalSize = m_pageSize * 2;
407  }
408 
409  m_more = value["more"].toBool();
410  m_updateTime[m_pageIndex + 1] = value["lasttime"].toLongLong();
411 
412  const QVariantList &datas = value["playlists"].toList();
413  for(const QVariant &var : qAsConst(datas))
414  {
415  if(var.isNull())
416  {
417  continue;
418  }
419 
420  value = var.toMap();
422 
423  MusicResultDataItem item;
424  item.m_id = value["id"].toString();
425  item.m_name = value["name"].toString();
426  item.m_coverUrl = value["coverImgUrl"].toString();
427 
428  value = value["creator"].toMap();
429  item.m_nickName = value["nickname"].toString();
430  Q_EMIT createPlaylistItem(item);
431  }
432  }
433  }
434  }
435 
436  Q_EMIT downloadDataChanged({});
437  deleteAll();
438 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
#define TTK_NETWORK_QUERY_CHECK(VALUE)
The class of the search result data item.
virtual void deleteAll()
static constexpr const char * WY_PLAYLIST_HQ_URL
static constexpr const char * WY_PLAYLIST_URL
QNetworkReply * m_reply
void downloadDataChanged(const QString &bytes)
virtual void startToPage(int offset) overridefinal
static constexpr const char * WY_PLAYLIST_HQ_DATA_URL
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
virtual void startToSearchByID(const QString &value) override
#define TTK_PAGE_SIZE_30
QString makeSongArtist(const QString &in, const QString &name)
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
void createResultItem(const MusicResultInfoItem &result)
The class of the query playlist data from net.
void makeRequestRawHeader(QNetworkRequest *request) noexcept
#define TTK_YEAR_FORMAT
Definition: ttkglobal.h:305
MusicWYQueryPlaylistRecommendRequest(QObject *parent=nullptr)
void createPlaylistItem(const MusicResultDataItem &item)
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
static constexpr const char * WY_PLAYLIST_INFO_V1_URL
voidpf uLong offset
Definition: ioapi.h:142
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate)
ParseError error
TTK::MusicSongInformationList m_items
MusicWYQueryPlaylistRequest(QObject *parent=nullptr)
#define qAsConst
Definition: ttkqtglobal.h:57
static constexpr const char * WY_PLAYLIST_RECOMMED_URL
static constexpr const char * QUERY_WY_INTERFACE
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
virtual void downloadFinished() overridefinal
static constexpr const char * WY_SONG_LRC_OLD_URL
QNetworkAccessManager m_manager
static constexpr const char * WY_PLAYLIST_INFO_V2_DATA_URL
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
#define TTK_DATE_FORMAT
Definition: ttkglobal.h:309
virtual void startToPage(int offset) overridefinal
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
virtual void startToSearch(const QString &value) overridefinal
virtual void downloadFinished()
static constexpr const char * WY_PLAYLIST_INFO_V1_DATA_URL
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
virtual void startToSearchByID(const QString &value) overridefinal
static constexpr const char * WY_PLAYLIST_RECOMMED_DATA_URL
MusicWYQueryPlaylistHighRequest(QObject *parent=nullptr)
virtual void startToSearch(const QString &value) overridefinal
virtual void downloadFinished() override
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
static constexpr const char * WY_PLAYLIST_DATA_URL
virtual void downloadFinished() overridefinal
virtual void startToPage(int offset) overridefinal
static constexpr const char * WY_PLAYLIST_INFO_V2_URL
QByteArray makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &data)
virtual void startToSearch(const QString &value) overridefinal
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
The class of the music song information.
Definition: musicobject.h:300
QString makeCoverPixmapUrl(const QString &id)
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:82