TTKMusicPlayer  4.2.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() << __FUNCTION__);
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  QJsonParseError ok;
41  const QJsonDocument &json = QJsonDocument::fromJson("[" + buffer.toUtf8() + "]", &ok);
43  {
44  const QVariantList &datas = json.toVariant().toList();
45  if(datas.count() > 2)
46  {
47  key = datas[0].toString();
48  token = datas[1].toString();
49  }
50  }
51  }
52  }
53  }
54 
55  if(ig.isEmpty() || key.isEmpty() || token.isEmpty())
56  {
57  TTK_INFO_STREAM(className() << "downLoadFinished");
58  Q_EMIT downLoadDataChanged({});
59  deleteAll();
60  return;
61  }
62 
63  QNetworkRequest request;
64  request.setUrl(TTK::Algorithm::mdII(TRANSLATION_URL, false).arg(ig));
65  TTK::setSslConfiguration(&request);
66  TTK::makeUserAgentHeader(&request);
68 
69  auto vvv = TTK::Algorithm::mdII(PARAM_URL, false).arg(key, token, mapToString(Language::Auto), mapToString(Language::Chinese), data).toUtf8();
70  m_reply = m_manager.post(request, TTK::Url::urlPrettyEncode(vvv));
71  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
73 }
74 
76 {
77  TTK_INFO_STREAM(className() << __FUNCTION__);
78 
80  if(m_reply && m_reply->error() == QNetworkReply::NoError)
81  {
82  QJsonParseError ok;
83  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
85  {
86  for(const QVariant &var : json.toVariant().toList())
87  {
88  if(var.isNull())
89  {
90  continue;
91  }
92 
93  QVariantMap value = var.toMap();
94  for(const QVariant &var : value["translations"].toList())
95  {
96  if(var.isNull())
97  {
98  continue;
99  }
100 
101  value = var.toMap();
102  Q_EMIT downLoadDataChanged(value["text"].toString());
103  deleteAll();
104  return;
105  }
106  }
107  }
108  }
109 
110  TTK_ERROR_STREAM("Translation source data error");
111  Q_EMIT downLoadDataChanged({});
112  deleteAll();
113 }
114 
116 {
117  switch(type)
118  {
119  case Language::Auto: return "auto-detect";
120  case Language::Chinese: return "zh-Hans";
121  default: return {};
122  }
123 }
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
QNetworkReply * m_reply
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
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()
TTK_MODULE_EXPORT void makeUserAgentHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
static constexpr const char * PARAM_URL
ParseError error
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
QNetworkAccessManager m_manager
static constexpr wchar_t key[]
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
TTK_MODULE_EXPORT QString toString(Record type) noexcept
virtual void downLoadFinished() overridefinal
QString mapToString(Language type) const noexcept
MusicBingTranslationRequest(QObject *parent=nullptr)
static constexpr const char * TRANSLATION_URL
#define TTK_ERROR_STREAM(msg)
Definition: ttklogger.h:76
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