Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1 @@
# HTTP API文档

View File

@@ -0,0 +1,64 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"app_conf.bm.go",
"index.bm.go",
"relation.bm.go",
"relation.pbg.go",
],
embed = [":v1_go_proto"],
importpath = "go-common/app/interface/live/app-interface/api/http/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
proto_library(
name = "v1_proto",
srcs = [
"app_conf.proto",
"index.proto",
],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v1_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/app-interface/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)

View File

@@ -0,0 +1,57 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: app_conf.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
app_conf.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathConfigGetConf = "/live.appinterface.v1.config/getConf"
// ================
// Config Interface
// ================
type ConfigBMServer interface {
GetConf(ctx context.Context, req *GetConfReq) (resp *GetConfResp, err error)
}
var v1ConfigSvc ConfigBMServer
func configGetConf(c *bm.Context) {
p := new(GetConfReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ConfigSvc.GetConf(c, p)
c.JSON(resp, err)
}
// RegisterV1ConfigService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1ConfigService(e *bm.Engine, svc ConfigBMServer, midMap map[string]bm.HandlerFunc) {
v1ConfigSvc = svc
e.GET("/xlive/app-interface/v1/config/getConf", configGetConf)
}
// RegisterConfigBMServer Register the blademaster route
func RegisterConfigBMServer(e *bm.Engine, server ConfigBMServer) {
v1ConfigSvc = server
e.GET("/live.appinterface.v1.config/getConf", configGetConf)
}

View File

