|
1 | 1 | import honoka from 'honoka'; |
2 | 2 |
|
3 | 3 | function parseResponse(response) { |
4 | | - try { |
5 | | - response = JSON.parse(response); |
6 | | - } catch (e) { |
7 | | - throw new Error('response is not a valid json string'); |
8 | | - } |
| 4 | + try { |
| 5 | + response = JSON.parse(response); |
| 6 | + } catch (e) { |
| 7 | + throw new Error('response is not a valid json string'); |
| 8 | + } |
9 | 9 |
|
10 | | - if (response.code !== 200) { |
11 | | - throw new Error('response code is not valid', response.code); |
12 | | - } |
| 10 | + if (response.code !== 200) { |
| 11 | + throw new Error('response code is not valid', response.code); |
| 12 | + } |
13 | 13 |
|
14 | | - return response; |
| 14 | + return response; |
15 | 15 | } |
16 | 16 |
|
17 | 17 | async function generator() { |
18 | | - if (arguments.length === 0) { |
19 | | - throw new Error('invalid input'); |
20 | | - } |
21 | | - |
22 | | - const result = []; |
23 | | - |
24 | | - for (const id of Array.from(arguments)) { |
25 | | - const item = {}; |
26 | | - let songDetail = await honoka.get( |
27 | | - `http://music.163.com/api/song/detail/?id=${id}&ids=%5B${id}%5D` |
28 | | - ); |
29 | | - songDetail = parseResponse(songDetail); |
30 | | - |
31 | | - songDetail = songDetail.songs[0]; |
32 | | - |
33 | | - item.title = songDetail.name; |
34 | | - item.artist = songDetail.artists[0].name; |
35 | | - item.cover = songDetail.album.picUrl; |
36 | | - item.src = `https://api.kotori.love/netease/${id}.mp3`; |
37 | | - |
38 | | - let lyricDetail = await honoka.get( |
39 | | - `http://music.163.com/api/song/lyric?os=pc&id=${id}&lv=-1&kv=-1&tv=-1` |
40 | | - ); |
41 | | - lyricDetail = parseResponse(lyricDetail); |
42 | | - |
43 | | - item.lrc = lyricDetail.lrc.lyric; |
44 | | - item.translation = lyricDetail.tlyric.lyric; |
45 | | - |
46 | | - ['lrc', 'translation'].forEach(key => { |
47 | | - if (item[key] === null) { |
48 | | - delete item[key]; |
49 | | - } |
50 | | - }); |
51 | | - |
52 | | - result.push(item); |
53 | | - } |
54 | | - |
55 | | - return JSON.stringify(result, null, 2); |
| 18 | + if (arguments.length === 0) { |
| 19 | + throw new Error('invalid input'); |
| 20 | + } |
| 21 | + |
| 22 | + const result = []; |
| 23 | + |
| 24 | + for (const id of Array.from(arguments)) { |
| 25 | + if (!/^[0-9]*[1-9][0-9]*$/.test(id)) { |
| 26 | + throw new Error('invalid song ID'); |
| 27 | + } |
| 28 | + const item = {}; |
| 29 | + let songDetail = await honoka.get( |
| 30 | + `http://music.163.com/api/song/detail/?id=${id}&ids=%5B${id}%5D` |
| 31 | + ); |
| 32 | + songDetail = parseResponse(songDetail); |
| 33 | + |
| 34 | + songDetail = songDetail.songs[0]; |
| 35 | + |
| 36 | + item.title = songDetail.name; |
| 37 | + item.artist = songDetail.artists[0].name; |
| 38 | + item.cover = songDetail.album.picUrl; |
| 39 | + item.src = `https://api.kotori.love/netease/${id}.mp3`; |
| 40 | + |
| 41 | + let lyricDetail = await honoka.get( |
| 42 | + `http://music.163.com/api/song/lyric?os=pc&id=${id}&lv=-1&kv=-1&tv=-1` |
| 43 | + ); |
| 44 | + lyricDetail = parseResponse(lyricDetail); |
| 45 | + |
| 46 | + item.lyric = lyricDetail.lrc.lyric; |
| 47 | + item.translation = lyricDetail.tlyric.lyric; |
| 48 | + |
| 49 | + ['lyric', 'translation'].forEach(key => { |
| 50 | + if (item[key] === null) { |
| 51 | + delete item[key]; |
| 52 | + } |
| 53 | + }); |
| 54 | + |
| 55 | + result.push(item); |
| 56 | + } |
| 57 | + |
| 58 | + return JSON.stringify(result, null, 2); |
56 | 59 | } |
57 | 60 |
|
58 | 61 | export default generator; |
0 commit comments