syntax = "proto3";

package bilibili.app.viewunite.v1;

option java_multiple_files = true;

import "bilibili/app/archive/middleware/v1/preload.proto";
import "bilibili/app/viewunite/common.proto";
import "bilibili/pagination/pagination.proto";
import "google/protobuf/any.proto";

// 统一视频信息接口 (7.41.0+)
service View {
  //
  rpc ArcRefresh(ArcRefreshReq) returns (ArcRefreshReply);
  // 视频详情页下方推荐
  rpc RelatesFeed(RelatesFeedReq) returns (RelatesFeedReply);
  //
  rpc View(ViewReq) returns (ViewReply);
  //
  rpc ViewProgress(ViewProgressReq) returns (ViewProgressReply);
}

//
message ActivityResource {
  //
  string dark_text_color = 1;
  //
  string divider_color = 2;
  //
  string bg_color = 3;
  //
  string selected_bg_color = 4;
  //
  string text_color = 5;
  //
  string light_text_color = 6;
}

// 业务信息
message Arc {
  //
  int64 aid = 1;
  //
  int64 cid = 2;
  //
  int64 duration = 3;
  //
  bilibili.app.viewunite.common.Stat stat = 4;
  //
  string bvid = 5;
  //
  int32 copyright = 6;
  //
  Rights right = 7;
  //
  string cover = 8;
  //
  int64 type_id = 9;
  //
  string title = 10;
}

//
message ArcRefreshReply {
  //
  bilibili.app.viewunite.common.Stat stat = 1;
  //
  SimpleReqUser req_user = 2;
  //
  SimpleArc arc = 3;
  //
  Online online = 4;
  //
  LikeConfig like_config = 5;
}

//
message ArcRefreshReq {
  //
  int64 aid = 1;
  //
  string bvid = 2;
}

//
message AttentionCard {
  //
  repeated ShowTime show_time = 1;
}

//
message BizFollowVideoParam {
  //
  int64 season_id = 1;
}

//
message BizJumpLinkParam {
  //
  string url = 1;
}

//
message BizReserveActivityParam {
  //
  int64 activity_id = 1;
  //
  string from = 2;
  //
  string type = 3;
  //
  int64 oid = 4;
  //
  int64 reserve_id = 5;
}

//
message BizReserveGameParam {
  //
  int64 game_id = 1;
}

enum BizType {
  //
  BizTypeNone = 0;
  //
  BizTypeFollowVideo = 1;
  //
  BizTypeReserveActivity = 2;
  //
  BizTypeJumpLink = 3;
  //
  BizTypeFavSeason = 4;
  //
  BizTypeReserveGame = 5;
}

//
message Button {
  //
  string title = 1;
  //
  string uri = 2;
  //
  string icon = 3;
  //
  JumpShowType jump_show_type = 4;
}

//
message ChargingPlus {
  //
  bool pass = 1;
  //
  repeated PlayToast play_toast = 2;
}

//
message Chronos {
  //
  string md5 = 1;
  //
  string file = 2;
  //
  string sign = 3;
}

//
message ChronosParam {
  //
  string engine_version = 1;
  //
  string message_protocol = 2;
  //
  string service_key = 3;
}

// 推广信息
message CM {
  //
  google.protobuf.Any cm_under_player = 1;
  //
  google.protobuf.Any ads_control = 2;
  //
  repeated google.protobuf.Any source_content = 3;
}

//
message CommandDm {
  //
  int64 id = 1;
  //
  int64 oid = 2;
  //
  int64 mid = 3;
  //
  string command = 4;
  //
  string content = 5;
  //
  int32 progress = 6;
  //
  string ctime = 7;
  //
  string mtime = 8;
  //
  string extra = 9;
  //
  string idstr = 10;
}

// 播放器配置
message Config {
  //
  Online online = 1;
  //
  PlayerIcon player_icon = 2;
  //
  StoryEntrance story_entrance = 3;
}

// 视频播放时弹出的卡片
message ContractCard {
  // 在第几秒弹出
  float display_progress = 1;
  //
  int64 display_accuracy = 2;
  // 弹出后停留的时间
  int64 display_duration = 3;
  // 展示方式, 暂未知对应关系
  int32 show_mode = 4;
  // 页面类型, 暂未知对应关系
  int32 page_type = 5;
  //
  UpperInfos upper = 6;
  //
  int32 is_follow_display = 7;
  // 卡片的文字说明信息
  ContractText text = 8;
  //
  int64 follow_display_end_duration = 9;
  //
  int32 is_play_display = 10;
  //
  int32 is_interact_display = 11;
}

// 视频播放时弹出的卡片的文字说明信息
message ContractText {
  //
  string title = 1;
  //
  string subtitle = 2;
  //
  string inline_title = 3;
}

//
message Control {
  //
  bool limit = 1;
}

//
message DmResource {
  //
  repeated CommandDm command_dms = 1;
  //
  AttentionCard attention = 2;
  //
  repeated OperationCard cards = 3;
}