@@ -0,0 +1,26 @@
<!-- package=live.appinterface.v1 -->
- [/xlive/app-interface/v1/config/getConf](#xliveapp-interfacev1configgetConf)
## /xlive/app-interface/v1/config/getConf
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|key|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"value": ""
}
}
```

View File

@@ -0,0 +1,515 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: app_conf.proto
package v1
import proto "github.com/gogo/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "github.com/gogo/protobuf/gogoproto"
import io "io"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type GetConfReq struct {
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty" form:"key" validate:"required"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetConfReq) Reset() { *m = GetConfReq{} }
func (m *GetConfReq) String() string { return proto.CompactTextString(m) }
func (*GetConfReq) ProtoMessage() {}
func (*GetConfReq) Descriptor() ([]byte, []int) {
return fileDescriptor_app_conf_3aa11f6a51d393db, []int{0}
}
func (m *GetConfReq) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *GetConfReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_GetConfReq.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (dst *GetConfReq) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetConfReq.Merge(dst, src)
}
func (m *GetConfReq) XXX_Size() int {
return m.Size()
}
func (m *GetConfReq) XXX_DiscardUnknown() {
xxx_messageInfo_GetConfReq.DiscardUnknown(m)
}
var xxx_messageInfo_GetConfReq proto.InternalMessageInfo
func (m *GetConfReq) GetKey() string {
if m != nil {
return m.Key
}
return ""
}
type GetConfResp struct {
Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty" form:"value"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetConfResp) Reset() { *m = GetConfResp{} }
func (m *GetConfResp) String() string { return proto.CompactTextString(m) }
func (*GetConfResp) ProtoMessage() {}
func (*GetConfResp) Descriptor() ([]byte, []int) {
return fileDescriptor_app_conf_3aa11f6a51d393db, []int{1}
}
func (m *GetConfResp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *GetConfResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_GetConfResp.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (dst *GetConfResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetConfResp.Merge(dst, src)
}
func (m *GetConfResp) XXX_Size() int {
return m.Size()
}
func (m *GetConfResp) XXX_DiscardUnknown() {
xxx_messageInfo_GetConfResp.DiscardUnknown(m)
}
var xxx_messageInfo_GetConfResp proto.InternalMessageInfo
func (m *GetConfResp) GetValue() string {
if m != nil {
return m.Value
}
return ""
}
func init() {
proto.RegisterType((*GetConfReq)(nil), "live.appinterface.v1.GetConfReq")
proto.RegisterType((*GetConfResp)(nil), "live.appinterface.v1.GetConfResp")
}
func (m *GetConfReq) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *GetConfReq) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Key) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintAppConf(dAtA, i, uint64(len(m.Key)))
i += copy(dAtA[i:], m.Key)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func (m *GetConfResp) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *GetConfResp) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Value) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintAppConf(dAtA, i, uint64(len(m.Value)))
i += copy(dAtA[i:], m.Value)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func encodeVarintAppConf(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return offset + 1
}
func (m *GetConfReq) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Key)
if l > 0 {
n += 1 + l + sovAppConf(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *GetConfResp) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Value)
if l > 0 {
n += 1 + l + sovAppConf(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func sovAppConf(x uint64) (n int) {
for {
n++
x >>= 7
if x == 0 {
break
}
}
return n
}
func sozAppConf(x uint64) (n int) {
return sovAppConf(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *GetConfReq) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: GetConfReq: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: GetConfReq: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthAppConf
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Key = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAppConf(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAppConf
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *GetConfResp) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: GetConfResp: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: GetConfResp: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowAppConf
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthAppConf
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Value = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipAppConf(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthAppConf
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipAppConf(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
return iNdEx, nil
case 1:
iNdEx += 8
return iNdEx, nil
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
iNdEx += length
if length < 0 {
return 0, ErrInvalidLengthAppConf
}
return iNdEx, nil
case 3:
for {
var innerWire uint64
var start int = iNdEx
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowAppConf
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
innerWire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
innerWireType := int(innerWire & 0x7)
if innerWireType == 4 {
break
}
next, err := skipAppConf(dAtA[start:])
if err != nil {
return 0, err
}
iNdEx = start + next
}
return iNdEx, nil
case 4:
return iNdEx, nil
case 5:
iNdEx += 4
return iNdEx, nil
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
}
panic("unreachable")
}
var (
ErrInvalidLengthAppConf = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowAppConf = fmt.Errorf("proto: integer overflow")
)
func init() { proto.RegisterFile("app_conf.proto", fileDescriptor_app_conf_3aa11f6a51d393db) }
var fileDescriptor_app_conf_3aa11f6a51d393db = []byte{
// 245 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x2c, 0x28, 0x88,
0x4f, 0xce, 0xcf, 0x4b, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xc9, 0xc9, 0x2c, 0x4b,
0xd5, 0x4b, 0x2c, 0x28, 0xc8, 0xcc, 0x2b, 0x49, 0x2d, 0x4a, 0x4b, 0x4c, 0x4e, 0xd5, 0x2b, 0x33,
0x94, 0xd2, 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0x4f,
0xcf, 0xd7, 0x07, 0x2b, 0x4e, 0x2a, 0x4d, 0x03, 0xf3, 0xc0, 0x1c, 0x30, 0x0b, 0x62, 0x88, 0x92,
0x13, 0x17, 0x97, 0x7b, 0x6a, 0x89, 0x73, 0x7e, 0x5e, 0x5a, 0x50, 0x6a, 0xa1, 0x90, 0x09, 0x17,
0x73, 0x76, 0x6a, 0xa5, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xa7, 0x93, 0xd2, 0xa7, 0x7b, 0xf2, 0x72,
0x69, 0xf9, 0x45, 0xb9, 0x56, 0x4a, 0xd9, 0xa9, 0x95, 0x4a, 0x0a, 0x65, 0x89, 0x39, 0x99, 0x29,
0x89, 0x25, 0xa9, 0x56, 0x4a, 0x45, 0xa9, 0x85, 0xa5, 0x99, 0x45, 0xa9, 0x29, 0x4a, 0x41, 0x20,
0xe5, 0x4a, 0xa6, 0x5c, 0xdc, 0x70, 0x33, 0x8a, 0x0b, 0x84, 0xd4, 0xb8, 0x58, 0xcb, 0x12, 0x73,
0x4a, 0x53, 0xa1, 0xc6, 0x08, 0x7c, 0xba, 0x27, 0xcf, 0x03, 0x31, 0x06, 0x2c, 0xac, 0x14, 0x04,
0x91, 0x36, 0x8a, 0xe0, 0x62, 0x03, 0xf9, 0x26, 0x33, 0x5d, 0xc8, 0x8f, 0x8b, 0x3d, 0x1d, 0x62,
0x80, 0x90, 0x82, 0x1e, 0x36, 0x5f, 0xe9, 0x21, 0xdc, 0x28, 0xa5, 0x48, 0x40, 0x45, 0x71, 0x81,
0x93, 0xc0, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x18, 0xc5,
0x54, 0x66, 0x98, 0xc4, 0x06, 0xf6, 0xad, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x86, 0xd3, 0x42,
0x4e, 0x44, 0x01, 0x00, 0x00,
}

View File

@@ -0,0 +1,19 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service config {
rpc getConf (GetConfReq) returns (GetConfResp);
}
message GetConfReq {
string key = 1 [(gogoproto.moretags) = 'form:"key" validate:"required"'];
}
message GetConfResp {
string value = 1 [(gogoproto.moretags) = 'form:"value"'];
}

View File

@@ -0,0 +1,71 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/index.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/index.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
// ===============
// Index Interface
// ===============
// Index 相关服务
type Index interface {
// 首页大接口
// 首页换一换接口
// `dynamic_resp:"true" midware:"guest"`
GetAllList(ctx context.Context, req *GetAllListReq) (resp interface{}, err error)
// `midware:"guest"`
Change(ctx context.Context, req *ChangeReq) (resp *ChangeResp, err error)
}
var v1IndexSvc Index
// @params GetAllListReq
// @router GET /xlive/app-interface/v1/index/getAllList
// @response GetAllListResp
func indexGetAllList(c *bm.Context) {
p := new(GetAllListReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v1IndexSvc.GetAllList(c, p)
c.JSON(resp, err)
}
// @params ChangeReq
// @router GET /xlive/app-interface/v1/index/change
// @response ChangeResp
func indexChange(c *bm.Context) {
p := new(ChangeReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v1IndexSvc.Change(c, p)
c.JSON(resp, err)
}
// RegisterV1IndexService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1IndexService(e *bm.Engine, svc Index, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
v1IndexSvc = svc
e.GET("/xlive/app-interface/v1/index/getAllList", guest, indexGetAllList)
e.GET("/xlive/app-interface/v1/index/change", guest, indexChange)
}

View File

@@ -0,0 +1,96 @@
## 首页大接口
首页换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string|平台|
|device|是|string|设备|
|scale|是|string|分辨率|
|build|是|integer|版本号|
|relation_page|是|integer|关注页码|
|module_id|否|integer|模块id可选|
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```
##
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|是|integer| 模块id|
|attention_room_id|是|string||
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|integer|版本号|
```json
{
"code": 0,
"message": "ok",
"data": {
"module_list": [
{
"module_info": {
// 模块id
"id": 0,
// 标题
"title": "",
// 图标
"pic": "",
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 跳转链接
"link": "",
// 该模块数据总数
"count": 0,
"is_sky_horse_gray": 0
},
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
"list": [
{
"roomid": 0,
"title": "",
"uname": "",
"online": 0,
"cover": "",
"link": "",
"face": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"play_url,omitempty": "",
"play_url_h265,omitempty": "",
"current_quality,omitempty": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_pic": "",
"pendent_ru_color": "",
"rec_type": 0,
"pk_id": 0,
"accept_quality,omitempty": [
0
]
}
]
}
]
}
}
```

View File

