TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicbingtranslationrequest.cpp
Go to the documentation of this file.
2 #include "musicurlutils.h"
3 
4 static constexpr const char *QUERY_URL = "SUVwbklrTjVFYXdsSUJ3MHRZb21KVDRXL1ZwU1RtSVRNWURYdDZwczMxZnVXenhr";
5 static constexpr const char *TRANSLATION_URL = "Rm9rVXJIeFNOTDlrV2l5Yld0UGsweGd1V0JZbTFBMVZvQmpKaGhLUmtIT1VhOGtzM0RhVCthdnRhUVNMUGRLYU5LWkJLbVRWQjZoQ2QzYW1wUVIxWkxibnN6VDJ4Q05RNWV6V0NnPT0=";
6 static constexpr const char *PARAM_URL = "cmFWcURkeGhWb2thdWJIMG5JS3BGQmVseW9XeFU5b0Era3V6V1JMa2IxRmRqY2lFRnpUbkM3TDlsUFVjbUNWdA==";
7 
10 {
11 
12 }
13 
15 {
16  TTK_INFO_STREAM(className() << "startToRequest");
17 
19 
20  QString ig, token, key;
21  {
22  QNetworkRequest request;
23  request.setUrl(TTK::Algorithm::mdII(QUERY_URL, false));
24  TTK::setSslConfiguration(&request);
26 
27  const QString &bytes = QString(TTK::syncNetworkQueryForGet(&request));
28  if(!bytes.isEmpty())
29  {
30  {
31  const QRegExp regx("\"ig\"\\s?:\\s?\"(\\w+)\"");
32  ig = (regx.indexIn(bytes) != -1) ? regx.cap(1) : bytes;
33  }
34 
35  {
36  QRegExp regx("params_AbusePreventionHelper\\s?=\\s?\\[(.+)\\]");
37  regx.setMinimal(true);
38  const QString &buffer = ((regx.indexIn(bytes) != -1) ? regx.cap(1) : QString());
39 
40  QJson::Parser json;
41  bool ok = false;
42  const QVariant &data = json.parse("[" + buffer.toUtf8() + "]", &ok);
43  if(ok)
44  {
45  const QVariantList &datas = data.toList();
46  if(datas.count() > 2)
47  {
48  key = datas[0].toString();
49  token = datas[1].toString();
50  }
51  }
52  }
53  }
54  }
55 
56  if(ig.isEmpty() || key.isEmpty() || token.isEmpty())
57  {
58  TTK_INFO_STREAM(className() << "downLoadFinished");
59  Q_EMIT downLoadDataChanged({});
60  deleteAll();
61  return;
62  }
63 
64  QNetworkRequest request;
65  request.setUrl(TTK::Algorithm::mdII(TRANSLATION_URL, false).arg(ig));
66  TTK::setSslConfiguration(&request);
67  TTK::makeUserAgentHeader(&request);
69 
70  auto vvv = TTK::Algorithm::mdII(PARAM_URL, false).arg(key, token, mapToString(Language::Auto), mapToString(Language::Chinese), data).toUtf8();
71  m_reply = m_manager.post(request, TTK::Url::urlPrettyEncode(vvv));
72  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
74 }
75 
77 {
78  TTK_INFO_STREAM(className() << "downLoadFinished");
79 
81  if(m_reply && m_reply->error() == QNetworkReply::NoError)
82  {
83  QJson::Parser json;
84  bool ok = false;
85  const QVariant &data = json.parse(m_reply->readAll(), &ok);
86  if(ok)
87  {
88  for(const QVariant &var : data.toList())
89  {
90  if(var.isNull())
91  {
92  continue;
93  }
94 
95  QVariantMap value = var.toMap();
96  for(const QVariant &var : value["translations"].toList())
97  {
98  if(var.isNull())
99  {
100  continue;
101  }
102 
103  value = var.toMap();
104  Q_EMIT downLoadDataChanged(value["text"].toString());
105  deleteAll();
106  return;
107  }
108  }
109  }
110  }
111 
112  TTK_ERROR_STREAM("Translation source data error");
113  Q_EMIT downLoadDataChanged({});
114  deleteAll();
115 }
116 
118 {
119  switch(type)
120  {
121  case Language::Auto: return "auto-detect";
122  case Language::Chinese: return "zh-Hans";
123  default: return {};
124  }
125 }
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
QNetworkReply * m_reply
TTK_MODULE_EXPORT void makeUserAgentHeader(QNetworkRequest *request, const QByteArray &data={})
static constexpr wchar_t key[]
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
The class of the translation words request.
virtual void startToRequest(const QString &data) overridefinal
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForGet(QNetworkRequest *request)
TTK_MODULE_EXPORT QString urlPrettyEncode(QString &data)
virtual void downLoadFinished()
static constexpr const char * PARAM_URL
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:67
QNetworkAccessManager m_manager
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
QString mapToString(Language type) const
#define TTK_SLOT
Definition: ttkqtglobal.h:165
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
virtual void downLoadFinished() overridefinal
TTK_MODULE_EXPORT QString toString(Record type)
MusicBingTranslationRequest(QObject *parent=nullptr)
static constexpr const char * TRANSLATION_URL
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
#define TTK_ERROR_STREAM(msg)
Definition: ttklogger.h:69
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
static constexpr const char * QUERY_URL
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59