1
1
import { httpFetch } from '../../request'
2
2
import { formatPlayTime , decodeName } from '../../index'
3
- import { formatSinger } from './util'
3
+ import { formatSinger , wbdCrypto } from './util'
4
+
4
5
5
6
const boardList = [ { id : 'kw__93' , name : '飙升榜' , bangid : '93' } , { id : 'kw__17' , name : '新歌榜' , bangid : '17' } , { id : 'kw__16' , name : '热歌榜' , bangid : '16' } , { id : 'kw__158' , name : '抖音热歌榜' , bangid : '158' } , { id : 'kw__292' , name : '铃声榜' , bangid : '292' } , { id : 'kw__284' , name : '热评榜' , bangid : '284' } , { id : 'kw__290' , name : 'ACG新歌榜' , bangid : '290' } , { id : 'kw__286' , name : '台湾KKBOX榜' , bangid : '286' } , { id : 'kw__279' , name : '冬日暖心榜' , bangid : '279' } , { id : 'kw__281' , name : '巴士随身听榜' , bangid : '281' } , { id : 'kw__255' , name : 'KTV点唱榜' , bangid : '255' } , { id : 'kw__280' , name : '家务进行曲榜' , bangid : '280' } , { id : 'kw__282' , name : '熬夜修仙榜' , bangid : '282' } , { id : 'kw__283' , name : '枕边轻音乐榜' , bangid : '283' } , { id : 'kw__278' , name : '古风音乐榜' , bangid : '278' } , { id : 'kw__264' , name : 'Vlog音乐榜' , bangid : '264' } , { id : 'kw__242' , name : '电音榜' , bangid : '242' } , { id : 'kw__187' , name : '流行趋势榜' , bangid : '187' } , { id : 'kw__204' , name : '现场音乐榜' , bangid : '204' } , { id : 'kw__186' , name : 'ACG神曲榜' , bangid : '186' } , { id : 'kw__185' , name : '最强翻唱榜' , bangid : '185' } , { id : 'kw__26' , name : '经典怀旧榜' , bangid : '26' } , { id : 'kw__104' , name : '华语榜' , bangid : '104' } , { id : 'kw__182' , name : '粤语榜' , bangid : '182' } , { id : 'kw__22' , name : '欧美榜' , bangid : '22' } , { id : 'kw__184' , name : '韩语榜' , bangid : '184' } , { id : 'kw__183' , name : '日语榜' , bangid : '183' } , { id : 'kw__145' , name : '会员畅听榜' , bangid : '145' } , { id : 'kw__153' , name : '网红新歌榜' , bangid : '153' } , { id : 'kw__64' , name : '影视金曲榜' , bangid : '64' } , { id : 'kw__176' , name : 'DJ嗨歌榜' , bangid : '176' } , { id : 'kw__106' , name : '真声音' , bangid : '106' } , { id : 'kw__12' , name : 'Billboard榜' , bangid : '12' } , { id : 'kw__49' , name : 'iTunes音乐榜' , bangid : '49' } , { id : 'kw__180' , name : 'beatport电音榜' , bangid : '180' } , { id : 'kw__13' , name : '英国UK榜' , bangid : '13' } , { id : 'kw__164' , name : '百大DJ榜' , bangid : '164' } , { id : 'kw__246' , name : 'YouTube音乐排行榜' , bangid : '246' } , { id : 'kw__265' , name : '韩国Genie榜' , bangid : '265' } , { id : 'kw__14' , name : '韩国M-net榜' , bangid : '14' } , { id : 'kw__8' , name : '香港电台榜' , bangid : '8' } , { id : 'kw__15' , name : '日本公信榜' , bangid : '15' } , { id : 'kw__151' , name : '腾讯音乐人原创榜' , bangid : '151' } ]
6
7
8
+ const sortQualityArray = array => {
9
+ const qualityMap = {
10
+ flac24bit : 4 ,
11
+ flac : 3 ,
12
+ '320k' : 2 ,
13
+ '128k' : 1 ,
14
+ }
15
+ const rawQualityArray = [ ]
16
+ const newQualityArray = [ ]
17
+
18
+ array . forEach ( ( item , index ) => {
19
+ const type = qualityMap [ item . type ]
20
+ if ( ! type ) return
21
+ rawQualityArray . push ( { type, index } )
22
+ } )
23
+
24
+ rawQualityArray . sort ( ( a , b ) => a . type - b . type )
25
+
26
+ rawQualityArray . forEach ( item => {
27
+ newQualityArray . push ( array [ item . index ] )
28
+ } )
29
+
30
+ return newQualityArray
31
+ }
32
+
7
33
export default {
8
34
list : [
9
35
{
@@ -62,9 +88,9 @@ export default {
62
88
bangid : 183 ,
63
89
} ,
64
90
] ,
65
- getUrl : ( p , l , id ) => `http://kbangserver.kuwo.cn/ksong.s?from=pc&fmt=json&pn=${ p - 1 } &rn=${ l } &type=bang&data=content&id=${ id } &show_copyright_off=0&pcmp4=1&isbang=1` ,
91
+ // getUrl: (p, l, id) => `http://kbangserver.kuwo.cn/ksong.s?from=pc&fmt=json&pn=${p - 1}&rn=${l}&type=bang&data=content&id=${id}&show_copyright_off=0&pcmp4=1&isbang=1`,
66
92
regExps : {
67
-
93
+ mInfo : / l e v e l : ( \w + ) , b i t r a t e : ( \d + ) , f o r m a t : ( \w + ) , s i z e : ( [ \w . ] + ) / ,
68
94
} ,
69
95
limit : 100 ,
70
96
_requestBoardsObj : null ,
@@ -79,57 +105,50 @@ export default {
79
105
return requestDataObj . promise
80
106
} ,
81
107
filterData ( rawList ) {
82
- // console.log(rawList)
83
- // console.log(rawList.length, rawList2.length)
84
- return rawList . map ( ( item , inedx ) => {
85
- let formats = item . formats . split ( '|' )
108
+ return rawList . map ( item => {
86
109
let types = [ ]
87
- let _types = { }
88
- if ( formats . includes ( 'MP3128' ) ) {
89
- types . push ( { type : '128k' , size : null } )
90
- _types [ '128k' ] = {
91
- size : null ,
92
- }
93
- }
94
- // if (formats.includes('MP3192')) {
95
- // types.push({ type: '192k', size: null })
96
- // _types['192k'] = {
97
- // size: null,
98
- // }
99
- // }
100
- if ( formats . includes ( 'MP3H' ) ) {
101
- types . push ( { type : '320k' , size : null } )
102
- _types [ '320k' ] = {
103
- size : null ,
104
- }
105
- }
106
- // if (formats.includes('AL')) {
107
- // types.push({ type: 'ape', size: null })
108
- // _types.ape = {
109
- // size: null,
110
- // }
111
- // }
112
- if ( formats . includes ( 'ALFLAC' ) ) {
113
- types . push ( { type : 'flac' , size : null } )
114
- _types . flac = {
115
- size : null ,
116
- }
117
- }
118
- if ( formats . includes ( 'HIRFLAC' ) ) {
119
- types . push ( { type : 'flac24bit' , size : null } )
120
- _types . flac24bit = {
121
- size : null ,
110
+ const _types = { }
111
+ const qualitys = new Set ( )
112
+
113
+ item . n_minfo . split ( ';' ) . forEach ( i => {
114
+ const info = i . match ( this . regExps . mInfo )
115
+ if ( ! info ) return
116
+
117
+ const quality = info [ 2 ]
118
+ const size = info [ 4 ] . toLocaleUpperCase ( )
119
+
120
+ if ( qualitys . has ( quality ) ) return
121
+ qualitys . add ( quality )
122
+
123
+ switch ( quality ) {
124
+ case '4000' :
125
+ types . push ( { type : 'flac24bit' , size } )
126
+ _types . flac24bit = { size }
127
+ break
128
+ case '2000' :
129
+ types . push ( { type : 'flac' , size } )
130
+ _types . flac = { size }
131
+ break
132
+ case '320' :
133
+ types . push ( { type : '320k' , size } )
134
+ _types [ '320k' ] = { size }
135
+ break
136
+ case '128' :
137
+ types . push ( { type : '128k' , size } )
138
+ _types [ '128k' ] = { size }
139
+ break
122
140
}
123
- }
124
- // types.reverse()
141
+ } )
142
+ types = sortQualityArray ( types )
143
+
125
144
return {
126
145
singer : formatSinger ( decodeName ( item . artist ) ) ,
127
146
name : decodeName ( item . name ) ,
128
147
albumName : decodeName ( item . album ) ,
129
- albumId : item . albumid ,
148
+ albumId : item . albumId ,
130
149
songmid : item . id ,
131
150
source : 'kw' ,
132
- interval : formatPlayTime ( parseInt ( item . song_duration ) ) ,
151
+ interval : formatPlayTime ( parseInt ( item . duration ) ) ,
133
152
img : item . pic ,
134
153
lrc : null ,
135
154
otherSource : null ,
@@ -180,12 +199,20 @@ export default {
180
199
181
200
getList ( id , page , retryNum = 0 ) {
182
201
if ( ++ retryNum > 3 ) return Promise . reject ( new Error ( 'try max num' ) )
183
- return this . getData ( this . getUrl ( page , this . limit , id ) ) . then ( ( { statusCode, body } ) => {
184
- // console.log(body)
185
- if ( statusCode !== 200 || ! body . musiclist ) return this . getList ( id , page , retryNum )
186
- // console.log(data1.musiclist, data2.data)
187
- let total = parseInt ( body . num )
188
- let list = this . filterData ( body . musiclist )
202
+
203
+ const requestBody = { uid : '' , devId : '' , sFrom : 'kuwo_sdk' , user_type : 'AP' , carSource : 'kwplayercar_ar_6.0.1.0_apk_keluze.apk' , id, pn : page - 1 , rn : this . limit }
204
+ const requestUrl = `https://wbd.kuwo.cn/api/bd/bang/bang_info?${ wbdCrypto . buildParam ( requestBody ) } `
205
+ const request = httpFetch ( requestUrl ) . promise
206
+
207
+ return request . then ( ( { statusCode, body } ) => {
208
+ const rawData = wbdCrypto . decodeData ( body )
209
+ // console.log(rawData)
210
+ const data = rawData . data
211
+ if ( statusCode !== 200 || rawData . code != 200 || ! data . musiclist ) return this . getList ( id , page , retryNum )
212
+
213
+ const total = parseInt ( data . total )
214
+ const list = this . filterData ( data . musiclist )
215
+
189
216
return {
190
217
total,
191
218
list,
0 commit comments