TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickgqueryplaylistrequest.cpp
Go to the documentation of this file.
2 
5 {
8 }
9 
11 {
12  TTK_INFO_STREAM(className() << __FUNCTION__ << offset);
13 
14  deleteAll();
15  m_totalSize = 0;
17 
18  QNetworkRequest request;
19  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_URL, false).arg(m_queryValue).arg(offset + 1).arg(m_pageSize));
21 
22  m_reply = m_manager.get(request);
23  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
25 }
26 
28 {
29  TTK_INFO_STREAM(className() << __FUNCTION__ << value);
30 
31  deleteAll();
32 
33  QNetworkRequest request;
34  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_INFO_URL, false).arg(value));
36 
37  QNetworkReply *reply = m_manager.get(request);
38  connect(reply, SIGNAL(finished()), SLOT(downloadDetailsFinished()));
40 }
41 
43 {
44  TTK_INFO_STREAM(className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
45 
50 
53 }
54 
56 {
57  TTK_INFO_STREAM(className() << __FUNCTION__ << item.m_id);
58 
60 
61  QNetworkRequest request;
62  request.setUrl(TTK::Algorithm::mdII(KG_PLAYLIST_DETAIL_URL, false).arg(item.m_id));
64 
65  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
66  if(bytes.isEmpty())
67  {
68  return;
69  }
70 
71  QJsonParseError ok;
72  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
74  {
75  QVariantMap value = json.toVariant().toMap();
76  if(value["errcode"].toInt() == 0 && value.contains("data"))
77  {
78  value = value["data"].toMap();
79  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "400");
80  item.m_name = value["specialname"].toString();
81  item.m_count = value["playcount"].toString();
82  item.m_description = value["intro"].toString();
83  item.m_time = value["publishtime"].toString();
84  item.m_nickName = value["nickname"].toString();
85  item.m_category.clear();
86 
87  const QVariantList &tags = value["tags"].toList();
88  for(const QVariant &var : qAsConst(tags))
89  {
90  if(var.isNull())
91  {
92  continue;
93  }
94 
95  value = var.toMap();
96 
97  item.m_category.append(value["tagname"].toString() + "|");
98  }
99 
100  if(!item.m_category.isEmpty())
101  {
102  item.m_category.insert(0, "|");
103  }
104  }
105  }
106 }
107 
109 {
110  TTK_INFO_STREAM(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["errcode"].toInt() == 0)
121  {
122  value = value["data"].toMap();
123  m_totalSize = value["total"].toInt();
124 
125  const QVariantList &datas = value["info"].toList();
126  for(const QVariant &var : qAsConst(datas))
127  {
128  if(var.isNull())
129  {
130  continue;
131  }
132 
133  value = var.toMap();
135 
136  MusicResultDataItem item;
137  item.m_coverUrl = value["imgurl"].toString().replace("{size}", "400");
138  item.m_id = value["specialid"].toString();
139  item.m_name = value["specialname"].toString();
140  item.m_count = value["playcount"].toString();
141  item.m_description = value["intro"].toString();
142  item.m_time = value["publishtime"].toString();
143  item.m_nickName = value["username"].toString();
144  Q_EMIT createPlaylistItem(item);
145  }
146  }
147  }
148  }
149 
150 // Q_EMIT downLoadDataChanged({});
151  deleteAll();
152 }
153 
155 {
156  TTK_INFO_STREAM(className() << __FUNCTION__);
157 
159  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
160  if(reply && reply->error() == QNetworkReply::NoError)
161  {
162  QJsonParseError ok;
163  const QJsonDocument &json = QJsonDocument::fromJson(reply->readAll(), &ok);
165  {
166  QVariantMap value = json.toVariant().toMap();
167  if(value["errcode"].toInt() == 0 && value.contains("data"))
168  {
169  value = value["data"].toMap();
170 
171  const QVariantList &datas = value["info"].toList();
172  for(const QVariant &var : qAsConst(datas))
173  {
174  if(var.isNull())
175  {
176  continue;
177  }
178 
179  value = var.toMap();
181 
183  info.m_songId = value["hash"].toString();
184 
185  info.m_albumId = value["album_id"].toString();
186 
187  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
188  info.m_year.clear();
189  info.m_trackNumber = "0";
190 
194  ReqKGInterface::parseFromSongAlbumInfo(&info, value["album_audio_id"].toString());
198 
199  Q_EMIT createResultItem({info, serverToString()});
200  m_items << info;
201  }
202  }
203  }
204  }
205 
206  Q_EMIT downLoadDataChanged({});
207 }
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void startToPage(int offset) overridefinal
The class of the search result data item.
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
virtual void downLoadFinished() overridefinal
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
static constexpr const char * QUERY_KG_INTERFACE
static constexpr const char * KG_PLAYLIST_URL
playlist url
MusicSongPropertyList m_songProps
Definition: musicobject.h:309
void createResultItem(const MusicResultInfoItem &result)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
The class of the query playlist download data from net.
virtual void downLoadFinished()
void createPlaylistItem(const MusicResultDataItem &item)
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
virtual void startToSearch(const QString &value) overridefinal
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
QNetworkAccessManager m_manager
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 downLoadFinished() override
TTK_MODULE_EXPORT QString toString(Record type) noexcept
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
static constexpr const char * KG_PLAYLIST_INFO_URL
#define SONG_PAGE_SIZE
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
static constexpr const char * KG_PLAYLIST_DETAIL_URL
MusicKGQueryPlaylistRequest(QObject *parent=nullptr)
void parseFromSongAlbumLrc(TTK::MusicSongInformation *info)
void parseFromSongAlbumInfo(TTK::MusicSongInformation *info, const QString &album)
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
void makeRequestRawHeader(QNetworkRequest *request) noexcept
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
The class of the music song information.
Definition: musicobject.h:295
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:82