TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicwyqueryartistrequest.cpp
Go to the documentation of this file.
2 
3 static constexpr const char *WY_ARTIST_URL = "YmhRbVZDYy8rbytiRWc5cXc2MUVUdEFKRmw2eFhTVmhqWTZ6MmRVNEMzbVg0Q3BFQVF4d0VYUktBMk1aVUNVb3ZaNk5VL3BYRjBZPQ==";
4 static constexpr const char *WY_ARTIST_INFO_URL = "RnJtNVNTT01ncFI2cDJMRTMrSFFwWFBWVEEzQnZNYmg4TEJrRjZCeHorTE13aVNCNUxScGo2QzNzVUNKNzhKbkI2VjNKUT09";
5 static constexpr const char *WY_ARTIST_INFO_DATA_URL = "dmt4VnNDdWErYjRYUXBnOWdubVBIQT09";
6 
9 {
10  m_pageSize = TTK_HIGH_LEVEL; // TTK_PAGE_SIZE_50;
12 }
13 
15 {
16  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << offset);
17 
18  deleteAll();
19  m_totalSize = m_pageSize; // 0
21 
22  QNetworkRequest request;
23  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
25  QString("{}"));
26 
27  m_reply = m_manager.post(request, parameter);
28  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
30 }
31 
33 {
34  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__ << info->m_songId << bitrate << "kbps");
35 
40 
43 }
44 
46 {
47  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
48 
50  if(m_reply && m_reply->error() == QNetworkReply::NoError)
51  {
52  QJsonParseError ok;
53  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
55  {
56  QVariantMap value = json.toVariant().toMap();
57  if(value["code"].toInt() == 200 && value.contains("hotSongs"))
58  {
59  const QVariantMap &artistObject = value["artist"].toMap();
60  const QString &coverUrl = artistObject["picUrl"].toString();
61  const QString &artistName = TTK::String::charactersReplace(artistObject["name"].toString());
62 
63  const QVariantList &datas = value["hotSongs"].toList();
64  for(const QVariant &var : qAsConst(datas))
65  {
66  if(var.isNull())
67  {
68  continue;
69  }
70 
71  value = var.toMap();
73 
75  info.m_songId = value["id"].toString();
76  info.m_songName = TTK::String::charactersReplace(value["name"].toString());
77 
78  info.m_artistName = artistName;
79  const QVariantList &artistsArray = value["ar"].toList();
80  for(const QVariant &artistValue : qAsConst(artistsArray))
81  {
82  if(artistValue.isNull())
83  {
84  continue;
85  }
86 
87  const QVariantMap &artistObject = artistValue.toMap();
88  info.m_artistId = artistObject["id"].toString();
89  break;
90  }
91 
92  const QVariantMap &albumObject = value["al"].toMap();
93  info.m_albumId = albumObject["id"].toString();
94  info.m_albumName = TTK::String::charactersReplace(albumObject["name"].toString());
95 
96  info.m_coverUrl = ReqWYInterface::makeCoverPixmapUrl(albumObject["pic_str"].toString());
98  info.m_duration = TTKTime::formatDuration(value["dt"].toInt());
99  info.m_year.clear();
100  info.m_trackNumber = value["no"].toString();
101 
105 
106  if(!m_artistFound)
107  {
108  m_artistFound = true;
109 
110  MusicResultDataItem item;
111  item.m_nickName.clear();
112  item.m_id = info.m_artistId;
113  item.m_name = info.m_artistName;
114  item.m_coverUrl = coverUrl;
115  item.m_time = TTKDateTime::format(artistObject["publishTime"].toLongLong(), TTK_DATE_FORMAT);
116 
117  const QVariantList &aliasArray = artistObject["alias"].toList();
118  for(const QVariant &aliasValue : qAsConst(aliasArray))
119  {
120  if(aliasValue.isNull())
121  {
122  continue;
123  }
124 
125  item.m_nickName += aliasValue.toString() + ",";
126  }
127 
128  if(!item.m_nickName.isEmpty())
129  {
130  item.m_nickName.chop(1);
131  }
132  else
133  {
134  item.m_nickName = info.m_artistName;
135  }
136 
138  queryArtistIntro(&item);
140  Q_EMIT createArtistItem(item);
141  }
142 
143  Q_EMIT createResultItem({info, serverToString()});
144  m_items << info;
145  }
146  }
147  }
148  }
149 
150  Q_EMIT downloadDataChanged({});
151  deleteAll();
152 }
153 
155 {
156  QNetworkRequest request;
157  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
160 
161  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
162  if(bytes.isEmpty())
163  {
164  return;
165  }
166 
167  QJsonParseError ok;
168  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
170  {
171  QVariantMap value = json.toVariant().toMap();
172  if(value["code"].toInt() == 200)
173  {
174  item->m_description = value["briefDesc"].toString();
175  if(!item->m_description.isEmpty())
176  {
177  item->m_description = QString("%1\r\n\r\n").arg(item->m_description);
178  }
179 
180  const QVariantList &datas = value["introduction"].toList();
181  for(const QVariant &var : qAsConst(datas))
182  {
183  if(var.isNull())
184  {
185  continue;
186  }
187 
188  value = var.toMap();
190 
191  item->m_description += QString("**%1**\r\n").arg(value["ti"].toString());
192  item->m_description += value["txt"].toString() + "\r\n\r\n";
193  }
194  }
195  }
196 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
#define TTK_NETWORK_QUERY_CHECK(VALUE)
The class of the search result data item.
virtual void deleteAll()
QNetworkReply * m_reply
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
virtual void startToPage(int offset) overridefinal
MusicSongPropertyList m_songProps
Definition: musicobject.h:314
void createResultItem(const MusicResultInfoItem &result)
static constexpr const char * WY_ARTIST_INFO_DATA_URL
The class of the query artist data from net.
MusicWYQueryArtistRequest(QObject *parent=nullptr)
virtual void downloadFinished() 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
bool fetchUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
#define TTK_DATE_FORMAT
Definition: ttkglobal.h:309
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
#define TTK_HIGH_LEVEL
Definition: ttkglobal.h:334
virtual void downloadFinished()
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate) overridefinal
void queryArtistIntro(MusicResultDataItem *item) const
void createArtistItem(const MusicResultDataItem &item)
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
static constexpr const char * WY_ARTIST_INFO_URL
static constexpr const char * WY_ARTIST_URL
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)
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123