TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicwyquerysongrequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *WY_SONG_INFO_URL = "S3paVUxRY3hZVDVweWhJZFU0K0FpakhJc3R5YW1hbmpmRUVsL3JTRUdwcnlDdDlMWFJSR0ludFFPZ1MycWExVVlLNjg5Njh3VmV2cGxpQzE=";
4 static constexpr const char *WY_SONG_INFO_DATA_URL = "Zmh6cVNyd2REdlVlZ3JQVUZpNjd5YlBaYVR0SEQrWFAydVpzOWc9PQ==";
5 static constexpr const char *WY_NEW_SONG_URL = "SnJhQ3VyZzNwU0ZnYlo2ME9BRVFjdmp0aGNTTldyL2c2RmtES3dFSkY4b0NFZGUwWDRteFpDS0F0SUozOU9nR0RVVE9lTUFwMEhNPQ==";
6 static constexpr const char *WY_NEW_SONG_DATA_URL = "UnNXcXM0ODFxamFPVmFWeEM3Tm0xL1dZNlZTdDBib3QzejhwUXlsNEg4OGI2aDl4";
7 
9  : MusicQuerySongRequest(parent)
10 {
13 }
14 
16 {
17  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
18 
19  deleteAll();
20  m_totalSize = 0;
22 
23  QNetworkRequest request;
24  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
26  TTK::Algorithm::mdII(WY_SEARCH_DATA_URL, false).arg(1).arg(m_queryValue).arg(m_pageSize * offset).arg(m_pageSize).toUtf8());
27 
28  m_reply = m_manager.post(request, parameter);
29  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
31 }
32 
34 {
35  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << value);
36 
37  deleteAll();
38 
39  QNetworkRequest request;
40  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
42  TTK::Algorithm::mdII(WY_SONG_INFO_DATA_URL, false).arg(value));
43 
44  QNetworkReply *reply = m_manager.post(request, parameter);
45  connect(reply, SIGNAL(finished()), SLOT(downloadSingleFinished()));
47 }
48 
50 {
51  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
52 
57 
60 }
61 
63 {
64  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
65 
67  if(m_reply && m_reply->error() == QNetworkReply::NoError)
68  {
69  QJsonParseError ok;
70  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
72  {
73  QVariantMap value = json.toVariant().toMap();
74  if(value["code"].toInt() == 200)
75  {
76  value = value["result"].toMap();
77  m_totalSize = value["songCount"].toInt();
78 
79  const QVariantList &datas = value["songs"].toList();
80  for(const QVariant &var : qAsConst(datas))
81  {
82  if(var.isNull())
83  {
84  continue;
85  }
86 
87  value = var.toMap();
89 
91  info.m_songId = value["id"].toString();
92  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
93 
94  const QVariantList &artistsArray = value["ar"].toList();
95  for(const QVariant &artistValue : qAsConst(artistsArray))
96  {
97  if(artistValue.isNull())
98  {
99  continue;
100  }
101 
102  const QVariantMap &artistObject = artistValue.toMap();
103  if(info.m_artistId.isEmpty())
104  {
105  info.m_artistId = artistObject["id"].toString();
106  }
107 
108  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, artistObject["name"].toString());
109  }
110 
111  const QVariantMap &albumObject = value["al"].toMap();
112  info.m_albumId = albumObject["id"].toString();
113  info.m_albumName = TTK::String::charactersReplace(albumObject["name"].toString());
114 
115  info.m_coverUrl = ReqWYInterface::makeCoverPixmapUrl(albumObject["pic_str"].toString());
117  info.m_duration = TTKTime::formatDuration(value["dt"].toInt());
118  info.m_year = TTKDateTime::format(value["publishTime"].toULongLong(), TTK_YEAR_FORMAT);
119  info.m_trackNumber = value["no"].toString();
120 
122  {
126 
127  Q_EMIT createResultItem({info, serverToString()});
128  }
129 
130  m_items << info;
131  }
132  }
133  }
134  }
135 
136  Q_EMIT downloadDataChanged({});
137  deleteAll();
138 }
139 
141 {
142  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
143 
145  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
146  if(reply && reply->error() == QNetworkReply::NoError)
147  {
148  QJsonParseError ok;
149  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
151  {
152  QVariantMap value = json.toVariant().toMap();
153  if(value["code"].toInt() == 200 && value.contains("songs"))
154  {
155  const QVariantList &datas = value["songs"].toList();
156  for(const QVariant &var : qAsConst(datas))
157  {
158  if(var.isNull())
159  {
160  continue;
161  }
162 
163  value = var.toMap();
165 
167  info.m_songId = value["id"].toString();
168  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
169 
170  const QVariantList &artistsArray = value["ar"].toList();
171  for(const QVariant &artistValue : qAsConst(artistsArray))
172  {
173  if(artistValue.isNull())
174  {
175  continue;
176  }
177 
178  const QVariantMap &artistObject = artistValue.toMap();
179  if(info.m_artistId.isEmpty())
180  {
181  info.m_artistId = artistObject["id"].toString();
182  }
183 
184  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, artistObject["name"].toString());
185  }
186 
187  const QVariantMap &albumObject = value["al"].toMap();
188  info.m_albumId = albumObject["id"].toString();
189  info.m_albumName = TTK::String::charactersReplace(albumObject["name"].toString());
190 
191  info.m_coverUrl = ReqWYInterface::makeCoverPixmapUrl(albumObject["pic_str"].toString());
193  info.m_duration = TTKTime::formatDuration(value["dt"].toInt());
194  info.m_year = TTKDateTime::format(value["publishTime"].toULongLong(), TTK_YEAR_FORMAT);
195  info.m_trackNumber = value["no"].toString();
196 
200 
201  Q_EMIT createResultItem({info, serverToString()});
202  m_items << info;
203  }
204  }
205  }
206  }
207 
208  Q_EMIT downloadDataChanged({});
209  deleteAll();
210 }
211 
212 
213 
215  : MusicQuerySongRequest(parent)
216 {
218  m_pageSize = 1;
219  m_totalSize = 13;
220 }
221 
223 {
224  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
225 
226  deleteAll();
227 
228  QNetworkRequest request;
229  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
232 
233  m_reply = m_manager.post(request, parameter);
234  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
236 }
237 
239 {
240  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
241 
246 
247  fetchUrlPathSize(&info->m_songProps, info->m_duration);
249 }
250 
252 {
253  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
254 
256  if(m_reply && m_reply->error() == QNetworkReply::NoError)
257  {
258  QJsonParseError ok;
259  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
261  {
262  QVariantMap value = json.toVariant().toMap();
263  if(value["code"].toInt() == 200 && value.contains("data"))
264  {
265  value = value["data"].toMap();
266 
267  const QVariantList &datas = value["newList"].toList();
268  for(const QVariant &var : qAsConst(datas))
269  {
270  if(var.isNull())
271  {
272  continue;
273  }
274 
275  if(!pageValid())
276  {
277  break;
278  }
279 
280  ++m_pageIndex;
281 
282  value = var.toMap();
284 
286  info.m_songId = value["id"].toString();
287  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
288 
289  const QVariantList &artistsArray = value["ar"].toList();
290  for(const QVariant &artistValue : qAsConst(artistsArray))
291  {
292  if(artistValue.isNull())
293  {
294  continue;
295  }
296 
297  const QVariantMap &artistObject = artistValue.toMap();
298  if(info.m_artistId.isEmpty())
299  {
300  info.m_artistId = artistObject["id"].toString();
301  }
302 
303  info.m_artistName = ReqWYInterface::makeSongArtist(info.m_artistName, artistObject["name"].toString());
304  }
305 
306  const QVariantMap &albumObject = value["al"].toMap();
307  info.m_albumId = albumObject["id"].toString();
308  info.m_albumName = TTK::String::charactersReplace(albumObject["name"].toString());
309 
310  info.m_coverUrl = ReqWYInterface::makeCoverPixmapUrl(albumObject["pic_str"].toString());
312  info.m_duration = TTKTime::formatDuration(value["dt"].toInt());
313  info.m_year = TTKDateTime::format(value["publishTime"].toULongLong(), TTK_YEAR_FORMAT);
314  info.m_trackNumber = value["no"].toString();
315 
319 
320  Q_EMIT createResultItem({info, serverToString()});
321  m_items << info;
322  }
323  }
324  }
325  }
326 
327  Q_EMIT downloadDataChanged({});
328  deleteAll();
329 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
MusicWYQuerySongRequest(QObject *parent=nullptr)
virtual void deleteAll()
static constexpr const char * WY_SEARCH_DATA_URL
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
QNetworkReply * m_reply
The class of the query song data from net.
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static constexpr const char * WY_SONG_INFO_DATA_URL
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
#define TTK_PAGE_SIZE_30
static constexpr const char * WY_NEW_SONG_DATA_URL
QString makeSongArtist(const QString &in, const QString &name)
virtual void downloadFinished() overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
void createResultItem(const MusicResultInfoItem &result)
static constexpr const char * WY_NEW_SONG_URL
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
#define TTK_YEAR_FORMAT
Definition: ttkglobal.h:305
virtual void startToPage(int offset) overridefinal
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 * QUERY_WY_INTERFACE
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
static constexpr const char * WY_SONG_LRC_OLD_URL
QNetworkAccessManager m_manager
virtual void downloadFinished() overridefinal
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
virtual void startToSearchByID(const QString &value) overridefinal
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
MusicWYQueryNewSongRequest(QObject *parent=nullptr)
virtual void downloadFinished()
static constexpr const char * WY_SONG_INFO_URL
virtual void downloadFinished() override
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
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
QString makeCoverPixmapUrl(const QString &id)
virtual void startToPage(int offset) overridefinal
#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
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:82