TTKMusicPlayer  3.7.0.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==", ALG_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.isEmpty() && !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_bitrate = bitrate;
117  prop.m_format = MP4_FILE_SUFFIX;
118 
119  if(prop.isEmpty() || info->m_songProps.contains(prop))
120  {
121  return;
122  }
123 
124  info->m_songProps.append(prop);
125  }
126  }
127 }
128 
129 
132 {
134 }
135 
137 {
138  TTK_INFO_STREAM(className() << "startToPage" << offset);
139 
140  if(needToUnity())
141  {
143  return;
144  }
145 
146  deleteAll();
147  m_totalSize = 0;
149 
150  QNetworkRequest request;
151  request.setUrl(TTK::Algorithm::mdII(KW_SONG_SEARCH_URL, false).arg(m_queryValue).arg(offset).arg(m_pageSize));
153 
154  m_reply = m_manager.get(request);
155  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
157 }
158 
159 void MusicKWQueryMovieRequest::startToSearch(const QString &value)
160 {
161  resetUnity();
163 }
164 
166 {
167  TTK_INFO_STREAM(className() << "startToSearchByID" << value);
168 
169  deleteAll();
170  m_queryValue = value;
171 
173 }
174 
176 {
177  TTK_INFO_STREAM(className() << "downLoadFinished");
178 
180  if(m_reply && m_reply->error() == QNetworkReply::NoError)
181  {
182  QJson::Parser json;
183  bool ok = false;
184  const QVariant &data = json.parse(m_reply->readAll().replace("'", "\""), &ok);
185  if(ok)
186  {
187  QVariantMap value = data.toMap();
188  if(value.contains("abslist"))
189  {
190  m_totalSize = value["TOTAL"].toInt();
191 
192  const QVariantList &datas = value["abslist"].toList();
193  for(const QVariant &var : qAsConst(datas))
194  {
195  if(var.isNull())
196  {
197  continue;
198  }
199 
200  value = var.toMap();
202 
204  info.m_songId = value["MUSICRID"].toString().remove("MUSIC_");
205  info.m_songName = TTK::String::charactersReplace(value["SONGNAME"].toString());
206 
207  info.m_artistName = ReqKWInterface::makeSongArtist(value["ARTIST"].toString());
208 
209  info.m_coverUrl = ReqKWInterface::makeCoverPixmapUrl(value["web_albumpic_short"].toString(), info.m_songId);
210  info.m_duration = TTKTime::formatDuration(value["DURATION"].toInt() * TTK_DN_S2MS);
211 
213  ReqKWInterface::parseFromMovieProperty(&info, value["FORMATS"].toString());
215 
216  if(info.m_songProps.isEmpty() || !findUrlPathSize(&info.m_songProps, info.m_duration))
217  {
218  continue;
219  }
220 
221  Q_EMIT createResultItem({info, serverToString()});
222  m_items << info;
223  }
224  }
225  }
226  }
227 
228  if(!pageValid())
229  {
230  setToUnity();
231  }
232 
233  Q_EMIT downLoadDataChanged({});
234  deleteAll();
235 }
236 
238 {
239  TTK_INFO_STREAM(className() << "downLoadSingleFinished");
240 
242 
244  info.m_songId = m_queryValue;
245 
249  ReqKWInterface::parseFromMovieProperty(&info, "MP4UL|MP4L|MP4HV|MP4");
251 
252  if(!info.m_songProps.isEmpty() && findUrlPathSize(&info.m_songProps, info.m_duration))
253  {
254  Q_EMIT createResultItem({info, serverToString()});
255  m_items << info;
256  }
257 
258  Q_EMIT downLoadDataChanged({});
259  deleteAll();
260 }
261 
262 
263 
265  : MusicQueryMovieRequest(parent)
266 {
269 }
270 
272 {
273  TTK_INFO_STREAM(className() << "startToPage" << offset);
274 
275  deleteAll();
276  m_totalSize = 0;
278 
279  QNetworkRequest request;
280  request.setUrl(TTK::Algorithm::mdII(KW_ARTIST_MOVIE_URL, false).arg(m_queryValue).arg(offset).arg(m_pageSize));
282 
283  m_reply = m_manager.get(request);
284  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
286 }
287 
289 {
290  TTK_INFO_STREAM(className() << "downLoadFinished");
291 
293  if(m_reply && m_reply->error() == QNetworkReply::NoError)
294  {
295  QJson::Parser json;
296  bool ok = false;
297  const QVariant &data = json.parse(m_reply->readAll().replace("'", "\""), &ok);
298  if(ok)
299  {
300  QVariantMap value = data.toMap();
301  if(value.contains("mvlist"))
302  {
303  m_totalSize = value["total"].toInt();
304 
305  const QVariantList &datas = value["mvlist"].toList();
306  for(const QVariant &var : qAsConst(datas))
307  {
308  if(var.isNull())
309  {
310  continue;
311  }
312 
313  value = var.toMap();
315 
316  MusicResultDataItem item;
317  item.m_id = value["musicid"].toString();
318  item.m_coverUrl = value["pic"].toString();
320  {
322  }
323  item.m_name = value["name"].toString();
324  item.m_updateTime.clear();
325  Q_EMIT createMovieItem(item);
326  }
327  }
328  }
329  }
330 
331  Q_EMIT downLoadDataChanged({});
332  deleteAll();
333 }
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
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:223
virtual void downLoadFinished() overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:295
QString makeCoverPixmapUrl(const QString &url, const QString &id)
QByteArray encrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:344
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
#define TTK_BN_1000
Definition: ttkglobal.h:354
void makeRequestRawHeader(QNetworkRequest *request)
virtual void downLoadFinished()
void createMovieItem(const MusicResultDataItem &item)
#define TTK_BN_250
Definition: ttkglobal.h:350
virtual void downLoadFinished() overridefinal
static constexpr const char * KW_ARTIST_MOVIE_URL
#define TTK_BN_500
Definition: ttkglobal.h:352
voidpf uLong offset
Definition: ioapi.h:142
TTK::MusicSongInformationList m_items
#define MP4_FILE_SUFFIX
Definition: musicobject.h:53
#define qAsConst
Definition: ttkqtglobal.h:53
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:67
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:177
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)
static constexpr const char * ALG_SHR_KEY
bool isEmpty() const noexcept
Definition: musicobject.h:236
static constexpr const char * KW_MOVIE_ATTR_URL
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:165
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:276
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
bool findUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
static constexpr const char * KW_SONG_INFO_URL
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:281
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path)
#define TTK_BN_750
Definition: ttkglobal.h:353
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123