syntax = "proto3";

package bilibili.app.dynamic.v1;

option java_multiple_files = true;

import "bilibili/app/archive/middleware/v1/preload.proto";

// v1动态
service Dynamic {
  // 动态视频页
  rpc DynVideo (DynVideoReq) returns (DynVideoReqReply);
  // 批量动态id获取动态详情
  rpc DynDetails (DynDetailsReq) returns (DynDetailsReply);
  // 小视频连播页
  rpc SVideo (SVideoReq) returns (SVideoReply);
  // 动态tab页
  rpc DynTab (DynTabReq) returns (DynTabReply);
  // 同城接口开关
  rpc DynOurCitySwitch (DynOurCitySwitchReq) returns (NoReply);
  // 动态同城页
  rpc DynOurCity(DynOurCityReq) returns (DynOurCityReply);
  // 最近访问-个人视频feed流
  rpc DynVideoPersonal(DynVideoPersonalReq) returns (DynVideoPersonalReply);
  // 最近访问-标记已读
  rpc DynUpdOffset(DynUpdOffsetReq) returns (NoReply);
  // 动态红点接口
  rpc DynRed(DynRedReq) returns(DynRedReply);
  // 查看更多-列表
  rpc DynMixUpListViewMore(NoReq) returns (DynMixUpListViewMoreReply);
  // 查看更多-搜索
  rpc DynMixUpListSearch(DynMixUpListSearchReq) returns (DynMixUpListSearchReply);
  // 同城点击上报
  rpc OurCityClickReport(OurCityClickReportReq) returns (OurCityClickReportReply);
  // 位置定位
  rpc GeoCoder(GeoCoderReq) returns (GeoCoderReply);
}

// 地址部件
message AddressComponent {
  // 国家
  string nation = 1;
  // 省
  string province = 2;
  // 市
  string city = 3;
  // 区，可能为空字串
  string district = 4;
  // 街道，可能为空字串
  string street = 5;
  // 门牌，可能为空字串
  string street_number = 6;
}

// 行政区划信息
message AdInfo {
  // 国家代码(ISO3166标准3位数字码)
  string nation_code = 1;
  // 行政区划代码，规则详见：行政区划代码说明
  string adcode = 2;
  // 城市代码，由国家码+行政区划代码(提出城市级别)组合而来，总共为9位
  string city_code = 3;
  // 行政区划名称
  string name = 4;
  // 行政区划中心点坐标
  Gps gps = 5;
}

//
enum BgType {
  bg_type_default = 0; //
  bg_type_face = 1; //
}

// 付费课程批次卡
message CardCurrBatch {
  // 标题
  string title = 1;
  // 封面图
  string cover = 2;
  // 跳转地址
  string uri = 3;
  // 展示项 1(本集标题)
  string text_1 = 4;
  // 展示项 2(更新了多少个视频)
  string text_2 = 5;
  // 角标
  VideoBadge badge = 6;
}

// 付费课程系列卡
message CardCurrSeason {
  // 标题
  string title = 1;
  // 封面图
  string cover = 2;
  // 跳转地址
  string uri = 3;
  // 展示项 1(更新信息)
  string text_1 = 4;
  // 描述信息
  string desc = 5;
  // 角标
  VideoBadge badge = 6;
}

// PGC视频卡片数据
message CardPGC {
  // 标题
  string title = 1;
  // 封面图
  string cover = 2;
  // 秒开地址
  string uri = 3;
  // 视频封面展示项 1
  string cover_left_text_1 = 4;
  // 视频封面展示项 2
  string cover_left_text_2 = 5;
  // 封面视频展示项 3
  string cover_left_text_3 = 6;
  // cid
  int64 cid = 7;
  // season_id
  int64 season_id = 8;
  // epid
  int64 epid = 9;
  // aid
  int64 aid = 10;
  // 视频源类型
  MediaType media_type = 11;
  // 番剧类型
  VideoSubType sub_type = 12;
  // 番剧是否为预览视频 0:否，1:是
  int32 is_preview = 13;
  // 尺寸信息
  Dimension dimension = 14;
  // 角标
  repeated VideoBadge badge = 15;
  // 是否能够自动播放
  int32  can_play = 16;
  // PGC单季信息
  PGCSeason season = 17;
}

