syntax = "proto3";

import "github.com/gogo/protobuf/gogoproto/gogo.proto";

// use {app_id}.{version} as package name
package archive.service.v1;

option go_package = "api";

// Archive grpc
service Archive {
    // Types 获取所有分区列表
    rpc Types(NoArgRequest) returns(TypesReply);
    // 获取单个稿件信息
    rpc Arc(ArcRequest) returns(ArcReply);
    // 批量获取稿件信息
    rpc Arcs(ArcsRequest) returns(ArcsReply);
    // 获取单个稿件计数信息
    rpc Stat(StatRequest) returns(StatReply);
    // 批量获取稿件计数信息
    rpc Stats(StatsRequest) returns(StatsReply);
    // 获取单个稿件+分P信息
    rpc View(ViewRequest) returns(ViewReply);
    // 批量获取稿件+分P信息
    rpc Views(ViewsRequest) returns(ViewsReply);
    // 获取稿件在各平台的点击数
    rpc Click(ClickRequest) returns(ClickReply);
    // 获取稿件的所有分P信息
    rpc Page(PageRequest) returns(PageReply);
    // 获取Up主绑定的相关推荐 *几乎废弃
    rpc Recommend(RecommendRequest) returns(RecommendReply);
    // 获取aid&cid对应的视频信息
    rpc Video(VideoRequest) returns(VideoReply);
    // 获取当前最大的aid，各子业务防刷、防脏数据时使用
    rpc MaxAid(NoArgRequest) returns(MaxAidReply);
    // 获取稿件的长简介信息
    rpc Description(DescriptionRequest) returns(DescriptionReply);
    // 内部方法，管理稿件服务缓存，请勿使用-----------------------------------------------------------------------
    rpc ArcFieldCache(ArcFieldCacheRequest) returns(NoReply);
    rpc ArcCache(ArcCacheRequest) returns(NoReply);
    rpc UpVideoCache(UpVideoCacheRequest) returns(NoReply);
    rpc DelVideoCache(DelVideoCacheRequest) returns(NoReply);
    rpc SetStat(SetStatRequest) returns(NoReply);
    // 内部方法，管理稿件服务缓存，请勿使用-----------------------------------------------------------------------
}

// NoArgReq
message NoArgRequest{}
// NoReply
message NoReply{}

message DescriptionRequest {
    int64 aid = 1;
}

message DescriptionReply {
    string desc = 1;
}

message MaxAidReply {
    int64 aid = 1;
}

message ArcRequest {
    int64 aid = 1;
}

message ArcReply {
    Arc arc = 1;
}

message ArcsRequest {
    repeated int64 aids = 1;
}

message ArcsReply {
    map<int64, Arc> arcs = 1;
}

message ViewRequest {
    int64 aid = 1;
}

message StatRequest {
    int64 aid = 1;
}

message StatReply {
    Stat Stat = 1;
}

message StatsRequest {
    repeated int64 aids = 1;
}

message StatsReply {
    map<int64, Stat> Stats = 1;
}

message ViewReply {
    Arc arc = 1 [(gogoproto.embed) = true, (gogoproto.jsontag) = ""];
    repeated Page pages = 2;
}

message ViewsRequest {
    repeated int64 aids = 1;
}

message ViewsReply {
    map<int64, ViewReply> views = 1;
}

message TypesReply {
    map<int32, Tp> types = 1;
}

message ClickRequest {
    int64 aid = 1;
}

message ClickReply {
    Click click = 1;
}

message PageRequest {
    int64 aid = 1;
}

message PageReply {
    repeated Page pages = 1;
}

message RecommendRequest {
    int64 aid = 1;
}

message RecommendReply {
    repeated Arc arcs = 1;
}

message VideoRequest {
    int64 aid = 1;
    int64 cid = 2;
}

message VideoReply {
    Page page = 1;
}

message Tp {
    // 分区id
    int32 ID = 1 [(gogoproto.jsontag) = "id"];
    // 该分区的父级id
    int32 pid = 2 [(gogoproto.jsontag) = "pid"];
    // 该分区对应的名称
    string name = 3 [(gogoproto.jsontag) = "name"];
}

message AidVideos {
    int64 Aid = 1 [(gogoproto.jsontag) = "aid"];
    // 分P信息
    repeated Page Pages = 2 [(gogoproto.jsontag) = "pages"];
}

