TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickwqueryplaylistrequest.cpp
Go to the documentation of this file.
2 
5 {
8 }
9 
11 {
12  TTK_INFO_STREAM(className() << "startToPage" << offset);
13 
14  deleteAll();
15  m_totalSize = 0;
17 
18  QNetworkRequest request;
19  request.setUrl(TTK::Algorithm::mdII(KW_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() << "startToSearch" << value);
30 
31  deleteAll();
32 
33  QNetworkRequest request;
34  request.setUrl(TTK::Algorithm::mdII(KW_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  MusicQueryPlaylistRequest::startToSearchByID(value.isEmpty() ? "393" : value);
45 }
46 
48 {
49  TTK_INFO_STREAM(className() << "startToQueryResult" << info->m_songId << bitrate << "kbps");
50 
55 
56  findUrlPathSize(&info->m_songProps, info->m_duration);
58 }
59 
61 {
62  TTK_INFO_STREAM(className() << "startToQueryInfo" << item.m_id);
63 
65 
66  QNetworkRequest request;
67  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_INFO_URL, false).arg(item.m_id));
69 
70  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
71  if(bytes.isEmpty())
72  {
73  return;
74  }
75 
76  QJson::Parser json;
77  bool ok = false;
78  const QVariant &data = json.parse(bytes, &ok);
79  if(ok)
80  {
81  const QVariantMap &value = data.toMap();
82  if(!value.isEmpty())
83  {
84  item.m_coverUrl = value["pic"].toString();
85  item.m_name = value["title"].toString();
86  item.m_count = value["playnum"].toString();
87  item.m_description = value["info"].toString();
88  item.m_updateTime = TTKDateTime::format(value["ctime"].toULongLong() * TTK_DN_S2MS, TTK_DATE_FORMAT);
89  item.m_nickName = value["uname"].toString();
90  }
91  }
92 }
93 
95 {
96  TTK_INFO_STREAM(className() << "downLoadFinished");
97 
99  if(m_reply && m_reply->error() == QNetworkReply::NoError)
100  {
101  QJson::Parser json;
102  bool ok = false;
103  const QVariant &data = json.parse(m_reply->readAll(), &ok);
104  if(ok)
105  {
106  QVariantMap value = data.toMap();
107  if(value["code"].toInt() == 200 && value.contains("data"))
108  {
109  value = value["data"].toMap();
110  m_totalSize = value["total"].toInt();
111 
112  const QVariantList &datas = value["data"].toList();
113  for(const QVariant &var : qAsConst(datas))
114  {
115  if(var.isNull())
116  {
117  continue;
118  }
119 
120  value = var.toMap();
122 
123  morePlaylistDetails(value["id"].toString());
125  }
126  }
127  }
128  }
129 
130 // Q_EMIT downLoadDataChanged({});
131  deleteAll();
132 }
133 
135 {
136  TTK_INFO_STREAM(className() << "downloadDetailsFinished");
137 
139  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
140  if(reply && reply->error() == QNetworkReply::NoError)
141  {
142  QJson::Parser json;
143  bool ok = false;
144  const QVariant &data = json.parse(reply->readAll(), &ok);
145  if(ok)
146  {
147  QVariantMap value = data.toMap();
148  if(value.contains("musiclist"))
149  {
150  const QVariantList &datas = value["musiclist"].toList();
151  for(const QVariant &var : qAsConst(datas))
152  {
153  if(var.isNull())
154  {
155  continue;
156  }
157 
158  value = var.toMap();
160 
162  info.m_songId = value["id"].toString();
163  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
164 
165  info.m_artistId = value["artistid"].toString();
166  info.m_artistName = ReqKWInterface::makeSongArtist(value["artist"].toString());
167 
168  info.m_albumId = value["albumid"].toString();
169  info.m_albumName = TTK::String::charactersReplace(value["album"].toString());
170 
171  info.m_coverUrl = ReqKWInterface::makeCoverPixmapUrl(value["web_albumpic_short"].toString(), info.m_songId);
172  info.m_lrcUrl = TTK::Algorithm::mdII(KW_SONG_LRC_URL, false).arg(info.m_songId);
173  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
174  info.m_year.clear();
175  info.m_trackNumber = "0";
176 
178  ReqKWInterface::parseFromSongProperty(&info, value["formats"].toString());
180 
181  Q_EMIT createResultItem({info, serverToString()});
182  m_items << info;
183  }
184  }
185  }
186  }
187 
188  Q_EMIT downLoadDataChanged({});
189 }
190 
192 {
193  TTK_INFO_STREAM(className() << "downloadMoreDetailsFinished");
194 
195  QNetworkReply *reply = TTKObjectCast(QNetworkReply*, sender());
196  if(reply && reply->error() == QNetworkReply::NoError)
197  {
198  QJson::Parser json;
199  bool ok = false;
200  const QVariant &data = json.parse(reply->readAll(), &ok);
201  if(ok)
202  {
203  const QVariantMap &value = data.toMap();
204  if(value["result"].toString() == "ok")
205  {
206  MusicResultDataItem item;
207  item.m_coverUrl = value["pic"].toString();
208  item.m_id = value["id"].toString();
209  item.m_name = value["title"].toString();
210  item.m_count = value["playnum"].toString();
211  item.m_description = value["info"].toString();
212  item.m_updateTime = TTKDateTime::format(value["ctime"].toULongLong() * TTK_DN_S2MS, TTK_DATE_FORMAT);
213  item.m_nickName = value["uname"].toString();
214  item.m_category = value["tag"].toString();
215 
216  if(!item.m_category.isEmpty())
217  {
218  item.m_category.replace(",", "|");
219  item.m_category.insert(0, "|");
220  item.m_category.append("|");
221  }
222 
223  Q_EMIT createPlaylistItem(item);
224  }
225  }
226  }
227 }
228 
230 {
231  TTK_INFO_STREAM(className() << "morePlaylistDetails" << pid);
232 
233  QNetworkRequest request;
234  request.setUrl(TTK::Algorithm::mdII(KW_PLAYLIST_INFO_URL, false).arg(pid));
236 
237  QNetworkReply *reply = m_manager.get(request);
238  connect(reply, SIGNAL(finished()), SLOT(downloadMoreDetailsFinished()));
240 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
virtual void downLoadFinished() overridefinal
virtual void startToSearchByID(const QString &value) overridefinal
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void startToSearch(const QString &value) overridefinal
The class of the search result data item.
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
virtual void startToSearchByID(const QString &value) override
MusicSongPropertyList m_songProps
Definition: musicobject.h:295
QString makeCoverPixmapUrl(const QString &url, const QString &id)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
void makeRequestRawHeader(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)
TTK::MusicSongInformationList m_items
#define qAsConst
Definition: ttkqtglobal.h:53
static constexpr const char * KW_SONG_LRC_URL
static constexpr const char * KW_PLAYLIST_INFO_URL
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:67
virtual void startToPage(int offset) overridefinal
QNetworkAccessManager m_manager
MusicKWQueryPlaylistRequest(QObject *parent=nullptr)
void createResultItem(const MusicResultInfoItem &songItem)
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
#define TTK_DATE_FORMAT
Definition: ttkglobal.h:231
virtual void downLoadFinished() override
QString makeSongArtist(const QString &name)
virtual void startToQueryInfo(MusicResultDataItem &item) overridefinal
#define SONG_PAGE_SIZE
#define TTK_DN_S2MS
Definition: ttkglobal.h:276
TTK_MODULE_EXPORT QString toString(Record type)
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
bool findUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
void morePlaylistDetails(const QString &pid)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
The class of the music song information.
Definition: musicobject.h:281
#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 * KW_PLAYLIST_URL
playlist url
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:60