// UGC视频卡片数据
message CardUGC {
  // 标题
  string title = 1;
  // 封面图
  string cover = 2;
  // 秒开地址
  string uri = 3;
  // 视频封面展示项 1
  string cover_left_text_1 = 4;
  // 视频封面展示项 2
  string cover_left_text_2 = 5;
  // 封面视频展示项 3
  string cover_left_text_3 = 6;
  // avid
  int64 avid = 7;
  // cid
  int64 cid = 8;
  // 视频源类型
  MediaType media_type = 9;
  // 尺寸信息
  Dimension dimension = 10;
  // 角标
  repeated VideoBadge badge = 11;
  // 是否能够自动播放
  int32  can_play = 12;
}

//
enum CornerType {
  corner_type_none = 0;  //
  corner_type_text = 1;  //
  corner_type_animation = 2;  //
}

// 粉丝样式
message DecoCardFan {
  // 是否是粉丝
  int32 is_fan = 1;
  // 数量
  int32 number = 2;
  // 颜色
  string color = 3;
}

// 装扮卡片
message DecorateCard {
  // 装扮卡片id
  int64 id = 1;
  // 装扮卡片链接
  string card_url = 2;
  // 装扮卡片点击跳转链接
  string jump_url = 3;
  // 粉丝样式
  DecoCardFan fan = 4;
}

// 文本描述
message Description {
  // 文本内容
  string text = 1;
  // 文本类型
  string type = 2;
  // 点击跳转链接
  string uri = 3;
  // emoji类型
  string emoji_type = 4;
  // 商品类型
  string goods_type = 5;
}

// 尺寸信息
message Dimension {
  //
  int64 height = 1;
  //
  int64 width = 2;
  //
  int64 rotate = 3;
}

// 动态卡片项
message DynamicItem {
  // 卡片类型
  // forward:转发 av:稿件视频 fold:折叠 pgc:pgc内容 courses:付费视频 upList:最近访问列表 followList:我的追番列表
  string card_type = 1;
  // 转发类型下，items的类型
  string item_type = 2;
  // 模块内容
  repeated Module modules = 3;
  // 动态ID str
  string dyn_id_str = 4;
  // 转发动态ID str
  string orig_dyn_id_str = 5;
  // r_type
  int32 r_type = 6;
  // 该卡片下面是否含有折叠卡
  int32 has_fold = 7;
}

// 批量动态id获取动态详情返回值
message DynDetailsReply {
  // 动态列表
  repeated DynamicItem list = 1;
}

// 批量动态id获取动态详情请求参数
message DynDetailsReq {
  // 青少年模式
  int32 teenagers_mode = 1;
  // 动态id
  string dynamic_ids = 2;
  // 清晰度
  int32 qn = 3;
  // 流版本
  int32 fnver = 4;
  // 流功能
  int32 fnval = 5;
  // 是否强制使用域名
  int32 force_host = 6;
  // 是否4k
  int32 fourk = 7;
}

// 查看更多-搜索-响应
message DynMixUpListSearchReply {
  //
  repeated MixUpListItem items = 1;
}

// 查看更多-搜索-请求
message DynMixUpListSearchReq {
  //
  string name = 1;
}

// 查看更多-列表-响应
message DynMixUpListViewMoreReply {
  // 关注up主列表信息
  repeated MixUpListItem items = 1;
  // 默认搜索文案
  string  search_default_text = 2;
}

// 动态同城物料
message DynOurCityItem {
  // 卡片类型
  // av:稿件 draw:图文
  string card_type = 1;
  // 动态ID
  int64 dyn_id = 2;
  // 跳转地址
  string uri = 3;
  // 模块列表
  repeated DynOurCityModule modules = 4;
  // 资源ID
  int64 rid = 5;
  // 透传服务端魔镜参数
  string debug_info = 6;
}

// 动态同城物料模块
message DynOurCityModule {
  // 类型
  // cover:封面 desc:描述 author:发布人 extend:扩展部分
  string module_type = 1;
  //
  oneof module_item {
    // 封面
    DynOurCityModuleCover module_cover = 2;
    // 描述
    DynOurCityModuleDesc module_desc = 3;
    // 发布人
    DynOurCityModuleAuthor module_author = 4;
    // 扩展部分
    DynOurCityModuleExtend module_extend = 5;
  }
}