enum ECode {
  //
  CODE_DEFAULT = 0;
  //
  CODE_404 = 1;
  // 青少年限制
  CODE_TEENAGER = 78301;
}

//
message ECodeConfig {
  //
  string redirect_url = 1;
}

//
message IconData {
  //
  string meta_json = 1;
  //
  string sprits_img = 2;
}

// 视频介绍 Tab
message IntroductionTab {
  //
  string title = 1;
  //
  repeated bilibili.app.viewunite.common.Module modules = 2;
}

enum JumpShowType {
  //
  JST_DEFAULT = 0;
  //
  JST_FULLSCREEN = 1;
  //
  JST_HALFSCREEN = 2;
}

//
message LikeConfig {
  bilibili.app.viewunite.common.UpLikeImg triple_like = 1;
  //
  string like_animation = 2;
}

// 素材详情
message Material {
  //
  string icon = 1;
  //
  string text = 2;
  //
  string url = 3;
  //
  MaterialBizType type = 4;
  //
  string param = 5;
  //
  string static_icon = 6;
  //
  string bg_color = 7;
  //
  string bg_pic = 8;
  //
  int32 jump_type = 9;
  //
  PageType page_type = 10;
  //
  bool need_login = 11;
}

// 素材类型
enum MaterialBizType {
  //
  NONE = 0;
  //
  ACTIVITY = 1;
  //
  BGM = 2;
  //
  EFFECT = 3;
  //
  SHOOT_SAME = 4;
  //
  SHOOT_TOGETHER = 5;
  //
  ACTIVITY_ICON = 6;
  //
  NEW_BGM = 7;
}

// 素材来源
enum MaterialSource {
  //
  DEFAULT = 0;
  // 必剪素材
  BIJIAN = 1;
}

//
message Online {
  //
  bool online_show = 1;
}

//
message OperationCard {
  //
  int64 id = 1;
  //
  int32 from = 2;
  //
  int32 to = 3;
  //
  bool status = 4;
  //
  BizType biz_type = 5;
  //
  OperationCardContent content = 6;
  //
  oneof param {
    //
    BizFollowVideoParam follow = 7;
    //
    BizReserveActivityParam reserve = 8;
    //
    BizJumpLinkParam jump = 9;
    //
    BizReserveGameParam game = 10;
  }
}

//
message OperationCardContent {
  //
  string title = 1;
  //
  string subtitle = 2;
  //
  string icon = 3;
  //
  string button_title = 4;
  //
  string button_selected_title = 5;
  //
  bool show_selected = 6;
}

//
enum PageCategory {
  //
  COMMON_PAGE = 0;
  //
  ACTIVITY_PAGE = 1;
}

//
message PageControl {
  Control toast_show = 1;
  Control material_show = 2;
  Control up_show = 3;
}

// 页面类型
enum PageType {
  // H5页面(Webview)
  H5 = 0;
  // 原生页面(native)
  NA = 1;
}

//
message PlayerIcon {
  //
  string url1 = 1;
  //
  string hash1 = 2;
  //
  string url2 = 3;
  //
  string hash2 = 4;
  //
  string drag_left_png = 5;
  //
  string middle_png = 6;
  //
  string drag_right_png = 7;
  //
  IconData drag_data = 8;
  //
  IconData nodrag_data = 9;
}

//
message PlayToast {
  //
  PlayToastEnum business = 1;
  //
  string icon_url = 2;
  //
  string text = 3;
}

enum PlayToastEnum {
  //
  PLAYTOAST_UNKNOWN = 0;
  //
  PLAYTOAST_CHARGINGPLUS = 1;
}

//
message PointMaterial {
  //
  string url = 1;
  //
  MaterialSource material_source = 2;
}

//
message Relate {
  //
  int64 device_type = 1;
  //
  bilibili.pagination.Pagination pagination = 2;
}

// 视频详情页下方推荐 Reply
message RelatesFeedReply {
  //
  repeated bilibili.app.viewunite.common.RelateCard relates = 1;
  //
  bilibili.pagination.Pagination pagination = 2;
}

// 视频详情页下方推荐 Req
message RelatesFeedReq {
  //
  int64 aid = 1;
  //
  string bvid = 2;
  //
  string from = 3;
  //
  string spmid = 4;
  //
  string from_spmid = 5;
  //
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
  //
  bilibili.pagination.Pagination pagination = 7;
  //
  string session_id = 8;
  //
  int64 auto_play = 9;
  //
  string from_track_id = 10;
}

//
message ReplyStyle {
  //
  string badge_url = 1;
  //
  string badge_text = 2;
  //
  int64 badge_type = 3;
}

//
message ReplyTab {
  //
  ReplyStyle reply_style = 1;
  //
  string title = 2;
  //
  TabControl control = 3;
}

