修复歌单显示问题

This commit is contained in:
lyswhut 2023-04-24 13:02:03 +08:00
parent 45c63cb988
commit 6bc7ee049c
4 changed files with 83 additions and 35 deletions

View File

@ -17,11 +17,6 @@
一个基于 React native 开发的音乐软件。 一个基于 React native 开发的音乐软件。
所用技术栈:
- React native
- Redux
支持的平台: 支持的平台:
- Android - Android

View File

@ -26,7 +26,8 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
listRef.current?.setList(listDetailInfo.list) listRef.current?.setList(listDetailInfo.list)
headerRef.current?.setInfo({ headerRef.current?.setInfo({
name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '', name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '',
desc: songlistState.selectListInfo.desc ?? listDetailInfo.desc ?? '', // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
desc: songlistState.selectListInfo.desc || listDetailInfo.info.desc || '',
playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '', playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '',
imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img, imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img,
}) })
@ -37,7 +38,8 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
setListDetailInfo(songlistState.selectListInfo.source, songlistState.selectListInfo.id) setListDetailInfo(songlistState.selectListInfo.source, songlistState.selectListInfo.id)
headerRef.current?.setInfo({ headerRef.current?.setInfo({
name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '', name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '',
desc: songlistState.selectListInfo.desc ?? listDetailInfo.desc ?? '', // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
desc: songlistState.selectListInfo.desc || listDetailInfo.info.desc || '',
playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '', playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '',
imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img, imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img,
}) })
@ -47,7 +49,8 @@ export default forwardRef<MusicListType, MusicListProps>(({ componentId }, ref)
requestAnimationFrame(() => { requestAnimationFrame(() => {
headerRef.current?.setInfo({ headerRef.current?.setInfo({
name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '', name: (songlistState.selectListInfo.name || listDetailInfo.info.name) ?? '',
desc: songlistState.selectListInfo.desc ?? listDetailInfo.desc ?? '', // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
desc: songlistState.selectListInfo.desc || listDetailInfo.info.desc || '',
playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '', playCount: (songlistState.selectListInfo.play_count ?? listDetailInfo.info.play_count) ?? '',
imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img, imgUrl: songlistState.selectListInfo.img ?? listDetailInfo.info.img,
}) })

View File

@ -52,7 +52,7 @@ export declare interface ListInfo {
export declare interface ListDetailInfo { export declare interface ListDetailInfo {
list: LX.Music.MusicInfoOnline[] list: LX.Music.MusicInfoOnline[]
source: LX.OnlineSource source: LX.OnlineSource
desc: string | null // desc: string | null
total: number total: number
page: number page: number
limit: number limit: number
@ -113,7 +113,7 @@ const state: InitState = {
listDetailInfo: { listDetailInfo: {
list: [], list: [],
id: '', id: '',
desc: null, // desc: null,
total: 0, total: 0,
page: 1, page: 1,
limit: 30, limit: 30,

View File

@ -102,12 +102,53 @@ export default {
// return body.data.info // return body.data.info
// }) // })
// }, // },
async getListDetailBySpecialId(id) { parseHtmlDesc(html) {
const globalSpecialId = await this.getGlobalSpecialId(id) const prefix = '<div class="pc_specail_text pc_singer_tab_content" id="specailIntroduceWrap">'
let index = html.indexOf(prefix)
if (index < 0) return null
const afterStr = html.substring(index + prefix.length)
index = afterStr.indexOf('</div>')
if (index < 0) return null
return decodeName(afterStr.substring(0, index))
},
async getListDetailBySpecialId(id, page, tryNum = 0) {
if (tryNum > 2) throw new Error('try max num')
const { body } = await httpFetch(this.getSongListDetailUrl(id)).promise
let listData = body.match(this.regExps.listData)
let listInfo = body.match(this.regExps.listInfo)
if (!listData) return this.getListDetailBySpecialId(id, page, ++tryNum)
let list = await this.getMusicInfos(JSON.parse(listData[1]))
// listData = this.filterData(JSON.parse(listData[1]))
let name
let pic
if (listInfo) {
name = listInfo[1]
pic = listInfo[2]
}
let desc = this.parseHtmlDesc(body)
return {
list,
page: 1,
limit: 10000,
total: list.length,
source: 'kg',
info: {
name,
img: pic,
desc,
// author: body.result.info.userinfo.username,
// play_count: this.formatPlayCount(body.result.listen_num),
},
}
// const globalSpecialId = await this.getGlobalSpecialId(id)
// const limit = 100 // const limit = 100
// const listData = await this.getSongListDetailByGlobalSpecialId(globalSpecialId, page, limit) // const listData = await this.getSongListDetailByGlobalSpecialId(globalSpecialId, page, limit)
// if (!Array.isArray(listData)) // if (!Array.isArray(listData))
return this.getUserListDetail2(globalSpecialId) // return this.getUserListDetail2(globalSpecialId)
// return { // return {
// list: this.filterDatav9(listData), // list: this.filterDatav9(listData),
// page, // page,
@ -132,9 +173,9 @@ export default {
if (tagId == null) tagId = '' if (tagId == null) tagId = ''
return `http://www2.kugou.kugou.com/yueku/v9/special/getSpecial?is_ajax=1&cdn=cdn&t=${sortId}&c=${tagId}&p=${page}` return `http://www2.kugou.kugou.com/yueku/v9/special/getSpecial?is_ajax=1&cdn=cdn&t=${sortId}&c=${tagId}&p=${page}`
}, },
// getSongListDetailUrl(id) { getSongListDetailUrl(id) {
// return `http://www2.kugou.kugou.com/yueku/v9/special/single/${id}-5-9999.html` return `http://www2.kugou.kugou.com/yueku/v9/special/single/${id}-5-9999.html`
// }, },
/** /**
* 格式化播放数量 * 格式化播放数量
@ -282,6 +323,15 @@ export default {
}, },
}).then(data => data.map(s => s[0]))) }).then(data => data.map(s => s[0])))
}, },
async getMusicInfos(list) {
return this.filterData2(
await Promise.all(
this.createTask(
this.deDuplication(list)
.map(item => ({ hash: item.hash })),
))
.then(([...datas]) => datas.flat()))
},
async getUserListDetailByCode(id) { async getUserListDetailByCode(id) {
const songInfo = await this.createHttp('http://t.kugou.com/command/', { const songInfo = await this.createHttp('http://t.kugou.com/command/', {
@ -318,12 +368,12 @@ export default {
}) })
// console.log(songList) // console.log(songList)
} }
let result = await Promise.all(this.createTask((songList || songInfo.list).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) let list = await this.getMusicInfos(songList || songInfo.list)
return { return {
list: this.filterData2(result) || [], list,
page: 1, page: 1,
limit: info.count, limit: info.count,
total: info.count, total: list.length,
source: 'kg', source: 'kg',
info: { info: {
name: info.name, name: info.name,
@ -345,13 +395,13 @@ export default {
if (songInfo.global_collection_id) return this.getUserListDetail2(songInfo.global_collection_id) if (songInfo.global_collection_id) return this.getUserListDetail2(songInfo.global_collection_id)
else return this.getUserListDetail4(songInfo, chain, page).catch(() => this.getUserListDetail5(chain)) else return this.getUserListDetail4(songInfo, chain, page).catch(() => this.getUserListDetail5(chain))
} }
let result = await Promise.all(this.createTask(songInfo.list.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) let list = await this.getMusicInfos(songInfo.list)
// console.log(info, songInfo) // console.log(info, songInfo)
return { return {
list: this.filterData2(result) || [], list,
page: 1, page: 1,
limit: this.listDetailLimit, limit: this.listDetailLimit,
total: songInfo.count, total: list.length,
source: 'kg', source: 'kg',
info: { info: {
name: songInfo.info.name, name: songInfo.info.name,
@ -389,13 +439,13 @@ export default {
}).then(data => data.list.info)) }).then(data => data.list.info))
} }
let result = await Promise.all(tasks).then(([...datas]) => datas.flat()) let result = await Promise.all(tasks).then(([...datas]) => datas.flat())
result = await Promise.all(this.createTask(this.deDuplication(result).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) result = await this.getMusicInfos(result)
// console.log(result) // console.log(result)
return { return {
list: this.filterData2(result) || [], list: result,
page, page,
limit: this.listDetailLimit, limit: this.listDetailLimit,
total: listInfo.count, total: result.length,
source: 'kg', source: 'kg',
info: { info: {
name: listInfo.name, name: listInfo.name,
@ -440,13 +490,13 @@ export default {
}, },
}) })
const songInfo = await this.createGetListDetail2Task(id, info.songcount) const songInfo = await this.createGetListDetail2Task(id, info.songcount)
let result = await Promise.all(this.createTask(this.deDuplication(songInfo).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) let list = await this.getMusicInfos(songInfo)
// console.log(info, songInfo, result) // console.log(info, songInfo, list)
return { return {
list: this.filterData2(result) || [], list,
page: 1, page: 1,
limit: this.listDetailLimit, limit: this.listDetailLimit,
total: info.songcount, total: list.length,
source: 'kg', source: 'kg',
info: { info: {
name: info.specialname, name: info.specialname,
@ -482,9 +532,9 @@ export default {
let result = body.match(/var\sdataFromSmarty\s=\s(\[.+?\])/) let result = body.match(/var\sdataFromSmarty\s=\s(\[.+?\])/)
if (result) result = JSON.parse(result[1]) if (result) result = JSON.parse(result[1])
this.cache.set(chain, result) this.cache.set(chain, result)
result = await Promise.all(this.createTask(result.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) result = await this.getMusicInfos(result)
// console.log(info, songInfo) // console.log(info, songInfo)
return this.filterData2(result) return result
}, },
async getUserListDetail4(songInfo, chain, page) { async getUserListDetail4(songInfo, chain, page) {
@ -497,7 +547,7 @@ export default {
list: list || [], list: list || [],
page, page,
limit, limit,
total: listInfo.songcount, total: list.length ?? 0,
source: 'kg', source: 'kg',
info: { info: {
name: listInfo.specialname, name: listInfo.specialname,
@ -518,7 +568,7 @@ export default {
list: list || [], list: list || [],
page: 1, page: 1,
limit: this.listDetailLimit, limit: this.listDetailLimit,
total: listInfo.songcount, total: list.length ?? 0,
source: 'kg', source: 'kg',
info: { info: {
name: listInfo.specialname, name: listInfo.specialname,
@ -541,9 +591,9 @@ export default {
}) })
// console.log(info) // console.log(info)
let result = await Promise.all(this.createTask(info.info.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat()) let result = await this.getMusicInfos(info.info)
// console.log(info, songInfo) // console.log(info, songInfo)
return this.filterData2(result) return result
}, },
async getUserListDetail(link, page, retryNum = 0) { async getUserListDetail(link, page, retryNum = 0) {