message Arc {
    int64 Aid = 1 [(gogoproto.jsontag) = "aid"];
    // 稿件一共有多少分P
    int64 Videos = 2 [(gogoproto.jsontag) = "videos"];
    // 分区ID
    int32 TypeID = 3 [(gogoproto.jsontag) = "tid"];
    // 分区名
    string TypeName = 4 [(gogoproto.jsontag) = "tname"];
    // 是否转载  1=原创  2=转载 0=历史上可能遗留的脏数据
    int32 Copyright = 5 [(gogoproto.jsontag) = "copyright"];
    // 稿件封面图地址，绝对地址 如 http://i0.hdslb.com/bfs/xxx.jpg
    string Pic = 6 [(gogoproto.jsontag) = "pic"];
    // 稿件标题
    string Title = 7 [(gogoproto.jsontag) = "title"];
    // 稿件发布时间 对外展示的标准时间  时间戳格式
    int64 PubDate = 8 [(gogoproto.jsontag) = "pubdate", (gogoproto.casttype) = "go-common/library/time.Time"];
    // 用户提交稿件的时间 一般不对外展示 时间戳格式
    int64 Ctime = 9 [(gogoproto.jsontag) = "ctime", (gogoproto.casttype) = "go-common/library/time.Time"];
    // 稿件简介
    string Desc = 10 [(gogoproto.jsontag) = "desc"];
    // 稿件状态，>=0为前台用户可见状态，其他值详见 http://info.bilibili.co/pages/viewpage.action?pageId=3686597#id-%E7%A8%BF%E4%BB%B6%E5%AD%97%E6%AE%B5%E6%9E%9A%E4%B8%BE%E5%80%BC%E5%B1%9E%E6%80%A7%E8%AF%B4%E6%98%8E-%E7%A8%BF%E4%BB%B6%E7%8A%B6%E6%80%81state&access
    int32 State = 11 [(gogoproto.jsontag) = "state"];
    // 稿件访问属性 0=全员可见 10000=登录用户可见（极少)
    int32 Access = 12 [(gogoproto.jsontag) = "access,omitempty"];
    // 稿件属性 详见State字段的文档
    int32 Attribute = 13 [(gogoproto.jsontag) = "attribute,omitempty"];
    // 废弃字段
    string Tag = 14 [(gogoproto.jsontag) = "-"];
    // 废弃字段
    repeated string Tags = 15 [(gogoproto.jsontag) = "tags,omitempty"];
    // 稿件总时长（所有分P加起来的） 单位=秒
    int64 Duration = 16 [(gogoproto.jsontag) = "duration"];
    // 稿件绑定的活动id
    int64 MissionID = 17 [(gogoproto.jsontag) = "mission_id,omitempty"];
    // 稿件绑定的商单id
    int64 OrderID = 18 [(gogoproto.jsontag) = "order_id,omitempty"];
    // 稿件后台设置的强制跳转地址，如果该值不为空，则必须调转到它对应的页面上
    string RedirectURL = 19 [(gogoproto.jsontag) = "redirect_url,omitempty"];
    int64 Forward = 20 [(gogoproto.jsontag) = "forward,omitempty"];
    // 见Rights字段说明
    Rights Rights = 21 [(gogoproto.jsontag) = "rights", (gogoproto.nullable) = false];
    // 稿件作者信息，详见Author字段说明
    Author Author = 22 [(gogoproto.jsontag) = "owner", (gogoproto.nullable) = false];
    // 稿件计数信息，详见Stat字段说明
    Stat Stat = 23 [(gogoproto.jsontag) = "stat", (gogoproto.nullable) = false];
    string ReportResult = 24 [(gogoproto.jsontag) = "report_result,omitempty"];
    // 发布稿件时Up主设置的动态描述（仅在动态展示）
    string Dynamic = 25 [(gogoproto.jsontag) = "dynamic"];
    // 稿件第一P的cid，供秒开使用
    int64 FirstCid = 26 [(gogoproto.jsontag) = "cid,omitempty"];
    // 稿件第一P的分辨率，详见Dimession字段说明
    Dimension Dimension = 27 [(gogoproto.jsontag) = "dimension,omitempty", (gogoproto.nullable) = false];
    // 联合投稿信息，内部使用，详见StaffInfo说明
    repeated StaffInfo StaffInfo  = 28 [(gogoproto.jsontag) = "-"];
}