//
message ReqUser {
  //
  int32 favorite = 1;
  //
  int32 like = 2;
  //
  int32 coin = 3;
  //
  int32 fav_season = 4;
  //
  int32 follow = 5;
  //
  int32 dislike = 6;
  // 头像旁充电按钮
  Button elec_plus_btn = 7;
  //
  ChargingPlus charging_plus = 8;
}

//
message Rights {
  //
  bool only_vip_download = 1;
  //
  bool no_reprint = 2;
  //
  bool download = 3;
}

//
message ShowTime {
  //
  int32 start_time = 1;
  //
  int32 end_time = 2;
  //
  double pos_x = 3;
  //
  double pos_y = 4;
}

//
message SimpleArc {
  //
  int32 copyright = 1;
}

//
message SimpleReqUser {
  //
  int32 favorite = 1;
  //
  int32 like = 2;
  //
  int32 coin = 3;
}

//
message StoryEntrance {
  //
  bool arc_play_story = 1;
  //
  string story_icon = 2;
  //
  bool arc_landscape_story = 3;
  //
  string landscape_icon = 4;
  //
  bool play_story = 5;
}

//
message Tab {
  //
  repeated TabModule tab_module = 1;
  //
  string tab_bg = 2;
  //
  TabControl danmaku_entrance = 3;
}

// 评论区/弹幕 Tab 控制
message TabControl {
  //
  bool limit = 1;
  //
  bool disable = 2;
  //
  string disable_click_tip = 3;
}

//
message TabModule {
  //
  TabType tab_type = 1;
  //
  oneof tab {
    //
    IntroductionTab introduction = 2;
    //
    ReplyTab reply = 3;
    //
    bilibili.app.viewunite.common.ActivityTab activity_tab = 4;
  }
}

enum TabType {
  //
  TAB_NONE = 0;
  // 详情 Tab
  TAB_INTRODUCTION = 1;
  // 评论区 Tab
  TAB_REPLY = 2;
  // OGV 活动信息 Tab
  TAB_OGV_ACTIVITY = 3;
}

//
enum UnionType {
  //
  UGC = 0;
  //
  OGV = 1;
}

// UP主信息(可是Upper这个... 程序员英文不过关吧? )
message UpperInfos {
  // 粉丝数
  uint64 fans_count = 1;
  // 过去半年内的稿件数
  uint64 arc_count_last_half_year = 2;
  //
  int64 first_up_dates = 3;
  // UP稿件总播放数
  uint64 total_play_count = 4;
}

//
message VideoGuide {
  //
  repeated Material material = 1;
  //
  VideoViewPoint video_point = 2;
  //
  ContractCard contract_card = 3;
}

//
message VideoPoint {
  //
  int32 type = 1;
  //
  int64 from = 2;
  //
  int64 to = 3;
  //
  string content = 4;
  //
  string cover = 5;
  //
  string logo_url = 6;
}

//
message VideoShot {
  //
  string pv_data = 1;
  //
  int32 img_x_len = 2;
  //
  int32 imd_x_size = 3;
  //
  int32 img_y_len = 4;
  //
  int32 img_y_size = 5;
  //
  repeated string image = 6;
}

//
message VideoViewPoint {
  //
  repeated VideoPoint points = 1;
  //
  PointMaterial point_material = 2;
  //
  bool point_permanent = 3;
}

//
message ViewBase {
  //
  UnionType union_type = 1;
  //
  PageType page_type = 2;
  //
  PageControl control = 3;
  //
  ActivityResource activity_resource = 4;
  //
  Config config = 5;
}

//
message ViewProgressReply {
  //
  VideoGuide video_guide = 1;
  //
  Chronos chronos = 2;
  //
  VideoShot arc_shot = 3;
  //
  DmResource dm = 4;
}

//
message ViewProgressReq {
  //
  uint64 aid = 1;
  //
  uint64 cid = 2;
  //
  uint64 up_mid = 3;
  //
  ChronosParam  chronos_param = 4;
  //
  UnionType type = 5;
}

//
message ViewReply {
  //
  ViewBase view_base = 1;
  //
  Arc arc = 2;
  //
  ReqUser req_user = 3;
  //
  bilibili.app.viewunite.common.Owner owner = 4;
  //
  Tab tab = 5;
  //
  google.protobuf.Any supplement = 6;
  //
  CM cm = 7;
  //
  ECode ecode = 8;
  //
  ECodeConfig ecode_config = 9;
  //
  map<string, string> report = 10;
}

//
message ViewReq {
  //
  uint64 aid = 1;
  //
  string bvid = 2;
  //
  string from = 3;
  //
  string spmid = 4;
  //
  string from_spmid = 5;
  //
  string session_id = 6;
  //
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
  //
  string track_id = 8;
  //
  map<string, string> extra_content = 9;
  //
  string play_mode = 10;
  //
  Relate relate = 11;
  //
  string biz_extra = 12;
  //
  string ad_extra = 13;
}