imsyy / home

个人主页,我的个人主页,个人主页源码,主页模板,homepage
https://www.imsyy.top
MIT License
3.41k stars 2.25k forks source link

[BUG]音乐歌单配置为QQ音乐时可以加载音乐列表,但是不能播放音乐。 #85

Closed AndaBrown closed 1 year ago

AndaBrown commented 1 year ago

如题。 图一:音乐列表成功加载。 图二:音乐无法播放,报错信息截图。 image image 根据api文档,访问 {api网址}/test 进行检验,QQ音乐歌单可以正常播放,应该不是api的问题。 希望能够尽快修复,谢谢!

imsyy commented 1 year ago

这个目前无法解决,因为qq音乐不对境外提供服务,你可以将该 api 部署到 国内服务器 上,就可以了

这个 api 目前境外解析qq音乐歌单用的是 jsonp 方式,并且采用了修改后的 MetingJs,但是由于目前 MetingJs 不支持 Vue,所以暂时无法实现

xizeyoupan commented 1 year ago

当然可以解决 src/components/Player/index.vue

// 初始化播放器
onMounted(() => {
  nextTick(() => {
    getPlayerList(props.songServer, props.songType, props.songId)
      .then((res) => new Promise(resolve => {

        if (res[0].url.startsWith('@')) {
          const [handle, jsonpCallback, jsonpCallbackFunction, url] = res[0].url.split('@').slice(1)

          fetchJsonp(url)
            .then(result => result.json())
            .then(result => {
              const domain =
                result.req_0.data.sip.find(i => !i.startsWith('http://ws')) ||
                result.req_0.data.sip[0]
              let _map = {}
              res.map(item => _map[item.songmid] = item)

              result.req_0.data.midurlinfo.map(info => {
                let purl = info.purl
                _map[info.songmid].url = (domain + purl).replace('http://', 'https://')
              })

              res = res.map(item => _map[item.songmid])
              resolve(res)
            })
        } else resolve(res)

      })).then(res => {
        // 生成歌单信息
        playIndex.value = Math.floor(Math.random() * res.length);
        ...

另外您 https://api-meting.imsyy.top/api 这个api似乎是fork我的main分支,好像不支持album,search之类的吧(因为还没实现...

imsyy commented 1 year ago

当然可以解决 src/components/Player/index.vue

// 初始化播放器
onMounted(() => {
  nextTick(() => {
    getPlayerList(props.songServer, props.songType, props.songId)
      .then((res) => new Promise(resolve => {

        if (res[0].url.startsWith('@')) {
          const [handle, jsonpCallback, jsonpCallbackFunction, url] = res[0].url.split('@').slice(1)

          fetchJsonp(url)
            .then(result => result.json())
            .then(result => {
              const domain =
                result.req_0.data.sip.find(i => !i.startsWith('http://ws')) ||
                result.req_0.data.sip[0]
              let _map = {}
              res.map(item => _map[item.songmid] = item)

              result.req_0.data.midurlinfo.map(info => {
                let purl = info.purl
                _map[info.songmid].url = (domain + purl).replace('http://', 'https://')
              })

              res = res.map(item => _map[item.songmid])
              resolve(res)
            })
        } else resolve(res)

      })).then(res => {
        // 生成歌单信息
        playIndex.value = Math.floor(Math.random() * res.length);
        ...

另外您 https://api-meting.imsyy.top/api 这个api似乎是fork我的main分支,好像不支持album,search之类的吧(因为还没实现...

感谢大佬,我去试试 😁