TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
toolfm.cpp
Go to the documentation of this file.
1 #include "toolfm.h"
2 
3 static constexpr const char *QT_BASE_URL = "TDNBRFd3S3lvRnVBNzFCblJSQmRHRFhrdVNnQk9qMlBEbzdjWUpSdS95VT0=";
4 static constexpr const char *QT_CATEGORY_URL = "N2VwdWNwUGxOL0ZWZCtrN3V6ekd4SUZqUXVQZ3p1Y2pyeEpsc01RZzR6blNnK0o5L3Q4NWRPRCswVzkrTURKV1VvdzMvQkJ4VEVrPQ==";
5 static constexpr const char *QT_CHANNEL_URL = "UHJCNEJXWlZhQVowVE1ndXZnajFKQ2tsb1c1SDdlaEE0a0pDWEM2RGJMaktmWXpNZFR6WTcxbmRNb0ZTRTVwQXo5cE92REJOMlhjPQ==";
6 static constexpr const char *QT_SONG_URL = "OTB3emRpcnNRVDI3eVBtZ2Nwbk9jZXQyQ2hUZjJ1ZjdFdEJIN1V4WHU1WnUvMjk4MEtNWFYrUXRwUlZkWG96TA==";
7 
8 static void makeRequestRawHeader(QNetworkRequest *request)
9 {
10  request->setUrl(TTK::Algorithm::mdII(QT_BASE_URL, false));
11  TTK::setSslConfiguration(request);
12  TTK::makeContentTypeHeader(request, "application/json;charset=utf-8");
13 }
14 
15 ToolFM::ToolFM(QObject *parent)
16  : MusicPageQueryRequest(parent)
17 {
18  m_pageSize = 12;
19 }
20 
22 {
23  TTK_INFO_STREAM("Start to request QingTing fm data");
24 
25  deleteAll();
26  m_pageIndex = -1;
27 
28  QNetworkRequest request;
29  makeRequestRawHeader(&request);
30 
31  m_reply = m_manager.post(request, TTK::Algorithm::mdII(QT_CATEGORY_URL, false).toUtf8());
32  connect(m_reply, SIGNAL(finished()), SLOT(downLoadFinished()));
34 }
35 
37 {
38  MusicFMCategoryList items;
40 
41  if(m_reply && m_reply->error() == QNetworkReply::NoError)
42  {
43  QJsonParseError ok;
44  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
46  {
47  QVariantMap value = json.toVariant().toMap();
48  if(value.contains("data"))
49  {
50  value = value["data"].toMap();
51  value = value["radioPage"].toMap();
52  const QVariantList &datas = value["classes"].toList();
53  for(const QVariant &var : qAsConst(datas))
54  {
55  if(var.isNull())
56  {
57  continue;
58  }
59 
60  value = var.toMap();
62 
63  m_pageIndex = -1;
64  MusicFMCategory category;
65  category.m_category = value["title"].toString();
66  startToListRequest(value["id"].toInt(), &category.m_items);
67  items << category;
68  }
69  }
70  }
71  }
72 
73  MusicFMConfigManager manager;
74  if(manager.load("qingtingfm.txt"))
75  {
76  manager.writeBuffer(items);
77  TTK_INFO_STREAM("Write QingTing fm data done");
78  qApp->exit();
79  }
80 
81  Q_EMIT downLoadDataChanged({});
82  deleteAll();
83 }
84 
85 void ToolFM::startToListRequest(int id, MusicFMChannelList *channels)
86 {
87  do
88  {
89  QNetworkRequest request;
90  makeRequestRawHeader(&request);
91 
92  const QByteArray &parameter = TTK::Algorithm::mdII(QT_CHANNEL_URL, false).arg(id).arg(++m_pageIndex + 1).toUtf8();
93  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
94  if(bytes.isEmpty())
95  {
96  return;
97  }
98 
99  QJsonParseError ok;
100  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
102  {
103  QVariantMap value = json.toVariant().toMap();
104  if(value.contains("data"))
105  {
106  value = value["data"].toMap();
107  value = value["radioPage"].toMap();
108  value = value["contents"].toMap();
109 
110  m_totalSize = value["count"].toInt();
111 
112  const QVariantList &datas = value["items"].toList();
113  for(const QVariant &var : qAsConst(datas))
114  {
115  if(var.isNull())
116  {
117  continue;
118  }
119 
120  value = var.toMap();
122 
123  MusicFMChannel channel;
124  channel.m_url = TTK::Algorithm::mdII(QT_SONG_URL, false).arg( value["id"].toInt());
125  channel.m_name = value["title"].toString();
126  channels->append(channel);
127  }
128  }
129  }
130  } while(pageValid());
131 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
virtual void deleteAll()
void downLoadDataChanged(const QString &bytes)
virtual void downLoadFinished() overridefinal
Definition: toolfm.cpp:36
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
QNetworkReply * m_reply
MusicFMChannelList m_items
static void makeRequestRawHeader(QNetworkRequest *request)
Definition: toolfm.cpp:8
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
The class of the fm config manager.
static constexpr const char * QT_CHANNEL_URL
Definition: toolfm.cpp:5
The class of the abstract download page query request.
virtual void downLoadFinished()
void startToRequest()
Definition: toolfm.cpp:21
ParseError error
#define qAsConst
Definition: ttkqtglobal.h:57
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
QNetworkAccessManager m_manager
The class of the fm channel item.
virtual bool writeBuffer(const MusicFMCategoryList &items) overridefinal
virtual void replyError(QNetworkReply::NetworkError error) override
#define TTK_SLOT
Definition: ttkqtglobal.h:177
void startToListRequest(int id, MusicFMChannelList *channels)
Definition: toolfm.cpp:85
static constexpr const char * QT_CATEGORY_URL
Definition: toolfm.cpp:4
bool load(const QString &name)
ToolFM(QObject *parent=nullptr)
Definition: toolfm.cpp:15
The class of the fm category item.
static constexpr const char * QT_SONG_URL
Definition: toolfm.cpp:6
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
static constexpr const char * QT_BASE_URL
Definition: toolfm.cpp:3
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59