TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickwquerymovierequest.cpp
Go to the documentation of this file.
2 
4 
5 namespace ReqKWInterface
6 {
14  static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &format);
18  static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &format, int bitrate);
19 
20 }
21 
23 {
24  if(info->m_songId.isEmpty())
25  {
26  return;
27  }
28 
29  info->m_songName = "Not Found";
30  info->m_artistName = "Anonymous";
31 
32  QNetworkRequest request;
33  request.setUrl(TTK::Algorithm::mdII(KW_SONG_INFO_URL, false).arg(info->m_songId));
35 
36  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
37  if(bytes.isEmpty())
38  {
39  return;
40  }
41 
42  QJson::Parser json;
43  bool ok = false;
44  const QVariant &data = json.parse(bytes, &ok);
45  if(ok)
46  {
47  QVariantMap value = data.toMap();
48  if(value.contains("data"))
49  {
50  value = value["data"].toMap();
51  info->m_songName = TTK::String::charactersReplace(value["name"].toString());
52  info->m_artistName = ReqKWInterface::makeSongArtist(value["artist"].toString());
53  info->m_coverUrl = value["pic"].toString();
54  info->m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
55  }
56  }
57 }
58 
60 {
61  if(info->m_songId.isEmpty())
62  {
63  return;
64  }
65 
66  for(const QString &v : format.split("|"))
67  {
68  if(v.contains("MP4L"))
69  {
70  parseFromMovieProperty(info, "MP4L", TTK_BN_250);
71  }
72  else if(v.contains("MP4HV"))
73  {
74  parseFromMovieProperty(info, "MP4HV", TTK_BN_750);
75  }
76  else if(v.contains("MP4UL"))
77  {
78  parseFromMovieProperty(info, "MP4UL", TTK_BN_1000);
79  }
80  else if(v.contains("MP4"))
81  {
82  parseFromMovieProperty(info, "MP4", TTK_BN_500);
83  }
84  }
85 }
86 
87 void ReqKWInterface::parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &format, int bitrate)
88 {
89  if(info->m_songId.isEmpty())
90  {
91  return;
92  }
93 
94  QAlgorithm::Des des;
95  const QByteArray &parameter = des.encrypt(TTK::Algorithm::mdII(KW_MOVIE_ATTR_URL, false).arg(info->m_songId, format).toUtf8(),
96  TTK::Algorithm::mdII("OGlVTjJWOEdlMkkzSkZIeg==", MDII_SHR_KEY, false).toUtf8());
97  QNetworkRequest request;
98  request.setUrl(TTK::Algorithm::mdII(KW_MOVIE_URL, false).arg(QString(parameter)));
100 
101  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
102  if(bytes.isEmpty())
103  {
104  return;
105  }
106 
107  if(!bytes.contains("res not found"))
108  {
109  const QString text(bytes);
110  const QRegExp regx(".*url=(.*)\r\nsig=");
111 
112  if(regx.indexIn(text) != -1)
113  {
115  prop.m_url = regx.cap(1);
116  prop.m_size = TTK_DEFAULT_STR;
117  prop.m_format = MP4_FILE_SUFFIX;
118  prop.m_bitrate = bitrate;
119 
120  if(prop.isEmpty() || info->m_songProps.contains(prop))
121  {
122  return;
123  }
124 
125  info->m_songProps.append(prop);
126  }
127  }
128 }
129 
130 
133 {
135 }
136 
138 {
139  TTK_INFO_STREAM(className() << __FUNCTION__ << offset);
140 
141  if(needToUnity())
142  {
144  return;
145  }
146 
147  deleteAll();
148  m_totalSize = 0;
150 
151  QNetworkRequest request;
152  request.setUrl(TTK::Algorithm::mdII(KW_SONG_SEARCH_URL, false).arg(m_queryValue).arg(offset).arg(m_pageSize));
154 
155  m_reply = m_manager.get(request);
156  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
158 }
159 
160 void MusicKWQueryMovieRequest::startToSearch(const QString &value)
161 {
162  resetUnity();
164 }
165 
167 {
168  TTK_INFO_STREAM(className() << __FUNCTION__ << value);
169 
170  deleteAll();
171  m_queryValue = value;
172 
174 }
175 
177 {
178  TTK_INFO_STREAM(className() << __FUNCTION__);
179 
181  if(m_reply && m_reply->error() == QNetworkReply::NoError)
182  {
183  QJson::Parser json;
184  bool ok = false;
185  const QVariant &data = json.parse(m_reply->readAll().replace("'", "\""), &ok);
186  if(ok)
187  {
188  QVariantMap value = data.toMap();
189  if(value.contains("abslist"))
190  {
191  m_totalSize = value["TOTAL"].toInt();
192 
193  const QVariantList &datas = value["abslist"].toList();
194  for(const QVariant &var : qAsConst(datas))
195  {
196  if(var.isNull())
197  {
198  continue;
199  }
200 
201  value = var.toMap();
203 
205  info.m_songId = value["MUSICRID"].toString().remove("MUSIC_");
206  info.m_songName = TTK::String::charactersReplace(value["SONGNAME"].toString());
207 
208  info.m_artistName = ReqKWInterface::makeSongArtist(value["ARTIST"].toString());
209 
210  info.m_coverUrl = ReqKWInterface::makeCoverPixmapUrl(value["web_albumpic_short"].toString(), info.m_songId);
211  info.m_duration = TTKTime::formatDuration(value["DURATION"].toInt() * TTK_DN_S2MS);
212 
214  ReqKWInterface::parseFromMovieProperty(&info, value["FORMATS"].toString());
216 
217  if(info.m_songProps.isEmpty() || !fetchUrlPathSize(&info.m_songProps, info.m_duration))
218  {
219  continue;
220  }
221 
222  Q_EMIT createResultItem({info, serverToString()});
223  m_items << info;
224  }
225  }
226  }
227  }
228 
229  if(!pageValid())
230  {
231  setToUnity();
232  }
233 
234  Q_EMIT downLoadDataChanged({});
235  deleteAll();
236 }
237 
239 {
240  TTK_INFO_STREAM(className() << __FUNCTION__);
241 
243 
245  info.m_songId = m_queryValue;
246 
250  ReqKWInterface::parseFromMovieProperty(&info, "MP4UL|MP4L|MP4HV|MP4");
252 
253  if(!info.m_songProps.isEmpty() && fetchUrlPathSize(&info.m_songProps, info.m_duration))
254  {
255  Q_EMIT createResultItem({info, serverToString()});
256  m_items << info;
257  }
258 
259  Q_EMIT downLoadDataChanged({});
260  deleteAll();
261 }
262 
263 
264 
266  : MusicQueryMovieRequest(parent)
267 {
270 }
271 
273 {
274  TTK_INFO_STREAM(className() << __FUNCTION__ << offset);
275 
276  deleteAll();
277  m_totalSize = 0;
279 
280  QNetworkRequest request;
281  request.setUrl(TTK::Algorithm::mdII(KW_ARTIST_MOVIE_URL, false).arg(m_queryValue).arg(offset).arg(m_pageSize));
283 
284  m_reply = m_manager.get(request);
285  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
287 }
288 
290 {
291  TTK_INFO_STREAM(className() << __FUNCTION__);
292 
294  if(m_reply && m_reply->error() == QNetworkReply::NoError)
295  {
296  QJson::Parser json;
297  bool ok = false;
298  const QVariant &data = json.parse(m_reply->readAll().replace("'", "\""), &ok);
299  if(ok)
300  {
301  QVariantMap value = data.toMap();
302  if(value.contains("mvlist"))
303  {
304  m_totalSize = value["total"].toInt();
305 
306  const QVariantList &datas = value["mvlist"].toList();
307  for(const QVariant &var : qAsConst(datas))
308  {
309  if(var.isNull())
310  {
311  continue;
312  }
313 
314  value = var.toMap();
316 
317  MusicResultDataItem item;
318  item.m_id = value["musicid"].toString();
319  item.m_coverUrl = value["pic"].toString();
321  {
323  }
324  item.m_name = value["name"].toString();
325  item.m_time.clear();
326  Q_EMIT createMovieItem(item);
327  }
328  }
329  }
330  }
331 
332  Q_EMIT downLoadDataChanged({});
333  deleteAll();
334 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void startToSearch(const QString &value) overridefinal
static void parseFromMovieInfo(TTK::MusicSongInformation *info)
The class of the search result data item.
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
#define TTK_DEFAULT_STR
Definition: ttkglobal.h:203
MusicKWQueryArtistMovieRequest(QObject *parent=nullptr)
static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &format)
The class of the unity query mv download data from net.
The class of the music song property.
Definition: musicobject.h:225
virtual void downLoadFinished() overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:297
QString makeCoverPixmapUrl(const QString &url, const QString &id)
QByteArray encrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:350
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
#define TTK_BN_1000
Definition: ttkglobal.h:359
void makeRequestRawHeader(QNetworkRequest *request)
virtual void downLoadFinished()
void createMovieItem(const MusicResultDataItem &item)
#define TTK_BN_250
Definition: ttkglobal.h:355
virtual void downLoadFinished() overridefinal
static constexpr const char * KW_ARTIST_MOVIE_URL
#define TTK_BN_500
Definition: ttkglobal.h:357
voidpf uLong offset
Definition: ioapi.h:142
TTK::MusicSongInformationList m_items
#define MP4_FILE_SUFFIX
Definition: musicobject.h:54
#define qAsConst
Definition: ttkqtglobal.h:51
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:68
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:193
The class of the query movie download data from net.
QNetworkAccessManager m_manager
The class of the des wrapper.
Definition: deswrapper.h:34
virtual void startToSearchByID(const QString &value) overridefinal
void createResultItem(const MusicResultInfoItem &songItem)
bool isEmpty() const noexcept
Definition: musicobject.h:238
static constexpr const char * KW_MOVIE_ATTR_URL
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
QVariant parse(QIODevice *io, bool *ok=0)
Read JSON string from the I/O Device and converts it to a QVariant object.
Definition: parser.cpp:69
static constexpr const char * QUERY_KW_INTERFACE
#define TTK_SLOT
Definition: ttkqtglobal.h:181
virtual void downLoadFinished() override
QString makeSongArtist(const QString &name)
#define ARTIST_ATTR_PAGE_SIZE
virtual void startToPage(int offset) overridefinal
MusicKWQueryMovieRequest(QObject *parent=nullptr)
#define TTK_DN_S2MS
Definition: ttkglobal.h:281
virtual void startToSearch(const QString &value) override
TTK_MODULE_EXPORT QString toString(Record type)
The namespace of the kuwo request interface.
virtual void startToPage(int offset) overridefinal
virtual void startToPage(int offset) override
static constexpr const char * KW_SONG_SEARCH_URL
song url
static constexpr const char * KW_MOVIE_URL
movie url
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
static constexpr const char * KW_SONG_INFO_URL
static constexpr const char * MDII_SHR_KEY
static void parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &format, int bitrate)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
static constexpr const char * KW_MOVIE_COVER_URL
The class of the music song information.
Definition: musicobject.h:283
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path)
#define TTK_BN_750
Definition: ttkglobal.h:358
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123