message StaffInfo {
    // 联合投稿的成员Up主id
     int64 Mid = 1 [(gogoproto.jsontag) = "mid"];
     // 联合投稿的成员角色（如 声优、字幕）
     string Title = 2 [(gogoproto.jsontag) = "title"];
}

// Dimension 视频分辨率
message Dimension {
    // 宽 如 1920
    int64 Width = 1 [(gogoproto.jsontag) = "width"];
    // 高 如 1080
    int64 Height = 2 [(gogoproto.jsontag) = "height"];
    // 是否竖屏 0=否 1=是
    int64 Rotate = 3 [(gogoproto.jsontag) = "rotate"];
}

// Rights 稿件各常用属性 0=否 1=是
message Rights {
    // 老版是否付费
    int32 Bp = 1 [(gogoproto.jsontag) = "bp"];
    // 是否支持充电 （不可直接使用，网关层请求业务方后才有值）
    int32 Elec = 2 [(gogoproto.jsontag) = "elec"];
    // 是否下载（不可直接使用，网关层请求业务方后才有值）
    int32 Download = 3 [(gogoproto.jsontag) = "download"];
    // 是否电影
    int32 Movie = 4 [(gogoproto.jsontag) = "movie"];
    // 是否PGC付费
    int32 Pay = 5 [(gogoproto.jsontag) = "pay"];
    // 无用
    int32 HD5 = 6 [(gogoproto.jsontag) = "hd5"];
    // 是否允许转发
    int32 NoReprint = 7 [(gogoproto.jsontag) = "no_reprint"];
    // 是否可以自动播放
    int32 Autoplay = 8 [(gogoproto.jsontag) = "autoplay"];
    // 是否UGC付费
    int32 UGCPay = 9 [(gogoproto.jsontag) = "ugc_pay"];
    // 是否联合投稿
    int32 IsCooperation = 10 [(gogoproto.jsontag) = "is_cooperation"];
}

// Author 稿件作者信息
message Author {
    // Up主mid
    int64 Mid = 1 [(gogoproto.jsontag) = "mid"];
    // Up主名称
    string Name = 2 [(gogoproto.jsontag) = "name"];
    // Up主头像地址 绝对地址
    string Face = 3 [(gogoproto.jsontag) = "face"];
}

// Stat 稿件的所有计数信息
message Stat {
    int64 Aid = 1 [(gogoproto.jsontag) = "aid"];
    // 播放数
    int32 View = 2 [(gogoproto.jsontag) = "view"];
    // 弹幕数
    int32 Danmaku = 3 [(gogoproto.jsontag) = "danmaku"];
    // 评论数
    int32 Reply = 4 [(gogoproto.jsontag) = "reply"];
    // 收藏数
    int32 Fav = 5 [(gogoproto.jsontag) = "favorite"];
    // 投币数
    int32 Coin = 6 [(gogoproto.jsontag) = "coin"];
    // 分享数
    int32 Share = 7 [(gogoproto.jsontag) = "share"];
    // 当前排名
    int32 NowRank = 8 [(gogoproto.jsontag) = "now_rank"];
    // 历史最高排名
    int32 HisRank = 9 [(gogoproto.jsontag) = "his_rank"];
    // 点赞数
    int32 Like = 10 [(gogoproto.jsontag) = "like"];
    // 点踩数 已取消前台展示，现在均返回0
    int32 DisLike = 11 [(gogoproto.jsontag) = "dislike"];
}

// Click 点击数详情，老版本播放器使用
message Click {
    int64 Aid = 1 [(gogoproto.jsontag) = "aid"];
    // web端播放数
    int32 Web = 2 [(gogoproto.jsontag) = "web"];
    // iOS端播放数
    int32 Ios = 3 [(gogoproto.jsontag) = "ios"];
    // android端播放数
    int32 Android = 4 [(gogoproto.jsontag) = "android"];
    // h5端播放数
    int32 H5 = 5 [(gogoproto.jsontag) = "h5"];
    // 站外播放数
    int32 Outter = 6 [(gogoproto.jsontag) = "outter"];
}

