/* global getParameterByName */ // eslint-disable-next-line no-unused-vars 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, // url: song_info.id, 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, }); }); }); }, }; } // eslint-disable-next-line no-unused-vars static bi_album(url) { return { success: (fn) => fn({ tracks: [], info: {}, }), // bilibili havn't album // const album_id = getParameterByName('list_id', url).split('_').pop(); // const target_url = ''; // axios.get(target_url).then((response) => { // const data = response.data; // const info = {}; // const tracks = []; // return 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, }); } // inferred, not implemented yet 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 track_id = getParameterByName('track_id', url).split('_').pop(); 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() {} // return { // show_playlist: bi_show_playlist, // get_playlist_filters, // get_playlist, // parse_url: bi_parse_url, // bootstrap_track: bi_bootstrap_track, // search: bi_search, // lyric: bi_lyric, // get_user: bi_get_user, // get_login_url: bi_get_login_url, // logout: bi_logout, // }; }