Quantcast
Channel: Kaedei 的个人博客
Viewing all articles
Browse latest Browse all 103

弹弹play“远程访问”功能API

$
0
0

弹弹play“远程访问”功能能够让第三方app通过wifi连接到PC上的弹弹play播放器,并通过http restful api来控制播放器的播放,或是查看当前进度与弹幕等数据,甚至可以直接串流播放PC上的视频文件。

 

原理

弹弹play“远程访问”功能是在弹弹playfor Windows/UWP客户端)中搭建了一个小型的http web应用服务器,并将播放器内部相关的功能和数据以RESTful API接口的形式暴露在局域网中。也就是说,弹弹play播放器既是一个客户端(相对于弹弹play服务器而言),又是一个服务器端(相对于其他应用)。

 

网址与端口

默认情况下,弹弹play将会监听本机所有IP的80端口,用户可以修改此项设置。假设本机IP192.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密钥) 

  1. 在http header添加Authorization头,例如
    Authorization: Bearer abcde 
  2. 在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-maxtime值的单位为毫秒,例如传入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

返回值:当前所有下载任务的列表。各属性说明请见注释

[
{
"Id": "FECAEB5B4930D097FCFF1AB3F87477709B51EBF8", //下载任务ID,即BTHash
"Progress": 1.0, //下载进度,范围是0.0-1.0。可以通过此数字判断任务状态,小于1.0为未完成,大于等于1.0为已完成。
"Title": "[SHIGURE][Hand_Shakers][01][CHT][720p].mp4", //下载任务标题
"State": 1, //下载状态:0-已停止,1-已暂停(或正等待开始),2-正在下载,3-正在做种,4-正在计算Hash,5-正在停止,6-出错,7-正在获取元数据
"StateText": "Paused", //7.2版本开始新增:下载状态的字符串版,与State属性相同,
内容为对应的英文单词 WaitingForStart,Downloading,Paused,Seeding,Stopping,Stopped,Hashing,Metadata,Error
"TotalBytes": 293980585, //下载任务总共字节数
"DownloadedBytes": 293980585, //已下载的字节数
"DownloadSpeed": 0, //下载速度,单位是 Byte/s
"UploadSpeed": 0, //上传速度,单位是 Byte/s
"RemainTime": -1, //剩余时间,单位是秒。-1表示无法估算或任务已暂停
"SavePath": "C:\\Users\\kaedei\\Videos", //下载保存目录
"Ignore": "", //不下载(被忽略)文件的列表,使用相对路径,不同文件之间用“|”符号分割,例如 1.txt|example\2.txt|3.txt
"CreatedTime": "2017-01-12T12:47:58.1776363+08:00", //任务创建时间,使用系统时区信息
"EnableAcceleration": false, //7.2版本开始新增:用户允许此任务使用“会员加速下载”
"EnteredAcceleration": false //7.2版本开始新增:此任务是否已进入“会员加速下载”状态
},
{
"Id": "8F327C68B838C1E9CD970EA33AE76A01568AC86A",
"Progress": 1.0,
"Title": "[DMHY][NEW GAME!!][10][1280x720][x264_AAC][BIG5].mp4",
"State": 3,
"TotalBytes": 194369709,
"DownloadedBytes": 194369709,
"DownloadSpeed": 88849,
"UploadSpeed": 31,
"RemainTime": 0,
"SavePath": "C:\\Users\\kaedei\\Videos",
"Ignore": "",
"CreatedTime": "2017-09-13T11:01:28.2878438+08:00"
},
{
"Id": "CCF1F2DEFC3C305C5BBED17E990FB315ECD0C52A",
"Progress": 1.0,
"Title": "[DMG][Gabriel Dropout][01][720P][BIG5].mp4",
"State": 1,
"TotalBytes": 201785536,
"DownloadedBytes": 201785536,
"DownloadSpeed": 0,
"UploadSpeed": 0,
"RemainTime": -1,
"SavePath": "C:\\Users\\kaedei\\Videos",
"Ignore": "",
"CreatedTime": "2017-01-12T10:20:53.1765133+08:00"
}
]


14.获取某一下载任务的信息 /api/v1/download/tasks/{taskId}

参数:taskId:下载任务的ID,即bthash,为32位长度的大写字母字符串

返回值:各个属性同上方获取下载列表的返回值,只返回一个json对象

{
"Id""FECAEB5B4930D097FCFF1AB3F87477709B51EBF8"//下载任务ID,即BTHash
"Progress"1.0//下载进度,范围是0.0-1.0。可以通过此数字判断任务状态,小于1.0为未完成,大于等于1.0为已完成。
"Title""[SHIGURE][Hand_Shakers][01][CHT][720p].mp4"//下载任务标题
"State"1//下载状态:0-已停止,1-已暂停(或正等待开始),2-正在下载,3-正在做种,4-正在计算Hash,5-正在停止,6-出错,7-正在获取元数据
"StateText": "Paused", //7.2版本开始新增:下载状态的字符串版,与State属性相同,
内容为对应的英文单词 WaitingForStart,Downloading,Paused,Seeding,Stopping,Stopped,Hashing,Metadata,Error
"TotalBytes"293980585//下载任务总共字节数
"DownloadedBytes"293980585//已下载的字节数
"DownloadSpeed"0//下载速度,单位是 Byte/s
"UploadSpeed"0//上传速度,单位是 Byte/s
"RemainTime"-1//剩余时间,单位是秒。-1表示无法估算或任务已暂停
"SavePath""C:\\Users\\kaedei\\Videos"//下载保存目录
"Ignore"""//不下载(被忽略)文件的列表,使用相对路径,不同文件之间用“|”符号分割,例如 1.txt|example\2.txt|3.txt
"CreatedTime""2017-01-12T12:47:58.1776363+08:00", //任务创建时间,使用系统时区信息
"EnableAcceleration": false, //7.2版本开始新增:用户允许此任务使用“会员加速下载”
"EnteredAcceleration": false //7.2版本开始新增:此任务是否已进入“会员加速下载”状态
}


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

重新联网刷新媒体库中所有视频的关联信息。请求后将马上返回,刷新操作将在后台进行。




 

Viewing all articles
Browse latest Browse all 103

Trending Articles