@@ -0,0 +1,96 @@
## 首页大接口
首页换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|string|版本号|
|relation_page|否|integer|关注页码|
|module_id|否|integer|模块id可选|
```json
{
"code": 0,
"message": "ok",
"data": {
}
}
```
##
`GET http://api.live.bilibili.com/xlive/app-interface/v1/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|否|integer| 模块id|
|attention_room_id|否|string||
|platform|否|string| 平台|
|device|否|string|设备|
|scale|否|string|分辨率|
|build|否|string|版本号|
```json
{
"code": 0,
"message": "ok",
"data": {
"module_list": [
{
"module_info": {
// 模块id
"id": 0,
// 标题
"title": "",
// 图标
"pic": "",
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 跳转链接
"link": "",
// 该模块数据总数
"count": 0,
"is_sky_horse_gray": 0
},
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
"list": [
{
"roomid": 0,
"title": "",
"uname": "",
"online": 0,
"cover": "",
"link": "",
"face": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"play_url": "",
"play_url_h265": "",
"current_quality": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_pic": "",
"pendent_ru_color": "",
"rec_type": 0,
"pk_id": 0,
"accept_quality": [
0
]
}
]
}
]
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,106 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Index {
// 首页大接口
// 首页换一换接口
// `dynamic_resp:"true" midware:"guest"`
rpc getAllList (GetAllListReq) returns (GetAllListResp);
// `midware:"guest"`
rpc change (ChangeReq) returns (ChangeResp);
}
message GetAllListResp {
}
// GetAllList请求
message GetAllListReq {
//平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
//设备
string device = 2 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
//分辨率
string scale = 3 [(gogoproto.moretags) = 'form:"scale" validate:"required"'];
//版本号
int64 build = 4 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
//关注页码
int64 relation_page = 5 [(gogoproto.moretags) = 'form:"relation_page" validate:"required"'];
//模块id可选
int64 module_id = 6 [(gogoproto.moretags) = 'form:"module_id"'];
}
// 换一换
message ChangeReq {
// 模块id
// `mock:"1"`
int64 module_id = 1 [(gogoproto.moretags) = 'form:"module_id" validate:"required"'];
string attention_room_id = 2 [(gogoproto.moretags) = 'form:"attention_room_id" validate:"required"'];
// 平台
string platform = 3 [(gogoproto.moretags) = 'form:"platform"'];
//设备
string device = 4 [(gogoproto.moretags) = 'form:"device"'];
//分辨率
string scale = 5 [(gogoproto.moretags) = 'form:"scale"'];
//版本号
int64 build = 6 [(gogoproto.moretags) = 'form:"build"'];
}
// 换一换响应
message ChangeResp {
// 返回码
message List {
int64 roomid = 1 [(gogoproto.jsontag) = 'roomid'];
string title = 2 [(gogoproto.jsontag) = 'title'];
string uname = 3 [(gogoproto.jsontag) = 'uname'];
int64 online = 4 [(gogoproto.jsontag) = 'online'];
string cover = 5 [(gogoproto.jsontag) = 'cover'];
string link = 6 [(gogoproto.jsontag) = 'link'];
string face = 7 [(gogoproto.jsontag) = 'face'];
int64 area_v2_parent_id = 8 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string area_v2_parent_name = 9 [(gogoproto.jsontag) = 'area_v2_parent_name'];
int64 area_v2_id = 10 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 11 [(gogoproto.jsontag) = 'area_v2_name'];
string play_url = 12 [(gogoproto.jsontag) = 'play_url,omitempty'];
string play_url_h265 = 13 [(gogoproto.jsontag) = 'play_url_h265,omitempty'];
int64 current_quality = 14 [(gogoproto.jsontag) = 'current_quality,omitempty'];
int64 broadcast_type = 15 [(gogoproto.jsontag) = 'broadcast_type'];
string pendent_ru = 16 [(gogoproto.jsontag) = 'pendent_ru'];
string pendent_ru_pic = 17 [(gogoproto.jsontag) = 'pendent_ru_pic'];
string pendent_ru_color = 18 [(gogoproto.jsontag) = 'pendent_ru_color'];
int64 rec_type = 19 [(gogoproto.jsontag) = 'rec_type'];
int64 pk_id = 20 [(gogoproto.jsontag) = 'pk_id'];
repeated int64 accept_quality = 21 [(gogoproto.jsontag) = 'accept_quality,omitempty'];
}
message ModuleInfo {
// 模块id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 标题
string title = 2 [(gogoproto.jsontag) = 'title'];
// 图标
string pic = 3 [(gogoproto.jsontag) = 'pic'];
// list数据类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
int64 type = 4 [(gogoproto.jsontag) = 'type'];
// 跳转链接
string link = 5 [(gogoproto.jsontag) = 'link'];
// 该模块数据总数
int64 count = 6 [(gogoproto.jsontag) = 'count'];
int64 is_sky_horse_gray = 7 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
}
message ModuleList {
//
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
// 注意:可能是 PicList{id,pic,link,title}需要根据ModuleInfo里的type判断
repeated List list = 2 [(gogoproto.jsontag) = 'list'];
}
repeated ModuleList module_list = 1 [(gogoproto.jsontag) = 'module_list'];
}

View File

@@ -0,0 +1,73 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v1/relation.pb
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v1/relation.pb
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
// ==================
// Relation Interface
// ==================
// Index 相关服务
type Relation interface {
// [app端关注二级页][全量]正在直播接口
// `midware:"guest"`
LiveAnchor(ctx context.Context, req *LiveAnchorReq) (resp *LiveAnchorResp, err error)
// [app端关注二级页][分页]暂未开播接口
// `midware:"guest"`
UnliveAnchor(ctx context.Context, req *UnLiveAnchorReq) (resp *UnLiveAnchorResp, err error)
}
var v1RelationSvc Relation
// @params LiveAnchorReq
// @router GET /xlive/app-interface/v1/relation/liveAnchor
// @response LiveAnchorResp
func relationLiveAnchor(c *bm.Context) {
p := new(LiveAnchorReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RelationSvc.LiveAnchor(c, p)
c.JSON(resp, err)
}
// @params UnLiveAnchorReq
// @router GET /xlive/app-interface/v1/relation/unliveAnchor
// @response UnLiveAnchorResp
func relationUnliveAnchor(c *bm.Context) {
p := new(UnLiveAnchorReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RelationSvc.UnliveAnchor(c, p)
c.JSON(resp, err)
}
// RegisterV1RelationService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1RelationService(e *bm.Engine, svc Relation, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
v1RelationSvc = svc
e.GET("/xlive/app-interface/v1/relation/liveAnchor", guest, relationLiveAnchor)
e.GET("/xlive/app-interface/v1/relation/unliveAnchor", guest, relationUnliveAnchor)
}

View File

@@ -0,0 +1,151 @@
## [app端关注二级页][全量]正在直播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/liveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|platform|否|string| 平台
|
|device|否|string| 设备
|
|build|否|string| 版本号
|
|sortRule|否|integer| 排序类型
|
|filterRule|否|integer| 筛选类型
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播间标题
"title": "",
// 直播间标签
"live_tag_name": "",
// 开始直播时间
"live_time": 0,
// 人气值
"online": 0,
// 秒开url
"playurl": "",
// 可选清晰度
"accept_quality": [
0
],
// 当前清晰度
"current_quality": 0,
// pk_id
"pk_id": 0,
// 特别关注标志
"special_attention": 0,
// 老的分区id
"area": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 广播适配标志
"broadcast_type": 0,
// 官方认证标志
"official_verify": 0,
// 直播间跳转链接
"link": "",
// 直播间封面
"cover": "",
// 角标文字
"pendent_ru": "",
// 角标颜色
"pendent_ru_color": "",
// 角标背景图
"pendent_ru_pic": ""
}
],
"total_count": 0,
"card_type": 0,
"big_card_type": 0
}
}
```
## [app端关注二级页][分页]暂未开播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/unliveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|page|否|integer| 分页号
|
|pagesize|否|integer| 页大小
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 上次开播描述
"live_desc": "",
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 特别关注标志
"special_attention": 0,
// 官方认证标志
"official_verify": 0,
// 直播状态标志
"live_status": 0,
// 广播适配标志
"broadcast_type": 0,
// 老的分区id
"area": 0,
// 粉丝数
"attentions": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 直播间跳转链接
"link": "",
// 房间页公告
"announcement_content": "",
// 房间页公告发布时间
"announcement_time": ""

View File

@@ -0,0 +1,157 @@
syntax = "proto3";
package live.appinterface.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Relation {
// [app端关注二级页][全量]正在直播接口
// `midware:"guest"`
rpc liveAnchor (LiveAnchorReq) returns (LiveAnchorResp);
// [app端关注二级页][分页]暂未开播接口
// `midware:"guest"`
rpc unliveAnchor (UnLiveAnchorReq) returns (UnLiveAnchorResp);
}
// liveAnchor请求
message LiveAnchorReq {
// 调试咒语
string buyaofangqizhiliao = 1;
// 平台
string platform = 2;
// 设备
string device = 3;
// 版本号
string build = 4;
// 排序类型
int64 sortRule = 5;
// 筛选类型
int64 filterRule = 6;
// 清晰度
int64 quality = 7;
}
// liveAnchor响应
message LiveAnchorResp {
repeated Rooms rooms = 1;
message Rooms {
// 房间id
int64 roomid = 1;
// 用户id
int64 uid = 2;
// 用户昵称
string uname = 3;
// 用户头像
string face = 4;
// 直播间标题
string title = 5;
// 直播间标签
string live_tag_name = 6;
// 开始直播时间
int64 live_time = 7;
// 人气值
int64 online = 8;
// 秒开url
string playurl = 9;
// 可选清晰度
repeated int64 accept_quality = 10;
// 当前清晰度
int64 current_quality = 11;
// pk_id
int64 pk_id = 12;
// 特别关注标志
int64 special_attention = 13;
// 老的分区id
int64 area = 14;
// 老的分区名
string area_name = 15;
// 子分区id
int64 area_v2_id = 16;
// 子分区名
string area_v2_name = 17;
// 父分区名
string area_v2_parent_name = 18;
// 父分区id
int64 area_v2_parent_id = 19;
// 广播适配标志
int64 broadcast_type = 20;
// 官方认证标志
int64 official_verify = 21;
// 直播间跳转链接
string link = 22;
// 直播间封面
string cover = 23;
// 角标文字
string pendent_ru = 24;
// 角标颜色
string pendent_ru_color = 25;
// 角标背景图
string pendent_ru_pic = 26;
string play_url_h265 = 27;
}
int64 total_count = 2;
int64 card_type = 3;
int64 big_card_type = 4;
}
// unLiveAnchor请求
message UnLiveAnchorReq {
// 调试咒语
string buyaofangqizhiliao = 1;
// 分页号
int64 page = 2;
// 页大小
int64 pagesize = 3;
}
// unLiveAnchor响应
message UnLiveAnchorResp {
repeated Rooms rooms = 1;
message Rooms {
// 上次开播描述
string live_desc = 1;
// 房间id
int64 roomid = 2;
// 用户id
int64 uid = 3;
// 用户昵称
string uname = 4;
// 用户头像
string face = 5;
// 特别关注标志
int64 special_attention = 6;
// 官方认证标志
int64 official_verify = 7;
// 直播状态标志
int64 live_status = 8;
// 广播适配标志
int64 broadcast_type = 9;
// 老的分区id
int64 area = 10;
// 粉丝数
int64 attentions = 11;
// 老的分区名
string area_name = 12;
// 子分区id
int64 area_v2_id = 13;
// 子分区名
string area_v2_name = 14;
// 父分区名
string area_v2_parent_name = 15;
// 父分区id
int64 area_v2_parent_id = 16;
// 直播间跳转链接
string link = 17;
// 房间页公告
string announcement_content = 18;
// 房间页公告发布时间
string announcement_time = 19;
}
int64 total_count = 2;
int64 no_room_count = 3;
int64 has_more = 4;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,153 @@
## [app端关注二级页][全量]正在直播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/liveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|platform|否|string| 平台
|
|device|否|string| 设备
|
|build|否|string| 版本号
|
|sortRule|否|integer| 排序类型
|
|filterRule|否|integer| 筛选类型
|
|quality|否|integer| 清晰度
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播间标题
"title": "",
// 直播间标签
"live_tag_name": "",
// 开始直播时间
"live_time": 0,
// 人气值
"online": 0,
// 秒开url
"playurl": "",
// 可选清晰度
"accept_quality": [
0
],
// 当前清晰度
"current_quality": 0,
// pk_id
"pk_id": 0,
// 特别关注标志
"special_attention": 0,
// 老的分区id
"area": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 广播适配标志
"broadcast_type": 0,
// 官方认证标志
"official_verify": 0,
// 直播间跳转链接
"link": "",
// 直播间封面
"cover": "",
// 角标文字
"pendent_ru": "",
// 角标颜色
"pendent_ru_color": "",
// 角标背景图
"pendent_ru_pic": "",
"play_url_h265": ""
}
],
"total_count": 0,
"card_type": 0,
"big_card_type": 0
}
}
```
## [app端关注二级页][分页]暂未开播接口
`GET http://api.live.bilibili.com/xlive/app-interface/v1/relation/unliveAnchor`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|buyaofangqizhiliao|否|string| 调试咒语
|
|page|否|integer| 分页号
|
|pagesize|否|integer| 页大小
|
```json
{
"code": 0,
"message": "ok",
"data": {
"rooms": [
{
// 上次开播描述
"live_desc": "",
// 房间id
"roomid": 0,
// 用户id
"uid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 特别关注标志
"special_attention": 0,
// 官方认证标志
"official_verify": 0,
// 直播状态标志
"live_status": 0,
// 广播适配标志
"broadcast_type": 0,
// 老的分区id
"area": 0,
// 粉丝数
"attentions": 0,
// 老的分区名
"area_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名
"area_v2_name": "",
// 父分区名
"area_v2_parent_name": "",
// 父分区id
"area_v2_parent_id": 0,
// 直播间跳转链接
"link": "",
// 房间页公告
"announcement_content": "",
// 房间页公告发布时间

View File

@@ -0,0 +1,55 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v2_proto",
srcs = ["index.proto"],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v2_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/interface/live/app-interface/api/http/v2",
proto = ":v2_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["index.bm.go"],
embed = [":v2_go_proto"],
importpath = "go-common/app/interface/live/app-interface/api/http/v2",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,72 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: api/http/v2/index.proto
/*
Package v2 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
api/http/v2/index.proto
*/
package v2
import (
"context"
bm "go-common/library/net/http/blademaster"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
// ===============
// Index Interface
// ===============
// Index 相关服务
type Index interface {
// 首页大接口
// `midware:"guest,verify"`
GetAllList(ctx context.Context, req *GetAllListReq) (resp *GetAllListResp, err error)
// 换一换接口
// `midware:"guest,verify"`
Change(ctx context.Context, req *ChangeReq) (resp *ChangeResp, err error)
}
var v2IndexSvc Index
// @params GetAllListReq
// @router GET /xlive/app-interface/v2/index/getAllList
// @response GetAllListResp
func indexGetAllList(c *bm.Context) {
p := new(GetAllListReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v2IndexSvc.GetAllList(c, p)
c.JSON(resp, err)
}
// @params ChangeReq
// @router GET /xlive/app-interface/v2/index/change
// @response ChangeResp
func indexChange(c *bm.Context) {
p := new(ChangeReq)
if err := c.Bind(p); err != nil {
return
}
resp, err := v2IndexSvc.Change(c, p)
c.JSON(resp, err)
}
// RegisterV2IndexService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV2IndexService(e *bm.Engine, svc Index, midMap map[string]bm.HandlerFunc) {
guest := midMap["guest"]
verify := midMap["verify"]
v2IndexSvc = svc
e.GET("/xlive/app-interface/v2/index/getAllList", guest, verify, indexGetAllList)
e.GET("/xlive/app-interface/v2/index/change", guest, verify, indexChange)
}

View File

@@ -0,0 +1,532 @@
## 首页大接口
`GET http://api.live.bilibili.com/xlive/app-interface/v2/index/getAllList`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string| 平台
|
|device|是|string| 设备
|
|scale|是|string| 分辨率
|
|build|是|integer| 版本号
|
|relation_page|是|integer|关注页码
|
|rec_page|否|integer|推荐页码 当前推荐页用于天马强推不传默认按1处理
|
|quality|否|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
// 刷新重新请求间隔
"interval": 0,
// 是否命中天马灰度
"is_sky_horse_gray": 0,
// banner类型
"banner": [
{
// 模块信息
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
// 模块列表
"list": [
{
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
]
}
],
// 常用标签类型
"my_tag": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 是否命中常用标签灰度
"is_gray": 0,
// offline已下线标签
"offline": [
{
"id": 0,
"area_v2_name": ""
}
]
},
"list": [
{
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_id": 0,
"area_v2_parent_name": "",
"pic": "",
"link": "",
"is_advice": 0
}
]
}
],
// 分区入口类型
"area_entrance": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
]
}
],
// 大航海提示类型
"sea_patrol": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 唯一标识id
"id": 0,
// 跳转url
"link": "",
// 图片url
"pic": "",
// 标题
"title": "",
// 内容
"content": ""
}
}
],
// 我的关注类型
"my_idol": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
"total_count": 0,
"time_desc": "",
"uname_desc": "",
"tags_desc": "",
"card_type": 0,
"relation_page": 0
},
"list": [
{
"roomid": 0,
"uid": 0,
"uname": "",
"face": "",
"cover": "",
"title": "",
"area": 0,
"live_time": 0,
"area_name": "",
"area_v2_id": 0,
"area_v2_name": "",
"area_v2_parent_name": "",
"area_v2_parent_id": 0,
"live_tag_name": "",
"online": 0,
"play_url": "",
"play_url_h265": "",
"accept_quality": [
0
],
"current_quality": 0,
"pk_id": 0,
"link": "",
"special_attention": 0,
"broadcast_type": 0,
"pendent_ru": "",
"pendent_ru_color": "",
"pendent_ru_pic": "",
"official_verify": 0
}
]
}
],
// 通用房间列表类型
"room_list": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
// 当前拥有清晰度列表
"accept_quality": [
0
],
// 二级分区id
"area_v2_id": 0,
// 一级分区id
"area_v2_parent_id": 0,
// 二级分区名称
"area_v2_name": "",
// 一级分区名称
"area_v2_parent_name": "",
// 横竖屏 0:横屏 1:竖屏 -1:异常情况
"broadcast_type": 0,
// 封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
"cover": "",
// 当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
"current_quality": 0,
// 主播头像
"face": "",
// 跳转链接
"link": "",
// 人气值
"online": 0,
// 新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
"pendent_ru": "",
// 【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
"pendent_ru_color": "",
// 新版移动端角标色值-右上
"pendent_ru_pic": "",
// pk_id
"pk_id": 0,
// 秒开播放串 h264
"play_url": "",
// 推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
"rec_type": 0,
// 房间id
"roomid": 0,
// 房间标题
"title": "",
// 主播uname
"uname": "",
// 秒开播放串 h265
"play_url_h265": ""
}
]
}
],
// 小时榜类型
"hour_rank": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"extra_info": {
// 14:00-15:00榜单
"sub_title": ""
},
"list": [
{
// 排名
"rank": 0,
// 用户uid
"uid": 0,
// 房间id
"roomid": 0,
// 用户昵称
"uname": "",
// 用户头像
"face": "",
// 直播状态
"live_status": 0,
// 父分区id
"area_v2_parent_id": 0,
// 父分区名称
"area_v2_parent_name": "",
// 子分区id
"area_v2_id": 0,
// 子分区名称
"area_v2_name": ""
}
]
}
],
// 活动卡
"activity_card": [
{
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"list": [
{
"card": {
// 活动id
"aid": 0,
// 活动图片
"pic": "",
// 活动标题
"title": "",
// 活动文案
"text": "",
// 图片链接
"pic_link": "",
// 围观链接
"go_link": "",
// 三种:去围观,预约,已预约
"button_text": "",
// 代表卡片所处于的状态 0可以去围观,1用户可以点击去预约,2用户可以点击取消预约
"status": 0,
// card,room和av排序值
"sort": 0
},
"room": [
{
// 是否开播
"is_live": 0,
// 房间id
"room_id": 0,
// 房间标题
"title": "",
// 主播名
"u_name": "",
// 人气值
"online": 0,
// 封面
"cover": "",
// 父一级分区id
"area_v2_parent_id": 0,
// 二级分区id
"area_v2_id": 0,
// card,room和av排序值
"sort": 0
}
],
"av": [
{
// 视频
"avid": 0,
// avid
"title": "",
// 视频标题
"view_count": 0,
// 浏览
"dan_ma_ku": 0,
// 弹幕
"duration": 0,
// 时长
"cover": "",
// card,room和av排序值
"sort": 0
}
]
}
]
}
]
}
}
```
## 换一换接口
`GET http://api.live.bilibili.com/xlive/app-interface/v2/index/change`
### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|module_id|是|integer|模块id
|
|attention_room_id|否|string|关注的room ids
|
|page|是|integer|换一换的当前页数
|
|platform|是|string||
|build|是|integer||
|device|是|string||
|quality|否|integer||
```json
{
"code": 0,
"message": "ok",
"data": {
"module_info": {
// 模块id
"id": 0,
// 模块跳转链接
"link": "",
// 模块图标
"pic": "",
// 模块标题
"title": "",
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
"type": 0,
// 模块排序值
"sort": 0,
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
"count": 0
},
"is_sky_horse_gray": 0,
"list": [
{
// 当前拥有清晰度列表
"accept_quality": [
0
],
// 二级分区id
"area_v2_id": 0,
// 一级分区id
"area_v2_parent_id": 0,
// 二级分区名称
"area_v2_name": "",
// 一级分区名称
"area_v2_parent_name": "",
// 横竖屏 0:横屏 1:竖屏 -1:异常情况
"broadcast_type": 0,
// 封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
"cover": "",
// 当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
"current_quality": 0,
// 主播头像
"face": "",
// 跳转链接
"link": "",
// 人气值
"online": 0,
// 新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
"pendent_ru": "",
// 【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
"pendent_ru_color": "",
// 新版移动端角标色值-右上
"pendent_ru_pic": "",
// pk_id
"pk_id": 0,
// 秒开播放串 h264
"play_url": "",
// 推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
"rec_type": 0,
// 房间id
"roomid": 0,
// 房间标题
"title": "",
// 主播uname

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,363 @@
syntax = "proto3";
package live.appinterface.v2;
option go_package = "v2";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Index 相关服务
service Index {
// 首页大接口
// `midware:"guest,verify"`
rpc getAllList (GetAllListReq) returns (GetAllListResp);
// 换一换接口
// `midware:"guest,verify"`
rpc change (ChangeReq) returns (ChangeResp);
}
// 接口1GetAllList
message GetAllListReq {
// 平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
// 设备
string device = 2 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
// 分辨率
string scale = 3 [(gogoproto.moretags) = 'form:"scale" validate:"required"'];
// 版本号
int64 build = 4 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
//关注页码
int64 relation_page = 5 [(gogoproto.moretags) = 'form:"relation_page" validate:"required"'];
//推荐页码 当前推荐页用于天马强推不传默认按1处理
int64 rec_page = 6 [(gogoproto.moretags) = 'form:"rec_page"'];
int64 quality = 7 [(gogoproto.moretags) = 'form:"quality"'];
}
// GetAllList响应
message GetAllListResp {
//刷新重新请求间隔
int64 interval = 1 [(gogoproto.jsontag) = 'interval'];
//是否命中天马灰度
int64 is_sky_horse_gray = 2 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
//banner类型
repeated MBanner banner = 3 [(gogoproto.jsontag) = 'banner'];
//常用标签类型
repeated MMyTag my_tag = 4 [(gogoproto.jsontag) = 'my_tag'];
//分区入口类型
repeated MAreaEntrance area_entrance = 5 [(gogoproto.jsontag) = 'area_entrance'];
//大航海提示类型
repeated MSeaPatrol sea_patrol = 6 [(gogoproto.jsontag) = 'sea_patrol'];
//我的关注类型
repeated MMyIdol my_idol = 7 [(gogoproto.jsontag) = 'my_idol'];
//通用房间列表类型
repeated MRoomBlock room_list = 8 [(gogoproto.jsontag) = 'room_list'];
//小时榜类型
repeated MHourRank hour_rank = 9 [(gogoproto.jsontag) = 'hour_rank'];
//活动卡
repeated MActivityCard activity_card = 10 [(gogoproto.jsontag) = 'activity_card'];
}
// module define begin
// banner banner位
message MBanner {
// 模块信息
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
// 模块列表
repeated PicItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// MyTag 常用标签
message MMyTag {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
MyTagExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated MyTagItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// AreaEntrance 分区入口
message MAreaEntrance {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated PicItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// SeaPatrol 大航海提示
message MSeaPatrol {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
PicItem extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
}
// MyIdol 我的关注
message MMyIdol {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
MyIdolExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated MyIdolItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// RoomList 房间列表
message MRoomBlock {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated CommonRoomItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// MHourRank 小时榜
message MHourRank {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
HourRankExtra extra_info = 2 [(gogoproto.jsontag) = 'extra_info'];
repeated HourRankItem list = 3 [(gogoproto.jsontag) = 'list'];
}
// MActivityCard 活动卡
message MActivityCard {
ModuleInfo module_info = 1 [(gogoproto.jsontag) = 'module_info'];
repeated ActivityCardItem list = 2 [(gogoproto.jsontag) = 'list'];
}
// ...
// ModuleInfo
message ModuleInfo {
// 模块id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
// 模块跳转链接
string link = 2 [(gogoproto.jsontag) = 'link'];
// 模块图标
string pic = 3 [(gogoproto.jsontag) = 'pic'];
// 模块标题
string title = 4 [(gogoproto.jsontag) = 'title'];
// 模块类型 1: banner 2: 导航栏 3: 运营推荐分区-标准 4: 运营推荐分区-方 5排行榜小时榜 6: 推荐主播-标准 7: 推荐主播-方 8:我的关注(用户相关) 9一级分区-标准 10一级分区-方 11: 活动卡片 12常用标签推荐入口(用户相关) 13常用标签推荐房间列表(用户相关) 14大航海提示入口
int64 type = 5 [(gogoproto.jsontag) = 'type'];
// 模块排序值
int64 sort = 6 [(gogoproto.jsontag) = 'sort'];
// 模块数据源数量按需、目前只有推荐有其它模块都是默认值0
int64 count = 7 [(gogoproto.jsontag) = 'count'];
}
// PicItem 比如banner、分区入口、大航海提示等等
message PicItem {
//唯一标识id
int64 id = 1 [(gogoproto.jsontag) = 'id'];
//跳转url
string link = 2 [(gogoproto.jsontag) = 'link'];
//图片url
string pic = 3 [(gogoproto.jsontag) = 'pic'];
//标题
string title = 4 [(gogoproto.jsontag) = 'title'];
//内容
string content = 5 [(gogoproto.jsontag) = 'content'];
}
// MyTagItem
message MyTagItem {
int64 area_v2_id = 1 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 2 [(gogoproto.jsontag) = 'area_v2_name'];
int64 area_v2_parent_id = 3 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string area_v2_parent_name = 4 [(gogoproto.jsontag) = 'area_v2_parent_name'];
string pic = 5 [(gogoproto.jsontag) = 'pic'];
string link = 6 [(gogoproto.jsontag) = 'link'];
int64 is_advice = 7 [(gogoproto.jsontag) = 'is_advice'];
}
// MyTagExtra
message MyTagExtra {
//是否命中常用标签灰度
int64 is_gray = 1 [(gogoproto.jsontag) = 'is_gray'];
//offline已下线标签
repeated OfflineTag offline = 2 [(gogoproto.jsontag) = 'offline'];
}
// OfflineTag
message OfflineTag {
int64 id = 1 [(gogoproto.jsontag) = 'id'];
string area_v2_name = 2 [(gogoproto.jsontag) = 'area_v2_name'];
}
// MyIdolExtra
message MyIdolExtra {
int64 total_count = 1 [(gogoproto.jsontag) = 'total_count'];
string time_desc = 2 [(gogoproto.jsontag) = 'time_desc'];
string uname_desc = 3 [(gogoproto.jsontag) = 'uname_desc'];
string tags_desc = 4 [(gogoproto.jsontag) = 'tags_desc'];
int64 card_type = 5 [(gogoproto.jsontag) = 'card_type'];
int64 relation_page = 6 [(gogoproto.jsontag) = 'relation_page'];
}
// MyIdolItem
message MyIdolItem {
int64 roomid = 1 [(gogoproto.jsontag) = 'roomid'];
int64 uid = 2 [(gogoproto.jsontag) = 'uid'];
string uname = 3 [(gogoproto.jsontag) = 'uname'];
string face = 4 [(gogoproto.jsontag) = 'face'];
string cover = 5 [(gogoproto.jsontag) = 'cover'];
string title = 6 [(gogoproto.jsontag) = 'title'];
int64 area = 7 [(gogoproto.jsontag) = 'area'];
int64 live_time = 8 [(gogoproto.jsontag) = 'live_time'];
string area_name = 9 [(gogoproto.jsontag) = 'area_name'];
int64 area_v2_id = 10 [(gogoproto.jsontag) = 'area_v2_id'];
string area_v2_name = 11 [(gogoproto.jsontag) = 'area_v2_name'];
string area_v2_parent_name = 12 [(gogoproto.jsontag) = 'area_v2_parent_name'];
int64 area_v2_parent_id = 13 [(gogoproto.jsontag) = 'area_v2_parent_id'];
string live_tag_name = 14 [(gogoproto.jsontag) = 'live_tag_name'];
int64 online = 15 [(gogoproto.jsontag) = 'online'];
string play_url = 16 [(gogoproto.jsontag) = 'play_url'];
string play_url_h265 = 17 [(gogoproto.jsontag) = 'play_url_h265'];
repeated int64 accept_quality = 18 [(gogoproto.jsontag) = 'accept_quality'];
int64 current_quality = 19 [(gogoproto.jsontag) = 'current_quality'];
int64 pk_id = 20 [(gogoproto.jsontag) = 'pk_id'];
string link = 21 [(gogoproto.jsontag) = 'link'];
int64 special_attention = 22 [(gogoproto.jsontag) = 'special_attention'];
int64 broadcast_type = 23 [(gogoproto.jsontag) = 'broadcast_type'];
string pendent_ru = 24 [(gogoproto.jsontag) = 'pendent_ru'];
string pendent_ru_color = 25 [(gogoproto.jsontag) = 'pendent_ru_color'];
string pendent_ru_pic = 26 [(gogoproto.jsontag) = 'pendent_ru_pic'];
int64 official_verify = 27 [(gogoproto.jsontag) = 'official_verify'];
}
// ActivityCardItem
message ActivityCardItem {
BannerCardItem card = 1 [(gogoproto.jsontag) = 'card'];
repeated RoomCardItem room = 2 [(gogoproto.jsontag) = 'room'];
repeated AvCardItem av = 3 [(gogoproto.jsontag) = 'av'];
}
// BannerCardItem
message BannerCardItem {
//活动id
int64 aid = 1 [(gogoproto.jsontag) = 'aid'];
//活动图片
string pic = 2 [(gogoproto.jsontag) = 'pic'];
//活动标题
string title = 3 [(gogoproto.jsontag) = 'title'];
//活动文案
string text = 4 [(gogoproto.jsontag) = 'text'];
//图片链接
string pic_link = 5 [(gogoproto.jsontag) = 'pic_link'];
//围观链接
string go_link = 6 [(gogoproto.jsontag) = 'go_link'];
//三种:去围观,预约,已预约
string button_text = 7 [(gogoproto.jsontag) = 'button_text'];
//代表卡片所处于的状态 0可以去围观,1用户可以点击去预约,2用户可以点击取消预约
int64 status = 8 [(gogoproto.jsontag) = 'status'];
//card,room和av排序值
int64 sort = 9 [(gogoproto.jsontag) = 'sort'];
}
// RoomCardItem
message RoomCardItem {
//是否开播
int64 is_live = 1 [(gogoproto.jsontag) = 'is_live'];
//房间id
int64 room_id = 2 [(gogoproto.jsontag) = 'room_id'];
//房间标题
string title = 3 [(gogoproto.jsontag) = 'title'];
//主播名
string u_name = 4 [(gogoproto.jsontag) = 'u_name'];
//人气值
int64 online = 5 [(gogoproto.jsontag) = 'online'];
//封面
string cover = 6 [(gogoproto.jsontag) = 'cover'];
//父一级分区id
int64 area_v2_parent_id = 7 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//二级分区id
int64 area_v2_id = 8 [(gogoproto.jsontag) = 'area_v2_id'];
//card,room和av排序值
int64 sort = 9 [(gogoproto.jsontag) = 'sort'];
}
// AvCardItem
message AvCardItem {
//视频
int64 avid = 1 [(gogoproto.jsontag) = 'avid'];
//avid
string title = 2 [(gogoproto.jsontag) = 'title'];
//视频标题
int64 view_count = 3 [(gogoproto.jsontag) = 'view_count'];
//浏览
int64 dan_ma_ku = 4 [(gogoproto.jsontag) = 'dan_ma_ku'];
//弹幕
int64 duration = 5 [(gogoproto.jsontag) = 'duration'];
//时长
string cover = 6 [(gogoproto.jsontag) = 'cover'];
//card,room和av排序值
int64 sort = 7 [(gogoproto.jsontag) = 'sort'];
}
// CommonRoomItem
message CommonRoomItem {
//当前拥有清晰度列表
repeated int64 accept_quality = 1 [(gogoproto.jsontag) = 'accept_quality'];
//二级分区id
int64 area_v2_id = 2 [(gogoproto.jsontag) = 'area_v2_id'];
//一级分区id
int64 area_v2_parent_id = 3 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//二级分区名称
string area_v2_name = 4 [(gogoproto.jsontag) = 'area_v2_name'];
//一级分区名称
string area_v2_parent_name = 5 [(gogoproto.jsontag) = 'area_v2_parent_name'];
//横竖屏 0:横屏 1:竖屏 -1:异常情况
int64 broadcast_type = 6 [(gogoproto.jsontag) = 'broadcast_type'];
//封面封面现在有3种关键帧、封面图、秀场封面正方形的返回哪个由后端决定
string cover = 7 [(gogoproto.jsontag) = 'cover'];
//当前清晰度,清晰度((0)) 0:默认码率, 2:800 3:1500 4:原画
int64 current_quality = 8 [(gogoproto.jsontag) = 'current_quality'];
//主播头像
string face = 9 [(gogoproto.jsontag) = 'face'];
//跳转链接
string link = 10 [(gogoproto.jsontag) = 'link'];
//人气值
int64 online = 11 [(gogoproto.jsontag) = 'online'];
//新版角标-右上 默认为空 只能是文字!!!@古月 【5.29显示更新】服务端还是吐右上兼容老版5.29显示在左上
string pendent_ru = 12 [(gogoproto.jsontag) = 'pendent_ru'];
//【5.29显示更新】服务端还是吐右上5.29客户端显示在左上,对应的背景图片
string pendent_ru_color = 13 [(gogoproto.jsontag) = 'pendent_ru_color'];
//新版移动端角标色值-右上
string pendent_ru_pic = 14 [(gogoproto.jsontag) = 'pendent_ru_pic'];
//pk_id
int64 pk_id = 15 [(gogoproto.jsontag) = 'pk_id'];
//秒开播放串 h264
string play_url = 16 [(gogoproto.jsontag) = 'play_url'];
//推荐类型 1人气 2营收 3运营强推 4天马推荐暂定用于客户端打点
int64 rec_type = 17 [(gogoproto.jsontag) = 'rec_type'];
//房间id
int64 roomid = 18 [(gogoproto.jsontag) = 'roomid'];
//房间标题
string title = 19 [(gogoproto.jsontag) = 'title'];
//主播uname
string uname = 20 [(gogoproto.jsontag) = 'uname'];
//秒开播放串 h265
string play_url_h265 = 21 [(gogoproto.jsontag) = 'play_url_h265'];
}
// HourRankItem
message HourRankItem {
//排名
int64 rank = 1 [(gogoproto.jsontag) = 'rank'];
//用户uid
int64 uid = 2 [(gogoproto.jsontag) = 'uid'];
//房间id
int64 roomid = 3 [(gogoproto.jsontag) = 'roomid'];
//用户昵称
string uname = 4 [(gogoproto.jsontag) = 'uname'];
//用户头像
string face = 5 [(gogoproto.jsontag) = 'face'];
//直播状态
int64 live_status = 6 [(gogoproto.jsontag) = 'live_status'];
//父分区id
int64 area_v2_parent_id = 7 [(gogoproto.jsontag) = 'area_v2_parent_id'];
//父分区名称
string area_v2_parent_name = 8 [(gogoproto.jsontag) = 'area_v2_parent_name'];
//子分区id
int64 area_v2_id = 9 [(gogoproto.jsontag) = 'area_v2_id'];
//子分区名称
string area_v2_name = 10 [(gogoproto.jsontag) = 'area_v2_name'];
}
message HourRankExtra {
//14:00-15:00榜单
string sub_title = 1 [(gogoproto.jsontag) = 'sub_title'];
}
// 接口2换一换
message ChangeReq {
//模块id
int64 module_id = 1 [(gogoproto.moretags) = 'form:"module_id" validate:"required"'];
//关注的room ids
string attention_room_id = 2 [(gogoproto.moretags) = 'form:"attention_room_id"'];
//换一换的当前页数
int64 page = 3 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
string platform = 4 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 build = 5 [(gogoproto.moretags) = 'form:"build" validate:"required"'];
string device = 6 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
int64 quality = 7 [(gogoproto.moretags) = 'form:"quality"'];
}
// 换一换响应
message ChangeResp {
ModuleInfo module_info = 1;
int64 is_sky_horse_gray = 2 [(gogoproto.jsontag) = 'is_sky_horse_gray'];
repeated CommonRoomItem list = 3;
}