syntax = "proto3";

package bilibili.app.interface.v1;

option java_package = "bilibili.app.interfaces.v1";
option java_multiple_files = true;

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

// 历史记录
service History {
  // 获取历史记录tab
  rpc HistoryTab (HistoryTabReq) returns (HistoryTabReply);
  // 获取历史记录列表(旧版)
  rpc Cursor (CursorReq) returns (CursorReply);
  // 获取历史记录列表
  rpc CursorV2 (CursorV2Req) returns (CursorV2Reply);
  // 删除历史记录
  rpc Delete (DeleteReq) returns (NoReply);
  // 搜索历史记录
  rpc Search (SearchReq) returns (SearchReply);
  // 清空历史记录
  rpc Clear (ClearReq) returns (NoReply);
  // 获取最新的历史记录
  rpc LatestHistory (LatestHistoryReq) returns (LatestHistoryReply);
}

// 专栏卡片
message CardArticle {
  // 封面url
  repeated string covers = 1;
  // UP主昵称
  string name = 2;
  // UP主mid
  int64 mid = 3;
  // 是否展示关注按钮
  bool displayAttention = 4;
  // 角标
  string badge = 5;
  // 关系信息
  Relation relation = 6;
}

// 课程卡片
message CardCheese {
  // 封面url
  string cover = 1;
  // 观看进度
  int64 progress = 2;
  // 总计时长
  int64 duration = 3;
  // 单集标题
  string subtitle = 4;
  //
  int64 state = 5;
}

// 直播卡片
message CardLive {
  // 封面url
  string cover = 1;
  // 主播昵称
  string name = 2;
  // 主播mid
  int64 mid = 3;
  // 直播分区名
  string tag = 4;
  // 直播状态
  int32 ststus = 5;
  // 是否展示关注按钮
  bool display_attention = 6;
  // 关系信息
  Relation relation = 7;
}

// pgc稿件卡片
message CardOGV {
  // 封面url
  string cover = 1;
  // 观看进度
  int64 progress = 2;
  // 总计时长
  int64 duration = 3;
  // 单集标题
  string subtitle = 4;
  //
  string badge = 5;
  //
  int64 state = 6;
}

// ugc稿件卡片
message CardUGC {
  // 封面url
  string cover = 1;
  // 观看进度
  int64 progress = 2;
  // 视频长度
  int64 duration = 3;
  // UP主昵称
  string name = 4;
  // UP主mid
  int64 mid = 5;
  // 是否展示关注按钮
  bool display_attention = 6;
  // 历史观看视频cid
  int64 cid = 7;
  // 历史观看视频分P
  int32 page = 8;
  // 历史观看视频分P的标题
  string subtitle = 9;
  // 关系信息
  Relation relation = 10;
  // 稿件bvid
  string bvid = 11;
  // 总分P数
  int64 videos = 12;
  // 短链接
  string short_link = 13;
  // 分享副标题
  string share_subtitle = 14;
  // 播放数
  int64 view = 15;
  //
  int64 state = 16;
}

// 清空历史记录-请求
message ClearReq {
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 1;
}

// 游标信息
message Cursor {
  // 本页最大值游标值
  int64 max = 1;
  // 本页最大值游标类型
  int32 maxTp = 2;
}

// 历史记录卡片信息
message CursorItem {
  // 主体数据
  oneof card_item {
    // ugc稿件
    CardUGC card_ugc = 1;
    // pgc稿件
    CardOGV card_ogv = 2;
    // 专栏
    CardArticle card_article = 3;
    // 直播
    CardLive card_live = 4;
    // 课程
    CardCheese card_cheese = 5;
  }
  // 标题
  string title = 6;
  // 目标uri/url
  string uri = 7;
  // 观看时间
  int64 viewAt = 8;
  // 历史记录id
  int64 kid = 9;
  // 业务id
  int64 oid = 10;
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 11;
  // 业务类型代码
  int32 tp = 12;
  // 设备标识
  DeviceType dt = 13;
  // 是否有分享按钮
  bool has_share = 14;
}

