TTKMusicPlayer  4.3.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 static constexpr const char *XI_SONG_URL = "ZE1EK2xZcVdTd0hpaksxQXFob0Jjdk8zTSswSU5lRnlZTzRNZ3dkNUNXND0=";
8 
9 ToolQTFM::ToolQTFM(QObject *parent)
10  : MusicPageQueryRequest(parent)
11 {
12  m_pageSize = 12;
13 }
14 
16 {
17  TTK_INFO_STREAM("Start to request QingTing fm data");
18 
19  deleteAll();
20  m_pageIndex = -1;
21 
22  QNetworkRequest request;
23  request.setUrl(TTK::Algorithm::mdII(QT_BASE_URL, false));
24  TTK::setSslConfiguration(&request);
25  TTK::setContentTypeHeader(&request, "application/json;charset=utf-8");
26 
27  m_reply = m_manager.post(request, TTK::Algorithm::mdII(QT_CATEGORY_URL, false).toUtf8());
28  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
30 }
31 
33 {
34  MusicFMCategoryList items;
36 
37  if(m_reply && m_reply->error() == QNetworkReply::NoError)
38  {
39  QJsonParseError ok;
40  const QJsonDocument &json = QJsonDocument::fromJson(m_reply->readAll(), &ok);
42  {
43  QVariantMap value = json.toVariant().toMap();
44  if(value.contains("data"))
45  {
46  value = value["data"].toMap();
47  value = value["radioPage"].toMap();
48  const QVariantList &datas = value["classes"].toList();
49  for(const QVariant &var : qAsConst(datas))
50  {
51  if(var.isNull())
52  {
53  continue;
54  }
55 
56  value = var.toMap();
58 
59  m_pageIndex = -1;
60  MusicFMCategory category;
61  category.m_category = value["title"].toString();
62  startToListRequest(value["id"].toInt(), &category.m_items);
63  items << category;
64  }
65  }
66  }
67  }
68 
69  MusicFMConfigManager manager;
70  if(manager.load("qingtingfm.xml"))
71  {
72  manager.writeBuffer(items);
73  TTK_INFO_STREAM("Write QingTing fm data done");
74  }
75 
76  Q_EMIT downloadDataChanged({});
77  deleteAll();
78 }
79 
80 void ToolQTFM::startToListRequest(int id, MusicFMChannelList *channels)
81 {
82  do
83  {
84  QNetworkRequest request;
85  request.setUrl(TTK::Algorithm::mdII(QT_BASE_URL, false));
86  TTK::setSslConfiguration(&request);
87  TTK::setContentTypeHeader(&request, "application/json;charset=utf-8");
88 
89  const QByteArray &parameter = TTK::Algorithm::mdII(QT_CHANNEL_URL, false).arg(id).arg(++m_pageIndex + 1).toUtf8();
90  const QByteArray &bytes = TTK::syncNetworkQueryForPost(&request, parameter);
91  if(bytes.isEmpty())
92  {
93  return;
94  }
95 
96  QJsonParseError ok;
97  const QJsonDocument &json = QJsonDocument::fromJson(bytes, &ok);
99  {
100  QVariantMap value = json.toVariant().toMap();
101  if(value.contains("data"))
102  {
103  value = value["data"].toMap();
104  value = value["radioPage"].toMap();
105  value = value["contents"].toMap();
106 
107  m_totalSize = value["count"].toInt();
108 
109  const QVariantList &datas = value["items"].toList();
110  for(const QVariant &var : qAsConst(datas))
111  {
112  if(var.isNull())
113  {
114  continue;
115  }
116 
117  value = var.toMap();
119 
120  MusicFMChannel channel;
121  channel.m_url = TTK::Algorithm::mdII(QT_SONG_URL, false).arg( value["id"].toInt());
122  channel.m_name = value["title"].toString();
123  channels->append(channel);
124  }
125  }
126  }
127  } while(pageValid());
128 }
129 
130 
131 ToolXIFM::ToolXIFM(QObject *parent)
132  : MusicAbstractNetwork(parent)
133 {
134 
135 }
136 
138 {
139  TTK_INFO_STREAM("Start to request xiph fm data");
140 
141  deleteAll();
142 
143  QNetworkRequest request;
144  request.setUrl(TTK::Algorithm::mdII(XI_SONG_URL, false));
145  TTK::setSslConfiguration(&request);
146  TTK::setContentTypeHeader(&request, "charset=utf-8");
147 
148  m_reply = m_manager.get(request);
149  connect(m_reply, SIGNAL(finished()), SLOT(downloadFinished()));
151 }
152 
154 {
155  MusicFMCategoryList items;
157 
158  if(m_reply && m_reply->error() == QNetworkReply::NoError)
159  {
160  TTKAbstractXml xml;
161  if(xml.fromByteArray(m_reply->readAll()))
162  {
163  MusicFMCategory category;
164  category.m_category = "foreign";
165 
166  const QDomNodeList &nodes = xml.findDomNodes("entry");
167  for(int i = 0; i < nodes.count(); ++i)
168  {
169  const QDomNodeList &chnNodes = nodes.item(i).childNodes();
170 
171  MusicFMChannel item;
172  for(int j = 0; j < chnNodes.count(); ++j)
173  {
174  const QDomElement &element = chnNodes.item(j).toElement();
175  if(element.nodeName() == "server_name")
176  {
177  item.m_name = element.text();
178  }
179  else if(element.nodeName() == "listen_url")
180  {
181  item.m_url = element.text();
182  }
183  }
184 
185  if(!item.m_name.isEmpty() && !item.m_url.isEmpty())
186  {
187  category.m_items << item;
188  }
189  }
190 
191  items.append(category);
192  }
193  }
194 
195  MusicFMConfigManager manager;
196  if(manager.load("xiph.xml"))
197  {
198  manager.writeBuffer(items);
199  TTK_INFO_STREAM("Write xiph fm data done");
200  }
201 
202  Q_EMIT downloadDataChanged({});
203  deleteAll();
204 
205  qApp->exit();
206 }
TTK_MODULE_EXPORT QByteArray syncNetworkQueryForPost(QNetworkRequest *request, const QByteArray &data)
bool pageValid() const noexcept
#define TTK_NETWORK_QUERY_CHECK(VALUE)
ToolQTFM(QObject *parent=nullptr)
Definition: toolfm.cpp:9
static constexpr const char * XI_SONG_URL
Definition: toolfm.cpp:7
virtual void deleteAll()
virtual void downloadFinished() overridefinal
Definition: toolfm.cpp:32
The class of the ttk xml interface.
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
QNetworkReply * m_reply
MusicFMChannelList m_items
void downloadDataChanged(const QString &bytes)
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.
void startToRequest()
Definition: toolfm.cpp:15
ParseError error
#define qAsConst
Definition: ttkqtglobal.h:57
ToolXIFM(QObject *parent=nullptr)
Definition: toolfm.cpp:131
#define TTK_INFO_STREAM(msg)
Definition: ttklogger.h:74
QDomNodeList findDomNodes(const QString &node) const
QNetworkAccessManager m_manager
bool fromByteArray(const QByteArray &data)
The class of the fm channel item.
virtual bool writeBuffer(const MusicFMCategoryList &items) overridefinal
TTK_MODULE_EXPORT void setContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
virtual void replyError(QNetworkReply::NetworkError error) override
void startToRequest()
Definition: toolfm.cpp:137
#define TTK_SLOT
Definition: ttkqtglobal.h:177
The class of the abstract network.
virtual void downloadFinished()
static constexpr const char * QT_CATEGORY_URL
Definition: toolfm.cpp:4
bool load(const QString &name)
The class of the fm category item.
virtual void downloadFinished() overridefinal
Definition: toolfm.cpp:153
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
void startToListRequest(int id, MusicFMChannelList *channels)
Definition: toolfm.cpp:80
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
Definition: ttkqtcompat.h:59