# 问题描述

今天突然发现博客的音乐无法播放了,经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 调用出错了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片无法获取了。于是自己用获取的列表信息组装出正确的 url 问题基本解决。只针对网易播放列表,图片只能使用一张固定的。

# 解决方法

到 themes\shoka\source\js\_app 目录下打开 player.js 文件,在最底部的 return t; 之上加入如下代码。

// 自己修改 - start
// 检查 api.i-meto.com 接口是否正常
t.player.meto = true;
vendorJs('fancybox', function() {
	jQuery.ajax({
		url: 'https://api.i-meto.com/meting/api',
		type: 'get',
		async: true,
		timeout: 5000,
		complete : function(XMLHttpRequest, status){
			if (XMLHttpRequest.status != 200) {
				t.player.meto = false;
			}
		}
	});
}, window.jQuery); // 加载 jquery
// 自己修改 - end

然后找到 56 行用下面的代码替换即可。

fetch: function(source) {
      var list = []
      return new Promise(function(resolve, reject) {
        source.forEach(function(raw) {
          var meta = utils.parse(raw)
          if(meta[0]) {
            var skey = JSON.stringify(meta)
            var playlist = store.get(skey)
            if(playlist) {
			  // 自己修改 - start
			  var audioInfos = JSON.parse(playlist);
			  var neteaseStartUrl = "https://music.163.com/song/media/outer/url?id=";
			  // 如果 api.i-meto.com 接口不正常并且是网易音乐就自己构建 url
			  if (!t.player.meto && meta[0] == "netease" && audioInfos && audioInfos.length>0 && 
				!audioInfos[0].url.startsWith(neteaseStartUrl)) {
				  audioInfos.forEach(function(audioInfo) {
					  var id = audioInfo.url.substring(audioInfo.url.indexOf("id=")+3, audioInfo.url.indexOf("&auth="));
					  audioInfo.url = neteaseStartUrl + id;
					  audioInfo.pic = "https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200";
				  })
			  } else {
				  list.push.apply(list, audioInfos);
				  resolve(list);
			  }
			  // 自己修改 - end
            } else {
              fetch('https://api.i-meto.com/meting/api?server='+meta[0]+'&type='+meta[1]+'&id='+meta[2]+'&r='+ Math.random())
                .then(function(response) {
                  return response.json()
                }).then(function(json) {
                  store.set(skey, JSON.stringify(json))
                  list.push.apply(list, json);
                  resolve(list);
                }).catch(function(ex) {})
            }
          } else {
            list.push(raw);
            resolve(list);
          }
        })
      })
    }