TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicwyquerymovierequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *WY_MOVIE_URL = "dFowcHhjYXk3UWRkZlo2eW40NkY2TEU4VzRoMC84TFh4Wm93N1hCbWk5V21WQnZnYzIrVUhvYmVtK0xtUW90cGpidHBqdz09";
4 static constexpr const char *WY_MOVIE_DATA_URL = "dmt4VnNDdWErYjRYUXBnOWdubVBIQT09";
5 static constexpr const char *WY_VIDEO_INFO_URL = "VGVNaXVsNW9GSTA0d1VYMnFlRnhuVFoyd1BTV0U0Y1RMWGxON25tTlZ4S2lxSUthSFkvSXFOcFB1MjE1eG4xVFBhUXpITWVEZkVrbU5uNk0=";
6 static constexpr const char *WY_VIDEO_INFO_DATA_URL = "MTFxaHNCYnNQYnh5YWFMQUpadk9sWmRCY3FJPQ==";
7 static constexpr const char *WY_VIDEO_PATH_URL = "VjZLL2tEVlFnYjhQclRPMDVnblZiNmE4Q0NDMzBqa3ZaeStjallYbkdBbllYU2YxSWE0OFFIRXppVDRLeEtsM2g4OTROdz09";
8 static constexpr const char *WY_VIDEO_PATH_DATA_URL = "OE8vNmRpSVV6VXg4OGRKL0s5OStEdFQ4K1R2SGJlblZnSGljeVllZ1RQUW5ES1JONWIvdVhNSWdtZGc9";
9 static constexpr const char *WY_ARTIST_MOVIE_URL = "eFdablNDbDlZVzVvYlo4UU9waEFVRlluRUFzdXA4TXFzVE9RMllXWVdQUXE2WjlsRi9DMzc0VlNXQlU9";
10 static constexpr const char *WY_ARTIST_MOVIE_DATA_URL = "OE95dm9DdmtycVlzcnZaaWRhRFpHYjNBenl0bmFKM0ZLa1lVaFFVenBFQnZ5N2RoNE5VR3N5TzlDTitNTjFiUk9vdDZ4QndxSHY2QjVzcFlPM0laTlplUEt0bz0=";
11 
12 namespace ReqWYInterface
13 {
17  static void parseFromMovieProperty(QString &url, const QString &id, int bitrate);
18 
19 }
20 
21 void ReqWYInterface::parseFromMovieProperty(QString &url, const QString &id, int bitrate)
22 {
23  QNetworkRequest request;
24  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
26  TTK::Algorithm::mdII(WY_VIDEO_PATH_DATA_URL, false).arg(id).arg(bitrate));
27 
28  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
29  if(bytes.isEmpty())
30  {
31  return;
32  }
33 
34  QJsonParseError ok;
35  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
37  {
38  QVariantMap value = json.toVariant().toMap();
39  if(value["code"].toInt() == 200)
40  {
41  const QVariantList &datas = value["urls"].toList();
42  for(const QVariant &var : qAsConst(datas))
43  {
44  if(var.isNull())
45  {
46  continue;
47  }
48 
49  value = var.toMap();
50  url = value["url"].toString();
51 
52  if(!url.isEmpty())
53  {
54  return;
55  }
56  }
57  }
58  }
59 }
60 
61 
64 {
66 }
67 
69 {
70  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
71 
72  if(needToUnity())
73  {
75  return;
76  }
77 
78  deleteAll();
79  m_totalSize = 0;
81 
82  QNetworkRequest request;
83  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
85  TTK::Algorithm::mdII(WY_SEARCH_DATA_URL, false).arg(1014).arg(m_queryValue).arg(m_pageSize * offset).arg(m_pageSize).toUtf8());
86 
87  m_reply = m_manager.post(request, parameter);
88  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
90 }
91 
92 void MusicWYQueryMovieRequest::startToSearch(const QString &value)
93 {
94  resetUnity();
96 }
97 
99 {
100  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
101 
102  deleteAll();
103  m_queryValue = value;
104 
106 }
107 
109 {
110  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
111 
113  if(m_reply && m_reply->error() == QNetworkReply::NoError)
114  {
115  QJsonParseError ok;
116  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
118  {
119  QVariantMap value = json.toVariant().toMap();
120  if(value["code"].toInt() == 200)
121  {
122  value = value["result"].toMap();
123  m_totalSize = value["videoCount"].toInt();
124 
125  const QVariantList &datas = value["videos"].toList();
126  for(const QVariant &var : qAsConst(datas))
127  {
128  if(var.isNull())
129  {
130  continue;
131  }
132 
133  value = var.toMap();
135 
136  const int type = value["type"].toInt();
137  if(type == 0)
138  {
139  const qint64 vid = value["vid"].toLongLong();
140  if(vid == 0)
141  {
142  continue;
143  }
144 
146  parseFromMovieList(vid);
148  }
149  else if(type == 1)
150  {
152  parseFromVideoList(value["vid"].toString());
154  }
155  }
156  }
157  }
158  }
159 
160  if(!pageValid())
161  {
162  setToUnity();
163  }
164 
165  Q_EMIT downloadDataChanged({});
166  deleteAll();
167 }
168 
170 {
171  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
172 
174 
175  const qint64 vid = m_queryValue.toLongLong();
176  if(vid != 0)
177  {
179  parseFromMovieList(vid);
181  }
182 
183  Q_EMIT downloadDataChanged({});
184  deleteAll();
185 }
186 
188 {
189  QNetworkRequest request;
190  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
192  TTK::Algorithm::mdII(WY_MOVIE_DATA_URL, false).arg(id));
193 
194  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
195  if(bytes.isEmpty())
196  {
197  return;
198  }
199 
200  QJsonParseError ok;
201  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
203  {
204  QVariantMap value = json.toVariant().toMap();
205  if(value["code"].toInt() == 200)
206  {
207  value = value["data"].toMap();
209 
211  info.m_songId = QString::number(id);
212  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
213 
214  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, value["artistName"].toString());
215 
216  info.m_coverUrl = value["cover"].toString();
217  info.m_duration = TTKTime::formatDuration(value["duration"].toInt());
218 
219  value = value["brs"].toMap();
220  for(const QString &key : value.keys())
221  {
222  const int bitrate = key.toInt();
224  if(bitrate <= 375)
225  {
226  prop.m_bitrate = TTK_BN_250;
227  }
228  else if(bitrate > 375 && bitrate <= 625)
229  {
230  prop.m_bitrate = TTK_BN_500;
231  }
232  else if(bitrate > 625 && bitrate <= 875)
233  {
234  prop.m_bitrate = TTK_BN_750;
235  }
236  else if(bitrate > 875)
237  {
238  prop.m_bitrate = TTK_BN_1000;
239  }
240 
241  prop.m_url = value[key].toString();
243 
244  if(!fetchUrlPathSize(&prop, info.m_duration))
245  {
246  continue;
247  }
248 
249  info.m_songProps.append(prop);
250  }
251 
252  if(info.m_songProps.isEmpty())
253  {
254  return;
255  }
256 
257  Q_EMIT createResultItem({info, serverToString()});
258  m_items << info;
259  }
260  }
261 }
262 
264 {
265  QNetworkRequest request;
266  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
269 
270  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
271  if(bytes.isEmpty())
272  {
273  return;
274  }
275 
276  QJsonParseError ok;
277  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
279  {
280  QVariantMap value = json.toVariant().toMap();
281  if(value["code"].toInt() == 200)
282  {
283  value = value["data"].toMap();
285 
287  info.m_songId = id;
288  info.m_songName = TTK::String::charactersReplace(value["title"].toString());
289 
290  const QVariantMap &artistObject = value["creator"].toMap();
291  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, artistObject["nickname"].toString());
292 
293  info.m_coverUrl = value["cover"].toString();
294  info.m_duration = TTKTime::formatDuration(value["durationms"].toInt());
295 
296  const QVariantList &datas = value["resolutions"].toList();
297  for(const QVariant &var : qAsConst(datas))
298  {
299  if(var.isNull())
300  {
301  continue;
302  }
303 
304  value = var.toMap();
306 
307  const int bitrate = value["resolution"].toInt();
311 
312  if(prop.isEmpty())
313  {
314  continue;
315  }
316 
317  if(bitrate <= 375)
318  {
319  prop.m_bitrate = TTK_BN_250;
320  }
321  else if(bitrate > 375 && bitrate <= 625)
322  {
323  prop.m_bitrate = TTK_BN_500;
324  }
325  else if(bitrate > 625 && bitrate <= 875)
326  {
327  prop.m_bitrate = TTK_BN_750;
328  }
329  else if(bitrate > 875)
330  {
331  prop.m_bitrate = TTK_BN_1000;
332  }
333 
334  prop.m_size = TTK::Number::sizeByteToLabel(value["size"].toInt());
336  info.m_songProps.append(prop);
337  }
338 
339  if(info.m_songProps.isEmpty())
340  {
341  return;
342  }
343 
344  Q_EMIT createResultItem({info, serverToString()});
345  m_items << info;
346  }
347  }
348 }
349 
350 
351 
353  : MusicQueryMovieRequest(parent)
354 {
357 }
358 
360 {
361  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
362 
363  deleteAll();
364  m_totalSize = 0;
366 
367  QNetworkRequest request;
368  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
371 
372  m_reply = m_manager.post(request, parameter);
373  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
375 }
376 
378 {
379  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
380 
382  if(m_reply && m_reply->error() == QNetworkReply::NoError)
383  {
384  QJsonParseError ok;
385  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
387  {
388  QVariantMap value = json.toVariant().toMap();
389  if(value["code"].toInt() == 200 && value.contains("mvs"))
390  {
394 
395  const QVariantList &datas = value["mvs"].toList();
396  for(const QVariant &var : qAsConst(datas))
397  {
398  if(var.isNull())
399  {
400  continue;
401  }
402 
403  value = var.toMap();
405 
406  MusicResultDataItem item;
407  item.m_id = value["id"].toString();
408  item.m_name = value["name"].toString();
409  item.m_coverUrl = value["imgurl"].toString();
410  item.m_time.clear();
411  Q_EMIT createMovieItem(item);
412  }
413  }
414  }
415  }
416 
417  Q_EMIT downloadDataChanged({});
418  deleteAll();
419 }
420 
422 {
424 
425  QNetworkRequest request;
426  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
428  TTK::Algorithm::mdII(WY_ARTIST_MOVIE_DATA_URL, false).arg(id).arg(0).arg(m_totalSize));
429 
430  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
431  if(bytes.isEmpty())
432  {
433  return;
434  }
435 
436  QJsonParseError ok;
437  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
439  {
440  const QVariantMap &value = json.toVariant().toMap();
441  if(value["code"].toInt() == 200 && value.contains("mvs"))
442  {
443  m_totalSize = value["mvs"].toList().count();
444  }
445  }
446 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
static constexpr const char * WY_VIDEO_PATH_DATA_URL
The class of the search result data item.
virtual void deleteAll()
static constexpr const char * WY_SEARCH_DATA_URL
static constexpr const char * WY_ARTIST_MOVIE_DATA_URL
QNetworkReply * m_reply
void downloadDataChanged(const QString &bytes)
The class of the unity query mv data from net.
QVariant toVariant() const
The class of the music song property.
Definition: musicobject.h:242
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
QString makeSongArtist(const QString &in, const QString &name)
virtual void downloadFinished() overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
void createResultItem(const MusicResultInfoItem &result)
TTK_MODULE_EXPORT QString sizeByteToLabel(qint64 size)
#define TTK_BN_1000
Definition: ttkglobal.h:434
virtual void startToSearchByID(const QString &value) overridefinal
void createMovieItem(const MusicResultDataItem &item)
#define TTK_BN_250
Definition: ttkglobal.h:430
void parseFromVideoList(const QString &id)
static constexpr const char * WY_ARTIST_MOVIE_URL
virtual void downloadFinished() overridefinal
static constexpr const char * WY_VIDEO_INFO_DATA_URL
#define TTK_BN_500
Definition: ttkglobal.h:432
voidpf uLong offset
Definition: ioapi.h:142
ParseError error
TTK::MusicSongInformationList m_items
#define qAsConst
Definition: ttkqtglobal.h:57
static constexpr const char * QUERY_WY_INTERFACE
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:189
static constexpr const char * WY_MOVIE_DATA_URL
The class of the query movie data from net.
QNetworkAccessManager m_manager
MusicWYQueryArtistMovieRequest(QObject *parent=nullptr)
static constexpr wchar_t key[]
bool isEmpty() const noexcept
Definition: musicobject.h:255
The namespace of the wangyi request interface.
static constexpr const char * WY_VIDEO_INFO_URL
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
static constexpr const char * WY_VIDEO_PATH_URL
virtual void startToPage(int offset) overridefinal
TTK_MODULE_EXPORT QString splitToken(const QString &name)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
MusicWYQueryMovieRequest(QObject *parent=nullptr)
#define TTK_HIGH_LEVEL
Definition: ttkglobal.h:334
virtual void downloadFinished()
virtual void startToPage(int offset) overridefinal
virtual void startToSearch(const QString &value) override
static void parseFromMovieProperty(QString &url, const QString &id, int bitrate)
virtual void startToPage(int offset) override
#define TTK_PAGE_SIZE_12
virtual void startToSearch(const QString &value) overridefinal
virtual void downloadFinished() override
static constexpr const char * WY_MOVIE_URL
QByteArray makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &data)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
The class of the music song information.
Definition: musicobject.h:300
#define TTK_BN_750
Definition: ttkglobal.h:433
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123
static constexpr const char * WY_SEARCH_URL