9 static constexpr
const char *
ACR_QUERY_URL =
"VzBxZCtBUDBKK1R6aHNiTGxMdy84SzlIUVA5a3cvbjdKQ1ZIVGdYRThBS0hZMTlZSnhRQ0Y5N0lZdi9QQ3VveVEyVDdXbll3ZUZvPQ==";
10 static constexpr
const char *
XF_QUERY_URL =
"cFJiZUh0Z3FxalV6NzlBcEhUVmN5VGRzMm5NZ01rbzlWaFUzRE1ubzBoTU53WlI5cEZpNnVxT3l6OEE9";
11 static constexpr
const char *
XF_QUERY_BODY =
"VHd2bFMwaTZGNFQxeDBuU0prYXE0SDIzOVYyWlVwMWk=";
12 static constexpr
const char *
XF_QUERY_DATA =
"a29sU1NRVExPbzIzRDdiNjRlbWUwdz09";
31 if(!file.open(QIODevice::ReadOnly))
37 const QString &accessKey = keys[
"key"].toString();
38 const QString &accessSecret = keys[
"secret"].toString();
40 const QString &boundary =
"----";
41 const QString &start =
"--" + boundary;
42 const QString &end =
"\r\n--" + boundary +
"--\r\n";
43 const QString &contentType =
"multipart/form-data; boundary=" + boundary;
45 const QString &method =
"POST";
46 const QString &endpoint =
"/v1/identify";
47 const QString &type =
"fingerprint";
48 const QString &version =
"1";
51 const QString &sign = method +
"\n" + endpoint +
"\n" + accessKey +
"\n" + type +
"\n" + version +
"\n" + timeStamp;
55 value += start +
"\r\nContent-Disposition: form-data; name=\"access_key\"\r\n\r\n" + accessKey +
"\r\n";
56 value += start +
"\r\nContent-Disposition: form-data; name=\"data_type\"\r\n\r\n" + type +
"\r\n";
57 value += start +
"\r\nContent-Disposition: form-data; name=\"timestamp\"\r\n\r\n" + timeStamp +
"\r\n";
58 value += start +
"\r\nContent-Disposition: form-data; name=\"signature_version\"\r\n\r\n" + version +
"\r\n";
59 value += start +
"\r\nContent-Disposition: form-data; name=\"signature\"\r\n\r\n" + body +
"\r\n";
60 value += start +
"\r\nContent-Disposition: form-data; name=\"sample_bytes\"\r\n\r\n" + QString::number(file.size()) +
"\r\n";
61 value += start +
"\r\nContent-Disposition: form-data; name=\"sample\"; filename=\"" + file.fileName() +
"\"\r\n";
62 value +=
"Content-Type: application/octet-stream\r\n\r\n";
65 body.append(value.toUtf8());
66 body.append(file.readAll());
67 body.append(end.toUtf8());
70 QNetworkRequest request;
93 QVariantMap value = json.
toVariant().toMap();
94 if(value.contains(
"metadata"))
96 value = value[
"metadata"].toMap();
98 const QVariantList &datas = value[
"music"].toList();
99 for(
const QVariant &var :
qAsConst(datas))
106 for(
const QVariant &artists : value[
"artists"].toList())
108 value = artists.toMap();
140 if(!file.open(QIODevice::ReadOnly))
146 const QString &accessKey = keys[
"xfid"].toString();
147 const QString &accessSecret = keys[
"xfkey"].toString();
149 const QByteArray &data = file.readAll();
156 QNetworkRequest request;
158 request.setRawHeader(
"X-CurTime", timeStamp);
159 request.setRawHeader(
"X-Param", audioBody);
160 request.setRawHeader(
"X-Appid", accessKey.toUtf8());
161 request.setRawHeader(
"X-CheckSum", md5);
183 QVariantMap value = json.
toVariant().toMap();
184 if(value[
"code"].toInt() == 0)
186 const QVariantList &datas = value[
"data"].toList();
187 for(
const QVariant &var :
qAsConst(datas))
224 connect(
this, SIGNAL(
finished()), &loop, SLOT(quit()));
TTK_MODULE_EXPORT QString charactersReplace(const QString &value)
virtual void startToRequest(const QString &path, const QVariantMap &keys) overridefinal
#define TTK_NETWORK_QUERY_CHECK(VALUE)
TTK_MODULE_EXPORT void setSslConfiguration(QNetworkRequest *request, QSslSocket::PeerVerifyMode mode=QSslSocket::VerifyNone) noexcept
static qint64 currentTimestamp() noexcept
void downloadDataChanged(const QString &bytes)
QVariant toVariant() const
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=0)
MusicXFIdentifyRequest(QObject *parent=nullptr)
MusicSongIdentifyDataList * m_items
static constexpr const char * XF_QUERY_BODY
int exec(ProcessEventsFlags flags=AllEvents)
TTK_MODULE_EXPORT QByteArray hmacSha1(const QByteArray &data, const QByteArray &key)
virtual void startToRequest(const QString &path, const QVariantMap &keys)=0
virtual void downloadFinished() overridefinal
void downloadKeyFinished(const QByteArray &bytes)
TTK_MODULE_EXPORT QByteArray md5(const QByteArray &data, bool base64=false)
The class of the ttk event loop.
The class of the song identify data item.
virtual void startToRequest(const QString &path, const QVariantMap &keys) overridefinal
static constexpr const char * XF_QUERY_DATA
MusicSongIdentifyDataList m_items
#define TTK_INFO_STREAM(msg)
void startToRequest(const QString &path)
The class of the data source download request.
QNetworkAccessManager m_manager
TTK_MODULE_EXPORT void setContentTypeHeader(QNetworkRequest *request, const QByteArray &data={}) noexcept
virtual void replyError(QNetworkReply::NetworkError error) override
MusicAbstractIdentifyRequest(QObject *parent=nullptr)
The class of the abstract network.
static constexpr const char * OS_ACRCLOUD_URL
void startToRequest(const QString &url)
TTK_MODULE_EXPORT QString toString(Record type) noexcept
MusicIdentifySongRequest(QObject *parent=nullptr)
virtual void downloadFinished()
void downloadDataFinished(const QString &bytes)
void setItems(MusicSongIdentifyDataList *item) noexcept
The class of the abstract song identify query request.
MusicACRIdentifyRequest(QObject *parent=nullptr)
static constexpr const char * XF_QUERY_URL
static constexpr const char * ACR_QUERY_URL
The class of the xf song identify query request.
#define TTK_ERROR_STREAM(msg)
TTK_MODULE_EXPORT QString mdII(const QString &data, bool encode)
static QString makeDataBucketUrl()
#define QtNetworkErrorConnect(p, q, f, s)
Network error connect.
The class of the acr song identify query request.
virtual void downloadFinished() overridefinal
void downloadRawDataChanged(const QByteArray &bytes)