TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickgquerymovierequest.cpp
Go to the documentation of this file.
2 
3 namespace ReqKGInterface
4 {
12  static void parseFromMovieProperty(TTK::MusicSongInformation *info, bool more);
16  static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QVariantMap &key);
17 
18 }
19 
21 {
22  if(info->m_songId.isEmpty())
23  {
24  return;
25  }
26 
27  QNetworkRequest request;
28  request.setUrl(TTK::Algorithm::mdII(KG_MOVIE_URL, false).arg(info->m_songId));
30 
31  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
32  if(bytes.isEmpty())
33  {
34  return;
35  }
36 
37  QRegExp regx;
38  const QString text(bytes);
39 
40  regx.setPattern("mv_hash\\s?=\\s?\"([^\"]+)");
41  if(regx.indexIn(text) != -1)
42  {
43  info->m_songId = regx.cap(1);
44  }
45 
46  regx.setPattern("mv_pic\\s?=\\s?\"([^\"]+)");
47  if(regx.indexIn(text) != -1)
48  {
49  info->m_coverUrl = regx.cap(1);
50  }
51 }
52 
54 {
55  if(info->m_songId.isEmpty())
56  {
57  return;
58  }
59 
60  const QByteArray &key = TTK::Algorithm::md5(QString("%1kugoumvcloud").arg(info->m_songId).toUtf8());
61 
62  QNetworkRequest request;
63  request.setUrl(TTK::Algorithm::mdII(KG_MOVIE_INFO_URL, false).arg(key, info->m_songId));
65 
66  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
67  if(bytes.isEmpty())
68  {
69  return;
70  }
71 
72  QJsonParseError ok;
73  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
75  {
76  QVariantMap value = json.toVariant().toMap();
77  if(value.contains("mvdata"))
78  {
79  if(more)
80  {
81  info->m_songName = TTK::String::charactersReplace(value["songname"].toString());
82  info->m_artistName = ReqKGInterface::makeSongArtist(value["singer"].toString());
83  }
84 
85  value = value["mvdata"].toMap();
86 
87  QVariantMap mv = value["sd"].toMap();
88  if(!mv.isEmpty())
89  {
90  parseFromMovieProperty(info, mv);
91  }
92 
93  mv = value["hd"].toMap();
94  if(!mv.isEmpty())
95  {
96  parseFromMovieProperty(info, mv);
97  }
98 
99  mv = value["sq"].toMap();
100  if(!mv.isEmpty())
101  {
102  parseFromMovieProperty(info, mv);
103  }
104 
105  mv = value["rq"].toMap();
106  if(!mv.isEmpty())
107  {
108  parseFromMovieProperty(info, mv);
109  }
110  }
111  }
112 }
113 
115 {
117  prop.m_url = key["downurl"].toString();
118  prop.m_size = TTK::Number::sizeByteToLabel(key["filesize"].toInt());
120 
121  const int bitrate = key["bitrate"].toInt() / 1000;
122  if(bitrate <= 375)
123  {
124  prop.m_bitrate = TTK_BN_250;
125  }
126  else if(bitrate > 375 && bitrate <= 625)
127  {
128  prop.m_bitrate = TTK_BN_500;
129  }
130  else if(bitrate > 625 && bitrate <= 875)
131  {
132  prop.m_bitrate = TTK_BN_750;
133  }
134  else if(bitrate > 875)
135  {
136  prop.m_bitrate = TTK_BN_1000;
137  }
138 
139  if(info->m_duration.isEmpty())
140  {
141  info->m_duration = TTKTime::formatDuration(key["timelength"].toInt());
142  }
143  info->m_songProps.append(prop);
144 }
145 
146 
149 {
151 }
152 
154 {
155  TTK_INFO_STREAM(className() << __FUNCTION__ << offset);
156 
157  if(needToUnity())
158  {
160  return;
161  }
162 
163  deleteAll();
164  m_totalSize = 0;
166 
167  QNetworkRequest request;
168  request.setUrl(TTK::Algorithm::mdII(KG_SONG_SEARCH_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
170 
171  m_reply = m_manager.get(request);
172  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
174 }
175 
176 void MusicKGQueryMovieRequest::startToSearch(const QString &value)
177 {
178  resetUnity();
180 }
181 
183 {
184  TTK_INFO_STREAM(className() << __FUNCTION__ << value);
185 
186  deleteAll();
187  m_queryValue = value;
188 
190 }
191 
193 {
194  TTK_INFO_STREAM(className() << __FUNCTION__);
195 
197  if(m_reply && m_reply->error() == QNetworkReply::NoError)
198  {
199  QJsonParseError ok;
200  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
202  {
203  QVariantMap value = json.toVariant().toMap();
204  if(value.contains("data"))
205  {
206  value = value["data"].toMap();
207  m_totalSize = value["total"].toInt();
208 
209  const QVariantList &datas = value["info"].toList();
210  for(const QVariant &var : qAsConst(datas))
211  {
212  if(var.isNull())
213  {
214  continue;
215  }
216 
217  value = var.toMap();
219 
221  info.m_songId = value["mvhash"].toString();
222  info.m_songName = TTK::String::charactersReplace(value["songname"].toString());
223 
224  info.m_artistName = ReqKGInterface::makeSongArtist(value["singername"].toString());
225 
226  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
227 
231 
232  if(info.m_songProps.isEmpty())
233  {
234  continue;
235  }
236 
237  Q_EMIT createResultItem({info, serverToString()});
238  m_items << info;
239  }
240  }
241  }
242  }
243 
244  if(!pageValid())
245  {
246  setToUnity();
247  }
248 
249  Q_EMIT downLoadDataChanged({});
250  deleteAll();
251 }
252 
254 {
255  TTK_INFO_STREAM(className() << __FUNCTION__);
256 
258 
260  info.m_songId = m_queryValue;
261 
267 
268  if(!info.m_songProps.isEmpty())
269  {
270  Q_EMIT createResultItem({info, serverToString()});
271  m_items << info;
272  }
273 
274  Q_EMIT downLoadDataChanged({});
275  deleteAll();
276 }
277 
278 
279 
281  : MusicQueryMovieRequest(parent)
282 {
285 }
286 
288 {
289  TTK_INFO_STREAM(className() << __FUNCTION__ << offset);
290 
291  deleteAll();
292  m_totalSize = 0;
294 
295  QNetworkRequest request;
296  request.setUrl(TTK::Algorithm::mdII(KG_ARTIST_MOVIE_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
298 
299  m_reply = m_manager.get(request);
300  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
302 }
303 
305 {
306  TTK_INFO_STREAM(className() << __FUNCTION__);
307 
309  if(m_reply && m_reply->error() == QNetworkReply::NoError)
310  {
311  QJsonParseError ok;
312  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
314  {
315  QVariantMap value = json.toVariant().toMap();
316  if(value.contains("data") && value["errcode"].toInt() == 0)
317  {
318  value = value["data"].toMap();
319  m_totalSize = value["total"].toInt();
320 
321  const QVariantList &datas = value["info"].toList();
322  for(const QVariant &var : qAsConst(datas))
323  {
324  if(var.isNull())
325  {
326  continue;
327  }
328 
329  value = var.toMap();
331 
332  MusicResultDataItem item;
333  item.m_id = value["hash"].toString();
334  item.m_coverUrl = value["imgurl"].toString();
335  item.m_name = value["filename"].toString();
336  item.m_time.clear();
337  Q_EMIT createMovieItem(item);
338  }
339  }
340  }
341  }
342 
343  Q_EMIT downLoadDataChanged({});
344  deleteAll();
345 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
virtual void startToPage(int offset) overridefinal
virtual void downLoadFinished() overridefinal
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
TTK_MODULE_EXPORT QByteArray md5(const QByteArray &data)
The class of the search result data item.
static void parseFromMovieProperty(TTK::MusicSongInformation *info, bool more)
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
The class of the unity query mv download data from net.
QVariant toVariant() const
The class of the music song property.
Definition: musicobject.h:237
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
static constexpr const char * QUERY_KG_INTERFACE
MusicKGQueryArtistMovieRequest(QObject *parent=nullptr)
MusicSongPropertyList m_songProps
Definition: musicobject.h:309
virtual void startToSearch(const QString &value) overridefinal
void createResultItem(const MusicResultInfoItem &result)
QString makeSongArtist(const QString &name)
TTK_MODULE_EXPORT QString sizeByteToLabel(qint64 size)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
#define TTK_BN_1000
Definition: ttkglobal.h:434
virtual void downLoadFinished()
void createMovieItem(const MusicResultDataItem &item)
The namespace of the kugou request interface.
#define TTK_BN_250
Definition: ttkglobal.h:430
#define TTK_BN_500
Definition: ttkglobal.h:432
voidpf uLong offset
Definition: ioapi.h:142
ParseError error
TTK::MusicSongInformationList m_items
virtual void startToSearchByID(const QString &value) overridefinal
#define qAsConst
Definition: ttkqtglobal.h:57
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:189
The class of the query movie download data from net.
QNetworkAccessManager m_manager
static constexpr wchar_t key[]
static constexpr const char * KG_SONG_SEARCH_URL
song url
virtual void downLoadFinished() overridefinal
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
static void parseFromMovieInfo(TTK::MusicSongInformation *info)
virtual void downLoadFinished() override
#define ARTIST_ATTR_PAGE_SIZE
TTK_MODULE_EXPORT QString splitToken(const QString &name)
static constexpr const char * KG_MOVIE_URL
movie url
static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QVariantMap &key)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
virtual void startToSearch(const QString &value) override
virtual void startToPage(int offset) override
MusicKGQueryMovieRequest(QObject *parent=nullptr)
static constexpr const char * KG_MOVIE_INFO_URL
void makeRequestRawHeader(QNetworkRequest *request) noexcept
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
static constexpr const char * KG_ARTIST_MOVIE_URL
The class of the music song information.
Definition: musicobject.h:295
#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
virtual void startToPage(int offset) overridefinal