// 动态同城物料-发布人模块
message DynOurCityModuleAuthor {
  // 用户Mid
  int64 mid = 1;
  // 用户昵称
  string name = 2;
  // 用户头像
  string face = 3;
  // 跳转地址
  string uri = 4;
}

// 动态同城物料-封面模块
message DynOurCityModuleCover {
  // 封面图 单图样式取第一个元素
  repeated string covers = 1;
  // 封面样式
  // 1:横图 2:竖图 3:方图
  int32 style = 2;
  // 视频封面展示项图标 1
  int32 cover_left_icon_1 = 3;
  // 视频封面展示项 1
  string cover_left_text_1 = 4;
  // 视频封面展示项图标 2
  int32 cover_left_icon_2 = 5;
  // 视频封面展示项 2
  string cover_left_text_2 = 6;
  // 封面视频展示项 3
  string cover_left_text_3 = 7;
  // 角标
  repeated VideoBadge badge = 8;
}

// 动态同城物料-描述模块
message DynOurCityModuleDesc {
  // 描述信息
  string desc = 1;
}

// 动态同城物料-扩展部分模块
message DynOurCityModuleExtend {
  // 类型
  string type = 1;
  oneof extend {
    // LBS模块
    DynOurCityModuleExtendLBS extend_lbs = 2;
  }
}

// 动态同城物料extent-LBS模块
message DynOurCityModuleExtendLBS {
  // 标题
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 小图标
  string icon = 3;
  // poiType
  int32 poi_type = 4;
}

// 动态同城-响应
message DynOurCityReply {
  // 翻页游标
  string offset = 1;
  // 是否还有更多数据
  // 1:有
  int32 has_more = 2;
  // 样式类型
  // 1:双列 2:瀑布流
  int32 style = 3;
  // 顶导信息
  string top_label = 4;
  // 列表详情
  repeated DynOurCityItem list = 5;
  // 顶导按钮信息
  string top_button_label = 6;
  // 城市ID
  int32 city_id = 7;
  // 城市名
  string city_name = 8;
}

// 动态同城页-请求
message DynOurCityReq {
  // 城市ID
  int64 city_id = 1;
  // 纬度
  double lat = 2;
  // 经度
  double lng = 3;
  // 透传上一次接口请求返回的offset
  string offset = 4;
  // 每页元素个数
  int32 page_size = 5;
  // 青少年模式
  // 1:开启青少年模式
  int32 teenagers_mode = 6;
  // 清晰度(旧版)
  int32 qn = 7;
  // 流版本(旧版)
  int32 fnver = 8;
  // 流类型(旧版)
  int32 fnval = 9;
  // 是否强制使用域名(旧版)
  int32 force_host = 10;
  // 是否4k(旧版)
  int32 fourk = 11;
  // 是否开启lbs
  // 0:关闭 1:开启
  int32 lbs_state = 12;
  // 是否刷新城市
  uint32 refresh_city = 13;
  // 魔镜设置
  ExpConf exp_conf = 14;
  // 秒开参数
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 15;
  // 城市码
  int64 city_code = 16;
  // 构建时间
  int64 build_time = 17;
}

// 动态同城开关-请求
message DynOurCitySwitchReq {
  // 开关参数
  // 0:关闭 1:开启
  int32 switch = 1;
}

// 红点接口物料
message DynRedItem {
  // 数字红点有效 更新数
  uint64 count = 1;
}

// 红点接口-响应
message DynRedReply {
  // 类型
  // count:数字红点 point:普通红点 no_point:没有红点
  string red_type = 1;
  // 红点具体信息
  DynRedItem dyn_red_item = 2;
  // 默认tab 值对应tab接口下发的anchor
  string default_tab = 3;
  //
  DynRedStyle red_style = 4;
}

// 动态红点接口-请求
message DynRedReq {
  // 动态红点接口各tab offset信息
  repeated TabOffset tab_offset = 1;
}

