TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickgqueryplaylistrequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *KG_PLAYLIST_URL = "VXJlbFlzWElZQ25iMzhicGJIVWJqRGpMdnJJU0tlZXdUTlVpWUJkN0xxR1Qya3dud3dLY2JSaWphWTF6QUw5RDJFK3hlZWhxdGhrRWFhQkpJUFhxOGUrY1J2d1NQVGZNM29pOXVXU3h0V1hrR0RIMnhHK2JYZz09";
4 static constexpr const char *KG_PLAYLIST_INFO_URL = "NHZmb0FWT2NGVmkrQ01QNFBYTXM3RGFMbkJrb3VtQXExWXBLK2JIRW5VZEQ1YUN1eEM4Y1l3U09Lb20zWDlKTHBSZXhEdHhveHdLbWFMWnhMR3FnL2c0TTk4SUFMbFdDVDFScVF1UXZMS3BrYVpqdnFURmRUUElxcXlFd3FNVTJNRDhPQ0E9PQ==";
5 static constexpr const char *KG_PLAYLIST_DETAIL_URL = "cEt0bHpiRkFKMTFZbzUyQ1prK1RCMjBqWnRRMGRKY2FqYnVSRllPZHMwcmoyVkZ3WG8vTWhMVUR0ZTdIZUszYmdybXBUdEVxOHdiSEM3Nmw=";
6 static constexpr const char *KG_PLAYLIST_RECOMMED_URL = "OTV1T3MyeFp6T2w4dXpEaTM4d3RKMzZhaHdJZVhsSCtHSTYyUXIwNWFXeEJsVVJ2cTlPcnhLQWlDZGk5c0oxZW1WUGxUQlpMV0NtL2R4WkpkVzVIYmQzd3lWejYwUXIrelVQWXU4NUI3dGM5aTNoZA==";
7 static constexpr const char *KG_PLAYLIST_HQ_URL = KG_PLAYLIST_RECOMMED_URL;
8 
11 {
14 }
15 
17 {
18  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
19 
20  deleteAll();
21  m_totalSize = 0;
23 
24  QNetworkRequest request;
25  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
27 
28  m_reply = m_manager.get(request);
29  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
31 }
32 
34 {
35  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
36 
37  deleteAll();
38 
39  QNetworkRequest request;
40  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_INFO_URL, false).arg(value));
42 
43  QNetworkReply *reply = m_manager.get(request);
44  connect(reply, SIGNAL(finished()), SLOT(downloadDetailsFinished()));
46 }
47 
49 {
50  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
51 
56 
59 }
60 
62 {
63  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
64 
66 
67  QNetworkRequest request;
68  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_DETAIL_URL, false).arg(item.m_id));
70 
71  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
72  if(bytes.isEmpty())
73  {
74  return;
75  }
76 
77  QJsonParseError ok;
78  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
80  {
81  QVariantMap value = json.toVariant().toMap();
82  if(value["errcode"].toInt() == 0 && value.contains("data"))
83  {
84  value = value["data"].toMap();
85  item.m_name = value["specialname"].toString();
86  item.m_count = value["playcount"].toString();
87  item.m_description = value["intro"].toString();
88  item.m_time = value["publishtime"].toString();
89  item.m_nickName = value["nickname"].toString();
90  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "500");
91  item.m_category.clear();
92 
93  const QVariantList &tags = value["tags"].toList();
94  for(const QVariant &var : qAsConst(tags))
95  {
96  if(var.isNull())
97  {
98  continue;
99  }
100 
101  value = var.toMap();
102 
103  item.m_category.append(value["tagname"].toString() + "|");
104  }
105 
106  if(!item.m_category.isEmpty())
107  {
108  item.m_category.insert(0, "|");
109  }
110  }
111  }
112 }
113 
115 {
116  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
117 
119  if(m_reply && m_reply->error() == QNetworkReply::NoError)
120  {
121  QJsonParseError ok;
122  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
124  {
125  QVariantMap value = json.toVariant().toMap();
126  if(value["errcode"].toInt() == 0)
127  {
128  value = value["data"].toMap();
129  m_totalSize = value["total"].toInt();
130 
131  const QVariantList &datas = value["info"].toList();
132  for(const QVariant &var : qAsConst(datas))
133  {
134  if(var.isNull())
135  {
136  continue;
137  }
138 
139  value = var.toMap();
141 
142  MusicResultDataItem item;
143  item.m_id = value["specialid"].toString();
144  item.m_name = value["specialname"].toString();
145  item.m_count = value["playcount"].toString();
146  item.m_nickName = value["username"].toString();
147  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "500");
148  Q_EMIT createPlaylistItem(item);
149  }
150  }
151  }
152  }
153 
154 // Q_EMIT downloadDataChanged({});
155  deleteAll();
156 }
157 
159 {
160  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
161 
163  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
164  if(reply && reply->error() == QNetworkReply::NoError)
165  {
166  QJsonParseError ok;
167  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
169  {
170  QVariantMap value = json.toVariant().toMap();
171  if(value["errcode"].toInt() == 0 && value.contains("data"))
172  {
173  value = value["data"].toMap();
174 
175  const QVariantList &datas = value["info"].toList();
176  for(const QVariant &var : qAsConst(datas))
177  {
178  if(var.isNull())
179  {
180  continue;
181  }
182 
183  value = var.toMap();
185 
187  info.m_songId = value["hash"].toString();
188 
189  info.m_albumId = value["album_id"].toString();
190 
191  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
192  info.m_trackNumber = "0";
193 
197  ReqKGInterface::parseFromSongAlbumInfo(&info, value["album_audio_id"].toString());
201 
202  if(info.m_songName.isEmpty())
203  {
204  continue;
205  }
206 
207  Q_EMIT createResultItem({info, serverToString()});
208  m_items << info;
209  }
210  }
211  }
212  }
213 
214  Q_EMIT downloadDataChanged({});
215 }
216 
217 
218 
220  : MusicQueryPlaylistRequest(parent)
221 {
225 }
226 
228 {
229  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
230 
231  deleteAll();
233 
234  QNetworkRequest request;
235  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_RECOMMED_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
237 
238  m_reply = m_manager.get(request);
239  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
241 }
242 
244 {
245  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
246 
247  m_queryValue = "1084";
248  startToPage(0);
249 }
250 
252 {
253  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
254 }
255 
257 {
258  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
259 
261  if(m_reply && m_reply->error() == QNetworkReply::NoError)
262  {
263  QJsonParseError ok;
264  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
266  {
267  QVariantMap value = json.toVariant().toMap();
268  if(value["errcode"].toInt() == 0 && value.contains("data"))
269  {
270  value = value["data"].toMap();
271  m_totalSize = value["total"].toInt();
272 
273  const QVariantList &datas = value["info"].toList();
274  for(const QVariant &var : qAsConst(datas))
275  {
276  if(var.isNull())
277  {
278  continue;
279  }
280 
281  value = var.toMap();
283 
284  MusicResultDataItem item;
285  item.m_id = value["specialid"].toString();
286  item.m_name = value["specialname"].toString();
287  item.m_count = value["playcount"].toString();
288  item.m_nickName = value["username"].toString();
289  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "500");
290  Q_EMIT createPlaylistItem(item);
291  }
292  }
293  }
294  }
295 
296  Q_EMIT downloadDataChanged({});
297  deleteAll();
298 }
299 
300 
301 
303  : MusicQueryPlaylistRequest(parent)
304 {
307 }
308 
310 {
311  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
312 
313  deleteAll();
315 
316  QNetworkRequest request;
317  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_HQ_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
319 
320  m_reply = m_manager.get(request);
321  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
323 }
324 
326 {
327  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
328 
329  switch(value.toInt())
330  {
331  case 0: m_queryValue = ""; break;
332  case 1: m_queryValue = "84"; break;
333  case 2: m_queryValue = "20"; break;
334  case 3: m_queryValue = "23"; break;
335  case 4: m_queryValue = "21"; break;
336  default: break;
337  }
338 
339  startToPage(0);
340 }
341 
343 {
344  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
345 }
346 
348 {
349  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
350 
352  if(m_reply && m_reply->error() == QNetworkReply::NoError)
353  {
354  QJsonParseError ok;
355  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
357  {
358  QVariantMap value = json.toVariant().toMap();
359  if(value["errcode"].toInt() == 0 && value.contains("data"))
360  {
361  value = value["data"].toMap();
362  m_totalSize = value["total"].toInt();
363 
364  const QVariantList &datas = value["info"].toList();
365  for(const QVariant &var : qAsConst(datas))
366  {
367  if(var.isNull())
368  {
369  continue;
370  }
371 
372  value = var.toMap();
374 
375  MusicResultDataItem item;
376  item.m_id = value["specialid"].toString();
377  item.m_name = value["specialname"].toString();
378  item.m_count = value["playcount"].toString();
379  item.m_nickName = value["username"].toString();
380  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "500");
381  Q_EMIT createPlaylistItem(item);
382  }
383  }
384  }
385  }
386 
387  Q_EMIT downloadDataChanged({});
388  deleteAll();
389 }
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void startToPage(int offset) overridefinal
virtual void startToSearch(const QString &value) overridefinal
The class of the search result data item.
virtual void deleteAll()
virtual void downloadFinished() overridefinal
QNetworkReply * m_reply
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
static constexpr const char * QUERY_KG_INTERFACE
#define TTK_PAGE_SIZE_30
virtual void downloadFinished() overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
static constexpr const char * KG_PLAYLIST_DETAIL_URL
void createResultItem(const MusicResultInfoItem &result)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
static constexpr const char * KG_PLAYLIST_RECOMMED_URL
virtual void startToPage(int offset) overridefinal
The class of the query playlist data from net.
void createPlaylistItem(const MusicResultDataItem &item)
static constexpr const char * KG_PLAYLIST_URL
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
voidpf uLong offset
Definition: ioapi.h:142
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate)
ParseError error
TTK::MusicSongInformationList m_items
MusicKGQueryPlaylistHighRequest(QObject *parent=nullptr)
#define qAsConst
Definition: ttkqtglobal.h:57
virtual void startToSearch(const QString &value) overridefinal
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
QNetworkAccessManager m_manager
MusicKGQueryPlaylistRecommendRequest(QObject *parent=nullptr)
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
static constexpr const char * KG_PLAYLIST_HQ_URL
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
TTK_MODULE_EXPORT QString toString(Record type) noexcept
virtual void startToSearch(const QString &value) overridefinal
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
MusicKGQueryPlaylistRequest(QObject *parent=nullptr)
virtual void downloadFinished()
static constexpr const char * KG_PLAYLIST_INFO_URL
void parseFromSongAlbumLrc(TTK::MusicSongInformation *info)
virtual void startToPage(int offset) overridefinal
virtual void downloadFinished() override
void parseFromSongAlbumInfo(TTK::MusicSongInformation *info, const QString &album)
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
void makeRequestRawHeader(QNetworkRequest *request) noexcept
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
The class of the music song information.
Definition: musicobject.h:300
#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