7 static constexpr
const char *
WY_USER_URL =
"resource/user";
8 static constexpr
const char *
WY_UA_URL =
"Vkloais0Z0Q4Smp1aElYSXFUVy96SXdoZ2VsTURzdDBpZEZjT21jMy9PRE1DMzdwQ0p5MllueTkrRGdzb2VkdlJMemJhWEFReHlUUk9uSEtMTHRLUzRxS3psczJiRW9LZ3BQbHh1Z3lGRlhEQk5JbVVGb1NDN1JzTDhZMjBybllLcndKSHlSNC94QzRJWXlL";
9 static constexpr
const char *
WY_COOKIE_URL =
"eU5NVy9LRm5jWE9pdUU1MzNQNi9OcjVUbi9vSGhYcGVaQWc0NjlPbCt1WnNDbDlONDg1SSthTi9JUDQ1YVpsRg==";
10 static constexpr
const char *
WY_USER1_URL =
"VzJpdUVPQ0xkZnp4VENJWjVIVFhQYzZKbnYrSU9pRTFmWXNkcXFaSWorRDRWMjJxUGdZaklZUDNzZXNweXJuczJMeGc2TVFRSEk4SkxCYkxXQ2FFUHpBbENUcjRZZ3RVNGpwRUloVkhVSWhSem50NTM3ZjFGMXdQVXFWN01mNE1GZUg2WFk3anl1Z1hxVkc0eXM3ZFZCVkpGNDZlNVA1MmhvYzZ6UT09";
11 static constexpr
const char *
WY_USER2_URL =
"TE40MEZBWWJkbkhTbTM2OEVTMkE3VjlJOWZuUjVNQ3BFRGMwYjZ4NW9yeE5QdWozU0ZuSjJrQVdpQkdaT3B4enBMOGpTNUJiVXZDTUxmSWFNRkV5SGVqMXcxaS8rZnlsVmo2bkFJR1BvaGQ2c3llUFlyTVNITWdtcFRpMlA2SEl4VE40RnphRTRza2FPaG5RR3hkeGtZOHVGdHV6Nko3UHNBb25rdz09";
12 static constexpr
const char *
WY_USER3_URL =
"c0s1RFpDY0Iya1hNOGFob2JLdGNiUFNxVCs0bE44MDBtQWtmTng4SDRqWlZOZWJXbUkySEtrSDNqVnhUOGMrUVpiNk9lc21MRlFTdFdNYlBwdWNtMmo2VUs4b1M4MFUvS2EzYkpjcnJTZHdZNGdsZ0JsU3lhWkoxaFY1czB4THF6anlDWWp5Ym1VKzJERjAvSmx1WXFPY0ErbjJrMnl2OFhGNGFBUT09";
13 static constexpr
const char *
WY_USER4_URL =
"RGdEcVgrSERYQjErNUovY0hFOVU1dElWR00xRVNiRTRVenlHaVpiMkZ1Z0tXV2ZTZVpjL3RCV2pvajhLNjhINjFaUG5QWGdNcnZlcVlxZm93V01IUUgyWWM3NFFTdGE5K203MG5KeE0rNzFPV1ZFUmJHUnBSSHRXRUx1NEVYcU91VGgzWUh6M0hOcUVaUG9YQU9GNXFIaHlDVk5UVGNISmtmcHllQT09";
14 static constexpr
const char *
WY_USER5_URL =
"ZmxqdmFXWFlmWFdtYzB2M212VVRaSDhIL1NhYnRySDg5dlV0eWx3YVdZUG82NFlMRlZMNnRHVGFlbVhqaFF0ckJ2YTVRSG12YnYrb1ZqaTJFY2ViK0Y3RG5WbWVHVldzVWk0enFweDd1dkhBNmF1dg==";
15 static constexpr
const char *
WY_RAND_URL =
"V0Zsb2tGREU1R0thR29GYjRYdk5jbm5NZjEvN1d6WWNiQlZqb2k4eE1nTm9lTHlBRktkQTBOaXNjQ3ZHU0ZMSw==";
16 static constexpr
const char *
WY_BASE_URL =
"MVNVTXo4bW9WdHhXR1dXeTZmU3k5dmFOcGlua1VOMlE=";
17 static constexpr
const char *
WY_SECKRY_URL =
"411571dca16717d9af5ef1ac97a8d21cb740329890560688b1b624de43f49fdd7702493835141b06ae45f1326e264c98c24ce87199c1a776315e5f25c11056b02dd92791fcc012bff8dd4fc86e37888d5ccc060f7837b836607dbb28bddc703308a0ba67c24c6420dd08eec2b8111067486c907b6e53c027ae1e56c188bc568e";
19 static constexpr
const char *
WY_SONG_PATH_V1_URL =
"N2NkQWg4V3o0NXYvMlFHamVOWVZ5Y2NnTDk2cTNFdFVROVNwTndJV2REYXM0K01Yd2NIT1pwaGcyTGJ0QVVsNHVxT0lTZHFKNTI2QnlWMnVBWFNDdWYrb09Waz0=";
20 static constexpr
const char *
WY_SONG_PATH_V2_URL =
"M21IV2dlSHNzaE1zZEpyb2hrQ0dqVEY3Ly9DZ3ZteDM1RStuSlJIRVVCRTljbWJKKzRBVnNZY3JEcEZKY045dEJ5KzM0WHArSDVCYXhrMHBoZmlTZXBWdHIvND0=";
22 static constexpr
const char *
WY_SONG_PATH_V3_URL =
"cmNsdVp5dFI1TG5VMVg1N2w1bnZwOEx0TGlUazZuZ1JFMkg0dVcvS0ZKbExPL2d0UW9kT0RaZHNhMzFXcjZiVytiZmtLY2hvYjk0bVEyZDhWaldiTmx6V0pmaz0=";
24 static constexpr
const char *
WY_SONG_PATH_V3_DATA_URL =
"TDlnVTZReGNvWk9YTkFFdVF4bDJJcUk4K1BHRFU1N2I3eHlNNmwwYnIzcEVRdDZVelpRVEpRODNjTDVWdXprVEJtcENlNmFmUHZXYUNsdXkxSHV6elE9PQ==";
26 Q_GLOBAL_STATIC(QString, WY_USER_DATA)
35 if(WY_USER_DATA()->isEmpty())
38 if(file.open(QIODevice::ReadOnly))
40 *WY_USER_DATA() = QString::fromUtf8(file.readAll());
61 return in.isEmpty() ? artistName : (in +
";" + artistName);
66 static QByteArray magic =
TTK::Algorithm::mdII(
"VHRXTE1NUmM3eGtOR25EWGpSYk1kVUg2U3A4Y2pmTkk=",
false).toUtf8();
69 const QByteArray &v =
id.toUtf8();
70 for(
int i = 0; i < v.length(); i++)
72 result.append(v[i] ^ magic[i % magic.length()]);
76 result.replace(
'/',
'_');
77 result.replace(
'+',
"-");
78 return TTK::Algorithm::mdII(
"QWU4T2xhNmVNaDFVd1hKZ3JvUkJ5d1BCUHE2OU5CazV5TktERlBFaUYxQWhIMGVrUXBVWXl3PT0=",
false).arg(result.constData(), id);
84 QByteArray param = aes.
encryptCBC(data.toUtf8(),
"0CoJUm6Qyw8W8jud",
"0102030405060708");
85 param = aes.
encryptCBC(param,
"a44e542eaac91dce",
"0102030405060708");
88 request->setUrl(query);
95 const QString &
message =
"nobody" + query +
"use" + data +
"md5forencrypt";
96 const QByteArray &digest = QCryptographicHash::hash(message.toUtf8(), QCryptographicHash::Md5).toHex();
97 const QString &body = query +
"-36cd479b6b5-" + data +
"-36cd479b6b5-" + digest;
100 const QByteArray ¶m = aes.
encryptECB(body.toUtf8(),
"e82ckenh8dichen8",
true);
102 request->setUrl(url);
104 return "params=" + param.toUpper();
111 if(prop.m_bitrate == bitrate)
117 TTK_INFO_STREAM(
"parse song" << bitrate <<
"kbps property in v1 module");
119 QNetworkRequest request;
133 QVariantMap value = json.
toVariant().toMap();
134 if(value[
"code"].toInt() == 200 && value.contains(
"data"))
136 value = value[
"data"].toMap();
142 const int rate = value[
"br"].toInt() / 1000;
146 prop.
m_url = value[
"url"].toString();
148 prop.
m_format = value[
"type"].toString();
160 if(prop.m_bitrate == bitrate)
166 TTK_INFO_STREAM(
"parse song" << bitrate <<
"kbps property in v2 module");
168 QNetworkRequest request;
183 QVariantMap value = json.
toVariant().toMap();
184 if(value[
"code"].toInt() == 200 && value.contains(
"data"))
186 const QVariantList &datas = value[
"data"].toList();
187 for(
const QVariant &var :
qAsConst(datas))
196 const int rate = value[
"br"].toInt() / 1000;
200 prop.
m_url = value[
"url"].toString();
202 prop.
m_format = value[
"type"].toString();
215 if(prop.m_bitrate == bitrate)
221 TTK_INFO_STREAM(
"parse song" << bitrate <<
"kbps property in v3 module");
232 QNetworkRequest request;
248 QVariantMap value = json.
toVariant().toMap();
249 if(value[
"code"].toInt() == 200 && value.contains(
"data"))
251 const QVariantList &datas = value[
"data"].toList();
252 for(
const QVariant &var :
qAsConst(datas))
261 const int rate = value[
"br"].toInt() / 1000;
265 prop.
m_url = value[
"url"].toString();
267 prop.
m_format = value[
"type"].toString();
280 if(prop.m_bitrate == bitrate)
286 TTK_INFO_STREAM(
"parse song" << bitrate <<
"kbps property in unity module");
360 const QVariantMap &privilege = key[
"privilege"].toMap();
361 if(!privilege.isEmpty())
363 const QString &brStr = privilege[
"maxbr"].toString();
364 if(brStr ==
"999000")
368 else if(brStr ==
"320000" || brStr ==
"192000" || brStr ==
"190000")
372 else if(brStr ==
"160000")
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
static constexpr const char * WY_COOKIE_URL
static constexpr const char * WY_SECKRY_URL
static QString message(const TTK::Attribute attr)
static constexpr const char * WY_USER1_URL
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
TTK_MODULE_EXPORT QString urlEncode(QString &data)
QVariant toVariant() const
The class of the music song property.
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
static constexpr const char * WY_USER5_URL
static void parseSongPropertyUnity(TTK::MusicSongInformation *info, int bitrate)
QByteArray encryptECB(const QByteArray &in, const QByteArray &key, bool hex=false)
static constexpr const char * WY_SONG_PATH_V3_DATA_URL
QString makeSongArtist(const QString &in, const QString &name)
static constexpr const char * WY_SONG_PATH_V3_QUERY_URL
static constexpr const char * WY_USER_URL
TTK_MODULE_EXPORT QString sizeByteToLabel(qint64 size)
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
static void parseSongPropertyV3(TTK::MusicSongInformation *info, int bitrate)
void makeRequestRawHeader(QNetworkRequest *request) noexcept
static constexpr const char * WY_USER3_URL
TTK_MODULE_EXPORT QByteArray md5(const QByteArray &data, bool base64=false)
QByteArray encryptCBC(const QByteArray &in, const QByteArray &key, const QByteArray &iv, bool hex=false)
static constexpr const char * MDII_UA_KEY
#define APPCACHE_DIR_FULL
static constexpr const char * QUERY_WY_INTERFACE
static void parseSongProperty(TTK::MusicSongInformation *info, int bitrate)
static void parseSongPropertyV1(TTK::MusicSongInformation *info, int bitrate)
#define TTK_INFO_STREAM(msg)
static constexpr const char * WY_SONG_PATH_V2_URL
static constexpr wchar_t key[]
The class of the aes wrapper.
TTK_MODULE_EXPORT void setContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
static QString makeUser() noexcept
static constexpr const char * WY_SONG_PATH_V3_URL
static constexpr const char * WY_USER4_URL
void parseFromSongProperty(TTK::MusicSongInformation *info, int bitrate)
static constexpr const char * WY_SONG_PATH_V2_DATA_URL
static constexpr const char * WY_USER2_URL
static constexpr const char * WY_SONG_PATH_V1_URL
static constexpr const char * WY_UA_URL
void parseFromSongProperty(TTK::MusicSongInformation *info, const QString &type, const QString &id, int bitrate)
QByteArray makeTokenRequest(QNetworkRequest *request, const QString &query, const QString &data)
static void parseSongPropertyV2(TTK::MusicSongInformation *info, int bitrate)
static constexpr const char * WY_RAND_URL
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
QString makeCoverPixmapUrl(const QString &id)
static constexpr const char * WY_BASE_URL