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} <