|
|
|
|
|
const axiosTH = axios.create({ |
|
baseURL: 'https://music.taihe.com/v1', |
|
}); |
|
axiosTH.interceptors.request.use( |
|
(config) => { |
|
const params = { ...config.params }; |
|
params.timestamp = Math.round(Date.now() / 1000); |
|
params.appid = '16073360'; |
|
const q = new URLSearchParams(params); |
|
q.sort(); |
|
const signStr = decodeURIComponent( |
|
`${q.toString()}0b50b02fd0d73a9c4c8c3a781c30845f` |
|
); |
|
params.sign = forge.md5 |
|
.create() |
|
.update(forge.util.encodeUtf8(signStr)) |
|
.digest() |
|
.toHex(); |
|
|
|
return { ...config, params }; |
|
}, |
|
null, |
|
{ synchronous: true } |
|
); |
|
|
|
class taihe { |
|
static th_convert_song(song) { |
|
const track = { |
|
id: `thtrack_${song.id}`, |
|
title: song.title, |
|
album: song.albumTitle, |
|
album_id: `thalbum_${song.albumAssetCode}`, |
|
source: 'taihe', |
|
source_url: `https://music.taihe.com/song/${song.id}`, |
|
img_url: song.pic, |
|
lyric_url: song.lyric || '', |
|
}; |
|
if (song.artist && song.artist.length) { |
|
track.artist = song.artist[0].name; |
|
track.artist_id = `thartist_${song.artist[0].artistCode}`; |
|
} |
|
return track; |
|
} |
|
|
|
static th_render_tracks(url, page, callback) { |
|
const list_id = getParameterByName('list_id', url).split('_').pop(); |
|
axiosTH |
|
.get('/tracklist/info', { |
|
params: { |
|
id: list_id, |
|
pageNo: page, |
|
pageSize: 100, |
|
}, |
|
}) |
|
.then((response) => { |
|
const data = response.data.data.trackList; |
|
const tracks = data.map(this.th_convert_song); |
|
return callback(null, tracks); |
|
}); |
|
} |
|
|
|
static search(url) { |
|
const keyword = getParameterByName('keywords', url); |
|
const curpage = getParameterByName('curpage', url); |
|
const searchType = getParameterByName('type', url); |
|
if (searchType === '1') { |
|
return { |
|
success: (fn) => |
|
fn({ |
|
result: [], |
|
total: 0, |
|
type: searchType, |
|
}), |
|
}; |
|
} |
|
return { |
|
success: (fn) => { |
|
axiosTH |
|
.get('/search', { |
|
params: { |
|
word: keyword, |
|
pageNo: curpage || 1, |
|
type: 1, |
|
}, |
|
}) |
|
.then((res) => { |
|
const { data } = res; |
|
const tracks = data.data.typeTrack.map(this.th_convert_song); |
|
return fn({ |
|
result: tracks, |
|
total: data.data.total, |
|
type: searchType, |
|
}); |
|
}) |
|
.catch(() => |
|
fn({ |
|
result: [], |
|
total: 0, |
|
type: searchType, |
|
}) |
|
); |
|
}, |
|
}; |
|
} |
|
|
|
static th_get_playlist(url) { |
|
const list_id = getParameterByName('list_id', url).split('_').pop(); |
|
|
|
return { |
|
success: (fn) => { |
|
axiosTH |
|
.get('/tracklist/info', { |
|
params: { |
|
id: list_id, |
|
}, |
|
}) |
|
.then((response) => { |
|
const { data } = response.data; |
|
|
|
const info = { |
|
cover_img_url: data.pic, |
|
title: data.title, |
|
id: `thplaylist_${list_id}`, |
|
source_url: `https://music.taihe.com/songlist/${list_id}`, |
|
}; |
|
|
|
const total = data.trackCount; |
|
const page = Math.ceil(total / 100); |
|
const page_array = Array.from({ length: page }, (v, k) => k + 1); |
|
async.concat( |
|
page_array, |
|
(item, callback) => this.th_render_tracks(url, item, callback), |
|
(err, tracks) => { |
|
fn({ |
|
tracks, |
|
info, |
|
}); |
|
} |
|
); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static th_artist(url) { |
|
return { |
|
success: (fn) => { |
|
const artist_id = getParameterByName('list_id', url).split('_').pop(); |
|
axiosTH |
|
.get('/artist/info', { |
|
params: { |
|
artistCode: artist_id, |
|
}, |
|
}) |
|
.then((response) => { |
|
const info = { |
|
cover_img_url: response.data.data.pic, |
|
title: response.data.data.name, |
|
id: `thartist_${artist_id}`, |
|
source_url: `https://music.taihe.com/artist/${artist_id}`, |
|
}; |
|
axiosTH |
|
.get('/artist/song', { |
|
params: { |
|
artistCode: artist_id, |
|
pageNo: 1, |
|
pageSize: 50, |
|
}, |
|
}) |
|
.then((res) => { |
|
const tracks = res.data.data.result.map(this.th_convert_song); |
|
return fn({ |
|
tracks, |
|
info, |
|
}); |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static bootstrap_track(track, success, failure) { |
|
const sound = {}; |
|
const song_id = track.id.slice('thtrack_'.length); |
|
axiosTH |
|
.get('/song/tracklink', { |
|
params: { |
|
TSID: song_id, |
|
}, |
|
}) |
|
.then((response) => { |
|
const { data } = response; |
|
if (data.data && data.data.path) { |
|
sound.url = data.data.path; |
|
sound.platform = 'taihe'; |
|
sound.bitrate = `${data.data.rate}kbps`; |
|
|
|
success(sound); |
|
} else { |
|
failure(sound); |
|
} |
|
}); |
|
} |
|
|
|
static lyric(url) { |
|
|
|
const lyric_url = getParameterByName('lyric_url', url); |
|
|
|
return { |
|
success: (fn) => { |
|
if (lyric_url) { |
|
axios.get(lyric_url).then((response) => |
|
fn({ |
|
lyric: response.data, |
|
}) |
|
); |
|
} else { |
|
const track_id = getParameterByName('track_id', url).split('_').pop(); |
|
axiosTH |
|
.get('/song/tracklink', { |
|
params: { |
|
TSID: track_id, |
|
}, |
|
}) |
|
.then((response) => { |
|
axios.get(response.data.data.lyric).then((res) => |
|
fn({ |
|
lyric: res.data, |
|
}) |
|
); |
|
}); |
|
} |
|
}, |
|
}; |
|
} |
|
|
|
static th_album(url) { |
|
return { |
|
success: (fn) => { |
|
const album_id = getParameterByName('list_id', url).split('_').pop(); |
|
|
|
axiosTH |
|
.get('/album/info', { |
|
params: { |
|
albumAssetCode: album_id, |
|
}, |
|
}) |
|
.then((response) => { |
|
const { data } = response.data; |
|
const info = { |
|
cover_img_url: data.pic, |
|
title: data.title, |
|
id: `thalbum_${album_id}`, |
|
source_url: `https://music.taihe.com/album/${album_id}`, |
|
}; |
|
|
|
const tracks = data.trackList.map((song) => ({ |
|
id: `thtrack_${song.assetId}`, |
|
title: song.title, |
|
artist: song.artist ? song.artist[0].name : '', |
|
artist_id: song.artist |
|
? `thartist_${song.artist[0].artistCode}` |
|
: 'thartist_', |
|
album: info.title, |
|
album_id: `thalbum_${album_id}`, |
|
source: 'taihe', |
|
source_url: `https://music.taihe.com/song/${song.assetId}`, |
|
img_url: info.cover_img_url, |
|
lyric_url: '', |
|
})); |
|
return fn({ |
|
tracks, |
|
info, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static show_playlist(url) { |
|
const offset = Number(getParameterByName('offset', url)); |
|
const subCate = getParameterByName('filter_id', url); |
|
return { |
|
success: (fn) => { |
|
axiosTH |
|
.get('/tracklist/list', { |
|
params: { |
|
pageNo: offset / 25 + 1, |
|
pageSize: 25, |
|
subCateId: subCate, |
|
}, |
|
}) |
|
.then((response) => { |
|
const { data } = response.data; |
|
const result = data.result.map((item) => ({ |
|
cover_img_url: item.pic, |
|
title: item.title, |
|
id: `thplaylist_${item.id}`, |
|
source_url: `https://music.taihe.com/songlist/${item.id}`, |
|
})); |
|
|
|
return fn({ |
|
result, |
|
}); |
|
}); |
|
}, |
|
}; |
|
} |
|
|
|
static parse_url(url) { |
|
let result; |
|
let id = ''; |
|
let match = /\/\/music.taihe.com\/([a-z]+)\//.exec(url); |
|
if (match) { |
|
switch (match[1]) { |
|
case 'songlist': |
|
match = /\/\/music.taihe.com\/songlist\/([0-9]+)/.exec(url); |
|
id = match ? `thplaylist_${match[1]}` : ''; |
|
break; |
|
case 'artist': |
|
match = /\/\/music.taihe.com\/artist\/(A[0-9]+)/.exec(url); |
|
id = match ? `thartist_${match[1]}` : ''; |
|
break; |
|
case 'album': |
|
match = /\/\/music.taihe.com\/album\/(P[0-9]+)/.exec(url); |
|
id = match ? `thalbum_${match[1]}` : ''; |
|
break; |
|
default: |
|
break; |
|
} |
|
result = { |
|
type: 'playlist', |
|
id, |
|
}; |
|
} |
|
return { |
|
success: (fn) => { |
|
fn(result); |
|
}, |
|
}; |
|
} |
|
|
|
static get_playlist(url) { |
|
const list_id = getParameterByName('list_id', url).split('_')[0]; |
|
switch (list_id) { |
|
case 'thplaylist': |
|
return this.th_get_playlist(url); |
|
case 'thalbum': |
|
return this.th_album(url); |
|
case 'thartist': |
|
return this.th_artist(url); |
|
default: |
|
return null; |
|
} |
|
} |
|
|
|
static get_playlist_filters() { |
|
return { |
|
success: (fn) => { |
|
axiosTH.get('/tracklist/category').then((res) => |
|
fn({ |
|
recommend: [{ id: '', name: '推荐歌单' }], |
|
all: res.data.data.map((sub) => ({ |
|
category: sub.categoryName, |
|
filters: sub.subCate.map((i) => ({ |
|
id: i.id, |
|
name: i.categoryName, |
|
})), |
|
})), |
|
}) |
|
); |
|
}, |
|
}; |
|
} |
|
|
|
static get_user() { |
|
return { |
|
success: (fn) => { |
|
fn({ status: 'fail', data: {} }); |
|
}, |
|
}; |
|
} |
|
|
|
static get_login_url() { |
|
return `https://music.taihe.com`; |
|
} |
|
|
|
static logout() {} |
|
} |
|
|