//
message DynRedStyle {
  //
  int32 bg_type = 1;
  //
  int32 corner_type = 2;
  //
  int32 display_time = 3;
  //
  string corner_mark = 4;
  //
  DynRedStyleUp up = 5;
  //
  int32 type = 6;
}

//
message DynRedStyleUp {
  //
  int64 uid = 1;
  //
  string face = 2;
}

// 动态tab详情
message DynTab {
  // tab标题 优先展示用,未开启状态第一次请求返回同城,后续请求返回对应城市名
  string title = 1;
  // 跳转链接
  string uri = 2;
  // 气泡内容
  string bubble = 3;
  // 是否推红点
  int32 red_point = 4;
  // 城市ID
  int64 city_id = 5;
  // 是否弹窗
  int32 is_popup = 6;
  // 弹窗内容
  Popup popup = 7;
  // 是否默认tab
  bool defaultTab = 8;
  // 副标题 对应城市名
  string sub_title = 9;
  // 锚点字段
  string anchor = 10;
  // 内测文案
  string internal_test = 11;
}

// 动态tab页-响应
message DynTabReply {
  // 动态tab详情列表
  repeated DynTab dyn_tab = 1;
}

// 动态tab页-请求
message DynTabReq {
  // 青少年模式
  // 1:开启青少年模式
  int32 teenagers_mode = 1;
}

// 最近访问-标记已读-请求
message DynUpdOffsetReq {
  // 被访问者的UID
  int64 host_uid = 1;
  // 用户已读进度
  string read_offset = 2;
}

// 最近访问-个人feed流列表-响应
message DynVideoPersonalReply {
  // 动态列表
  repeated DynamicItem list = 1;
  // 偏移量
  string offset = 2;
  // 是否还有更多数据
  int32 has_more = 3;
  // 已读进度
  string read_offset = 4;
}

// 最近访问-个人feed流列表-请求
message DynVideoPersonalReq {
  // 青少年模式
  // 1:开启青少年模式
  int32 teenagers_mode = 1;
  // 被访问者的mid
  int64 host_uid = 2;
  // 偏移量 第一页可传空
  string offset = 3;
  // 标明下拉几次
  int32 page = 4;
  // 是否是预加载
  int32 is_preload = 5;
  // 清晰度
  int32 qn = 6;
  // 流版本
  int32 fnver = 7;
  // 流类型
  int32 fnval = 8;
  // 是否强制使用域名
  int32 force_host = 9;
  // 是否4k
  int32 fourk = 10;
}

// 动态视频页-请求
message DynVideoReq {
  // 青少年模式
  int32 teenagers_mode = 1;
  // 透传 update_baseline
  string update_baseline = 2;
  // 透传 history_offset
  string offset = 3;
  // 向下翻页数
  int32 page = 4;
  // 刷新方式
  // 1:向上刷新 2:向下翻页
  int32 refresh_type = 5;
  // 清晰度
  int32 qn = 6;
  // 流版本
  int32 fnver = 7;
  // 流类型
  int32 fnval = 8;
  // 是否强制使用域名
  int32 force_host = 9;
  // 是否4K
  int32 fourk = 10;
}

// 动态视频页-响应
message DynVideoReqReply {
  // 动态列表
  repeated DynamicItem list = 1;
  // 更新的动态数
  int32 update_num = 2;
  // 历史偏移
  string history_offset = 3;
  // 更新基础信息
  string update_baseline = 4;
  // 是否还有更多数据
  int32 has_more = 5;
}

// 魔镜实验配置项
message Exp {
  // 实验名
  string exp_name = 1;
  // 实验组
  string exp_group = 2;
}

// 魔镜设置
message ExpConf {
  // 是否是魔镜请求
  int32 exp_enable = 1;
  // 实验配置
  repeated Exp exps = 2;
}

// 拓展
message Extend {
  // 类型
  // topic:话题小卡 lbs:lbs hot:热门视频 game:游戏
  string type = 1;
  // 卡片详情
  oneof extend {
    // 话题小卡
    ExtInfoTopic ext_info_topic = 2;
    // lbs
    ExtInfoLBS ext_info_lbs = 3;
    // 热门视频
    ExtInfoHot ext_info_hot = 4;
    // 游戏
    ExtInfoGame ext_info_game = 5;
  }
}

