TTKMusicPlayer  4.1.3.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  QJson::Parser json;
44  bool ok = false;
45  const QVariant &data = json.parse(m_reply->readAll(), &ok);
46  if(ok)
47  {
48  QVariantMap value = data.toMap();
49  if(value.contains("data"))
50  {
51  value = value["data"].toMap();
52  value = value["radioPage"].toMap();
53  const QVariantList &datas = value["classes"].toList();
54  for(const QVariant &var : qAsConst(datas))
55  {
56  if(var.isNull())
57  {
58  continue;
59  }
60 
61  value = var.toMap();
63 
64  m_pageIndex = -1;
65  MusicFMCategory category;
66  category.m_category = value["title"].toString();
67  startToListRequest(value["id"].toInt(), &category.m_items);
68  items << category;
69  }
70  }
71  }
72  }
73 
74  MusicFMConfigManager manager;
75  if(manager.load("qingtingfm.txt"))
76  {
77  manager.writeBuffer(items);
78  TTK_INFO_STREAM("Write QingTing fm data done");
79  qApp->exit();
80  }
81 
82  Q_EMIT downLoadDataChanged({});
83  deleteAll();
84 }
85 
86 void ToolFM::startToListRequest(int id, MusicFMChannelList *channels)
87 {
88  do
89  {
90  QNetworkRequest request;
91  makeRequestRawHeader(&request);
92 
93  const QByteArray &parameter = TTK::Algorithm::mdII(QT_CHANNEL_URL, false).arg(id).arg(++m_pageIndex + 1).toUtf8();
94  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
95  if(bytes.isEmpty())
96  {
97  return;
98  }
99 
100  QJson::Parser json;
101  bool ok = false;
102  const QVariant &data = json.parse(bytes, &ok);
103  if(ok)
104  {
105  QVariantMap value = data.toMap();
106  if(value.contains("data"))
107  {
108  value = value["data"].toMap();
109  value = value["radioPage"].toMap();
110  value = value["contents"].toMap();
111 
112  m_totalSize = value["count"].toInt();
113 
114  const QVariantList &datas = value["items"].toList();
115  for(const QVariant &var : qAsConst(datas))
116  {
117  if(var.isNull())
118  {
119  continue;
120  }
121 
122  value = var.toMap();
124 
125  MusicFMChannel channel;
126  channel.m_url = TTK::Algorithm::mdII(QT_SONG_URL, false).arg( value["id"].toInt());
127  channel.m_name = value["title"].toString();
128  channels->append(channel);
129  }
130  }
131  }
132  } while(pageValid());
133 }
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
QNetworkReply * m_reply
MusicFMChannelList m_items
static void makeRequestRawHeader(QNetworkRequest *request)
Definition: toolfm.cpp:8
The class of the fm config manager.
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone)
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
#define qAsConst
Definition: ttkqtglobal.h:51
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:68
QNetworkAccessManager m_manager
The class of the fm channel item.
virtual bool writeBuffer(const MusicFMCategoryList &items) overridefinal
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:181
void startToListRequest(int id, MusicFMChannelList *channels)
Definition: toolfm.cpp:86
TTK_MODULE_EXPORT void makeContentTypeHeader(QNetworkRequest *request, const QByteArray &data={})
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
Main class used to convert JSON data to QVariant objects.
Definition: parser.h:40
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