// Page 分P信息
message Page {
    // 视频的cid
    int64 Cid = 1 [(gogoproto.jsontag) = "cid"];
    // 视频的序号顺序，从小到大
    int32 Page = 2 [(gogoproto.jsontag) = "page"];
    // 视频的来源，99%为vupload=B站自己的，少部分为腾讯（qq）、湖南tv(hunan)
    string From = 3 [(gogoproto.jsontag) = "from"];
    // 视频的标题
    string Part = 4 [(gogoproto.jsontag) = "part"];
    // 视频的时长 单位=秒
    int64 Duration = 5 [(gogoproto.jsontag) = "duration"];
    // 站外视频才有vid属性
    string Vid = 6 [(gogoproto.jsontag) = "vid"];
    // 视频的简介，多P视频才可填写简介
    string Desc = 7 [(gogoproto.jsontag) = "description,omitempty"];
    // 站外视频跳转地址
    string WebLink = 8 [(gogoproto.jsontag) = "weblink"];
    // 视频分辨率信息
    Dimension Dimension = 9 [(gogoproto.jsontag) = "dimension", (gogoproto.nullable) = false];
}

// !!!Note: only response message defined, since we put pb into http response body
message VideoFileInfo {
    uint64 filesize   = 1 [(gogoproto.jsontag) = "filesize", (gogoproto.casttype) = "int64"];
    uint64 timelength = 2 [(gogoproto.jsontag) = "timelength", (gogoproto.casttype) ="int64"];
    string ahead = 3 [(gogoproto.jsontag) = "ahead"];
    string vhead = 4 [(gogoproto.jsontag) = "vhead"];
}

message VideoFormatFileInfo {
    repeated VideoFileInfo infos = 1 [(gogoproto.jsontag) = "infos"];
}

message DashItem {
    uint32 id = 1 [(gogoproto.jsontag) = "id", (gogoproto.casttype) = "int64"];
    string baseUrl = 2 [(gogoproto.jsontag) = "base_url"];
    uint32 bandwidth = 3 [(gogoproto.jsontag) = "bandwidth", (gogoproto.casttype) = "int64"];
    uint32 codecid = 4 [(gogoproto.jsontag) = "codecid", (gogoproto.casttype) = "int64"];
}

message ResponseDash {
    repeated DashItem video = 1 [(gogoproto.jsontag) = "video"];
    repeated DashItem audio = 2 [(gogoproto.jsontag) = "audio"];
}

message BvcVideoItem {
    uint64   expire_time                 = 1 [(gogoproto.jsontag) = "expire_time", (gogoproto.casttype) = "int64"];
    uint32   cid                         = 2 [(gogoproto.jsontag) = "cid", (gogoproto.casttype) ="int64"];
    repeated uint32 support_quality      = 3 [(gogoproto.jsontag) = "support_quality", (gogoproto.casttype) = "int"];
    repeated string support_formats      = 4 [(gogoproto.jsontag) = "support_formats"];
    repeated string support_description  = 5 [(gogoproto.jsontag) = "support_description"];
    uint32   quality                     = 6 [(gogoproto.jsontag) = "quality", (gogoproto.casttype) = "int"];
    string   url                         = 7 [(gogoproto.jsontag) = "url"];
    map<uint32, VideoFormatFileInfo> file_info = 8 [(gogoproto.jsontag) = "file_info"];
    uint32   video_codecid               = 9 [(gogoproto.jsontag) = "video_codecid"];
    bool     video_project               = 10 [(gogoproto.jsontag) = "video_project"];
    uint32   fnver                       = 11 [(gogoproto.jsontag) = "fnver", (gogoproto.casttype) = "int"];
    uint32   fnval                       = 12 [(gogoproto.jsontag) = "fnval", (gogoproto.casttype) = "int"];
    ResponseDash dash                    = 13 [(gogoproto.jsontag) = "dash"];
}

message BvcResponseMsg {
    uint32                         code = 1 [(gogoproto.jsontag) = "code", (gogoproto.casttype) = "int64"];
    map<uint32, BvcVideoItem> data = 2 [(gogoproto.jsontag) = "data"];
}

// 内部方法 请勿使用--------------------------------------------------------------------------------------------
message ArcCacheRequest {
    int64 aid = 1;
    string tp = 2;
    int64 OldMid = 3;
}

message ArcFieldCacheRequest {
    int64 aid = 1;
    int32 typeID = 2;
    int32 oldTypeID = 3;
}

message UpVideoCacheRequest {
    int64 aid = 1;
    int64 cid = 2;
}

message DelVideoCacheRequest {
    int64 aid = 1;
    int64 cid = 2;
}

message SetStatRequest {
    Stat stat = 1;
}
// 内部方法 请勿使用--------------------------------------------------------------------------------------------