TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicunityquerymovierequest.cpp
Go to the documentation of this file.
3 
7 namespace ReqYYTInterface
8 {
9  static constexpr const char *MODULE = "YYT";
10  static constexpr const char *MOVIE_URL = "aHFyKzJ2V2gvdWVrdzEyWlBmUFdHbys5RGM3STRrY25uQ2xCRDdXeldPV0pXMWtNVmN1di9CRndFeDNqbExEdjA5dC9qcWEzMWFxc3NnRWkrcFcrZlBReC90bz0=";
11  static constexpr const char *MOVIE_DATA_URL = "emxYODBYb2dkQUVzcFcxVFZJS29kbzIwMzhybDVJRk1aNDFab1l3ellaM2pEdEFTVHFvN3RRV2ZNOXM4QkFkVXcrNWNzamFzc2ducEs2NXVyU1RmaVM2VlJtSmlSVUt5MUJmSE9WS2lxc3A5bVh0TXNBRzBEeWd2R29yNVZkUzJLbVBVbGdQSFZOemdQUGkxWFN5TllweHdDNnA3ZStUclVIUE1zYmpwNkVaSC96RHY5eXdTVWdoTVhsK2tidGhmOGcvcFpLejA5NlVLaUlxZko5Ni9ucEJRSUJyZVJGUW5YQlpLQzBGdm44SklDVDh5T0xmTWZoRWpoU3pWTFRtby9mYWQ0QlpJNjk4Q3dzczA=";
12 }
13 
17 namespace ReqBLInterface
18 {
19  static constexpr const char *MODULE = "BL";
20 }
21 
22 
23 
25  : MusicQueryMovieRequest(parent),
26  m_isUnity(false),
27  m_pluginIndex(0),
28  m_value("0")
29 {
31 }
32 
34 {
35  TTK_INFO_STREAM(className() << "startToPage" << offset);
36 
37  deleteAll();
38  m_totalSize = 0;
40 
41  switch(m_pluginIndex)
42  {
43  case 0:
44  {
45  QNetworkRequest request;
46  request.setUrl(TTK::Algorithm::mdII(ReqYYTInterface::MOVIE_URL, false));
47  TTK::setSslConfiguration(&request);
48  TTK::makeContentTypeHeader(&request, "application/json");
49 
50  TTK_INFO_STREAM(className() << "ReqYYTInterface");
53  break;
54  }
55  case 1:
56  {
57  QNetworkRequest request;
58  request.setUrl(TTK::Algorithm::mdII(BL_MOVIE_URL, false).arg(m_queryValue).arg(m_pageIndex));
60 
61  TTK_INFO_STREAM(className() << "ReqBLInterface");
63  m_reply = m_manager.get(request);
64  break;
65  }
66  default: return;
67  }
68 
69  connect(m_reply, SIGNAL(finished()), SLOT(downLoadUnityFinished()));
71 }
72 
74 {
75  TTK_INFO_STREAM(className() << "downLoadUnityFinished");
76 
78  if(m_reply && m_reply->error() == QNetworkReply::NoError)
79  {
80  QJson::Parser json;
81  bool ok = false;
82  const QVariant &data = json.parse(m_reply->readAll(), &ok);
83  if(ok)
84  {
85  QVariantMap value = data.toMap();
86  const int lastCount = m_items.count();
87 
88  switch(m_pluginIndex)
89  {
90  case 0:
91  {
92  if(value["code"].toInt() == 0 && value.contains("data"))
93  {
94  const QVariantList &datas = value["data"].toList();
95  for(const QVariant &var : qAsConst(datas))
96  {
97  if(var.isNull())
98  {
99  continue;
100  }
101 
102  value = var.toMap();
104 
106 
108  info.m_songId = value["id"].toString();
109  info.m_songName = TTK::String::charactersReplace(value["title"].toString());
110 
111  const QVariantList &artistsArray = value["artists"].toList();
112  for(const QVariant &artistValue : qAsConst(artistsArray))
113  {
114  if(artistValue.isNull())
115  {
116  continue;
117  }
118 
119  const QVariantMap &artistObject = artistValue.toMap();
120  const QString &artistName = TTK::String::charactersReplace(artistObject["name"].toString());
121  info.m_artistName = info.m_artistName.isEmpty() ? artistName : (info.m_artistName + ";" + artistName);
122  }
123 
124  value = value["fullClip"].toMap();
125  info.m_coverUrl = value["cover"].toString();
126  info.m_duration = TTKTime::formatDuration(value["duration"].toInt() * TTK_DN_S2MS);
127 
128  const QVariantList &urlsArray = value["urls"].toList();
129  for(const QVariant &urlValue : qAsConst(urlsArray))
130  {
131  if(urlValue.isNull())
132  {
133  continue;
134  }
135 
136  value = urlValue.toMap();
137 
139  prop.m_url = value["url"].toString();
140  prop.m_bitrate = value["streamType"].toInt() == 1 ? TTK_BN_250 : TTK_BN_750;
142  info.m_songProps.append(prop);
143  }
144 
145  if(info.m_songProps.isEmpty() || !findUrlPathSize(&info.m_songProps, info.m_duration))
146  {
147  continue;
148  }
149 
150  m_value = info.m_songId;
151  Q_EMIT createResultItem({info, serverToString()});
152  m_items << info;
153  }
154  }
155 
156  findAllPlugins(lastCount);
157  break;
158  }
159  case 1:
160  {
161  if(value["code"].toInt() == 0 && value.contains("data"))
162  {
163  value = value["data"].toMap();
164  m_totalSize = value["numResults"].toInt();
165 
166  const QVariantList &datas = value["result"].toList();
167  for(const QVariant &var : qAsConst(datas))
168  {
169  if(var.isNull())
170  {
171  continue;
172  }
173 
174  value = var.toMap();
176 
178  info.m_songId = value["bvid"].toString();
179  info.m_songName = TTK::String::charactersReplace(value["title"].toString());
180 
181  info.m_artistName = TTK::String::charactersReplace(value["author"].toString());
182 
183  info.m_coverUrl = value["pic"].toString();
184  if(info.m_coverUrl.startsWith("//"))
185  {
187  }
188  else if(!TTK::String::isNetworkUrl(info.m_coverUrl))
189  {
190  info.m_coverUrl = HTTP_PROTOCOL + info.m_coverUrl;
191  }
192 
193  QString cid;
195 
196  if(!cid.isEmpty())
197  {
199  }
200 
201  if(info.m_songProps.isEmpty())
202  {
203  continue;
204  }
205 
206  Q_EMIT createResultItem({info, serverToString()});
207  m_items << info;
208  }
209  }
210  break;
211  }
212  default: break;
213  }
214  }
215  }
216 
217  Q_EMIT downLoadDataChanged({});
218  deleteAll();
219 }
220 
222 {
223  if(count + m_pageSize > m_items.count())
224  {
225  setToUnity();
226  ++m_pluginIndex;
227  }
228 }
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
#define TTK_NETWORK_QUERY_CHECK(VALUE)
#define HTTP_PROTOCOL_PREFIX
Definition: ttkglobal.h:205
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
#define HTTP_PROTOCOL
Definition: ttkglobal.h:208
The class of the music song property.
Definition: musicobject.h:223
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
MusicSongPropertyList m_songProps
Definition: musicobject.h:295
static constexpr const char * MOVIE_DATA_URL
static constexpr const char * BL_MOVIE_URL
static constexpr const char * MOVIE_URL
virtual void downLoadFinished()
#define TTK_BN_250
Definition: ttkglobal.h:350
MusicUnityQueryMovieRequest(QObject *parent=nullptr)
voidpf uLong offset
Definition: ioapi.h:142
TTK::MusicSongInformationList m_items
#define qAsConst
Definition: ttkqtglobal.h:53
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:67
static constexpr const char * MODULE
The class of the query movie download data from net.
QNetworkAccessManager m_manager
The namespace of the bl request interface.
void createResultItem(const MusicResultInfoItem &songItem)
void parseFromMovieInfo(TTK::MusicSongInformation *info, QString &cid)
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
#define TTK_SLOT
Definition: ttkqtglobal.h:165
TTK_MODULE_EXPORT QString splitToken(const QString &name)
#define TTK_HIGH_LEVEL
Definition: ttkglobal.h:255
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
#define SONG_PAGE_SIZE
#define TTK_DN_S2MS
Definition: ttkglobal.h:276
static constexpr const char * MODULE
The namespace of the yyt request interface.
TTK_MODULE_EXPORT QString toString(Record type)
virtual void startToPage(int offset) override
#define TTK_STR_CAT(...)
Definition: ttkglobal.h:167
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
void makeRequestRawHeader(QNetworkRequest *request)
bool findUrlPathSize(TTK::MusicSongProperty *prop, const QString &duration) const
void parseFromMovieProperty(TTK::MusicSongInformation *info, const QString &cid)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
The class of the music song information.
Definition: musicobject.h:281
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path)
#define TTK_BN_750
Definition: ttkglobal.h:353
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123