// 拓展信息-游戏小卡
message ExtInfoGame {
  // 标题
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 小图标
  string icon = 3;
}

// 拓展信息-热门视频
message ExtInfoHot {
  // 标题
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 小图标
  string icon = 3;
}

// 拓展信息-lbs
message ExtInfoLBS {
  // 标题
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 小图标
  string icon = 3;
  // poiType
  int32 poi_type = 4;
}

// 拓展信息-话题小卡
message ExtInfoTopic {
  // 标题-话题名
  string title = 1;
  // 跳转地址
  string uri = 2;
  // 小图标
  string icon = 3;
}

// 折叠分类
enum FoldType {
  FoldTypeZero = 0; // 占位
  FoldTypePublish = 1; // 用户发布折叠
  FoldTypeFrequent = 2; // 转发超频折叠
  FoldTypeUnite = 3; // 联合投稿折叠
  FoldTypeLimit = 4; // 动态受限折叠
}

// 我的追番列表Item
message FollowListItem {
  // season_id
  int32 season_id = 1;
  // 标题
  string title = 2;
  // 封面图
  string cover = 3;
  // 跳转链接
  string url = 4;
  // 最新ep
  NewEP new_ep = 5;
}

// 位置定位-响应
message GeoCoderReply {
  // 以行政区划+道路+门牌号等信息组成的标准格式化地址
  string address = 1;
  // 地址部件，address不满足需求时可自行拼接
  AddressComponent address_component = 2;
  // 行政区划信息
  AdInfo ad_info = 3;
}

// 位置定位-请求
message GeoCoderReq {
  // 纬度
  double lat = 1;
  // 经度
  double lng = 2;
  // 页面来源
  string from = 3;
}

// 行政区划中心点坐标
message Gps {
  // 纬度
  double lat = 1;
  // 经度
  double lng = 2;
}

// 点赞动画
message LikeAnimation {
  // 开始动画
  string begin = 1;
  // 过程动画
  string proc = 2;
  // 结束动画
  string end = 3;
  // id
  int64 like_icon_id = 4;
}

// 点赞拓展信息
message LikeInfo {
  // 点赞动画
  LikeAnimation animation = 1;
  // 是否点赞
  int32 is_like = 2;
}

// 点赞用户
message LikeUser {
  // 用户mid
  int64 uid = 1;
  // 用户昵称
  string uname = 2;
  // 点击跳转链接
  string uri = 3;
}

// 直播信息
message LiveInfo {
  // 是否在直播
  // 0:未直播 1:正在直播
  int32 is_living = 1;
  // 跳转链接
  string uri = 2;
}

// 播放器类型
enum MediaType {
  MediaTypeNone = 0; // 本地
  MediaTypeUGC = 1; // UGC
  MediaTypePGC = 2; // PGC
  MediaTypeLive = 3; // 直播
  MediaTypeVCS = 4; // 小视频
}

// 查看更多-列表单条数据
message MixUpListItem {
  // 用户mid
  int64 uid = 1;
  // 特别关注
  // 0:否 1:是
  int32 special_attention = 2;
  // 小红点状态
  // 0:没有 1:有
  int32 reddot_state = 3;
  // 直播信息
  MixUpListLiveItem live_info = 4;
  // 昵称
  string name = 5;
  // 头像
  string face = 6;
  // 认证信息
  OfficialVerify official = 7;
  // 大会员信息
  VipInfo vip = 8;
  // 关注状态
  Relation relation = 9;
  //
  int32 premiere_state = 10;
  //
  string uri = 11;
}

// 直播信息
message MixUpListLiveItem {
  // 直播状态
  // 0:未直播 1:直播中
  bool status = 1;
  // 房间号
  int64 room_id = 2;
  // 跳转地址
  string uri = 3;
}

