syntax = "proto3";

package bilibili.app.playurl.v1;

option java_multiple_files = true;

// 视频url
service PlayURL {
  // 视频地址
  rpc PlayURL (PlayURLReq) returns (PlayURLReply);
  // 投屏地址
  rpc Project (ProjectReq) returns (ProjectReply);
  // 播放页信息
  rpc PlayView (PlayViewReq) returns (PlayViewReply);
  // 编辑播放界面配置
  rpc PlayConfEdit (PlayConfEditReq) returns (PlayConfEditReply);
  // 获取播放界面配置
  rpc PlayConf (PlayConfReq) returns (PlayConfReply);
}

//
message AB {
  //
  Glance glance = 1;
  //
  int32 group = 2;
}

// 配置项
message ArcConf {
  // 是否支持
  bool is_support = 1;
  //
  bool disabled = 2;
  //
  ExtraContent extra_content = 3;
}

// 业务类型
enum Business {
  UNKNOWN = 0; // 未知类型
  STORY = 1; // story业务
}

// Chronos灰度管理
message Chronos {
  // 资源md5
  string md5 = 1;
  // 资源文件
  string file = 2;
}

//
message ButtonStyle {
  //
  string text = 1;
  //
  string text_color = 2;
  //
  string bg_color = 3;
  //
  string jump_link = 4;
}

//
message CloudConf {
  // 是否展示功能
  bool show = 1;
  // 设置类型
  ConfType conf_type = 2;
  //
  FieldValue field_value = 3;
  //
  ConfValue conf_value = 4;
}

// 编码类型
enum CodeType {
  NOCODE = 0; // 默认
  CODE264 = 1; // H.264
  CODE265 = 2; // H.265
  CODEAV1 = 3; // av1
}

// 设置类型
enum ConfType {
  NoType = 0; //
  FLIPCONF = 1; // 镜像反转
  CASTCONF = 2; // 视频投屏
  FEEDBACK = 3; // 反馈
  SUBTITLE = 4; // 字幕
  PLAYBACKRATE = 5; // 播放速度
  TIMEUP = 6; // 定时停止播放
  PLAYBACKMODE = 7; // 播放方式
  SCALEMODE = 8; // 画面尺寸
  BACKGROUNDPLAY = 9; // 后台播放
  LIKE = 10; // 顶
  DISLIKE = 11; // 踩
  COIN = 12; // 投币
  ELEC = 13; // 充电
  SHARE = 14; // 分享
  SCREENSHOT = 15; // 截图
  LOCKSCREEN = 16; // 锁屏
  RECOMMEND = 17; // 推荐
  PLAYBACKSPEED = 18; // 倍速
  DEFINITION = 19; // 清晰度
  SELECTIONS = 20; // 选集
  NEXT = 21; // 下一集
  EDITDM = 22; // 编辑弹幕
  SMALLWINDOW = 23; // 小窗
  SHAKE = 24; // 播放震动
  OUTERDM = 25; // 外层面板弹幕设置
  INNERDM = 26; // 三点内弹幕设置
  PANORAMA = 27; // 全景
  DOLBY = 28; // 杜比
  COLORFILTER = 29; // 颜色滤镜
}

//
message ConfValue {
  oneof value {
    //
    bool switch_val = 1;
    //
    int64 selected_val = 2;
  }
}

// dash条目
message DashItem {
  // 清晰度
  uint32 id = 1;
  // 主线流
  string baseUrl = 2;
  // 备用流
  repeated string backup_url = 3;
  // 带宽
  uint32 bandwidth = 4;
  // 编码id
  uint32 codecid = 5;
  // md5
  string md5 = 6;
  // 大小
  uint64 size = 7;
  // 帧率
  string frame_rate = 8;
  //
  string widevine_pssh = 9;
}

