fuo 协议 =============== **fuo 协议** 是 feeluown 播放器的控制协议,它主要是用来提升 feeluown 的可扩展性。 fuo 协议在设计时优先考虑以下几点: 1. 可读性好 2. 请求简单(使用 netcat 工具可以轻松发送请求) 3. 解析代码简单 feeluown 以默认参数启动时,会相应的启动一个 TCP 服务,监听 23333 端口, 我们可以使用 fuo 协议,通过该 TCP 服务来与播放器通信。比如: .. code::sh ~ > nc localhost 23333 OK feeluown 1.0.0 目前(3.0 版本),协议主要包含两个方面的内容: 1. 资源标识:比如 fuo://netease/songs/289530 标识了一首歌 2. 命令控制:播放、暂停、下一首、执行代码等控制命令 资源标识 ----------- feeluown 使用 :ref:`design-library` 来管理音乐提供方的资源,接入音乐库的资源都有一个特征, 这些资源都有一个唯一的资源标识符,我们称之为 **fuo uri** 。 对于大部分 fuo uri 来说,它们由几个部分组成:scheme, provider, type, identifier。 scheme 统一为 fuo。 .. code:: fuo://{res_provider}/{res_type}/{res_identifier} | | | 资源提供方 id 资源类型 资源id 举个例子: - ``fuo://local/songs/12`` 代表的资源就是 **本地** (资源提供方) 提供的 id 为 **12** 的 **歌曲** (资源类别)。 - ``fuo://netease/artists/46490`` 代表的资源时 **网易云音乐** 提供的 id 为 **46490** 的 **歌手** 资源提供方都是以插件的形式存在,目前已知的资源插件有 本地音乐(local)、qq 音乐(qqmusic)、 虾米音乐(xiami)、网易云音乐(netease),我们可以在 `这里 `_ 找到它们。 实现一个资源提供方也很简单,有兴趣的话,可以参考上面的例子。 目前支持的资源类型有: - 用户: ``fuo://{provider}/users/{identifier}`` - 歌曲: ``fuo://{provider}/songs/{identifier}`` - 歌手: ``fuo://{provider}/artists/{identifier}`` - 专辑: ``fuo://{provider}/album/{identifier}`` - 歌词: ``fuo://{provider}/songs/{identifier}/lyric`` 注:除了这类标识资源的 uri,我们以后可能会有其它格式的 uri。 带有简单描述的资源标识符 ''''''''''''''''''''''''''' 一个 uri 虽然可以标识一个资源,但是 uri 能够携带的信息往往不够,客户端拿到 uri 后, 肉眼识别不出来这是个什么东西,所以我们可以给 uri 附上一个简短描述,对于 **歌曲** 来说: .. code:: text {song uri}{ }# {title}-{artists_name}-{album_name}-{duration_ms} | | | 空格或者\t 分割符# 描述(所有字段均为可选,但必须按照顺序) 用户,歌手,专辑格式定义分别如下: .. code:: text {user uri} # {name} {artist uri} # {name} {album uri} # {album_name}-{artist_name} 注:之后可以考虑支持带有复杂描述的资源标识符,可能类似(待研究和讨论) .. code:: text fuo://{provider}/songs/{identifier} <