// 获取历史记录列表(旧版)-响应
message CursorReply {
  // 卡片内容
  repeated CursorItem items = 1;
  // 顶部tab
  repeated CursorTab tab = 2;
  // 游标信息
  Cursor cursor = 3;
  // 是否未拉取完
  bool hasMore = 4;
}

// 获取历史记录列表(旧版)-请求
message CursorReq {
  // 游标信息
  Cursor cursor = 1;
  // 业务类型
  // all:全部 archive:视频 live:直播 article:专栏
  string business = 2;
  // 秒开参数(旧版)
  PlayerPreloadParams player_preload = 3;
  // 秒开参数
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
}

// 业务分类表
message CursorTab {
  // 业务类型
  string business = 1;
  // 名称
  string name = 2;
  // 路由uri
  string router = 3;
  // tab定位
  bool focus = 4;
}

// 获取历史记录列表-响应
message CursorV2Reply {
  // 卡片内容
  repeated CursorItem items = 1;
  // 游标信息
  Cursor cursor = 2;
  // 是否未拉取完
  bool hasMore = 3;
  //
  string empty_link = 4;
}

// 获取历史记录列表-请求
message CursorV2Req {
  // 游标信息
  Cursor cursor = 1;
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 2;
  // 秒开参数(旧版)
  PlayerPreloadParams player_preload = 3;
  // 秒开参数
  bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
  // 是否选择本机的播放历史
  bool is_local = 5;
}

// 设备标识代码
enum DT {
  Unknown = 0; // 未知
  Phone = 1; // 手机端
  Pad = 2; // ipad端
  PC = 3; // web端
  TV = 4; // TV端
  Car = 5; // 车机端
  Iot = 6; // 物联设备
  AndPad = 7; // apad端
}

// 删除历史记录-请求
message DeleteReq {
  // 历史记录信息
  HisInfo his_info = 1;
}

// 设备类型
message DeviceType {
  // 设备标识代码
  DT type = 1;
  // 图标url
  string icon = 2;
}

// 历史记录信息
message HisInfo {
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 1;
  // 历史记录id
  int64 kid = 2;
}

// 搜索历史记录来源
enum HistorySource {
  history_VALUE = 0; // 主站历史记录页
  shopping_VALUE = 1; // 会员购浏览记录
}

// 获取历史记录tab-响应
message HistoryTabReply {
  // tab列表
  repeated CursorTab tab = 1;
}

// 获取历史记录tab-请求
message HistoryTabReq {
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 1;
  // 查询请求来源
  HistorySource source = 2;
  // 搜索关键词
  string keyword = 3;
}

// 获取最新的历史记录-响应
message LatestHistoryReply {
  // 卡片内容
  CursorItem items = 1;
  // 场景
  string scene = 2;
  // 弹窗停留时间
  int64 rtime = 3;
  // 分组的标志(客户端埋点上报)
  string flag = 4;
}

// 获取最新的历史记录-请求
message LatestHistoryReq {
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 1;
  // 秒开参数
  PlayerPreloadParams player_preload = 2;
}

// 空响应
message NoReply {

}

// 页面信息
message Page {
  // 当前页码
  int64 pn = 1;
  // 总计条目数
  int64 total = 2;
}

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

// 关系信息
message Relation {
  // 关系状态
  // 1:未关注 2:已关注 3:被关注 4:互关
  int32 status = 1;
  // 用户关注UP主
  int32 is_follow = 2;
  // UP主关注用户
  int32 is_followed = 3;
}

// 搜索历史记录-响应
message SearchReply {
  // 卡片内容
  repeated CursorItem items = 1;
  // 是否未拉取完
  bool hasMore = 2;
  // 页面信息
  Page page = 3;
}

// 搜索历史记录-请求
message SearchReq {
  // 关键词
  string keyword = 1;
  // 页码
  int64 pn = 2;
  // 业务类型
  // archive:视频 live:直播 article:专栏 goods:商品 show:展演
  string business = 3;
}