// dash视频流
message DashVideo {
  // 主线流
  string base_url = 1;
  // 备用流
  repeated string backup_url = 2;
  // 带宽
  uint32 bandwidth = 3;
  // 编码id
  uint32 codecid = 4;
  // md5
  string md5 = 5;
  // 大小
  uint64 size = 6;
  // 伴音质量id
  uint32 audioId = 7;
  // 是否非全二压
  bool no_rexcode = 8;
  // 码率
  string frame_rate = 9;
  // 宽度
  int32 width = 10;
  // 高度
  int32 height = 11;
  //
  string widevine_pssh = 12;
}

// 杜比伴音信息
message DolbyItem {
  enum Type {
    NONE = 0; // NONE
    COMMON = 1; // 普通杜比音效
    ATMOS = 2; // 全景杜比音效
  }
  // 杜比类型
  Type type = 1;
  // 音频流
  DashItem audio = 2;
}

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

//
message ExtraContent {
  //
  string disabled_reason = 1;
  //
  int64 disabled_code = 2;
}

// 配置字段值
message FieldValue {
  oneof value {
    // 开关
    bool switch = 1;
  }
}

// 清晰度描述
message FormatDescription {
  // 清晰度
  int32 quality = 1;
  // 清晰度格式
  string format = 2;
  // 清晰度描述
  string description = 3;
  // 新描述
  string new_description = 4;
  // 选中态的清晰度描述
  string display_desc = 5;
  // 选中态的清晰度描述的角标
  string superscript = 6;
}

//
message Glance {
  //
  bool can_watch = 1;
  //
  int64 times = 2;
  //
  int64 duration = 3;
}

//
enum Group {
  UnknownGroup = 0; //
  A = 1; //
  B = 2; //
  C = 3; //
}

// 禁用功能配置
message PlayAbilityConf {
  CloudConf background_play_conf = 1;  // 后台播放
  CloudConf flip_conf = 2;  // 镜像反转
  CloudConf cast_conf = 3;  // 投屏
  CloudConf feedback_conf = 4;  // 反馈
  CloudConf subtitle_conf = 5;  // 字幕
  CloudConf playback_rate_conf = 6;  // 播放速度
  CloudConf time_up_conf = 7;  // 定时停止
  CloudConf playback_mode_conf = 8;  // 播放方式
  CloudConf scale_mode_conf = 9;  // 画面尺寸
  CloudConf like_conf = 10; // 赞
  CloudConf dislike_conf = 11; // 踩
  CloudConf coin_conf = 12; // 投币
  CloudConf elec_conf = 13; // 充电
  CloudConf share_conf = 14; // 分享
  CloudConf screen_shot_conf = 15; // 截图
  CloudConf lock_screen_conf = 16; // 锁定
  CloudConf recommend_conf = 17; // 相关推荐
  CloudConf playback_speed_conf = 18; // 播放速度
  CloudConf definition_conf = 19; // 清晰度
  CloudConf selections_conf = 20; // 选集
  CloudConf next_conf = 21; // 下一集
  CloudConf edit_dm_conf = 22; // 编辑弹幕
  CloudConf small_window_conf = 23; // 小窗
  CloudConf shake_conf = 24; // 震动
  CloudConf outer_dm_conf = 25; // 外层面板弹幕设置
  CloudConf innerDmDisable = 26; // 三点内弹幕设置
  CloudConf inner_dm_conf = 27; // 一起看入口
  CloudConf dolby_conf = 28; // 杜比音效
  CloudConf color_filter_conf = 29; // 颜色滤镜
}

