mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-05-23 22:37:41 +08:00
修复kg源的歌单链接无法打开的问题
This commit is contained in:
parent
f8fc8d3111
commit
cc469f18a2
@ -23,4 +23,5 @@ module.exports = {
|
|||||||
settings: {
|
settings: {
|
||||||
'html/html-extensions': ['.jsx'],
|
'html/html-extensions': ['.jsx'],
|
||||||
},
|
},
|
||||||
|
ignorePatterns: ['vendors', '*.min.js'],
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
### 修复
|
### 修复
|
||||||
|
|
||||||
- 修复我的列表搜索无法搜索小括号、中括号等字符,并会导致应用崩溃的问题
|
- 修复kg源的歌单链接无法打开的问题
|
||||||
- 修复使用同步功能同步完成后,列表没有被保存,导致下次再连接同步时被同步新增的歌曲被移除的问题(此问题由v0.8.2的存储切片改造引入的)
|
|
||||||
|
|
||||||
### 其他
|
|
||||||
|
|
||||||
- 更新React native到v0.66.0
|
|
||||||
|
@ -1,6 +1,17 @@
|
|||||||
import { httpFetch } from '../../request'
|
import { httpFetch } from '../../request'
|
||||||
import { decodeName, formatPlayTime, sizeFormate } from '../../index'
|
import { decodeName, formatPlayTime, sizeFormate } from '../../index'
|
||||||
import { toMD5 } from '../utils'
|
import { toMD5 } from '../utils'
|
||||||
|
import infSign from './vendors/infSign.min'
|
||||||
|
|
||||||
|
const handleSignature = (id, page, limit) => new Promise((resolve, reject) => {
|
||||||
|
infSign({ appid: 1058, type: 0, module: 'playlist', page, pagesize: limit, specialid: id }, null, {
|
||||||
|
useH5: !0,
|
||||||
|
isCDN: !0,
|
||||||
|
callback(i) {
|
||||||
|
resolve(i.signature)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
_requestObj_tags: null,
|
_requestObj_tags: null,
|
||||||
@ -40,6 +51,7 @@ export default {
|
|||||||
id: '8',
|
id: '8',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
cache: new Map(),
|
||||||
regExps: {
|
regExps: {
|
||||||
listData: /global\.data = (\[.+\]);/,
|
listData: /global\.data = (\[.+\]);/,
|
||||||
listInfo: /global = {[\s\S]+?name: "(.+)"[\s\S]+?pic: "(.+)"[\s\S]+?};/,
|
listInfo: /global = {[\s\S]+?name: "(.+)"[\s\S]+?pic: "(.+)"[\s\S]+?};/,
|
||||||
@ -255,7 +267,7 @@ export default {
|
|||||||
})
|
})
|
||||||
if (!songInfo.list) {
|
if (!songInfo.list) {
|
||||||
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 throw new Error('fail')
|
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 result = await Promise.all(this.createTask(songInfo.list.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
|
||||||
// console.log(info, songInfo)
|
// console.log(info, songInfo)
|
||||||
@ -368,6 +380,94 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async getListInfoByChain(chain) {
|
||||||
|
if (this.cache.has(chain)) return this.cache.get(chain)
|
||||||
|
const { body } = await httpFetch(`https://m.kugou.com/share/?chain=${chain}&id=${chain}`, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
|
||||||
|
},
|
||||||
|
}).promise
|
||||||
|
let result = body.match(/var\sphpParam\s=\s({.+?});/)
|
||||||
|
if (result) result = JSON.parse(result[1])
|
||||||
|
this.cache.set(chain, result)
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
|
||||||
|
async getUserListDetailByPcChain(chain) {
|
||||||
|
let key = `${chain}_pc_list`
|
||||||
|
if (this.cache.has(key)) return this.cache.get(key)
|
||||||
|
const { body } = await httpFetch(`http://www.kugou.com/share/${chain}.html`, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
|
||||||
|
},
|
||||||
|
}).promise
|
||||||
|
let result = body.match(/var\sdataFromSmarty\s=\s(\[.+?\])/)
|
||||||
|
if (result) result = JSON.parse(result[1])
|
||||||
|
this.cache.set(chain, result)
|
||||||
|
result = await Promise.all(this.createTask(result.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
|
||||||
|
// console.log(info, songInfo)
|
||||||
|
return this.filterData2(result)
|
||||||
|
},
|
||||||
|
|
||||||
|
async getUserListDetail4(songInfo, chain, page) {
|
||||||
|
const limit = 100
|
||||||
|
const [listInfo, list] = await Promise.all([
|
||||||
|
this.getListInfoByChain(chain),
|
||||||
|
this.getUserListDetailById(songInfo.id, page, limit),
|
||||||
|
])
|
||||||
|
return {
|
||||||
|
list: list || [],
|
||||||
|
page,
|
||||||
|
limit,
|
||||||
|
total: listInfo.songcount,
|
||||||
|
source: 'kg',
|
||||||
|
info: {
|
||||||
|
name: listInfo.specialname,
|
||||||
|
img: listInfo.imgurl && listInfo.imgurl.replace('{size}', 240),
|
||||||
|
// desc: body.result.info.list_desc,
|
||||||
|
author: listInfo.nickname,
|
||||||
|
// play_count: this.formatPlayCount(info.count),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async getUserListDetail5(chain) {
|
||||||
|
const [listInfo, list] = await Promise.all([
|
||||||
|
this.getListInfoByChain(chain),
|
||||||
|
this.getUserListDetailByPcChain(chain),
|
||||||
|
])
|
||||||
|
return {
|
||||||
|
list: list || [],
|
||||||
|
page: 1,
|
||||||
|
limit: this.listDetailLimit,
|
||||||
|
total: listInfo.songcount,
|
||||||
|
source: 'kg',
|
||||||
|
info: {
|
||||||
|
name: listInfo.specialname,
|
||||||
|
img: listInfo.imgurl && listInfo.imgurl.replace('{size}', 240),
|
||||||
|
// desc: body.result.info.list_desc,
|
||||||
|
author: listInfo.nickname,
|
||||||
|
// play_count: this.formatPlayCount(info.count),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async getUserListDetailById(id, page, limit) {
|
||||||
|
const signature = await handleSignature(id, page, limit)
|
||||||
|
let info = await this.createHttp(`https://pubsongscdn.kugou.com/v2/get_other_list_file?srcappid=2919&clientver=20000&appid=1058&type=0&module=playlist&page=${page}&pagesize=${limit}&specialid=${id}&signature=${signature}`, {
|
||||||
|
headers: {
|
||||||
|
Referer: 'https://m3ws.kugou.com/share/index.php',
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
|
||||||
|
dfid: '-',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// console.log(info)
|
||||||
|
let result = await Promise.all(this.createTask(info.info.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
|
||||||
|
// console.log(info, songInfo)
|
||||||
|
return this.filterData2(result)
|
||||||
|
},
|
||||||
|
|
||||||
async getUserListDetail(link, page, retryNum = 0) {
|
async getUserListDetail(link, page, retryNum = 0) {
|
||||||
if (retryNum > 3) return Promise.reject(new Error('link try max num'))
|
if (retryNum > 3) return Promise.reject(new Error('link try max num'))
|
||||||
if (link.includes('#')) link = link.replace(/#.*$/, '')
|
if (link.includes('#')) link = link.replace(/#.*$/, '')
|
||||||
|
2
src/utils/music/kg/vendors/infSign.min.js
vendored
Normal file
2
src/utils/music/kg/vendors/infSign.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user