TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musickwqueryinterface.cpp
Go to the documentation of this file.
3 
5 
6 void ReqKWInterface::makeRequestRawHeader(QNetworkRequest *request)
7 {
11 }
12 
13 QString ReqKWInterface::makeSongArtist(const QString &name)
14 {
15  return TTK::String::charactersReplace(name).replace("&", ";").replace("+", ";");
16 }
17 
18 QString ReqKWInterface::makeCoverPixmapUrl(const QString &url, const QString &id)
19 {
20  if(url.isEmpty() && !id.isEmpty())
21  {
22  return TTK::Algorithm::mdII(KW_ALBUM_COVER_INFO_URL, false).arg(id);
23  }
24  else if(!TTK::String::isNetworkUrl(url))
25  {
26  return TTK::Algorithm::mdII(KW_ALBUM_COVER_URL, false) + url.section('/', 1);
27  }
28  else
29  {
30  return url;
31  }
32 }
33 
34 static void parseSongPropertyV1(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
35 {
36  for(const TTK::MusicSongProperty &prop : qAsConst(info->m_songProps))
37  {
38  if(prop.m_bitrate == bitrate)
39  {
40  return;
41  }
42  }
43 
44  TTK_INFO_STREAM("parse song" << bitrate << "kbps property in v1 module");
45 
46  QString quality;
47  if((format.contains("MP3128") || format.contains("128kmp3")) && bitrate == TTK_BN_128)
48  {
49  quality = "128kmp3";
50  }
51  else if((format.contains("MP3192") || format.contains("192kmp3")) && bitrate == TTK_BN_192)
52  {
53  quality = "192kmp3";
54  }
55  else if((format.contains("MP3H") || format.contains("320kmp3")) && bitrate == TTK_BN_320)
56  {
57  quality = "320kmp3";
58  }
59  else if((format.contains("FLAC") || format.contains("2000kflac")) && bitrate == TTK_BN_1000)
60  {
61  quality = "2000kflac";
62  }
63  else
64  {
65  return;
66  }
67 
68  QNetworkRequest request;
69  request.setUrl(TTK::Algorithm::mdII(KW_SONG_PATH_V1_URL, false).arg(info->m_songId, quality));
71 
72  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
73  if(bytes.isEmpty())
74  {
75  return;
76  }
77 
78  QJson::Parser json;
79  bool ok = false;
80  const QVariant &data = json.parse(bytes, &ok);
81  if(ok)
82  {
83  QVariantMap value = data.toMap();
84  if(value["code"].toInt() == 200 && value.contains("data"))
85  {
86  value = value["data"].toMap();
87  if(value.isEmpty())
88  {
89  return;
90  }
91 
92  const QString &format = value["format"].toString();
93  if(format == suffix)
94  {
96  prop.m_url = value["url"].toString();
97  prop.m_size = TTK_DEFAULT_STR;
98  prop.m_format = suffix;
99  prop.m_bitrate = bitrate;
100  info->m_songProps.append(prop);
101  }
102  }
103  }
104 }
105 
106 static void parseSongPropertyV2(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
107 {
108  for(const TTK::MusicSongProperty &prop : qAsConst(info->m_songProps))
109  {
110  if(prop.m_bitrate == bitrate)
111  {
112  return;
113  }
114  }
115 
116  TTK_INFO_STREAM("parse song" << bitrate << "kbps property in v2 module");
117 
118  QString quality;
119  if((format.contains("MP3128") || format.contains("128kmp3")) && bitrate == TTK_BN_128)
120  {
121  quality = "128kmp3";
122  }
123  else if((format.contains("MP3192") || format.contains("192kmp3")) && bitrate == TTK_BN_192)
124  {
125  quality = "192kmp3";
126  }
127  else if((format.contains("MP3H") || format.contains("320kmp3")) && bitrate == TTK_BN_320)
128  {
129  quality = "320kmp3";
130  }
131  else if((format.contains("FLAC") || format.contains("2000kflac")) && bitrate == TTK_BN_1000)
132  {
133  quality = "2000kflac";
134  }
135  else
136  {
137  return;
138  }
139 
140  QAlgorithm::Des des;
141  const QString &parameter = des.encrypt(TTK::Algorithm::mdII(KW_SONG_PATH_V2_DATA_URL, false).arg(quality).toUtf8(),
142  TTK::Algorithm::mdII("OGlVTjJWOEdlMkkzSkZIeg==", MDII_SHR_KEY, false).toUtf8());
143  QNetworkRequest request;
144  request.setUrl(TTK::Algorithm::mdII(KW_SONG_PATH_V2_URL, false).arg(parameter, info->m_songId));
146 
147  const QByteArray &bytes = TTK::syncNetworkQueryForGet(&request);
148  if(bytes.isEmpty())
149  {
150  return;
151  }
152 
153  if(!bytes.contains("res not found"))
154  {
155  const QString text(bytes);
156  const QRegExp regx(".*url=(.*)\r\nsig=");
157 
158  if(regx.indexIn(text) != -1)
159  {
161  prop.m_url = regx.cap(1);
162  prop.m_size = TTK_DEFAULT_STR;
163  prop.m_format = suffix;
164  prop.m_bitrate = bitrate;
165 
166  if(prop.m_url.isEmpty() || info->m_songProps.contains(prop))
167  {
168  return;
169  }
170 
171  info->m_songProps.append(prop);
172  }
173  }
174 }
175 
176 static void parseSongPropertyV3(TTK::MusicSongInformation *info, const QString &format, int bitrate)
177 {
178  for(const TTK::MusicSongProperty &prop : qAsConst(info->m_songProps))
179  {
180  if(prop.m_bitrate == bitrate)
181  {
182  return;
183  }
184  }
185 
186  TTK_INFO_STREAM("parse song" << bitrate << "kbps property in v3 module");
187 
188  if(((format.contains("MP3128") || format.contains("128kmp3")) && bitrate == TTK_BN_128) ||
189  ((format.contains("MP3H") || format.contains("320kmp3")) && bitrate == TTK_BN_320) ||
190  ((format.contains("FLAC") || format.contains("2000kflac")) && bitrate == TTK_BN_1000))
191  {
193  }
194 }
195 
196 static void parseSongProperty(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
197 {
198  parseSongPropertyV1(info, suffix, format, bitrate);
199  parseSongPropertyV2(info, suffix, format, bitrate);
200  parseSongPropertyV3(info, format, bitrate);
201 }
202 
204 {
205  if(info->m_songId.isEmpty())
206  {
207  return;
208  }
209 
210  if(info->m_formatProps.isEmpty())
211  {
212  parseSongProperty(info, MP3_FILE_SUFFIX, "128kmp3", TTK_BN_128);
213  return;
214  }
215 
216  if(bitrate == TTK_BN_0)
217  {
222  }
223  else
224  {
225  parseSongProperty(info, bitrate > TTK_BN_320 ? FLAC_FILE_SUFFIX : MP3_FILE_SUFFIX, info->m_formatProps, bitrate);
226  }
227 }
228 
230 {
231  info->m_formatProps = format;
232 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
static void parseSongPropertyV3(TTK::MusicSongInformation *info, const QString &format, int bitrate)
#define TTK_DEFAULT_STR
Definition: ttkglobal.h:203
TTK_MODULE_EXPORT void makeUserAgentHeader(QNetworkRequest *request, const QByteArray &data={})
static constexpr const char * KW_SONG_PATH_V1_URL
static void parseSongPropertyV1(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
The class of the music song property.
Definition: musicobject.h:225
static constexpr const char * KW_ALBUM_COVER_URL
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
static constexpr const char * KW_ALBUM_COVER_INFO_URL
MusicSongPropertyList m_songProps
Definition: musicobject.h:297
QString makeCoverPixmapUrl(const QString &url, const QString &id)
QByteArray encrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:350
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
#define TTK_BN_1000
Definition: ttkglobal.h:359
void makeRequestRawHeader(QNetworkRequest *request)
#define MP3_FILE_SUFFIX
Definition: musicobject.h:51
static void parseSongPropertyV2(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
static void parseSongProperty(TTK::MusicSongInformation *info, const QString &suffix, const QString &format, int bitrate)
#define qAsConst
Definition: ttkqtglobal.h:51
const char * name
Definition: http_parser.c:458
TTK_MODULE_EXPORT QString suffix(const QString &name)
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:68
The class of the des wrapper.
Definition: deswrapper.h:34
#define TTK_BN_0
Definition: ttkglobal.h:349
static constexpr const char * KW_SONG_PATH_V2_URL
#define TTK_BN_320
Definition: ttkglobal.h:356
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
static constexpr const char * KW_SONG_PATH_V2_DATA_URL
QString makeSongArtist(const QString &name)
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
#define TTK_BN_192
Definition: ttkglobal.h:354
#define FLAC_FILE_SUFFIX
Definition: musicobject.h:53
void parseFromSongProperty(TTK::MusicSongInformation *info, const QString &type, const QString &id, int bitrate)
static constexpr const char * MDII_SHR_KEY
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:283
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path)
#define TTK_BN_128
Definition: ttkglobal.h:353