// 播放控件稿件配置
message PlayArcConf {
  ArcConf background_play_conf = 1;  // 后台播放
  ArcConf flip_conf = 2;  // 镜像反转
  ArcConf cast_conf = 3;  // 投屏
  ArcConf feedback_conf = 4;  // 反馈
  ArcConf subtitle_conf = 5;  // 字幕
  ArcConf playback_rate_conf = 6;  // 播放速度
  ArcConf time_up_conf = 7;  // 定时停止
  ArcConf playback_mode_conf = 8;  // 播放方式
  ArcConf scale_mode_conf = 9;  // 画面尺寸
  ArcConf like_conf = 10; // 赞
  ArcConf dislike_conf = 11; // 踩
  ArcConf coin_conf = 12; // 投币
  ArcConf elec_conf = 13; // 充电
  ArcConf share_conf = 14; // 分享
  ArcConf screen_shot_conf = 15; // 截图
  ArcConf lock_screen_conf = 16; // 锁定
  ArcConf recommend_conf = 17; // 相关推荐
  ArcConf playback_speed_conf = 18; // 播放速度
  ArcConf definition_conf = 19; // 清晰度
  ArcConf selections_conf = 20; // 选集
  ArcConf next_conf = 21; // 下一集
  ArcConf edit_dm_conf = 22; // 编辑弹幕
  ArcConf small_window_conf = 23; // 小窗
  ArcConf shake_conf = 24; // 震动
  ArcConf outer_dm_conf = 25; // 外层面板弹幕设置
  ArcConf inner_dm_conf = 26; // 三点内弹幕设置
  ArcConf panorama_conf = 27; // 一起看入口
  ArcConf dolby_conf = 28; // 杜比音效
  ArcConf screen_recording_conf = 29; // 屏幕录制
  ArcConf color_filter_conf = 30; // 颜色滤镜
}

// 编辑播放界面配置-响应
message PlayConfEditReply {

}

// 编辑播放界面配置-请求
message PlayConfEditReq {
  // 播放界面配置
  repeated PlayConfState play_conf = 1;
}

// 获取播放界面配置-响应
message PlayConfReply {
  //播放控件用户自定义配置
  PlayAbilityConf play_conf = 1;
}

// 获取播放界面配置-请求
message PlayConfReq {

}

// 播放界面配置
message PlayConfState {
  // 设置类型
  ConfType conf_type = 1;
  // 是否隐藏
  bool show = 2;
  // 配置字段值
  FieldValue field_value = 3;
  //
  ConfValue conf_value = 4;
}

// 错误码
enum PlayErr {
  NoErr = 0; //
  WithMultiDeviceLoginErr = 1; // 管控类型的错误码
}

//
message PlayLimit {
  //
  PlayLimitCode code = 1;
  //
  string message = 2;
  //
  string sub_message = 3;
  //
  ButtonStyle button = 4;
}

//
enum PlayLimitCode {
  PLCUnkown = 0; //
  PLCUgcNotPayed = 1; //
}

// 视频地址-回复
message PlayURLReply {
  // 清晰的
  uint32 quality = 1;
  // 格式
  string format = 2;
  // 总时长(单位为ms)
  uint64 timelength = 3;
  // 编码id
  uint32 video_codecid = 4;
  // 视频流版本
  uint32 fnver = 5;
  // 视频流格式
  uint32 fnval = 6;
  // 是否支持投影
  bool video_project = 7;
  // 分段视频流列表
  repeated ResponseUrl durl = 8;
  // dash数据
  ResponseDash dash = 9;
  // 是否非全二压
  int32 no_rexcode = 10;
  // 互动视频升级提示
  UpgradeLimit upgrade_limit = 11;
  // 清晰度描述列表
  repeated FormatDescription support_formats = 12;
  // 视频格式
  VideoType type = 13;
}

// 视频地址-请求
message PlayURLReq {
  // 稿件avid
  int64 aid = 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;
}

// 播放页信息-回复
message PlayViewReply {
  // 视频流信息
  VideoInfo video_info = 1;
  // 播放控件用户自定义配置
  PlayAbilityConf play_conf = 2;
  // 互动视频升级提示
  UpgradeLimit upgrade_limit = 3;
  // Chronos灰度管理
  Chronos chronos = 4;
  // 播放控件稿件配置
  PlayArcConf play_arc = 5;
  // 事件
  Event event = 6;
  //
  AB ab = 7;
  //
  PlayLimit play_limit = 8;
}

