TTKMusicPlayer  4.3.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 static constexpr const char *UA_URL = "TWlxK2t4SCthVk1rMjBSWGdOMUdPWVVzSmJSeUtubmsxN1dualdvay8wL0tEVFdETG1BUTJmRlZObUtNM29wVXI1WTNaN1QxSVJNRHFMM1hhclVscEpxbjJpT1FvdnRRZjNtNlZvcnNTcmovQkE3c0s4cVNzUT09";
8 
11 {
12 
13 }
14 
16 {
17  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
18 
20 
21  QString ig, token, key;
22  {
23  QNetworkRequest request;
24  request.setUrl(TTK::Algorithm::mdII(QUERY_URL, false));
25  TTK::setSslConfiguration(&request);
26  TTK::setContentTypeHeader(&request);
27 
28  const QString &bytes = QString(TTK::syncNetworkQueryForGet(&request));
29  if(!bytes.isEmpty())
30  {
31  {
32  static TTKRegularExpression regx("\"ig\"\\s?:\\s?\"(\\w+)\"");
33  ig = (regx.match(bytes) != -1) ? regx.captured(1) : bytes;
34  }
35 
36  {
37  static TTKRegularExpression regx("params_AbusePreventionHelper\\s?=\\s?\\[(.+)\\]");
38  regx.setCaseSensitivity(false);
39  const QString &buffer = ((regx.match(bytes) != -1) ? regx.captured(1) : QString());
40 
41  QJsonParseError ok;
42  const QJsonDocument &json = QJsonDocument::fromJson("[" + buffer.toUtf8() + "]", &ok);
44  {
45  const QVariantList &datas = json.toVariant().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(metaObject()->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::setContentTypeHeader(&request);
68  TTK::setUserAgentHeader(&request, TTK::Algorithm::mdII(UA_URL, false).toUtf8());
69 
70  auto v = 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(v));
72  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
74 }
75 
77 {
78  TTK_INFO_STREAM(metaObject()->className() << __FUNCTION__);
79 
81  if(m_reply && m_reply->error() == QNetworkReply::NoError)
82  {
83  QJsonParseError ok;
84  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
86  {
87  for(const QVariant &var : json.toVariant().toList())
88  {
89  if(var.isNull())
90  {
91  continue;
92  }
93 
94  QVariantMap value = var.toMap();
95  for(const QVariant &var : value["translations"].toList())
96  {
97  if(var.isNull())
98  {
99  continue;
100  }
101 
102  value = var.toMap();
103  Q_EMIT downloadDataChanged(value["text"].toString());
104  deleteAll();
105  return;
106  }
107  }
108  }
109  }
110 
111  TTK_ERROR_STREAM("Translation source data error");
112  Q_EMIT downloadDataChanged({});
113  deleteAll();
114 }
115 
117 {
118  switch(type)
119  {
120  case Language::Auto: return "auto-detect";
121  case Language::Chinese: return "zh-Hans";
122  default: return {};
123  }
124 }
TTK_MODULE_EXPORT void setUserAgentHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
virtual void deleteAll()
QString captured(int index) const
static constexpr const char * UA_URL
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
QNetworkReply * m_reply
void downloadDataChanged(const QString &bytes)
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() overridefinal
static constexpr const char * PARAM_URL
ParseError error
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
QNetworkAccessManager m_manager
static constexpr wchar_t key[]
TTK_MODULE_EXPORT void setContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
TTK_MODULE_EXPORT QString toString(Record type) noexcept
The class of the regular expression.
virtual void downloadFinished()
QString mapToString(Language type) const noexcept
MusicBingTranslationRequest(QObject *parent=nullptr)
static constexpr const char * TRANSLATION_URL
int match(const QString &str, int pos=0)
#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