syntax = "proto3";

package bilibili.pgc.gateway.player.v1;

option java_multiple_files = true;

import "bilibili/app/playurl/v1/playurl.proto";

// 播放地址
service PlayURL {
  // 播放页信息
  rpc PlayView (PlayViewReq) returns (PlayViewReply);
  // 获取投屏地址
  rpc Project (ProjectReq) returns (ProjectReply);
  // 直播播放页信息
  rpc LivePlayView (LivePlayViewReq) returns (LivePlayViewReply);
}

// 其他业务信息
message BusinessInfo {
  // 当前视频是否是预览
  bool is_preview = 1;
  // 用户是否承包过
  bool bp = 2;
  // drm使用
  string marlin_token = 3;
}

// 事件
message Event {
  // 震动
  Shake shake = 1;
}

// 播放信息
message LivePlayInfo {
  //
  int32 current_qn = 1;
  //
  repeated QualityDescription quality_description = 2;
  //
  repeated ResponseDataUrl durl = 3;
}

// 直播播放页信息-响应
message LivePlayViewReply {
  // 房间信息
  RoomInfo room_info = 1;
  // 播放信息
  LivePlayInfo play_info = 2;
}

// 直播播放页信息-请求
message LivePlayViewReq {
  // 剧集epid
  int64 ep_id = 1;
  // 清晰度
  // 0,10000:原画 400:蓝光 250:超清 150:高清 80:流畅
  uint32 quality = 2;
  // 类型
  // 0:音频 2:hevc 4:dash 8:p2p, 16:蒙版
  uint32 ptype = 3;
  // 是否请求https
  bool https = 4;
  // 0:默认直播间播放 1:投屏播放
  uint32 play_type = 5;
  // 投屏设备
  // 0:默认其他 1:OTT设备
  int32 device_type = 6;
}

// 禁用功能配置
message PlayAbilityConf {
  bool background_play_disable = 1;   // 后台播放
  bool flip_disable = 2;              // 镜像反转
  bool cast_disable = 3;              // 投屏
  bool feedback_disable = 4;          // 反馈
  bool subtitle_disable = 5;          // 字幕
  bool playback_rate_disable = 6;     // 播放速度
  bool time_up_disable = 7;           // 定时停止
  bool playback_mode_disable = 8;     // 播放方式
  bool scale_mode_disable = 9;        // 画面尺寸
  bool like_disable = 10;             // 赞
  bool dislike_disable = 11;          // 踩
  bool coin_disable = 12;             // 投币
  bool elec_disable = 13;             // 充电
  bool share_disable = 14;            // 分享
  bool screen_shot_disable = 15;      // 截图
  bool lock_screen_disable = 16;      // 锁定
  bool recommend_disable = 17;        // 相关推荐
  bool playback_speed_disable = 18;   // 播放速度
  bool definition_disable = 19;       // 清晰度
  bool selections_disable = 20;       // 选集
  bool next_disable = 21;             // 下一集
  bool edit_dm_disable = 22;          // 编辑弹幕
  bool small_window_disable = 23;     // 小窗
  bool shake_disable = 24;            // 震动
  bool outer_dm_disable = 25;         // 外层面板弹幕设置
  bool inner_dm_disable = 26;         // 三点内弹幕设置
  bool freya_enter_disable = 27;      // 一起看入口
  bool dolby_disable = 28;            // 杜比音效
  bool freya_full_disable = 29;       // 全屏一起看入口
  bool skip_oped_switch_disable = 30; //
}

//  播放页信息-响应
message PlayViewReply {
  // 视频流信息
  bilibili.app.playurl.v1.VideoInfo video_info = 1;
  // 播放控件用户自定义配置
  PlayAbilityConf play_conf = 2;
  // 业务需要的其他信息
  BusinessInfo business = 3;
  // 事件
  Event event = 4;
}