// 播放页信息-请求
message PlayViewReq {
  // 稿件avid
  int64 aid = 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;
  // 编码
  CodeType prefer_codec_type = 12;
  // 业务类型
  Business business = 13;
  //
  int64 voice_balance = 14;
}

// 投屏地址-响应
message ProjectReply {
  PlayURLReply project = 1;
}

// 投屏地址-请求
message ProjectReq {
  // 稿件avid
  int64 aid = 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;
  // 使用协议
  // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
  int32 protocol = 11;
  // 投屏设备
  // 0:默认其他 1:OTT设备
  int32 device_type = 12;
}

// dash数据
message ResponseDash {
  // dash视频流
  repeated DashItem video = 1;
  // dash伴音流
  repeated DashItem audio = 2;
}

// 分段流条目
message ResponseUrl {
  // 分段序号
  uint32 order = 1;
  // 分段时长
  uint64 length = 2;
  // 分段大小
  uint64 size = 3;
  // 主线流
  string url = 4;
  // 备用流
  repeated string backup_url = 5;
  // md5
  string md5 = 6;
}

//分段视频流
message SegmentVideo {
  //分段视频流列表
  repeated ResponseUrl segment = 1;
}

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

// 视频流信息
message Stream {
  // 元数据
  StreamInfo stream_info = 1;
  // 流数据
  oneof content {
    // dash流
    DashVideo dash_video = 2;
    // 分段流
    SegmentVideo segment_video = 3;
  }
}

// 流媒体元数据
message StreamInfo {
  // 清晰度
  uint32 quality = 1;
  // 格式
  string format = 2;
  // 格式描述
  string description = 3;
  // 错误码
  PlayErr err_code = 4;
  // 不满足条件信息
  StreamLimit limit = 5;
  // 是否需要vip
  bool need_vip = 6;
  // 是否需要登录
  bool need_login = 7;
  // 是否完整
  bool intact = 8;
  // 是否非全二压
  bool no_rexcode = 9;
  // 清晰度属性位
  int64 attribute = 10;
  // 新版格式描述
  string new_description = 11;
  // 格式文字
  string display_desc = 12;
  // 新版格式描述备注
  string superscript = 13;
}

// 清晰度不满足条件信息
message StreamLimit {
  // 标题
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 提示信息
  string msg = 3;
}

// 互动视频升级按钮信息
message UpgradeButton {
  // 标题
  string title = 1;
  // 链接
  string link = 2;
}

// 互动视频升级提示
message UpgradeLimit {
  // 错误码
  int32 code = 1;
  // 错误信息
  string message = 2;
  // 图片url
  string image = 3;
  // 按钮信息
  UpgradeButton button = 4;
}

// 视频url信息
message VideoInfo {
  // 视频清晰度
  uint32 quality = 1;
  // 视频格式
  string format = 2;
  // 视频时长
  uint64 timelength = 3;
  // 视频编码id
  uint32 video_codecid = 4;
  // 视频流
  repeated Stream stream_list = 5;
  // 伴音流
  repeated DashItem dash_audio = 6;
  // 杜比伴音流
  DolbyItem dolby = 7;
  //
  VolumeInfo volume = 8;
}

// 视频类型
enum VideoType {
  Unknown_VALUE = 0; //
  FLV_VALUE = 1; // flv格式
  DASH_VALUE = 2; // dash格式
  MP4_VALUE = 3; // mp4格式
}

//
message VolumeInfo {
  //
  double measured_i = 1;
  //
  double measured_lra = 2;
  //
  double measured_tp = 3;
  //
  double measured_threshold = 4;
  //
  double target_offset = 5;
  //
  double target_i = 6;
  //
  double target_tp = 7;
}