[开发笔记]每周歌词播放器新版本

虽然2018我没有更新过每周歌词,但是其实我还记得这个系列啦!起因是我在翻log的时候发现似乎有人一直都有check每周歌词播放器,贼感动!然而播放器已经不能用了……所以我准备顺手把播放器后台重写一遍。

改进接口

原来的接口是石乐志写的,单php……不仅丑还杂乱不堪、缺少注释。于是我就全部改写了一遍,如何dalao们抓包的话大概就会发现接口转移到/api下了。而且参数校验等等也规范化了(没错就是Biliapi那个框架)。对外暴露的接口只有歌单(/api/songlist)和解析(/api/parse)。

解析接口大换血

看过上一篇开发笔记的dalao应该会知道,这个播放器是支持解析网易云和虾米音乐的。然而悲伤的是原先的解析接口崩了……于是我只能自己分析了。先是虾米的,在播放页面发现每次播放都会请求http://www.xiami.com/song/playlist/id/{SongId}/object_name/default/object_id/0/cat/json(注意要带上Referer:http://www.xiami.com/play?ids=/song/playlist/id/{SongId}/object_name/default/object_id/0)。分析返回的json,发现里面就有个location,不过url是通过一种神秘的编码方法处理过的。分析js,找到这么一个函数:

_getLocation: function(a) {
    if (-1 !== a.indexOf("http://"))
        return a;
    for (var b = Number(a.charAt(0)), c = a.substring(1), d = Math.floor(c.length / b), e = c.length % b, f = new Array, g = 0; e > g; g++)
        void 0 == f[g] && (f[g] = ""),
        f[g] = c.substr((d + 1) * g, d + 1);
    for (g = e; b > g; g++)
        f[g] = c.substr(d * (g - e) + (d + 1) * e, d);
    var h = "";
    for (g = 0; g < f[0].length; g++)
        for (var i = 0; i < f.length; i++)
            h += f[i].charAt(g);
    h = unescape(h);
    var j = "";
    for (g = 0; g < h.length; g++)
        j += "^" == h.charAt(g) ? "0" : h.charAt(g);
    return j = j.replace("+", " ")
}

于是这个算法就很容易分析出来了。我发的新年红包就包含了这个编码方法,所以这里就不详细讲了。好奇的dalao可以看这里。

P.S.其实我也搞了网易云的分析,然而服务器在香港……于是只能靠其他dalao的接口了。

解析方式变更

原来的播放器需要一年加载……原因其实是,请求歌单的时候会直接解析所有歌曲!我也不知道为什么我会设计成这样,反正我自己都看不下去。于是现在修正为播放歌曲前进行解析,这样一来就快了不少(而且缓存控制也方便了许多)。

还需改进

其实主要需要改进的都在前端……尤其是手机端的播放体验,不用说我也感觉很差。而且随机播放也很坑,甚至会出现连续2首的情况……嘛,以后我会更的23333

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片
  2. 没有图片
  3. 没有图片
  4. 没有图片
  5. 没有图片

评论

还没有评论。

在此评论中不能使用 HTML 标签。