TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickwqueryplaylistrequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *KW_PLAYLIST_URL = "QzgyT0gvMmt3cTFrTDh0LzZ2TFRoNWdIUktZNUJVbjRiVHRnQWxIQkJUaWtCWEw4dUltWVhSSUE4b1RUekkvWnFrS3RRK1NwT1dVNXFJamMreU1STG1KcmhhbE5oL1dUTTZ0a3VLOXQwZm96cm1EeQ==";
4 static constexpr const char *KW_PLAYLIST_INFO_URL = "a1RvK2Rxb3oza1FHZ3FNeU1ZQ1lSYTdGN0xUanZXZ09rU2RTQlF3UGxsT3dFcTBqc3FXdmdUVW1wL2RQVUJKdGEzM3Z2RUI1cUIrYmVnNmNtdEZla3VlN01ySXdNb3dVa21lSDR1b2VwZlJFWXVVbnY4bDFLSHplSHhicDY5WEFBaFZxdlpZUmxVTkhxL0hNcDI1ZW9oamtXWkZadUhNdWFOZG1iVHM0K2FmY0pLamlXZ2tGMFE9PQ==";
5 static constexpr const char *KW_PLAYLIST_RECOMMED_URL = "YWFRTDhrYTErN3VwM29WbVoraEs4cnptSXVjdkJxWW5YbnJPcWpYcjhsUDNQZDZWN21KUURPU2ZmeE5MNVJRUmYyUWlsb3dvRzFXNXlITG9PWlIrRFEzdWp1ZXdJaTFsRGpvYjBZWGdGeDFwYlNOR0tYUnBDdG1qdXNKYTZhMGFJUmU0MzNkcFRKT1JMK1JnN1R4THdTME9sc3AzbmdFVXlFYmViUT09";
6 static constexpr const char *KW_PLAYLIST_HQ_URL = KW_PLAYLIST_URL;
7 
10 {
13 }
14 
16 {
17  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
18 
19  deleteAll();
20  m_totalSize = 0;
22 
23  QNetworkRequest request;
24  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
26 
27  m_reply = m_manager.get(request);
28  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
30 }
31 
33 {
34  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
35 
36  deleteAll();
37 
38  QNetworkRequest request;
39  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_INFO_URL, false).arg(value));
41 
42  QNetworkReply *reply = m_manager.get(request);
43  connect(reply, SIGNAL(finished()), SLOT(downloadDetailsFinished()));
45 }
46 
48 {
49  MusicQueryPlaylistRequest::startToSearchByID(value.isEmpty() ? "393" : value);
50 }
51 
53 {
54  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
55 
60 
63 }
64 
66 {
67  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
68 
70 
71  QNetworkRequest request;
72  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_INFO_URL, false).arg(item.m_id));
74 
75  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
76  if(bytes.isEmpty())
77  {
78  return;
79  }
80 
81  QJsonParseError ok;
82  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
84  {
85  const QVariantMap &value = json.toVariant().toMap();
86  if(!value.isEmpty())
87  {
88  item.m_name = value["title"].toString();
89  item.m_count = value["playnum"].toString();
90  item.m_description = value["info"].toString();
91  item.m_time = TTKDateTime::format(value["ctime"].toULongLong() * TTK_DN_S2MS, TTK_DATE_FORMAT);
92  item.m_nickName = value["uname"].toString();
93  item.m_coverUrl = value["pic"].toString();
94  }
95  }
96 }
97 
99 {
100  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
101 
103  if(m_reply && m_reply->error() == QNetworkReply::NoError)
104  {
105  QJsonParseError ok;
106  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
108  {
109  QVariantMap value = json.toVariant().toMap();
110  if(value["code"].toInt() == 200 && value.contains("data"))
111  {
112  value = value["data"].toMap();
113  m_totalSize = value["total"].toInt();
114 
115  const QVariantList &datas = value["data"].toList();
116  for(const QVariant &var : qAsConst(datas))
117  {
118  if(var.isNull())
119  {
120  continue;
121  }
122 
123  value = var.toMap();
125 
126  morePlaylistDetails(value["id"].toString());
128  }
129  }
130  }
131  }
132 
133 // Q_EMIT downloadDataChanged({});
134  deleteAll();
135 }
136 
138 {
139  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
140 
142  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
143  if(reply && reply->error() == QNetworkReply::NoError)
144  {
145  QJsonParseError ok;
146  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
148  {
149  QVariantMap value = json.toVariant().toMap();
150  if(value.contains("musiclist"))
151  {
152  const QVariantList &datas = value["musiclist"].toList();
153  for(const QVariant &var : qAsConst(datas))
154  {
155  if(var.isNull())
156  {
157  continue;
158  }
159 
160  value = var.toMap();
162 
164  info.m_songId = value["id"].toString();
165  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
166 
167  info.m_artistId = value["artistid"].toString();
168  info.m_artistName = ReqKWInterface::makeSongArtist(value["artist"].toString());
169 
170  info.m_albumId = value["albumid"].toString();
171  info.m_albumName = TTK::String::charactersReplace(value["album"].toString());
172 
173  info.m_coverUrl = ReqKWInterface::makeCoverPixmapUrl(value["web_albumpic_short"].toString(), info.m_songId);
174  info.m_lrcUrl = TTK::Algorithm::mdII(KW_SONG_LRC_URL, false).arg(info.m_songId);
175  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
176  info.m_year = value["firstrecordtime"].toString().section(TTK_DEFAULT_STR, 0, 0);
177  info.m_trackNumber = "0";
178 
180  ReqKWInterface::parseFromSongProperty(&info, value["formats"].toString());
182 
183  Q_EMIT createResultItem({info, serverToString()});
184  m_items << info;
185  }
186  }
187  }
188  }
189 
190  Q_EMIT downloadDataChanged({});
191 }
192 
194 {
195  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
196 
197  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
198  if(reply && reply->error() == QNetworkReply::NoError)
199  {
200  QJsonParseError ok;
201  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
203  {
204  const QVariantMap &value = json.toVariant().toMap();
205  if(value["result"].toString() == "ok")
206  {
207  MusicResultDataItem item;
208  item.m_id = value["id"].toString();
209  item.m_name = value["title"].toString();
210  item.m_count = value["playnum"].toString();
211  item.m_nickName = value["uname"].toString();
212  item.m_coverUrl = value["pic"].toString();
213  Q_EMIT createPlaylistItem(item);
214  }
215  }
216  }
217 }
218 
220 {
221  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << pid);
222 
223  QNetworkRequest request;
224  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_INFO_URL, false).arg(pid));
226 
227  QNetworkReply *reply = m_manager.get(request);
228  connect(reply, SIGNAL(finished()), SLOT(downloadMoreDetailsFinished()));
230 }
231 
232 
233 
235  : MusicQueryPlaylistRequest(parent)
236 {
240 }
241 
243 {
244  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
245 
246  deleteAll();
248 
249  QNetworkRequest request;
250  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_RECOMMED_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
252 
253  m_reply = m_manager.get(request);
254  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
256 }
257 
259 {
260  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
261 
262  m_queryValue = "hot";
263  startToPage(0);
264 }
265 
267 {
268  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
269 }
270 
272 {
273  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
274 
276  if(m_reply && m_reply->error() == QNetworkReply::NoError)
277  {
278  QJsonParseError ok;
279  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
281  {
282  QVariantMap value = json.toVariant().toMap();
283  if(value["code"].toInt() == 200 && value.contains("data"))
284  {
285  value = value["data"].toMap();
286  m_totalSize = value["total"].toInt();
287 
288  const QVariantList &datas = value["data"].toList();
289  for(const QVariant &var : qAsConst(datas))
290  {
291  if(var.isNull())
292  {
293  continue;
294  }
295 
296  value = var.toMap();
298 
299  MusicResultDataItem item;
300  item.m_id = value["id"].toString();
301  item.m_name = value["name"].toString();
302  item.m_count = value["listencnt"].toString();
303  item.m_nickName = value["uname"].toString();
304  item.m_coverUrl = value["img"].toString();
305  Q_EMIT createPlaylistItem(item);
306  }
307  }
308  }
309  }
310 
311  Q_EMIT downloadDataChanged({});
312  deleteAll();
313 }
314 
315 
316 
318  : MusicQueryPlaylistRequest(parent)
319 {
322 }
323 
325 {
326  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
327 
328  deleteAll();
330 
331  QNetworkRequest request;
332  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_HQ_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
334 
335  m_reply = m_manager.get(request);
336  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
338 }
339 
341 {
342  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
343 
344  switch(value.toInt())
345  {
346  case 0: m_queryValue = "393"; break;
347  case 1: m_queryValue = "37"; break;
348  case 2: m_queryValue = "35"; break;
349  case 3: m_queryValue = "1093"; break;
350  case 4: m_queryValue = "1091"; break;
351  default: break;
352  }
353 
354  startToPage(0);
355 }
356 
358 {
359  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << item.m_id);
360 }
361 
363 {
364  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
365 
367  if(m_reply && m_reply->error() == QNetworkReply::NoError)
368  {
369  QJsonParseError ok;
370  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
372  {
373  QVariantMap value = json.toVariant().toMap();
374  if(value["code"].toInt() == 200 && value.contains("data"))
375  {
376  value = value["data"].toMap();
377  m_totalSize = value["total"].toInt();
378 
379  const QVariantList &datas = value["data"].toList();
380  for(const QVariant &var : qAsConst(datas))
381  {
382  if(var.isNull())
383  {
384  continue;
385  }
386 
387  value = var.toMap();
389 
390  MusicResultDataItem item;
391  item.m_id = value["id"].toString();
392  item.m_name = value["name"].toString();
393  item.m_count = value["listencnt"].toString();
394  item.m_nickName = value["uname"].toString();
395  item.m_coverUrl = value["img"].toString();
396  Q_EMIT createPlaylistItem(item);
397  }
398  }
399  }
400  }
401 
402  Q_EMIT downloadDataChanged({});
403  deleteAll();
404 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
virtual void startToSearchByID(const QString &value) overridefinal
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void startToSearch(const QString &value) overridefinal
The class of the search result data item.
virtual void deleteAll()
MusicKWQueryPlaylistHighRequest(QObject *parent=nullptr)
QNetworkReply * m_reply
#define TTK_DEFAULT_STR
Definition: ttkglobal.h:276
static constexpr const char * KW_PLAYLIST_HQ_URL
static constexpr const char * KW_PLAYLIST_INFO_URL
virtual void startToSearch(const QString &value) overridefinal
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
virtual void startToSearchByID(const QString &value) override
static constexpr const char * KW_PLAYLIST_RECOMMED_URL
#define TTK_PAGE_SIZE_30
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
QString makeCoverPixmapUrl(const QString &url, const QString &id)
void createResultItem(const MusicResultInfoItem &result)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
The class of the query playlist data from net.
void createPlaylistItem(const MusicResultDataItem &item)
voidpf uLong offset
Definition: ioapi.h:142
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate)
ParseError error
TTK::MusicSongInformationList m_items
#define qAsConst
Definition: ttkqtglobal.h:57
static constexpr const char * KW_SONG_LRC_URL
virtual void startToPage(int offset) overridefinal
virtual void downloadFinished() overridefinal
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
virtual void startToPage(int offset) overridefinal
QNetworkAccessManager m_manager
MusicKWQueryPlaylistRequest(QObject *parent=nullptr)
virtual void startToPage(int offset) overridefinal
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
static constexpr const char * QUERY_KW_INTERFACE
#define TTK_SLOT
Definition: ttkqtglobal.h:177
virtual void downloadFinished() overridefinal
#define TTK_DATE_FORMAT
Definition: ttkglobal.h:309
QString makeSongArtist(const QString &name)
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
TTK_MODULE_EXPORT QString toString(Record type) noexcept
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
virtual void downloadFinished()
void makeRequestRawHeader(QNetworkRequest *request) noexcept
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
virtual void downloadFinished() override
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
MusicKWQueryPlaylistRecommendRequest(QObject *parent=nullptr)
void morePlaylistDetails(const QString &pid)
virtual void startToSearch(const QString &value) overridefinal
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
static constexpr const char * KW_PLAYLIST_URL
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