// 模块
message Module {
  // 类型
  // fold:折叠 author:发布人 dynamic:动态卡片内容 state:计数信息 forward:转发 extend:小卡信息 dispute:争议小黄条 desc:描述信息
  // likeUser:点赞用户 upList:最近访问列表 followList:我的追番
  string module_type = 1;
  oneof module_item{
    // 折叠
    ModuleFold module_fold = 2;
    // 发布人
    ModuleAuthor module_author = 3;
    // 动态卡片内容
    ModuleDynamic module_dynamic = 4;
    // 计数信息
    ModuleState module_state = 5;
    // 转发
    ModuleForward module_forward = 6;
    // 小卡信息
    ModuleExtend module_extend = 7;
    // 争议小黄条
    ModuleDispute module_dispute = 8;
    // 描述信息
    ModuleDesc module_desc = 9;
    // 点赞用户
    ModuleLikeUser module_likeUser = 10;
    // 最近访问列表
    ModuleDynUpList module_upList = 11;
    // 我的追番
    ModuleFollowList module_followList = 12;
  }
}

// 作者信息模块
message ModuleAuthor {
  // 用户mid
  int64 id = 1;
  // 时间标签
  string ptime_label_text = 2;
  // 用户详情
  UserInfo author = 3;
  // 装扮卡片
  DecorateCard decorate_card = 4;
}

// 文本内容模块
message ModuleDesc {
  // 文本描述
  repeated Description desc = 1;
}

// 争议小黄条模块
message ModuleDispute {
  // 标题
  string title = 1;
  // 描述内容
  string desc = 2;
  // 跳转链接
  string uri = 3;
}

// 动态详情模块
message ModuleDynamic {
  // 卡片类型
  // ugc:ugc卡 pgc:pgc卡 currSeason:付费课程系列 currBatch:付费课程批次
  string card_type = 1;
  // 正文卡片
  oneof card {
    // ugc卡
    CardUGC card_ugc = 2;
    // pgc卡
    CardPGC card_pgc = 3;
    // 付费课程系列
    CardCurrSeason card_curr_season = 4;
    // 付费课程批次
    CardCurrBatch card_curr_batch = 5;
  }
}

// 最近访问up主列表
message ModuleDynUpList {
  // 标题展示文案
  string module_title = 1;
  // “全部”按钮文案
  string show_all = 2;
  // up主列表
  repeated UpListItem list = 3;
}

// 拓展信息
message ModuleExtend {
  // 拓展
  repeated Extend extend = 1;
}

// 折叠模块
message ModuleFold {
  // 折叠分类(该字段废弃)
  int32 fold_type = 1;
  // 折叠文案
  string text = 2;
  // 被折叠的动态
  string fold_ids = 3;
  // 被折叠的用户信息
  repeated UserInfo fold_users = 4;
  // 折叠分类
  FoldType fold_type_v2 = 5;
}

// 我的追番列表
message ModuleFollowList {
  // 查看全部的跳转链接
  string view_all_link = 1;
  //
  repeated FollowListItem list = 2;
}

// 转发模块
message ModuleForward {
  // 卡片类型
  string card_type = 1;
  // 嵌套模型
  repeated Module modules = 2;
}

// 点赞用户模块
message ModuleLikeUser {
  // 点赞用户
  repeated LikeUser like_users = 1;
  // 文案
  string display_text = 2;
}

// 计数信息模块
message ModuleState {
  // 转发数
  int32 repost = 1;
  // 点赞数
  int32 like = 2;
  // 评论数
  int32 reply = 3;
  // 点赞拓展信息
  LikeInfo like_info = 4;
  // 禁评
  bool no_comment = 5;
  // 禁转
  bool no_forward = 6;
}

// 认证名牌
message Nameplate {
  // nid
  int64 nid = 1;
  // 名称
  string name = 2;
  // 图片地址
  string image = 3;
  // 小图地址
  string image_small = 4;
  // 等级
  string level = 5;
  // 获取条件
  string condition = 6;
}

// 最新ep
message NewEP {
  // 最新话epid
  int32 id = 1;
  // 更新至XX话
  string index_show = 2;
  // 更新剧集的封面
  string cover = 3;
}

// 空响应
message NoReply {

}

// 空请求
message NoReq {

}

// 认证信息
message OfficialVerify {
  // 认证类型
  // 127:未认证 0:个人 1:机构
  int32 type = 1;
  // 认证描述
  string desc = 2;
  //
  int32 is_atten = 3;
}

