-
Notifications
You must be signed in to change notification settings - Fork 68
/
Copy pathapi.cpp
121 lines (102 loc) · 2.7 KB
/
api.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "lib/lyrics/api.hpp"
#include "lib/uri.hpp"
lib::lrc::api::api(const lib::http_client &http_client)
: http(http_client)
{
}
auto lib::lrc::api::headers() -> lib::headers
{
return {
{"Content-Type", "application/json"},
{
"User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/102.1",
},
};
}
void lib::lrc::api::search(const lib::spt::track &track,
lib::callback<lib::result<std::vector<lib::lrc::search_result>>> &callback)
{
const auto query = lib::fmt::format("{} {}",
lib::uri::encode(track.name),
lib::uri::encode(track.artists.front().name));
search(query, callback);
}
void lib::lrc::api::search(const std::string &query,
lib::callback<lib::result<std::vector<lib::lrc::search_result>>> &callback)
{
lib::uri uri("https://music.xianqiao.wang/neteaseapiv2/search");
uri.set_search_params({
{"limit", "10"},
{"type", "1"},
{"keywords", query},
});
http.get(uri.get_url(), headers(), [callback](const std::string &response)
{
if (response.empty())
{
callback(lib::result<std::vector<lib::lrc::search_result>>::fail("No response"));
return;
}
nlohmann::json json;
try
{
json = nlohmann::json::parse(response);
}
catch (const std::exception &e)
{
callback(lib::result<std::vector<lib::lrc::search_result>>::fail(e.what()));
return;
}
if (!json.contains("result"))
{
callback(lib::result<std::vector<lib::lrc::search_result>>::fail("No results"));
return;
}
const auto songs = json.at("result").at("songs");
if (!songs.is_array() || songs.empty())
{
callback(lib::result<std::vector<lib::lrc::search_result>>::fail("No lyrics found"));
return;
}
std::vector<lib::lrc::search_result> results;
results.reserve(songs.size());
for (const auto &song: songs)
{
results.push_back(song);
}
callback(lib::result<std::vector<lib::lrc::search_result>>::ok(results));
});
}
void lib::lrc::api::lyrics(int lyrics_id, lib::callback<lib::result<lib::lrc::lyrics>> &callback)
{
lib::uri uri("https://music.xianqiao.wang/neteaseapiv2/lyric");
uri.set_search_params({
{"id", std::to_string(lyrics_id)},
});
http.get(uri.get_url(), headers(), [callback](const std::string &response)
{
if (response.empty())
{
callback(lib::result<lib::lrc::lyrics>::fail("No response"));
return;
}
nlohmann::json json;
try
{
json = nlohmann::json::parse(response);
}
catch (const std::exception &e)
{
callback(lib::result<lib::lrc::lyrics>::fail(e.what()));
return;
}
if (!json.contains("lrc"))
{
callback(lib::result<lib::lrc::lyrics>::fail("No lyrics"));
return;
}
const auto lyric = json.at("lrc").at("lyric");
callback(lib::result<lib::lrc::lyrics>::ok(lyric));
});
}