// 播放页信息-请求
message PlayViewReq {
  // 剧集epid
  int64 epid = 1;
  // 视频cid
  int64 cid = 2;
  // 清晰度
  int64 qn = 3;
  // 视频流版本
  int32 fnver = 4;
  // 视频流格式
  int32 fnval = 5;
  // 下载模式
  // 0:播放 1:flv下载 2:dash下载
  uint32 download = 6;
  // 流url强制是用域名
  // 0:允许使用ip 1:使用http 2:使用https
  int32 force_host = 7;
  // 是否4K
  bool fourk = 8;
  // 当前页spm
  string spmid = 9;
  // 上一页spm
  string from_spmid = 10;
  // 青少年模式
  int32 teenagers_mode = 11;
  // 视频编码
  bilibili.app.playurl.v1.CodeType prefer_codec_type = 12;
  // 是否强制请求预览视频
  bool is_preview = 13;
  // 一起看房间id
  int64 room_id = 14;
}

// 投屏地址-响应
message ProjectReply {
  bilibili.app.playurl.v1.PlayURLReply project = 1;
}

// 投屏地址-请求
message ProjectReq {
  // 剧集epid
  int64 ep_id = 1;
  // 视频cid
  int64 cid = 2;
  // 清晰度
  int64 qn = 3;
  // 视频流版本
  int32 fnver = 4;
  // 视频流格式
  int32 fnval = 5;
  // 下载模式
  // 0:播放 1:flv下载 2:dash下载
  uint32 download = 6;
  // 流url强制是用域名
  // 0:允许使用ip 1:使用http 2:使用https
  int32 forceHost = 7;
  // 是否4K
  bool fourk = 8;
  // 当前页spm
  string spmid = 9;
  // 上一页spm
  string fromSpmid = 10;
  // 使用协议
  // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
  int32 protocol = 11;
  // 投屏设备
  // 0:默认其他 1:OTT设备
  int32 device_type = 12;
  //
  bool use_new_project_code = 13;
}

//
message QualityDescription {
  //
  int32 qn = 1;
  //
  string desc = 2;
}

//
message ResponseDataUrl {
  string url = 1;
  // 表示stream类型,按位表示
  // Value|  1   |  1  |  1   |  1   |     1
  // --------------------------------------------
  // desc | mask | p2p | dash | hevc | only-audio
  uint32 stream_type = 2;
  // 表示支持p2p的cdn厂商,按位表示
  // 值   | 1  |  1  |  1  | 1  |  1  | 1  | 1  | 1
  // -----------------------------------------------
  // CDN	| hw | bdy | bsy | ws | txy | qn | js | bvc
  uint32 ptag = 3;
}

// 房间信息
message RoomInfo {
  // 房间长号
  int64 room_id = 1;
  // 主播mid
  int64 uid = 2;
  // 状态相关
  RoomStatusInfo status = 3;
  // 展示相关
  RoomShowInfo show = 4;
}

// 房间信息-展示相关
message RoomShowInfo {
  // 短号
  int64 short_id = 1;
  // 人气值
  int64 popularity_count = 8;
  // 最近一次开播时间戳
  int64 live_start_time = 10;
}

// 房间信息-状态相关
message RoomStatusInfo {
  // 直播间状态
  // 0:未开播 1:直播中 2:轮播中
  int64 live_status = 1;
  // 横竖屏方向
  // 0:横屏 1:竖屏
  int64 live_screen_type = 2;
  // 是否开播过标识
  int64 live_mark = 3;
  // 封禁状态
  // 0:未封禁 1:审核封禁 2:全网封禁
  int64 lock_status = 4;
  // 封禁时间戳
  int64 lock_time = 5;
  // 隐藏状态
  // 0:不隐藏 1:隐藏
  int64 hidden_status = 6;
  // 隐藏时间戳
  int64 hidden_time = 7;
  // 直播类型
  // 0:默认 1:摄像头直播 2;录屏直播 3:语音直播
  int64 live_type = 8;
  //
  int64 room_shield = 9;
}

// 震动
message Shake {
  // 文件地址
  string file = 1;
}
