弹弹play“远程访问”功能能够让第三方app通过wifi连接到PC上的弹弹play播放器,并通过http restful api来控制播放器的播放,或是查看当前进度与弹幕等数据,甚至可以直接串流播放PC上的视频文件。
原理
弹弹play“远程访问”功能是在弹弹play(for Windows/UWP客户端)中搭建了一个小型的http web应用服务器,并将播放器内部相关的功能和数据以RESTful API接口的形式暴露在局域网中。也就是说,弹弹play播放器既是一个客户端(相对于弹弹play服务器而言),又是一个服务器端(相对于其他应用)。
网址与端口
默认情况下,弹弹play将会监听本机所有IP的80端口,用户可以修改此项设置。假设本机IP为 192.168.31.100,那么你的应用则可以通过 http://192.168.31.100:80 连接到弹弹play“远程访问”服务。
如果当前机器有公网IP并绑定了域名,也可以通过域名进行访问,例如 http://www.xxxxx.com:80
API说明
- 远程访问API为了方便使用与开发,所有接口都以 /api/v1 开头,而且都可以直接通过HTTP GET方法来访问到。
- 除了某些获取数据等类型的请求以外,客户端在发送请求后不需要判断返回码以及请求是否成功完成。
- 下面列表中,URL包含大括号的表示此处为参数,例如 {hash} 表示在访问这个API时需要将 {hash}替换为真正的参数值。
- 所有API都支持CORS。
API密钥验证
从9.0版开始,远程访问支持使用密钥对API进行加密。如果用户打开了这个设置,您的应用在访问时需要提供对应的密钥才可以正常返回数据,否则会返回http 401错误。通过验证的方式有两个,使用下列方法其中的一种即可:
(假设用户设置了 abcde 作为API密钥)
- 在http header添加Authorization头,例如
Authorization: Bearer abcde - 在url参数列表中增加token参数,例如
/api/v1/control/volume/99?token=abcde
/api/v1/download/tasks/1122-3344-5566/?remove=1&token=abcde
可以通过 /api/v1/welcome 返回的 tokenRequired 参数来判断当前用户是否开启了密钥验证。
API列表
1.获取欢迎信息: /api/v1/welcome 和 /welcome
无需API密钥即可调用。
返回值:
{"message":"Hello dandanplay user!","version":"6.5.0.1214","time":"12/14/2016 23:40:36","tokenRequired":false}
其中version代表弹弹play当前的版本号,可以通过此值判断某些api是否存在。
time为当前运行弹弹play播放器的本机时间。
tokenRequired表示当前是否开启了API验证,如果此项为true,请求时需要附加密钥,详情请见上方“API验证”一节。
2.控制播放器调整音量 /api/v1/control/volume/{volume}
参数:volume:整数,范围0-100
3.控制播放器跳转进度 /api/v1/control/seek/{time}
参数:time:整数,范围0-max。time值的单位为毫秒,例如传入12345代表将视频跳转到第12.345秒处
4.控制播放器当前的播放状态 /api/v1/control/{method}
参数:method:
以下取值之一,分别代表
播放、停止、暂停、下一个视频、上一个视频
- play
- stop
- pause
- next
- previous
5.获取当前正在播放的视频信息 /api/v1/current/video
返回值:
{"EpisodeId":"119410001","AnimeTitle":"期待在地下城邂逅有错吗OVA","EpisodeTitle":"第1话 Volume 1","Duration":1473000,"Position":0.335781753,"Seekable":true,"Volume":100}
EpisodeId为弹幕库编号,此值为字符串格式,并且可能为null;
AnimeTitle为主标题;
EpisodeTitle为子标题;
Duration为视频长度(毫秒),此数值可以用来配合跳转进度条api使用;
Position为当前进度,取值范围0-1;
Seekable为当前视频是否支持跳转进度,部分流媒体视频和直播视频不支持跳转;
Volume为当前播放器声音大小,取值范围0-100。
6.获取当前视频的弹幕列表 /api/v1/current/comment
返回值(始终为xml格式):
7.获取当前播放列表内容 /api/v1/playlist
返回值:
["C:\\Users\\kaedei\\Videos\\[KTXP]Dungeon ni Deai o Motomeru no wa Machigatteiru no Darou ka [OVA] [720p][GB].mp4","C:\\Users\\kaedei\\Videos\\[SumiSora][Tawawa_on_Monday][02][GB][720p].mp4"]
字符串数组,为视频在本机硬盘上的完整路径。
8.获取媒体库中的所有内容 /api/v1/library
返回值:
[{"AnimeId":12462,"EpisodeId":124620002,"AnimeTitle":"星期一的丰满","EpisodeTitle":"第2话 しっかり者のつもりだがスキの多い後輩","Hash":"A0012AF34130EC4FCC0CA7F79A306C31","Name":"[SumiSora][Tawawa_on_Monday][02][GB][720p].mp4","Path":"C:\\Users\\kaedei\\Videos\\[SumiSora][Tawawa_on_Monday][02][GB][720p].mp4","Size":38843483,"Rate":0,"Created":"2016-10-31T16:31:13","LastPlay":"2016-12-10T19:49:17","Duration":275},{"AnimeId":11941,"EpisodeId":119410001,"AnimeTitle":"期待在地下城邂逅有错吗OVA","EpisodeTitle":"第1话 Volume 1","Hash":"361BD640D7CC18993F1A6BC3BD8B7E73","Name":"[KTXP]Dungeon ni Deai o Motomeru no wa Machigatteiru no Darou ka [OVA] [720p][GB].mp4","Path":"C:\\Users\\kaedei\\Videos\\[KTXP]Dungeon ni Deai o Motomeru no wa Machigatteiru no Darou ka [OVA] [720p][GB].mp4","Size":313123890,"Rate":0,"Created":"2016-12-12T00:54:14","LastPlay":"2016-12-14T23:48:16.925167+08:00","Duration":1473}]
AnimeId为动画编号,属于相同动画的视频总有同样的编号;
EpisodeId为弹幕库编号;
AnimeTitle为主标题;
EpisodeTitle为子标题;
Hash为此视频的特征码(重要);
Name为此视频的文件名(去除路径信息);
Path为此视频在硬盘上的完整路径;
Size为文件体积,单位为Byte;
Rate为用户对此视频内容的打分,目前全部为0;
Created为弹弹play媒体库收录此视频的时间;
LastPlay为上次使用弹弹play播放此视频的时间;
Duration为视频时长,单位为秒;
9.获取视频缩略图 /api/v1/image/{hash}
参数:hash:视频特征码
返回值:jpeg格式的图片文件
10.控制播放器加载文件 /api/v1/load/{hash}
参数:hash:视频特征码
注:如果有多个相同hash的视频(例如一个视频保存在了多个地方),将随机加载其中一个。
11.获取指定视频的弹幕/api/v1/comment/{hash}
参数:hash:视频特征码
返回值(始终为xml格式):
注:与BiliBili的弹幕格式相同,不再详述。
注2:弹弹play会联网获取最新的弹幕,所以访问此api时可能很久才会返回弹幕
12.串流视频 /api/v1/stream/{hash}
参数:hash:视频特征码
返回:视频文件流,支持 range,可以直接在浏览器中播放。
v6.8.2版本开始新增的API
13.获取下载任务列表 /api/v1/download/tasks
返回值:当前所有下载任务的列表。各属性说明请见注释
14.获取某一下载任务的信息 /api/v1/download/tasks/{taskId}
参数:taskId:下载任务的ID,即bthash,为32位长度的大写字母字符串
返回值:各个属性同上方获取下载列表的返回值,只返回一个json对象
15.添加下载任务 /api/v1/download/tasks/add?magnet={magnet}
参数:magnet:需要添加下载的磁力链接,此参数需要先进行Url编码然后放到参数中。磁力链接必须含有 urn:btih= 段
返回值:如果任务创建成功,则返回此新建任务的信息,格式同获取某任务信息的API相同。
如果任务ID已存在,则会在更新当前下载任务之后返回此任务的信息。
如果创建任务失败,将会返回null。
16.控制下载任务 /api/v1/download/tasks/{taskId}/{method}?remove={remove}
参数:
- taskId:下载任务ID
- method:需要进行的操作。start 开始, pause 暂停, delete 删除任务
- remove:删除任务时是否删除对应的视频文件,1 删除文件,0 不删除保留文件。仅在method=delete时remove参数才会有效。
返回值:返回此任务的信息,返回格式同 14.获取某一下载任务的信息 相同。
v9.0.1版本开始新增的API
17.扫描媒体库文件夹中的文件改动 /api/v1/library/scan
扫描媒体库中所有文件的文件改动+为新视频生成缩略图+为新视频关联弹幕库。请求后将马上返回,刷新操作将在后台进行。
18.更新媒体库所有视频的关联信息 /api/v1/library/refreshmatch
重新联网刷新媒体库中所有视频的关联信息。请求后将马上返回,刷新操作将在后台进行。