// 动态同城点击上报-响应
message OurCityClickReportReply {

}

// 动态同城点击上报-请求
message OurCityClickReportReq {
  // 动态ID
  string dynamic_id = 1;
  // 城市ID
  int64 city_id = 2;
  // 纬度
  double lat = 3;
  // 经度
  double lng = 4;
}

// PGC单季信息
message PGCSeason {
  // 是否完结
  int32 is_finish = 1;
  // 标题
  string title = 2;
  // 类型
  int32 type = 3;
}

// 秒开参数
message PlayerPreloadParams {
  // 清晰度
  int32 qn = 1;
  // 流版本
  int32 fnver = 2;
  // 流类型
  int32 fnval = 3;
  // 是否强制使用域名
  int32 force_host = 4;
  // 是否4k
  int32 fourk = 5;
}

// 动态tab弹窗详情
message Popup {
  // 标题
  string title = 1;
  // 文案
  string desc = 2;
  // 文案附加跳转地址
  string uri = 3;
}

// 关注关系
message Relation {
  // 关注状态
  RelationStatus status = 1;
  // 关注
  int32 is_follow = 2;
  // 被关注
  int32 is_followed = 3;
  // 文案
  string title = 4;
}

// 关注状态
enum RelationStatus {
  relation_status_none = 0; //
  relation_status_nofollow = 1; // 未关注
  relation_status_follow = 2; // 关注
  relation_status_followed = 3; // 被关注
  relation_status_mutual_concern = 4; // 互相关注
  relation_status_special = 5; // 特别关注
}

// 分享需要
message ShareInfo {
  // 稿件avid
  int64 aid = 1;
  // 稿件bvid
  string bvid = 2;
  // 标题
  string title = 3;
  // 副标题
  string subtitle = 4;
  // 稿件封面
  string cover = 5;
  // up mid
  int64 mid = 6;
  // up昵称
  string name = 7;
}

//
enum StyleType {
  STYLE_TYPE_NONE = 0; //
  STYLE_TYPE_LIVE = 1; //
  STYLE_TYPE_DYN_UP = 2; //
}

// 小视频卡片项
message SVideoItem {
  // 卡片类型
  // av:稿件视频
  string card_type = 1;
  // 模块内容
  repeated SVideoModule modules = 2;
  // 动态ID str
  string dyn_id_str = 3;
  // 卡片游标
  int64 index = 4;
}

// 小视频模块
message SVideoModule {
  // 类型
  // author:发布人 player:播放器内容 desc:描述信息 stat:计数信息
  string module_type = 1;
  oneof module_item {
    // 发布人
    SVideoModuleAuthor module_author = 2;
    // 播放器内容
    SVideoModulePlayer module_player = 3;
    // 描述信息
    SVideoModuleDesc module_desc = 4;
    // 计数信息
    SVideoModuleStat module_stat = 5;
  }
}

// 作者信息模块
message SVideoModuleAuthor {
  // 用户mid
  int64 mid = 1;
  // 用户昵称
  string name = 2;
  // 用户头像
  string face = 3;
  // 发布描述
  string pub_desc = 4;
  // 是否关注up
  // 1:已关注
  int32 is_attention = 5;
  // 跳转地址
  string uri = 6;
}

// 文本内容模块
message SVideoModuleDesc {
  // 文本内容
  string text = 1;
  // 跳转地址
  string uri = 2;
}

// 播放器模块
message SVideoModulePlayer {
  // 标题
  string title = 1;
  // 封面图
  string cover = 2;
  // 跳转地址，秒开地址如果有会拼接player_preload可参考天马
  string uri = 3;
  // aid
  int64 aid = 4;
  // cid
  int64 cid = 5;
  // 视频时长
  int64 duration = 6;
  // 尺寸信息
  Dimension dimension = 7;
}

// 计数信息模块
message SVideoModuleStat {
  // 计数内容
  repeated SVideoStatInfo stat_info = 1;
  // 分享需要
  ShareInfo share_info = 2;
}

// 小视频连播页-响应
message SVideoReply {
  // 列表
  repeated SVideoItem list = 1;
  // 翻页游标
  string offset = 2;
  // 是否还有更多数据
  // 1:有
  int32 has_more = 3;
  // 顶部
  SVideoTop top = 4;
}

