|
|
|
|
|
class bilibili { |
|
static bi_convert_song(song_info) { |
|
const track = { |
|
id: `bitrack_${song_info.id}`, |
|
title: song_info.title, |
|
artist: song_info.uname, |
|
artist_id: `biartist_${song_info.uid}`, |
|
source: 'bilibili', |
|
source_url: `https://www.bilibili.com/audio/au${song_info.id}`, |
|
img_url: song_info.cover, |
|
|
|
lyric_url: song_info.lyric, |
|
}; |
|
return track; |
|
} |
|
|
|
static show_playlist(url) { |
|
let offset = getParameterByName('offset', url); |
|
if (offset === undefined) { |
|
offset = 0; |
|
} |
|
const page = offset / 20 + 1; |
|
const target_url = `https://www.bilibili.com/audio/music-service-c/web/menu/hit?ps=20&pn=${page}`; |
|
return { |
|
success: (fn) => { |
|
axios.get(target_url).then((response) => { |
|
const { data } = response.data.data; |
|
const result = data.map((item) => ({ |
|
cover_img_url: item.cover, |
|
title: item.title, |
|
id: `biplaylist_${item.menuId}`, |
|
source_url: `https://www.bilibili.com/audio/am${item.menuId}`, |
|
})); |
|
return fn({ |
|
result, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static bi_get_playlist(url) { |
|
const list_id = getParameterByName('list_id', url).split('_').pop(); |
|
const target_url = `https://www.bilibili.com/audio/music-service-c/web/menu/info?sid=${list_id}`; |
|
return { |
|
success: (fn) => { |
|
axios.get(target_url).then((response) => { |
|
const { data } = response.data; |
|
const info = { |
|
cover_img_url: data.cover, |
|
title: data.title, |
|
id: `biplaylist_${list_id}`, |
|
source_url: `https://www.bilibili.com/audio/am${list_id}`, |
|
}; |
|
const target = `https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=${list_id}`; |
|
axios.get(target).then((res) => { |
|
const tracks = res.data.data.data.map((item) => |
|
this.bi_convert_song(item) |
|
); |
|
return fn({ |
|
info, |
|
tracks, |
|
}); |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
|
|
static bi_album(url) { |
|
return { |
|
success: (fn) => |
|
fn({ |
|
tracks: [], |
|
info: {}, |
|
}), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}; |
|
} |
|
|
|
static bi_artist(url) { |
|
return { |
|
success: (fn) => { |
|
const artist_id = getParameterByName('list_id', url).split('_').pop(); |
|
let target_url = `https://api.bilibili.com/x/space/acc/info?mid=${artist_id}&jsonp=jsonp`; |
|
axios.get(target_url).then((response) => { |
|
const info = { |
|
cover_img_url: response.data.data.face, |
|
title: response.data.data.name, |
|
id: `biartist_${artist_id}`, |
|
source_url: `https://space.bilibili.com/${artist_id}/#/audio`, |
|
}; |
|
target_url = `https://api.bilibili.com/audio/music-service-c/web/song/upper?pn=1&ps=0&order=2&uid=${artist_id}`; |
|
axios.get(target_url).then((res) => { |
|
const tracks = res.data.data.data.map((item) => |
|
this.bi_convert_song(item) |
|
); |
|
return fn({ |
|
tracks, |
|
info, |
|
}); |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static parse_url(url) { |
|
let result; |
|
const match = /\/\/www.bilibili.com\/audio\/am([0-9]+)/.exec(url); |
|
if (match != null) { |
|
const playlist_id = match[1]; |
|
result = { |
|
type: 'playlist', |
|
id: `biplaylist_${playlist_id}`, |
|
}; |
|
} |
|
return { |
|
success: (fn) => { |
|
fn(result); |
|
}, |
|
}; |
|
} |
|
|
|
static bootstrap_track(track, success, failure) { |
|
const sound = {}; |
|
const song_id = track.id.slice('bitrack_'.length); |
|
const target_url = `https://www.bilibili.com/audio/music-service-c/web/url?sid=${song_id}`; |
|
axios.get(target_url).then((response) => { |
|
const { data } = response; |
|
if (data.code === 0) { |
|
[sound.url] = data.data.cdns; |
|
sound.platform = 'bilibili'; |
|
|
|
success(sound); |
|
} else { |
|
failure(sound); |
|
} |
|
}); |
|
} |
|
|
|
static search(url) { |
|
return { |
|
success: (fn) => { |
|
const keyword = getParameterByName('keywords', url); |
|
const curpage = getParameterByName('curpage', url); |
|
const au = /\d+$/.exec(keyword); |
|
if (au != null) { |
|
const target_url = `https://www.bilibili.com/audio/music-service-c/web/song/info?sid=${au}`; |
|
axios.get(target_url).then((response) => { |
|
const { data } = response.data; |
|
const tracks = [this.bi_convert_song(data)]; |
|
return fn({ |
|
result: tracks, |
|
total: 1, |
|
}); |
|
}); |
|
} else { |
|
return fn({ |
|
result: [], |
|
total: 0, |
|
}); |
|
} |
|
|
|
const target_url = `https://api.bilibili.com/x/web-interface/search/type?search_type=audio&keyword=${keyword}&page=${curpage}`; |
|
axios.get(target_url).then((response) => { |
|
const { data } = response.data; |
|
const tracks = data.result.map((item) => this.bi_convert_song(item)); |
|
return fn({ |
|
result: tracks, |
|
total: data.numResults, |
|
}); |
|
}); |
|
return null; |
|
}, |
|
}; |
|
} |
|
|
|
static lyric(url) { |
|
|
|
const lyric_url = getParameterByName('lyric_url', url); |
|
return { |
|
success: (fn) => { |
|
axios.get(lyric_url).then((response) => { |
|
const { data } = response; |
|
return fn({ |
|
lyric: data, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static get_playlist(url) { |
|
const list_id = getParameterByName('list_id', url).split('_')[0]; |
|
switch (list_id) { |
|
case 'biplaylist': |
|
return this.bi_get_playlist(url); |
|
case 'bialbum': |
|
return this.bi_album(url); |
|
case 'biartist': |
|
return this.bi_artist(url); |
|
default: |
|
return null; |
|
} |
|
} |
|
|
|
static get_playlist_filters() { |
|
return { |
|
success: (fn) => fn({ recommend: [], all: [] }), |
|
}; |
|
} |
|
|
|
static get_user() { |
|
return { |
|
success: (fn) => fn({ status: 'fail', data: {} }), |
|
}; |
|
} |
|
|
|
static get_login_url() { |
|
return `https://www.bilibili.com`; |
|
} |
|
|
|
static logout() {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|