TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicwyqueryinterface.cpp
Go to the documentation of this file.
2 #include "musicurlutils.h"
3 #include "musicabstractnetwork.h"
4 
6 
7 void ReqWYInterface::makeRequestRawHeader(QNetworkRequest *request)
8 {
9  request->setRawHeader("Referer", TTK::Algorithm::mdII(WY_BASE_URL, false).toUtf8());
10  request->setRawHeader("Origin", TTK::Algorithm::mdII(WY_BASE_URL, false).toUtf8());
11  request->setRawHeader("User-Agent", TTK::Algorithm::mdII(WY_UA_URL, ALG_UA_KEY, false).toUtf8());
12  request->setRawHeader("Cookie", QString("MUSIC_U=%1; NMTID=%2; ").arg(TTK::Algorithm::mdII(WY_COOKIE_URL, false), TTK::Algorithm::mdII(WY_NMTID_URL, ALG_UA_KEY, false)).toUtf8());
13  TTK::setSslConfiguration(request);
15 }
16 
17 QString ReqWYInterface::makeSongArtist(const QString &in, const QString &name)
18 {
19  const QString &artistName = TTK::String::charactersReplace(name);
20  return in.isEmpty() ? artistName : (in + ";" + artistName);
21 }
22 
23 QString ReqWYInterface::makeCoverPixmapUrl(const QString &url)
24 {
25  return url + TTK::Algorithm::mdII("dCt3T2JSbmJ2LzFuOUZBalAwTnUvNkRpc3dZPQ==", false);
26 }
27 
28 QByteArray ReqWYInterface::makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &type)
29 {
30  QAlgorithm::Aes aes;
31  QByteArray parameter = aes.encryptCBC(type.toUtf8(), "0CoJUm6Qyw8W8jud", "0102030405060708");
32  parameter = aes.encryptCBC(parameter, "a44e542eaac91dce", "0102030405060708");
33  TTK::Url::urlEncode(parameter);
34 
35  request->setUrl(query);
37 
38  return "params=" + parameter + "&encSecKey=" + WY_SECKRY_STRING;
39 }
40 
41 static void parseSongPropertyNew(TTK::MusicSongInformation *info, int bitrate)
42 {
43  QNetworkRequest request;
44  const QByteArray &parameter = ReqWYInterface::makeTokenRequest(&request,
46  TTK::Algorithm::mdII(WY_SONG_PATH_DATA_URL, false).arg(info->m_songId).arg(bitrate * 1000));
47 
48  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
49  if(bytes.isEmpty())
50  {
51  return;
52  }
53 
54  QJson::Parser json;
55  bool ok = false;
56  const QVariant &data = json.parse(bytes, &ok);
57  if(ok)
58  {
59  QVariantMap value = data.toMap();
60  if(value["code"].toInt() == 200 && value.contains("data"))
61  {
62  const QVariantList &datas = value["data"].toList();
63  for(const QVariant &var : qAsConst(datas))
64  {
65  if(var.isNull())
66  {
67  continue;
68  }
69 
70  value = var.toMap();
71 
73  prop.m_url = value["url"].toString();
74  prop.m_bitrate = bitrate;
75 
76  if(prop.isEmpty() || info->m_songProps.contains(prop))
77  {
78  break;
79  }
80 
81  prop.m_size = TTK::Number::sizeByteToLabel(value["size"].toInt());
82  prop.m_format = value["type"].toString();
83  info->m_songProps.append(prop);
84  }
85  }
86  }
87 }
88 
89 static void parseSongProperty(TTK::MusicSongInformation *info, int bitrate)
90 {
91  for(const TTK::MusicSongProperty &prop : qAsConst(info->m_songProps))
92  {
93  if(prop.m_bitrate == bitrate)
94  {
95  return;
96  }
97  }
98 
99  QNetworkRequest request;
100  request.setUrl(TTK::Algorithm::mdII(WY_SONG_INFO_OLD_URL, false).arg(bitrate * 1000).arg(info->m_songId));
102 
103  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
104  if(bytes.isEmpty())
105  {
106  return;
107  }
108 
109  QJson::Parser json;
110  bool ok = false;
111  const QVariant &data = json.parse(bytes, &ok);
112  if(ok)
113  {
114  QVariantMap value = data.toMap();
115  if(value["code"].toInt() == 200 && value.contains("data"))
116  {
117  value = value["data"].toMap();
118  if(value.isEmpty())
119  {
120  return;
121  }
122 
124  prop.m_url = value["url"].toString();
125  prop.m_bitrate = bitrate;
126 
127  const int oCount = info->m_songProps.count();
128  if(prop.isEmpty())
129  {
130  parseSongPropertyNew(info, bitrate);
131  if(info->m_songProps.count() != oCount)
132  {
133  return;
134  }
135 
136  QString format;
137  if(bitrate == TTK_BN_128)
138  {
139  format = TTK::Algorithm::mdII("QXMyZkZJc2dIb1FOenJlTg==", false);
140  prop.m_format = MP3_FILE_SUFFIX;
141  }
142  else if(bitrate == TTK_BN_320)
143  {
144  format = TTK::Algorithm::mdII("UThNR09kcDRXNG9qbG45Ng==", false);
145  prop.m_format = MP3_FILE_SUFFIX;
146  }
147  else if(bitrate == TTK_BN_1000)
148  {
149  format = TTK::Algorithm::mdII("VGF0djlKc01mL1QxM1pyNQ==", false);
150  prop.m_format = FLAC_FILE_SUFFIX;
151  }
152  else
153  {
154  return;
155  }
156 
157  prop.m_url = TTK::Algorithm::mdII(WY_SONG_DETAIL_CGG_URL, false).arg(info->m_songId, format);
158  prop.m_size = TTK::Number::sizeByteToLabel(info->m_duration, bitrate);
159  info->m_songProps.append(prop);
160  return;
161  }
162  else
163  {
164  prop.m_size = TTK::Number::sizeByteToLabel(value["size"].toInt());
165  prop.m_format = value["type"].toString();
166  info->m_songProps.append(prop);
167  }
168  }
169  }
170 }
171 
173 {
174  if(info->m_songId.isEmpty())
175  {
176  return;
177  }
178 
179  if(info->m_formatProps.isEmpty())
180  {
182  return;
183  }
184 
185  if(bitrate == TTK_BN_0)
186  {
187  const int maxBr = info->m_formatProps.toInt();
188  if(maxBr == TTK_BN_1000)
189  {
194  }
195  else if(maxBr == TTK_BN_320)
196  {
200  }
201  else if(maxBr == TTK_BN_192)
202  {
205  }
206  else
207  {
209  }
210  }
211  else
212  {
213  parseSongProperty(info, bitrate);
214  }
215 }
216 
218 {
219  int maxBr = TTK_BN_1000;
220  const QVariantMap &privilege = key["privilege"].toMap();
221  if(!privilege.isEmpty())
222  {
223  const QString &brStr = privilege["maxbr"].toString();
224  if(brStr == "999000")
225  {
226  maxBr = TTK_BN_1000;
227  }
228  else if(brStr == "320000" || brStr == "192000" || brStr == "190000")
229  {
230  maxBr = TTK_BN_320;
231  }
232  else if(brStr == "160000")
233  {
234  maxBr = TTK_BN_192;
235  }
236  else
237  {
238  maxBr = TTK_BN_128;
239  }
240  }
241 
242  info->m_formatProps = QString::number(maxBr);
243 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
static constexpr const char * WY_BASE_URL
base url
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
TTK_MODULE_EXPORT QString urlEncode(QString &data)
static constexpr const char * WY_SONG_DETAIL_CGG_URL
static constexpr const char * WY_NMTID_URL
The class of the music song property.
Definition: musicobject.h:223
static constexpr wchar_t key[]
QString makeSongArtist(const QString &in, const QString &name)
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
MusicSongPropertyList m_songProps
Definition: musicobject.h:295
TTK_MODULE_EXPORT QString sizeByteToLabel(qint64 size)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
#define TTK_BN_1000
Definition: ttkglobal.h:354
#define MP3_FILE_SUFFIX
Definition: musicobject.h:50
static constexpr const char * WY_SONG_PATH_URL
static constexpr const char * WY_SONG_PATH_DATA_URL
static constexpr const char * ALG_UA_KEY
#define qAsConst
Definition: ttkqtglobal.h:53
const char * name
Definition: http_parser.c:458
static void parseSongPropertyNew(TTK::MusicSongInformation *info, int bitrate)
static void parseSongProperty(TTK::MusicSongInformation *info, int bitrate)
void makeRequestRawHeader(QNetworkRequest *request)
The class of the aes wrapper.
Definition: aeswrapper.h:32
bool isEmpty() const noexcept
Definition: musicobject.h:236
#define TTK_BN_0
Definition: ttkglobal.h:344
#define TTK_BN_320
Definition: ttkglobal.h:351
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 * WY_SECKRY_STRING
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
static constexpr const char * WY_UA_URL
cookie url
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
QByteArray makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &type)
static constexpr const char * WY_COOKIE_URL
QString makeCoverPixmapUrl(const QString &url)
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
#define TTK_BN_192
Definition: ttkglobal.h:349
#define FLAC_FILE_SUFFIX
Definition: musicobject.h:52
static constexpr const char * WY_SONG_INFO_OLD_URL
QByteArray encryptCBC(const QByteArray &in, const QByteArray &key, const QByteArray &iv)
Definition: aeswrapper.cpp:49
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
The class of the music song information.
Definition: musicobject.h:281
#define TTK_BN_128
Definition: ttkglobal.h:348