// 小视频连播页-请求
message SVideoReq {
  // 当前素材的id
  int64 oid = 1;
  // 当前素材类型
  // 1:动态(如果有oid则必传) 2:热门分类 3:热点聚合
  SVideoType type = 2;
  // 翻页offset
  string offset = 3;
  // 清晰度(旧版)
  int32 qn = 4;
  // 流版本(旧版)
  int32 fnver = 5;
  // 流类型(旧版)
  int32 fnval = 6;
  // 是否强制使用域名(旧版)
  int32 force_host = 7;
  // 是否4k(旧版)
  int32 fourk = 8;
  // 当前页面spm
  string spmid = 9;
  // 上级页面spm
  string from_spmid = 10;
  // 秒开参数
  PlayerPreloadParams player_preload = 11;
  // 热门进入联播页的锚点aid
  int64 focus_aid = 12;
  // 秒开参数
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 13;
}

// 计数内容
message SVideoStatInfo {
  // 计数icon
  // 1:分享符号 2:评论符号 3:点赞符号
  int32 icon = 1;
  // 计数值
  int64 num = 2;
  // 选中状态
  // 1:选中
  int32 selected = 3;
  // 跳转链接(如评论)
  string uri = 4;
}

// 顶部
message SVideoTop {
  // 联播页标题
  string Title = 1;
  // 联播页导语
  string Desc = 2;
}

// 入口联播页类型
enum SVideoType {
  TypeNone = 0; // 无类型
  TypeDynamic = 1; // 动态
  TypePopularIndex = 2; // 热门分类
  TypePopularHotword = 3; // 热点聚合
}

// 动态红点接口各tab offset信息
message TabOffset {
  // 1:综合页 2:视频页
  int32  tab = 1;
  // 上一次对应列表页offset
  string offset = 2;
}

// up主列表
message UpListItem {
  // 是否有更新
  // 0:没有 1:有
  int32 has_update = 1;
  // up主头像
  string face = 2;
  // up主昵称
  string name = 3;
  // up主uid
  int64 uid = 4;
}

// 用户信息
message UserInfo {
  // 用户mid
  int64 mid = 1;
  // 用户昵称
  string name = 2;
  // 用户头像
  string face = 3;
  // 认证信息
  OfficialVerify official = 4;
  // 大会员信息
  VipInfo vip = 5;
  // 直播信息
  LiveInfo live = 6;
  // 空间页跳转链接
  string uri = 7;
  // 挂件信息
  UserPendant pendant = 8;
  // 认证名牌
  Nameplate nameplate = 9;
}

// 头像挂件信息
message UserPendant {
  // pid
  int64 pid = 1;
  // 名称
  string name = 2;
  // 图片链接
  string image = 3;
  // 有效期
  int64 expire = 4;
}

// 角标信息
message VideoBadge {
  // 文案
  string text = 1;
  // 文案颜色-日间
  string text_color = 2;
  // 文案颜色-夜间
  string text_color_night = 3;
  // 背景颜色-日间
  string bg_color = 4;
  // 背景颜色-夜间
  string bg_color_night = 5;
  // 边框颜色-日间
  string border_color = 6;
  // 边框颜色-夜间
  string border_color_night = 7;
  // 样式
  int32 bg_style = 8;
}

// 番剧类型
enum VideoSubType {
  VideoSubTypeNone = 0; // 没有子类型
  VideoSubTypeBangumi = 1; // 番剧
  VideoSubTypeMovie = 2; // 电影
  VideoSubTypeDocumentary = 3; // 纪录片
  VideoSubTypeDomestic = 4; // 国创
  VideoSubTypeTeleplay = 5; // 电视剧
}

// 大会员信息
message VipInfo {
  // 大会员类型
  int32 Type = 1;
  // 大会员状态
  int32 status = 2;
  // 到期时间
  int64 due_date = 3;
  // 标签
  VipLabel label = 4;
  // 主题
  int32 theme_type = 5;
}

// 大会员标签
message VipLabel {
  // 图片地址
  string path = 1;
}
