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,42 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["const.go"],
importpath = "go-common/app/interface/main/app-intl/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-intl/model/bangumi:all-srcs",
"//app/interface/main/app-intl/model/feed:all-srcs",
"//app/interface/main/app-intl/model/manager:all-srcs",
"//app/interface/main/app-intl/model/player:all-srcs",
"//app/interface/main/app-intl/model/region:all-srcs",
"//app/interface/main/app-intl/model/search:all-srcs",
"//app/interface/main/app-intl/model/tag:all-srcs",
"//app/interface/main/app-intl/model/view:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,27 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["bangumi.go"],
importpath = "go-common/app/interface/main/app-intl/model/bangumi",
tags = ["automanaged"],
)
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,82 @@
package bangumi
import "encoding/json"
// Season struct
type Season struct {
AllowDownload string `json:"allow_download,omitempty"`
SeasonID string `json:"season_id,omitempty"`
IsJump int `json:"is_jump,omitempty"`
Title string `json:"title,omitempty"`
Cover string `json:"cover,omitempty"`
IsFinish string `json:"is_finish,omitempty"`
NewestEpID string `json:"newest_ep_id,omitempty"`
NewestEpIndex string `json:"newest_ep_index,omitempty"`
TotalCount string `json:"total_count,omitempty"`
Weekday string `json:"weekday,omitempty"`
UserSeason *struct {
Attention string `json:"attention,omitempty"`
} `json:"user_season,omitempty"`
Player *struct {
Aid int64 `json:"aid,omitempty"`
Vid string `json:"vid,omitempty"`
Cid int64 `json:"cid,omitempty"`
From string `json:"from,omitempty"`
} `json:"player,omitempty"`
}
// Movie struct
type Movie struct {
AllowDownload int8 `json:"allow_download,omitempty"`
MovieStatus int `json:"movie_status"`
PayUser *struct {
Status int `json:"status"`
} `json:"pay_user"`
Payment json.RawMessage `json:"payment,omitempty"`
Season *struct {
Actor json.RawMessage `json:"actor,omitempty"`
Area string `json:"area"`
Areas json.RawMessage `json:"areas,omitempty"`
Cover string `json:"cover"`
Evaluate string `json:"evaluate"`
PubTime string `json:"pub_time"`
SeasonID int `json:"season_id"`
Tags json.RawMessage `json:"tags,omitempty"`
Title string `json:"title"`
TotalDuration int `json:"total_duration"`
} `json:"season"`
TrailerAid int `json:"trailer_aid"`
VideoLength int `json:"video_length"`
VipQuality int `json:"vip_quality"`
Activity json.RawMessage `json:"activity,omitempty"`
List []struct {
Cid int64 `json:"cid"`
HasAlias bool `json:"has_alias"`
Page int `json:"page"`
Part string `json:"part"`
Type string `json:"type"`
Vid string `json:"vid"`
} `json:"list,omitempty"`
}
// Card for bangumi.
type Card struct {
SeasonID int64 `json:"season_id"`
SeasonType int `json:"season_type"`
IsFollow int `json:"is_follow"`
IsSelection int `json:"is_selection"`
Badge string `json:"badge"`
BadgeType int `json:"badge_type"`
Episodes []*Episode `json:"episodes"`
}
// Episode for bangumi card.
type Episode struct {
ID int64 `json:"id"`
Badge string `json:"badge"`
BadgeType int `json:"badge_type"`
Status int `json:"status"`
Cover string `json:"cover"`
Index string `json:"index"`
IndexTitle string `json:"index_title"`
}

View File

@@ -0,0 +1,281 @@
package model
import (
"encoding/json"
"fmt"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
"net/url"
"strings"
)
const (
// PlatAndroid is int8 for android.
PlatAndroid = int8(0)
// PlatIPhone is int8 for iphone.
PlatIPhone = int8(1)
// PlatIPad is int8 for ipad.
PlatIPad = int8(2)
// PlatWPhone is int8 for wphone.
PlatWPhone = int8(3)
// PlatAndroidG is int8 for Android Global.
PlatAndroidG = int8(4)
// PlatIPhoneI is int8 for Iphone Global.
PlatIPhoneI = int8(5)
// PlatIPadI is int8 for IPAD Global.
PlatIPadI = int8(6)
// PlatAndroidTV is int8 for AndroidTV Global.
PlatAndroidTV = int8(7)
// PlatAndroidI is int8 for Android Global.
PlatAndroidI = int8(8)
GotoAv = "av"
GotoWeb = "web"
GotoBangumi = "bangumi"
GotoPGC = "pgc"
GotoLive = "live"
GotoGame = "game"
GotoAdAv = "ad_av"
GotoAdWeb = "ad_web"
GotoRank = "rank"
GotoBangumiRcmd = "bangumi_rcmd"
GotoLogin = "login"
GotoBanner = "banner"
GotoAdWebS = "ad_web_s"
GotoConverge = "converge"
GotoSpecial = "special"
GotoArticle = "article"
GotoArticleS = "article_s"
GotoGameDownloadS = "game_download_s"
GotoShoppingS = "shopping_s"
GotoAudio = "audio"
GotoPlayer = "player"
GotoAdLarge = "ad_large"
GotoSpecialS = "special_s"
GotoPlayerLive = "player_live"
GotoSong = "song"
GotoLiveUpRcmd = "live_up_rcmd"
GotoUpRcmdAv = "up_rcmd_av"
GotoSubscribe = "subscribe"
GotoSearchSubscribe = "search_subscribe"
GotoChannelRcmd = "channel_rcmd"
GotoMoe = "moe"
// GotoAuthor is search
GotoAuthor = "author"
GotoSp = "sp"
GotoMovie = "movie"
GotoEP = "ep"
GotoSuggestKeyWord = "suggest_keyword"
GotoRecommendWord = "recommend_word"
GotoTwitter = "twitter"
GotoChannel = "channel"
FromOrder = "order"
FromOperation = "operation"
FromRcmd = "recommend"
CoverIng = "即将上映"
CoverPay = "付费观看"
CoverFree = "免费观看"
CoverVipFree = "付费观看"
CoverVipOnly = "专享"
CoverVipFirst = "抢先"
Hans = "hans"
Hant = "hant"
// ForbidCode is forbid by law
ForbidCode = -110
NoResultCode = -111
)
var (
// AvHandler is handler
AvHandler = func(a *api.Arc, trackid string, ap *archive.PlayerInfo) func(uri string) string {
var player string
if ap != nil {
bs, _ := json.Marshal(ap)
player = url.QueryEscape(string(bs))
if strings.IndexByte(player, '+') > -1 {
player = strings.Replace(player, "+", "%20", -1)
}
}
return func(uri string) string {
if a == nil {
return uri
}
var uriStr string
if player != "" && (a.Dimension.Height != 0 || a.Dimension.Width != 0) {
uriStr = fmt.Sprintf("%s?page=1&player_preload=%s&player_width=%d&player_height=%d&player_rotate=%d", uri, player, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
} else if player != "" {
uriStr = fmt.Sprintf("%s?page=1&player_preload=%s", uri, player)
} else if a.Dimension.Height != 0 || a.Dimension.Width != 0 {
uriStr = fmt.Sprintf("%s?player_width=%d&player_height=%d&player_rotate=%d", uri, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
}
if trackid != "" {
if uriStr == "" {
uriStr = fmt.Sprintf("%s?trackid=%s", uri, trackid)
} else {
uriStr = fmt.Sprintf("%s&trackid=%s", uriStr, trackid)
}
}
if uriStr != "" {
return uriStr
}
return uri
}
}
)
// TWLocale is taiwan locale
func TWLocale(locale string) bool {
var twLocalem = map[string]struct{}{
"zh_hk": struct{}{},
"zh_mo": struct{}{},
"zh_tw": struct{}{},
}
_, ok := twLocalem[strings.ToLower(locale)]
return ok
}
// Plat return plat by platStr or mobiApp
func Plat(mobiApp, device string) int8 {
switch mobiApp {
case "iphone":
if device == "pad" {
return PlatIPad
}
return PlatIPhone
case "white":
return PlatIPhone
case "ipad":
return PlatIPad
case "android", "android_b":
return PlatAndroid
case "win":
return PlatWPhone
case "android_G":
return PlatAndroidG
case "android_i":
return PlatAndroidI
case "iphone_i":
if device == "pad" {
return PlatIPadI
}
return PlatIPhoneI
case "ipad_i":
return PlatIPadI
case "android_tv":
return PlatAndroidTV
}
return PlatIPhone
}
// IsAndroid check plat is android or ipad.
func IsAndroid(plat int8) bool {
return plat == PlatAndroid || plat == PlatAndroidG
}
// IsIOS check plat is iphone or ipad.
func IsIOS(plat int8) bool {
return plat == PlatIPad || plat == PlatIPhone || plat == PlatIPadI || plat == PlatIPhoneI
}
// IsIPhone check plat is iphone.
func IsIPhone(plat int8) bool {
return plat == PlatIPhone || plat == PlatIPhoneI
}
// IsIPad check plat is pad.
func IsIPad(plat int8) bool {
return plat == PlatIPad || plat == PlatIPadI
}
// IsOverseas is overseas
func IsOverseas(plat int8) bool {
return plat == PlatAndroidI || plat == PlatIPhoneI || plat == PlatIPadI
}
// FillURI deal app schema.
func FillURI(gt, param string, f func(uri string) string) (uri string) {
if param == "" {
return
}
switch gt {
case GotoAv, "":
uri = "bilibili://video/" + param
case GotoLive:
uri = "bilibili://live/" + param
case GotoBangumi:
uri = "bilibili://bangumi/season/" + param
case GotoGame:
uri = "bilibili://game_center/detail?id=" + param + "&sourceType=adPut"
case GotoSp:
uri = "bilibili://splist/" + param
case GotoAuthor:
uri = "bilibili://author/" + param
case GotoArticle:
uri = "bilibili://article/" + param
case GotoWeb:
uri = param
case GotoPGC:
uri = "https://www.bilibili.com/bangumi/play/ss" + param
case GotoChannel:
uri = "bilibili://pegasus/channel/" + param + "/"
case GotoEP:
uri = "https://www.bilibili.com/bangumi/play/ep" + param
case GotoTwitter:
uri = "bilibili://pictureshow/detail/" + param
default:
return
}
if f != nil {
uri = f(uri)
}
return
}
// InvalidBuild check source build is not allow by config build and condition.
// eg: when condition is gt, means srcBuild must gt cfgBuild, otherwise is invalid srcBuild.
func InvalidBuild(srcBuild, cfgBuild int, cfgCond string) bool {
if cfgBuild != 0 && cfgCond != "" {
switch cfgCond {
case "gt":
if cfgBuild >= srcBuild {
return true
}
case "lt":
if cfgBuild <= srcBuild {
return true
}
case "eq":
if cfgBuild != srcBuild {
return true
}
case "ne":
if cfgBuild == srcBuild {
return true
}
}
}
return false
}
// StatusMark cover status mark
func StatusMark(status int) string {
if status == 0 {
return CoverIng
} else if status == 1 {
return CoverPay
} else if status == 2 {
return CoverFree
} else if status == 3 {
return CoverVipFree
} else if status == 4 {
return CoverVipOnly
} else if status == 5 {
return CoverVipFirst
}
return ""
}

View File

@@ -0,0 +1,29 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["feed.go"],
importpath = "go-common/app/interface/main/app-intl/model/feed",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//app/interface/main/app-card/model: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,41 @@
package feed
import (
cdm "go-common/app/interface/main/app-card/model"
)
// IndexParam struct
type IndexParam struct {
Build int `form:"build"`
Platform string `form:"platform"`
MobiApp string `form:"mobi_app"`
Device string `form:"device"`
Network string `form:"network"`
// idx, err := strconv.ParseInt(idxStr, 10, 64)
// if err != nil || idx < 0 {
// idx = 0
// }
Idx int64 `form:"idx" default:"0"`
// pull, err := strconv.ParseBool(pullStr)
// if err != nil {
// pull = true
// }
Pull bool `form:"pull" default:"true"`
Column cdm.ColumnStatus `form:"column"`
// loginEvent, err := strconv.Atoi(loginEventStr)
// if err != nil {
// loginEvent = 0
// }
LoginEvent int `form:"login_event" default:"0"`
OpenEvent string `form:"open_event"`
BannerHash string `form:"banner_hash"`
AdExtra string `form:"ad_extra"`
Qn int `form:"qn" default:"0"`
Interest string `form:"interest"`
Flush int `form:"flush"`
AutoPlayCard int `form:"autoplay_card"`
Fnver int `form:"fnver" default:"0"`
Fnval int `form:"fnval" default:"0"`
DeviceType int `form:"device_type"`
Locale string `form:"locale"`
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["manager.go"],
importpath = "go-common/app/interface/main/app-intl/model/manager",
tags = ["automanaged"],
deps = [
"//library/log:go_default_library",
"//library/time:go_default_library",
"//library/xstr: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,85 @@
package manager
import (
"encoding/json"
"go-common/library/log"
xtime "go-common/library/time"
"go-common/library/xstr"
)
// Relate struct
type Relate struct {
ID int64 `json:"id,omitempty"`
Param int64 `json:"param,omitempty"`
Goto string `json:"goto,omitempty"`
Title string `json:"title,omitempty"`
ResourceIDs string `json:"resource_ids,omitempty"`
TagIDs string `json:"tag_ids,omitempty"`
ArchiveIDs string `json:"archive_ids,omitempty"`
RecReason string `json:"rec_reason,omitempty"`
Position int `json:"position,omitempty"`
STime xtime.Time `json:"stime,omitempty"`
ETime xtime.Time `json:"etime,omitempty"`
PlatVer json.RawMessage `json:"plat_ver,omitempty"`
Versions map[int8][]*Version `json:"versions,omitempty"`
Aids map[int64]struct{}
Tids map[int64]struct{}
Rids map[int64]struct{}
}
// Version struct
type Version struct {
Plat int8 `json:"plat,omitempty"`
Build int `json:"build,omitempty"`
Condition string `json:"conditions,omitempty"`
}
// Change is.
func (r *Relate) Change() {
var (
vs []*Version
err error
)
if r.ArchiveIDs != "" {
var aids []int64
if aids, err = xstr.SplitInts(r.ArchiveIDs); err != nil {
log.Error("xstr.SplitInts(%s) error(%v)", r.ArchiveIDs, err)
return
}
r.Aids = make(map[int64]struct{}, len(aids))
for _, aid := range aids {
r.Aids[aid] = struct{}{}
}
}
if r.TagIDs != "" {
var tids []int64
if tids, err = xstr.SplitInts(r.TagIDs); err != nil {
log.Error("xstr.SplitInts(%s) error(%v)", r.TagIDs, err)
return
}
r.Tids = make(map[int64]struct{}, len(tids))
for _, tid := range tids {
r.Tids[tid] = struct{}{}
}
}
if r.ResourceIDs != "" {
var rids []int64
if rids, err = xstr.SplitInts(r.ResourceIDs); err != nil {
log.Error("xstr.SplitInts(%s) error(%v)", r.ResourceIDs, err)
return
}
r.Rids = make(map[int64]struct{}, len(rids))
for _, rid := range rids {
r.Rids[rid] = struct{}{}
}
}
if err = json.Unmarshal(r.PlatVer, &vs); err != nil {
log.Error("json.Unmarshal(%s) error(%v)", r.PlatVer, err)
return
}
vm := make(map[int8][]*Version, len(vs))
for _, v := range vs {
vm[v.Plat] = append(vm[v.Plat], v)
}
r.Versions = vm
}

View File

@@ -0,0 +1,31 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["model.go"],
importpath = "go-common/app/interface/main/app-intl/model/player",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/interface/main/app-intl/model/player/archive:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,49 @@
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 = ["archive.go"],
embed = [":archive_go_proto"],
importpath = "go-common/app/interface/main/app-intl/model/player/archive",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["@com_github_golang_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 = "archive_proto",
srcs = ["model.proto"],
tags = ["automanaged"],
)
go_proto_library(
name = "archive_go_proto",
compilers = ["@io_bazel_rules_go//proto:go_proto"],
importpath = "go-common/app/interface/main/app-intl/model/player/archive",
proto = ":archive_proto",
tags = ["automanaged"],
)

View File

@@ -0,0 +1,37 @@
package archive
// is
const (
StateOpen = int32(0)
AttrNo = int32(0)
AttrYes = int32(1)
AttrBitBadgepay = uint(18)
AttrBitUGCPay = uint(22)
AttrBitIsPGC = uint(9)
)
// IsNormal check archive is normal.
func (info *Info) IsNormal() bool {
return info.State >= StateOpen
}
// IsPGC is.
func (info *Info) IsPGC() bool {
return info.AttrVal(AttrBitIsPGC) == AttrYes
}
// AttrVal get attr val by bit.
func (info *Info) AttrVal(bit uint) int32 {
return (info.Attribute >> bit) & int32(1)
}
// HasCid check cid is in info.Cids.
func (info *Info) HasCid(cid int64) (ok bool) {
for _, id := range info.Cids {
if cid == id {
ok = true
break
}
}
return
}

View File

@@ -0,0 +1,511 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: model.proto
/*
Package archive is a generated protocol buffer package.
It is generated from these files:
model.proto
It has these top-level messages:
Info
*/
package archive
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
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.ProtoPackageIsVersion2 // please upgrade the proto package
type Info struct {
Aid int64 `protobuf:"varint,1,opt,name=aid,proto3" json:"aid,omitempty"`
Cids []int64 `protobuf:"varint,2,rep,packed,name=cids" json:"cids,omitempty"`
State int32 `protobuf:"varint,3,opt,name=state,proto3" json:"state,omitempty"`
Mid int64 `protobuf:"varint,4,opt,name=mid,proto3" json:"mid,omitempty"`
Attribute int32 `protobuf:"varint,5,opt,name=attribute,proto3" json:"attribute,omitempty"`
}
func (m *Info) Reset() { *m = Info{} }
func (m *Info) String() string { return proto.CompactTextString(m) }
func (*Info) ProtoMessage() {}
func (*Info) Descriptor() ([]byte, []int) { return fileDescriptorModel, []int{0} }
func (m *Info) GetAid() int64 {
if m != nil {
return m.Aid
}
return 0
}
func (m *Info) GetCids() []int64 {
if m != nil {
return m.Cids
}
return nil
}
func (m *Info) GetState() int32 {
if m != nil {
return m.State
}
return 0
}
func (m *Info) GetMid() int64 {
if m != nil {
return m.Mid
}
return 0
}
func (m *Info) GetAttribute() int32 {
if m != nil {
return m.Attribute
}
return 0
}
func init() {
proto.RegisterType((*Info)(nil), "archive.Info")
}
func (m *Info) 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 *Info) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Aid != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintModel(dAtA, i, uint64(m.Aid))
}
if len(m.Cids) > 0 {
dAtA2 := make([]byte, len(m.Cids)*10)
var j1 int
for _, num1 := range m.Cids {
num := uint64(num1)
for num >= 1<<7 {
dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
j1++
}
dAtA2[j1] = uint8(num)
j1++
}
dAtA[i] = 0x12
i++
i = encodeVarintModel(dAtA, i, uint64(j1))
i += copy(dAtA[i:], dAtA2[:j1])
}
if m.State != 0 {
dAtA[i] = 0x18
i++
i = encodeVarintModel(dAtA, i, uint64(m.State))
}
if m.Mid != 0 {
dAtA[i] = 0x20
i++
i = encodeVarintModel(dAtA, i, uint64(m.Mid))
}
if m.Attribute != 0 {
dAtA[i] = 0x28
i++
i = encodeVarintModel(dAtA, i, uint64(m.Attribute))
}
return i, nil
}
func encodeFixed64Model(dAtA []byte, offset int, v uint64) int {
dAtA[offset] = uint8(v)
dAtA[offset+1] = uint8(v >> 8)
dAtA[offset+2] = uint8(v >> 16)
dAtA[offset+3] = uint8(v >> 24)
dAtA[offset+4] = uint8(v >> 32)
dAtA[offset+5] = uint8(v >> 40)
dAtA[offset+6] = uint8(v >> 48)
dAtA[offset+7] = uint8(v >> 56)
return offset + 8
}
func encodeFixed32Model(dAtA []byte, offset int, v uint32) int {
dAtA[offset] = uint8(v)
dAtA[offset+1] = uint8(v >> 8)
dAtA[offset+2] = uint8(v >> 16)
dAtA[offset+3] = uint8(v >> 24)
return offset + 4
}
func encodeVarintModel(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 *Info) Size() (n int) {
var l int
_ = l
if m.Aid != 0 {
n += 1 + sovModel(uint64(m.Aid))
}
if len(m.Cids) > 0 {
l = 0
for _, e := range m.Cids {
l += sovModel(uint64(e))
}
n += 1 + sovModel(uint64(l)) + l
}
if m.State != 0 {
n += 1 + sovModel(uint64(m.State))
}
if m.Mid != 0 {
n += 1 + sovModel(uint64(m.Mid))
}
if m.Attribute != 0 {
n += 1 + sovModel(uint64(m.Attribute))
}
return n
}
func sovModel(x uint64) (n int) {
for {
n++
x >>= 7
if x == 0 {
break
}
}
return n
}
func sozModel(x uint64) (n int) {
return sovModel(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *Info) 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 ErrIntOverflowModel
}
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: Info: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: Info: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Aid", wireType)
}
m.Aid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Aid |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType == 0 {
var v int64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.Cids = append(m.Cids, v)
} else if wireType == 2 {
var packedLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
packedLen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if packedLen < 0 {
return ErrInvalidLengthModel
}
postIndex := iNdEx + packedLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
for iNdEx < postIndex {
var v int64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.Cids = append(m.Cids, v)
}
} else {
return fmt.Errorf("proto: wrong wireType = %d for field Cids", wireType)
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field State", wireType)
}
m.State = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.State |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Mid", wireType)
}
m.Mid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Mid |= (int64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Attribute", wireType)
}
m.Attribute = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Attribute |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipModel(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthModel
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipModel(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, ErrIntOverflowModel
}
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, ErrIntOverflowModel
}
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, ErrIntOverflowModel
}
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, ErrInvalidLengthModel
}
return iNdEx, nil
case 3:
for {
var innerWire uint64
var start int = iNdEx
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowModel
}
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 := skipModel(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 (
ErrInvalidLengthModel = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowModel = fmt.Errorf("proto: integer overflow")
)
func init() { proto.RegisterFile("model.proto", fileDescriptorModel) }
var fileDescriptorModel = []byte{
// 159 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xce, 0xcd, 0x4f, 0x49,
0xcd, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x4f, 0x2c, 0x4a, 0xce, 0xc8, 0x2c, 0x4b,
0x55, 0x2a, 0xe2, 0x62, 0xf1, 0xcc, 0x4b, 0xcb, 0x17, 0x12, 0xe0, 0x62, 0x4e, 0xcc, 0x4c, 0x91,
0x60, 0x54, 0x60, 0xd4, 0x60, 0x0e, 0x02, 0x31, 0x85, 0x84, 0xb8, 0x58, 0x92, 0x33, 0x53, 0x8a,
0x25, 0x98, 0x14, 0x98, 0x35, 0x98, 0x83, 0xc0, 0x6c, 0x21, 0x11, 0x2e, 0xd6, 0xe2, 0x92, 0xc4,
0x92, 0x54, 0x09, 0x66, 0x05, 0x46, 0x0d, 0xd6, 0x20, 0x08, 0x07, 0xa4, 0x37, 0x37, 0x33, 0x45,
0x82, 0x05, 0xa2, 0x37, 0x37, 0x33, 0x45, 0x48, 0x86, 0x8b, 0x33, 0xb1, 0xa4, 0xa4, 0x28, 0x33,
0xa9, 0xb4, 0x24, 0x55, 0x82, 0x15, 0xac, 0x16, 0x21, 0xe0, 0x24, 0x70, 0xe2, 0x91, 0x1c, 0xe3,
0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xce, 0x78, 0x2c, 0xc7, 0x90, 0xc4, 0x06, 0x76,
0x95, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xb5, 0xa1, 0xbc, 0xa4, 0x00, 0x00, 0x00,
}

View File

@@ -0,0 +1,10 @@
syntax = "proto3";
package archive;
message Info {
int64 aid = 1;
repeated int64 cids = 2;
int32 state = 3;
int64 mid = 4;
int32 attribute = 5;
}

View File

@@ -0,0 +1,93 @@
package player
// Playurl is http://git.bilibili.co/video/playurl_doc/blob/master/PlayurlV2%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.md
type Playurl struct {
From string `json:"from"`
Result string `json:"result"`
Quality int64 `json:"quality"`
Format string `json:"format"`
Timelength int64 `json:"timelength"`
AcceptFormat string `json:"accept_format"`
AcceptDescription []string `json:"accept_description,omitempty"`
AcceptQuality []int64 `json:"accept_quality"`
VideoCodecid int `json:"video_codecid"`
Fnver int `json:"fnver"`
Fnval int `json:"fnval"`
VideoProject bool `json:"video_project"`
SeekParam string `json:"seek_param"`
SeekType string `json:"seek_type"`
Abtid int `json:"abtid,omitempty"`
Durl []*Durl `json:"durl,omitempty"`
Dash *Dash `json:"dash,omitempty"`
}
// FormatDash dash 驼峰 -> 下划线
func (p *Playurl) FormatDash() {
if p.Dash != nil {
var as, vs []*DashItem
for _, a := range p.Dash.Audio {
as = append(as, &DashItem{
ID: a.ID,
BaseURL: a.BaseURLRes,
BackupURL: a.BackupURLRes,
Bandwidth: a.Bandwidth,
Codecid: a.Codecid,
})
}
for _, v := range p.Dash.Video {
vs = append(vs, &DashItem{
ID: v.ID,
BaseURL: v.BaseURLRes,
BackupURL: v.BackupURLRes,
Bandwidth: v.Bandwidth,
Codecid: v.Codecid,
})
}
p.Dash.Audio = as
p.Dash.Video = vs
}
}
// Durl is
type Durl struct {
Order int `json:"order"`
Length int64 `json:"length"`
Size int64 `json:"size"`
AHead string `json:"ahead,omitempty"`
VHead string `json:"vhead,omitempty"`
URL string `json:"url"`
BackupURL []string `json:"backup_url,omitempty"`
}
//Param is
type Param struct {
AID int64 `form:"aid"`
CID int64 `form:"cid"`
Qn int64 `form:"qn"`
Npcybs int `form:"npcybs"`
Otype string `form:"otype"`
MobiApp string `form:"mobi_app"`
Fnver int `form:"fnver"`
Fnval int `form:"fnval"`
Session string `form:"session"`
Build int `form:"build"`
Device string `form:"device"`
ForceHost int `form:"force_host"`
}
// Dash is
type Dash struct {
Video []*DashItem `json:"video"`
Audio []*DashItem `json:"audio"`
}
// DashItem is
type DashItem struct {
ID int64 `json:"id"`
BaseURL string `json:"base_url"`
BackupURL []string `json:"backup_url,omitempty"`
BaseURLRes string `json:"baseUrl,omitempty"`
BackupURLRes []string `json:"backupUrl,omitempty"`
Bandwidth int64 `json:"bandwidth"`
Codecid int64 `json:"codecid"`
}

View File

@@ -0,0 +1,27 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["region.go"],
importpath = "go-common/app/interface/main/app-intl/model/region",
tags = ["automanaged"],
)
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,16 @@
package region
// Region struct
type Region struct {
Rid int16 `json:"tid"`
Reid int16 `json:"reid"`
Name string `json:"name"`
Logo string `json:"logo"`
Goto string `json:"goto"`
Param string `json:"param"`
Rank string `json:"-"`
Plat int8 `json:"-"`
Build int `json:"-"`
Condition string `json:"-"`
Area string `json:"-"`
}

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"from.go",
"result.go",
],
importpath = "go-common/app/interface/main/app-intl/model/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-intl/model:go_default_library",
"//app/interface/main/app-intl/model/bangumi:go_default_library",
"//app/interface/openplatform/article/model:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//library/log:go_default_library",
"//library/time: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,438 @@
package search
import (
"encoding/json"
"go-common/library/log"
xtime "go-common/library/time"
)
// search const
const (
TypeVideo = "video"
TypeLive = "live_room"
TypeMediaBangumi = "media_bangumi"
TypeMediaFt = "media_ft"
TypeArticle = "article"
TypeSpecial = "special_card"
TypeBanner = "banner"
TypeUser = "user"
TypeBiliUser = "bili_user"
TypeGame = "game"
TypeSpecialS = "special_card_small"
TypeConverge = "content_card"
TypeQuery = "query"
TypeLiveMaster = "live_master"
TypeTwitter = "twitter"
// TypeLiveComic = "comic"
SuggestionJump = 99
SuggestionAV = "video"
SuggestionLive = "live"
)
// Search all
type Search struct {
Code int `json:"code,omitempty"`
Trackid string `json:"seid,omitempty"`
Page int `json:"page,omitempty"`
PageSize int `json:"pagesize,omitempty"`
Total int `json:"total,omitempty"`
NumResults int `json:"numResults,omitempty"`
NumPages int `json:"numPages,omitempty"`
SuggestKeyword string `json:"suggest_keyword,omitempty"`
Attribute int32 `json:"exp_bits,omitempty"`
PageInfo struct {
UpUser *Page `json:"upuser,omitempty"`
BiliUser *Page `json:"bili_user,omitempty"`
User *Page `json:"user,omitempty"`
Movie *Page `json:"movie,omitempty"`
Article *Page `json:"article,omitempty"`
LiveRoom *Page `json:"live_room,omitempty"`
LiveUser *Page `json:"live_user,omitempty"`
LiveAll *Page `json:"live_all,omitempty"`
MediaBangumi *Page `json:"media_bangumi,omitempty"`
MediaFt *Page `json:"media_ft,omitempty"`
} `json:"pageinfo,omitempty"`
Result struct {
Bangumi []*Bangumi `json:"bangumi,omitempty"`
UpUser []*User `json:"upuser,omitempty"`
BiliUser []*User `json:"bili_user,omitempty"`
User []*User `json:"user,omitempty"`
Movie []*Movie `json:"movie,omitempty"`
LiveRoom []*Live `json:"live_room,omitempty"`
LiveUser []*Live `json:"live_user,omitempty"`
Video []*Video `json:"video,omitempty"`
MediaBangumi []*Media `json:"media_bangumi,omitempty"`
MediaFt []*Media `json:"media_ft,omitempty"`
} `json:"result,omitempty"`
FlowResult []*Flow `json:"flow_result,omitempty"`
FlowPlaceholder int `json:"flow_placeholder,omitempty"`
EggInfo *struct {
Source int64 `json:"source,omitempty"`
ShowCount int `json:"show_count,omitempty"`
} `json:"egg_info,omitempty"`
}
// NoResultRcmd no result rcmd
type NoResultRcmd struct {
Code int `json:"code,omitempty"`
Msg string `json:"msg,omitempty"`
ReqType string `json:"req_type,omitempty"`
Result []*Video `json:"result,omitempty"`
NumResults int `json:"numResults,omitempty"`
Page int `json:"page,omitempty"`
Trackid string `json:"seid,omitempty"`
SuggestKeyword string `json:"suggest_keyword,omitempty"`
RecommendTips string `json:"recommend_tips,omitempty"`
}
// RecommendPre search at pre-page
type RecommendPre struct {
Code int `json:"code,omitempty"`
Msg string `json:"msg,omitempty"`
NumResult int `json:"numResult,omitempty"`
Trackid string `json:"seid,omitempty"`
Result []*struct {
Type string `json:"type,omitempty"`
Query string `json:"query,omitempty"`
List []*struct {
Type string `json:"source_type,omitempty"`
ID int64 `json:"source_id,omitempty"`
} `json:"rec_list,omitempty"`
} `json:"result,omitempty"`
}
// Page struct
type Page struct {
NumResults int `json:"numResults"`
Pages int `json:"pages"`
}
// Bangumi struct
type Bangumi struct {
Name string `json:"name,omitempty"`
SeasonID int `json:"season_id,omitempty"`
Title string `json:"title,omitempty"`
Cover string `json:"cover,omitempty"`
Evaluate string `json:"evaluate,omitempty"`
NewestEpID int `json:"newest_ep_id,omitempty"`
NewestEpIndex string `json:"newest_ep_index,omitempty"`
IsFinish int `json:"is_finish,omitempty"`
IsStarted int `json:"is_started,omitempty"`
NewestCat string `json:"newest_cat,omitempty"`
NewestSeason string `json:"newest_season,omitempty"`
TotalCount int `json:"total_count,omitempty"`
Pages int `json:"numPages,omitempty"`
CatList *struct {
TV int `json:"tv"`
Movie int `json:"movie"`
Ova int `json:"ova"`
} `json:"catlist,omitempty"`
}
// Movie struct
type Movie struct {
Title string `json:"title"`
SpID string `json:"spid"`
Type string `json:"type"`
Aid int64 `json:"aid"`
Desc string `json:"description"`
Actors string `json:"actors"`
Staff string `json:"staff"`
Cover string `json:"cover"`
Pic string `json:"pic"`
ScreenDate string `json:"screenDate"`
Area string `json:"area"`
Status int `json:"status"`
Length int `json:"length"`
Pages int `json:"numPages"`
}
// User struct
type User struct {
Mid int64 `json:"mid,omitempty"`
Name string `json:"uname,omitempty"`
SName string `json:"name,omitempty"`
OfficialVerify *OfficialVerify `json:"official_verify,omitempty"`
Usign string `json:"usign,omitempty"`
Fans int `json:"fans,omitempty"`
Videos int `json:"videos,omitempty"`
Level int `json:"level,omitempty"`
Pic string `json:"upic,omitempty"`
Pages int `json:"numPages,omitempty"`
Res []*struct {
Play interface{} `json:"play,omitempty"`
Danmaku int `json:"dm,omitempty"`
Pubdate int64 `json:"pubdate,omitempty"`
Title string `json:"title,omitempty"`
Aid int64 `json:"aid,omitempty"`
Pic string `json:"pic,omitempty"`
ArcURL string `json:"arcurl,omitempty"`
Duration string `json:"duration,omitempty"`
} `json:"res,omitempty"`
IsLive int `json:"is_live,omitempty"`
RoomID int64 `json:"room_id,omitempty"`
IsUpuser int `json:"is_upuser,omitempty"`
}
// OfficialVerify struct
type OfficialVerify struct {
Type int `json:"type"`
Desc string `json:"desc,omitempty"`
}
// Video struct
type Video struct {
ID int64 `json:"id"`
Author string `json:"author"`
Title string `json:"title"`
Pic string `json:"pic"`
Desc string `json:"description"`
Play interface{} `json:"play"`
Danmaku int `json:"video_review"`
Duration string `json:"duration"`
Pages int `json:"numPages"`
ViewType string `json:"view_type"`
RecTags []string `json:"rec_tags"`
}
// Live struct
type Live struct {
Total int `json:"total,omitempty"`
Pages int `json:"pages"`
UID int64 `json:"uid,omitempty"`
RoomID int64 `json:"roomid,omitempty"`
Type string `json:"type,omitempty"`
Title string `json:"title,omitempty"`
LiveStatus int `json:"live_status,omitempty"`
ShortID int `json:"short_id,omitempty"`
Uname string `json:"uname,omitempty"`
Uface string `json:"uface,omitempty"`
Cover string `json:"cover,omitempty"`
Online int `json:"online,omitempty"`
Attentions int `json:"attentions,omitempty"`
Tags string `json:"tags,omitempty"`
Area int `json:"area,omitempty"`
CateName string `json:"cate_name,omitempty"`
CateParentName string `json:"cate_parent_name,omitempty"`
UserCover string `json:"user_cover,omitempty"`
VerifyType int `json:"verify_type,omitempty"`
VerifyDesc string `json:"verify_desc,omitempty"`
Fans int `json:"fans,omitempty"`
}
// Article struct
type Article struct {
ID int64 `json:"id"`
Mid int64 `json:"mid"`
Uname string `json:"uname"`
TemplateID int `json:"template_id"`
Title string `json:"title"`
Desc string `json:"desc"`
ImageUrls []string `json:"image_urls"`
View int `json:"view"`
Like int `json:"like"`
Reply int `json:"reply"`
}
// Media struct
type Media struct {
MediaID int64 `json:"media_id,omitempty"`
SeasonID int64 `json:"season_id,omitempty"`
Title string `json:"title,omitempty"`
OrgTitle string `json:"org_title,omitempty"`
Styles string `json:"styles,omitempty"`
Cover string `json:"cover,omitempty"`
PlayState int `json:"play_state,omitempty"`
MediaScore *struct {
Score float64 `json:"score,omitempty"`
UserCount int `json:"user_count,omitempty"`
} `json:"media_score,omitempty"`
MediaType int `json:"media_type,omitempty"`
CV string `json:"cv,omitempty"`
Staff string `json:"staff,omitempty"`
Areas string `json:"areas,omitempty"`
GotoURL string `json:"goto_url,omitempty"`
Pubtime xtime.Time `json:"pubtime,omitempty"`
HitColumns []string `json:"hit_columns,omitempty"`
}
// Query struct
type Query struct {
Type string `json:"type,omitempty"`
Name string `json:"name,omitempty"`
ID int64 `json:"id,omitempty"`
FromSource string `json:"from_source,omitempty"`
}
// Hot struct
type Hot struct {
Code int `json:"code,omitempty"`
SeID string `json:"seid,omitempty"`
TrackID string `json:"trackid"`
List []struct {
Keyword string `json:"keyword"`
Status string `json:"status"`
NameType string `json:"name_type"`
} `json:"list"`
}
// Suggest struct
type Suggest struct {
Code int `json:"code"`
Stoken string `json:"stoken"`
ResultBs interface{} `json:"result"`
Result struct {
Accurate struct {
UpUser interface{} `json:"upuser,omitempty"`
Bangumi interface{} `json:"bangumi,omitempty"`
} `json:"accurate,omitempty"`
Tag []*struct {
Value string `json:"value,omitempty"`
} `json:"tag,omitempty"`
} `json:"-"`
}
// Suggest2 struct
type Suggest2 struct {
Code int `json:"code"`
Stoken string `json:"stoken"`
Result *struct {
Tag []*SuggestTag `json:"tag"`
} `json:"result"`
}
// SuggestTag struct
type SuggestTag struct {
Value string `json:"value,omitempty"`
Ref int64 `json:"ref,omitempty"`
Name string `json:"name,omitempty"`
SpID int `json:"spid,omitempty"`
Type string `json:"type,omitempty"`
}
// Suggest3 struct
type Suggest3 struct {
Code int `json:"code"`
TrackID string `json:"trackid"`
Result []*Sug `json:"result"`
}
// Sug struct
type Sug struct {
ShowName string `json:"show_name,omitempty"`
Term string `json:"term,omitempty"`
Ref int64 `json:"ref,omitempty"`
TermType int `json:"term_type,omitempty"`
SubType string `json:"sub_type,omitempty"`
Pos int `json:"pos,omitempty"`
Cover string `json:"cover,omitempty"`
CoverSize float64 `json:"cover_size,omitempty"`
}
// Operate struct
type Operate struct {
ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Cover string `json:"cover,omitempty"`
RedirectURL string `json:"redirect_url,omitempty"`
Desc string `json:"desc,omitempty"`
Corner string `json:"corner,omitempty"`
RecReason string `json:"rec_reason,omitempty"`
ContentList []*struct {
Type int `json:"type,omitempty"`
ID int64 `json:"id,omitempty"`
} `json:"content_list,omitempty"`
}
// Game struct
type Game struct {
ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Cover string `json:"cover,omitempty"`
Desc string `json:"description,omitempty"`
View float64 `json:"view,omitempty"`
Like int64 `json:"like,omitempty"`
Status int `json:"status,omitempty"`
RedirectURL string `json:"redirect_url,omitempty"`
}
// type Comic struct {
// ID int64 `json:"id,omitempty"`
// Title string `json:"title,omitempty"`
// Cover string `json:"cover,omitempty"`
// Uname string `json:"uname,omitempty"`
// Areas string `json:"areas,omitempty"`
// Styles string `json:"styles,omitempty"`
// URL string `json:"url,omitempty"`
// Type string `json:"type,omitempty"`
// }
// Channel struct
type Channel struct {
Type string `json:"type,omitempty"`
TagID int64 `json:"tag_id,omitempty"`
TagName string `json:"tag_name,omitempty"`
AttenCount int `json:"atten_count,omitempty"`
Cover string `json:"cover,omitempty"`
}
// Twitter twitter.
type Twitter struct {
ID int64 `json:"id,omitempty"`
PicID int64 `json:"pic_id"`
Cover []string `json:"cover,omitempty"`
CoverCount int `json:"cover_count,omitempty"`
Content string `json:"content,omitempty"`
}
// Flow struct
type Flow struct {
LinkType string `json:"linktype,omitempty"`
Position int `json:"position,omitempty"`
Type string `json:"type,omitempty"`
TypeName string `json:"type_name,omitempty"`
Value json.RawMessage `json:"value,omitempty"`
Video *Video
Live *Live
Operate *Operate
Article *Article
Media *Media
User *User
Game *Game
Query []*Query
Twitter *Twitter
// Comic *Comic
TrackID string `json:"trackid,omitempty"`
}
// Change chagne flow
func (f *Flow) Change() {
var err error
switch f.Type {
case TypeVideo:
err = json.Unmarshal(f.Value, &f.Video)
case TypeLive:
err = json.Unmarshal(f.Value, &f.Live)
case TypeMediaBangumi, TypeMediaFt:
err = json.Unmarshal(f.Value, &f.Media)
case TypeArticle:
err = json.Unmarshal(f.Value, &f.Article)
case TypeSpecial, TypeBanner, TypeSpecialS, TypeConverge:
err = json.Unmarshal(f.Value, &f.Operate)
case TypeUser, TypeBiliUser:
err = json.Unmarshal(f.Value, &f.User)
case TypeGame:
err = json.Unmarshal(f.Value, &f.Game)
case TypeQuery:
err = json.Unmarshal(f.Value, &f.Query)
// case TypeLiveComic:
// err = json.Unmarshal(f.Value, &f.Comic)
case TypeTwitter:
err = json.Unmarshal(f.Value, &f.Twitter)
}
if err != nil {
log.Error("json.Unmarshal(%s) error(%+v)", f.Value, err)
}
}

View File

@@ -0,0 +1,601 @@
package search
import (
"bytes"
"fmt"
// "hash/crc32"
"regexp"
"strconv"
"strings"
"go-common/app/interface/main/app-intl/model"
bgmmdl "go-common/app/interface/main/app-intl/model/bangumi"
article "go-common/app/interface/openplatform/article/model"
"go-common/app/service/main/archive/api"
xtime "go-common/library/time"
)
// search const
var getHightLight = regexp.MustCompile(`<em.*?em>`)
// Result struct
type Result struct {
Trackid string `json:"trackid,omitempty"`
Page int `json:"page,omitempty"`
NavInfo []*NavInfo `json:"nav,omitempty"`
Item []*Item `json:"item,omitempty"`
Array int `json:"array,omitempty"`
Attribute int32 `json:"attribute"`
EasterEgg *EasterEgg `json:"easter_egg,omitempty"`
}
// NavInfo struct
type NavInfo struct {
Name string `json:"name"`
Total int `json:"total"`
Pages int `json:"pages"`
Type int `json:"type"`
Show int `json:"show_more,omitempty"`
}
// TypeSearch struct
type TypeSearch struct {
TrackID string `json:"trackid"`
Pages int `json:"pages"`
Total int `json:"total"`
Items []*Item `json:"items,omitempty"`
}
// Suggestion struct
type Suggestion struct {
TrackID string `json:"trackid"`
UpUser interface{} `json:"upuser,omitempty"`
Bangumi interface{} `json:"bangumi,omitempty"`
Suggest []string `json:"suggest,omitempty"`
}
// SuggestionResult3 struct
type SuggestionResult3 struct {
TrackID string `json:"trackid"`
List []*Item `json:"list,omitempty"`
}
// NoResultRcndResult struct
type NoResultRcndResult struct {
TrackID string `json:"trackid"`
Title string `json:"title,omitempty"`
Pages int `json:"pages"`
Items []*Item `json:"items,omitempty"`
}
// EasterEgg struct
type EasterEgg struct {
ID int64 `json:"id,omitempty"`
ShowCount int `json:"show_count,omitempty"`
}
// Item struct
type Item struct {
TrackID string `json:"trackid,omitempty"`
LinkType string `json:"linktype,omitempty"`
Position int `json:"position,omitempty"`
SuggestKeyword string `json:"suggest_keyword,omitempty"`
Title string `json:"title,omitempty"`
Name string `json:"name,omitempty"`
Cover string `json:"cover,omitempty"`
URI string `json:"uri,omitempty"`
Param string `json:"param,omitempty"`
Goto string `json:"goto,omitempty"`
// av
Play int `json:"play,omitempty"`
Danmaku int `json:"danmaku,omitempty"`
Author string `json:"author,omitempty"`
ViewType string `json:"view_type,omitempty"`
PTime xtime.Time `json:"ptime,omitempty"`
RecTags []string `json:"rec_tags,omitempty"`
// bangumi season
SeasonID int64 `json:"season_id,omitempty"`
SeasonType int `json:"season_type,omitempty"`
Finish int8 `json:"finish,omitempty"`
Started int8 `json:"started,omitempty"`
Index string `json:"index,omitempty"`
NewestCat string `json:"newest_cat,omitempty"`
NewestSeason string `json:"newest_season,omitempty"`
CatDesc string `json:"cat_desc,omitempty"`
TotalCount int `json:"total_count,omitempty"`
MediaType int `json:"media_type,omitempty"`
PlayState int `json:"play_state,omitempty"`
Style string `json:"style,omitempty"`
CV string `json:"cv,omitempty"`
Rating float64 `json:"rating,omitempty"`
Vote int `json:"vote,omitempty"`
RatingCount int `json:"rating_count,omitempty"`
BadgeType int `json:"badge_type,omitempty"`
// upper
Sign string `json:"sign,omitempty"`
Fans int `json:"fans,omitempty"`
Level int `json:"level,omitempty"`
Desc string `json:"desc,omitempty"`
OfficialVerify *OfficialVerify `json:"official_verify,omitempty"`
AvItems []*Item `json:"av_items,omitempty"`
Item []*Item `json:"item,omitempty"`
CTime int64 `json:"ctime,omitempty"`
IsUp bool `json:"is_up,omitempty"`
LiveURI string `json:"live_uri,omitempty"`
// movie
ScreenDate string `json:"screen_date,omitempty"`
Area string `json:"area,omitempty"`
CoverMark string `json:"cover_mark,omitempty"`
// arc and sp
Arcs int `json:"archives,omitempty"`
// arc and movie
Duration string `json:"duration,omitempty"`
DurationInt int64 `json:"duration_int,omitempty"`
Actors string `json:"actors,omitempty"`
Staff string `json:"staff,omitempty"`
Length int `json:"length,omitempty"`
Status int `json:"status,omitempty"`
// live
RoomID int64 `json:"roomid,omitempty"`
Mid int64 `json:"mid,omitempty"`
Type string `json:"type,omitempty"`
Attentions int `json:"attentions,omitempty"`
LiveStatus int `json:"live_status,omitempty"`
Tags string `json:"tags,omitempty"`
Region int `json:"region,omitempty"`
Online int `json:"online,omitempty"`
ShortID int `json:"short_id,omitempty"`
CateName string `json:"area_v2_name,omitempty"`
IsSelection int `json:"is_selection,omitempty"`
// article
ID int64 `json:"id,omitempty"`
TemplateID int `json:"template_id,omitempty"`
ImageUrls []string `json:"image_urls,omitempty"`
View int `json:"view,omitempty"`
Like int `json:"like,omitempty"`
Reply int `json:"reply,omitempty"`
// special
Badge string `json:"badge,omitempty"`
RcmdReason *RcmdReason `json:"rcmd_reason,omitempty"`
// media bangumi and mdeia ft
Prompt string `json:"prompt,omitempty"`
Episodes []*Item `json:"episodes,omitempty"`
Label string `json:"label,omitempty"`
// game
Reserve string `json:"reserve,omitempty"`
// user
Face string `json:"face,omitempty"`
// suggest
From string `json:"from,omitempty"`
KeyWord string `json:"keyword,omitempty"`
CoverSize float64 `json:"cover_size,omitempty"`
SugType string `json:"sug_type,omitempty"`
TermType int `json:"term_type,omitempty"`
// rcmd query
List []*Item `json:"list,omitempty"`
FromSource string `json:"from_source,omitempty"`
// live master
UCover string `json:"ucover,omitempty"`
VerifyType int `json:"verify_type,omitempty"`
VerifyDesc string `json:"verify_desc,omitempty"`
LevelColor int64 `json:"level_color,omitempty"`
IsAttention int `json:"is_atten,omitempty"`
CateParentName string `json:"cate_parent_name,omitempty"`
CateNameNew string `json:"cate_name,omitempty"`
Glory *Glory `json:"glory_info,omitempty"`
// twitter
Covers []string `json:"covers,omitempty"`
CoverCount int `json:"cover_count,omitempty"`
}
// Glory live struct
type Glory struct {
Title string `json:"title,omitempty"`
Total int `json:"total"`
Items []*Item `json:"items,omitempty"`
}
// RcmdReason struct
type RcmdReason struct {
Content string `json:"content,omitempty"`
}
// UserResult struct
type UserResult struct {
Items []*Item `json:"items,omitempty"`
}
// DefaultWords struct
type DefaultWords struct {
Trackid string `json:"trackid,omitempty"`
Param string `json:"param,omitempty"`
Show string `json:"show,omitempty"`
Word string `json:"word,omitempty"`
}
// FromSeason form func
func (i *Item) FromSeason(b *Bangumi, bangumi string) {
i.Title = b.Title
i.Cover = b.Cover
i.Goto = model.GotoBangumi
i.Param = strconv.Itoa(int(b.SeasonID))
i.URI = model.FillURI(bangumi, i.Param, nil)
i.Finish = int8(b.IsFinish)
i.Started = int8(b.IsStarted)
i.Index = b.NewestEpIndex
i.NewestCat = b.NewestCat
i.NewestSeason = b.NewestSeason
i.TotalCount = b.TotalCount
var buf bytes.Buffer
if b.CatList.TV != 0 {
buf.WriteString(`TV(`)
buf.WriteString(strconv.Itoa(b.CatList.TV))
buf.WriteString(`) `)
}
if b.CatList.Movie != 0 {
buf.WriteString(`剧场版(`)
buf.WriteString(strconv.Itoa(b.CatList.Movie))
buf.WriteString(`) `)
}
if b.CatList.Ova != 0 {
buf.WriteString(`OVA/OAD/SP(`)
buf.WriteString(strconv.Itoa(b.CatList.Ova))
buf.WriteString(`)`)
}
i.CatDesc = buf.String()
}
// FromUser form func
func (i *Item) FromUser(u *User, as map[int64]*api.Arc) {
i.Title = u.Name
i.Cover = u.Pic
i.Goto = model.GotoAuthor
i.OfficialVerify = u.OfficialVerify
i.Param = strconv.Itoa(int(u.Mid))
i.URI = model.FillURI(i.Goto, i.Param, nil)
i.Mid = u.Mid
i.Sign = u.Usign
i.Fans = u.Fans
i.Level = u.Level
i.Arcs = u.Videos
i.AvItems = make([]*Item, 0, len(u.Res))
i.RoomID = u.RoomID
if u.IsUpuser == 1 {
for _, v := range u.Res {
vi := &Item{}
vi.Title = v.Title
vi.Cover = v.Pic
vi.Goto = model.GotoAv
vi.Param = strconv.Itoa(int(v.Aid))
vi.URI = model.FillURI(vi.Goto, vi.Param, model.AvHandler(as[v.Aid], "", nil))
a, ok := as[v.Aid]
if ok {
vi.Play = int(a.Stat.View)
vi.Danmaku = int(a.Stat.Danmaku)
} else {
switch play := v.Play.(type) {
case float64:
vi.Play = int(play)
case string:
vi.Play, _ = strconv.Atoi(play)
}
vi.Danmaku = v.Danmaku
}
vi.CTime = v.Pubdate
vi.Duration = v.Duration
i.AvItems = append(i.AvItems, vi)
}
i.IsUp = true
}
}
// FromUpUser form func
func (i *Item) FromUpUser(u *User, as map[int64]*api.Arc) {
i.Title = u.Name
i.Cover = u.Pic
i.Goto = model.GotoAuthor
i.OfficialVerify = u.OfficialVerify
i.Param = strconv.Itoa(int(u.Mid))
i.URI = model.FillURI(i.Goto, i.Param, nil)
i.Mid = u.Mid
i.Sign = u.Usign
i.Fans = u.Fans
i.Level = u.Level
i.Arcs = u.Videos
i.AvItems = make([]*Item, 0, len(u.Res))
for _, v := range u.Res {
vi := &Item{}
vi.Title = v.Title
vi.Cover = v.Pic
vi.Goto = model.GotoAv
vi.Param = strconv.Itoa(int(v.Aid))
vi.URI = model.FillURI(vi.Goto, vi.Param, model.AvHandler(as[v.Aid], "", nil))
a, ok := as[v.Aid]
if ok {
vi.Play = int(a.Stat.View)
vi.Danmaku = int(a.Stat.Danmaku)
} else {
switch play := v.Play.(type) {
case float64:
vi.Play = int(play)
case string:
vi.Play, _ = strconv.Atoi(play)
}
vi.Danmaku = v.Danmaku
}
vi.CTime = v.Pubdate
vi.Duration = v.Duration
i.AvItems = append(i.AvItems, vi)
}
i.RoomID = u.RoomID
i.IsUp = u.IsUpuser == 1
}
// FromMovie form func
func (i *Item) FromMovie(m *Movie, as map[int64]*api.Arc) {
i.Title = m.Title
i.Desc = m.Desc
if m.Type == "movie" {
i.Cover = m.Cover
i.Param = strconv.Itoa(int(m.Aid))
i.Goto = model.GotoAv
i.URI = model.FillURI(i.Goto, i.Param, model.AvHandler(as[m.Aid], "", nil))
i.CoverMark = model.StatusMark(m.Status)
} else if m.Type == "special" {
i.Param = m.SpID
i.Goto = model.GotoSp
i.URI = model.FillURI(i.Goto, i.Param, nil)
i.Cover = m.Pic
}
i.Staff = m.Staff
i.Actors = m.Actors
i.Area = m.Area
i.Length = m.Length
i.Status = m.Status
i.ScreenDate = m.ScreenDate
}
// FromVideo form func
func (i *Item) FromVideo(v *Video, a *api.Arc) {
i.Title = v.Title
i.Cover = v.Pic
i.Author = v.Author
i.Param = strconv.Itoa(int(v.ID))
i.Goto = model.GotoAv
if a != nil {
i.Face = a.Author.Face
i.URI = model.FillURI(i.Goto, i.Param, model.AvHandler(a, "", nil))
i.Play = int(a.Stat.View)
i.Danmaku = int(a.Stat.Danmaku)
} else {
i.URI = model.FillURI(i.Goto, i.Param, nil)
switch play := v.Play.(type) {
case float64:
i.Play = int(play)
case string:
i.Play, _ = strconv.Atoi(play)
}
i.Danmaku = v.Danmaku
}
i.Desc = v.Desc
i.Duration = v.Duration
i.ViewType = v.ViewType
i.RecTags = v.RecTags
}
// FromOperate form func
func (i *Item) FromOperate(o *Operate, gt string) {
i.Title = o.Title
i.Cover = o.Cover
i.URI = o.RedirectURL
i.Param = strconv.FormatInt(o.ID, 10)
i.Desc = o.Desc
i.Badge = o.Corner
i.Goto = gt
if o.RecReason != "" {
i.RcmdReason = &RcmdReason{Content: o.RecReason}
}
}
// FromConverge form func
func (i *Item) FromConverge(o *Operate, am map[int64]*api.Arc, artm map[int64]*article.Meta) {
const _convergeMinCount = 2
cis := make([]*Item, 0, len(o.ContentList))
for _, c := range o.ContentList {
ci := &Item{}
switch c.Type {
case 0:
if a, ok := am[c.ID]; ok && a.IsNormal() {
ci.Title = a.Title
ci.Cover = a.Pic
ci.Goto = model.GotoAv
ci.Param = strconv.FormatInt(a.Aid, 10)
ci.URI = model.FillURI(ci.Goto, ci.Param, model.AvHandler(a, "", nil))
ci.fillArcStat(a)
cis = append(cis, ci)
}
case 2:
if art, ok := artm[c.ID]; ok {
ci.Title = art.Title
ci.Desc = art.Summary
if len(art.ImageURLs) != 0 {
ci.Cover = art.ImageURLs[0]
}
ci.Goto = model.GotoArticle
ci.Param = strconv.FormatInt(art.ID, 10)
ci.URI = model.FillURI(ci.Goto, ci.Param, nil)
if art.Stats != nil {
ci.fillArtStat(art)
}
ci.Badge = "文章"
cis = append(cis, ci)
}
}
}
if len(cis) < _convergeMinCount {
return
}
i.Item = cis
i.Title = o.Title
i.Cover = o.Cover
i.URI = o.RedirectURL
i.Param = strconv.FormatInt(o.ID, 10)
i.Desc = o.Desc
i.Badge = o.Corner
i.Goto = model.GotoConverge
if o.RecReason != "" {
i.RcmdReason = &RcmdReason{Content: o.RecReason}
}
}
// FromMedia form func
func (i *Item) FromMedia(m *Media, prompt string, gt string, bangumis map[string]*bgmmdl.Card) {
i.Title = m.Title
if i.Title == "" {
i.Title = m.OrgTitle
}
i.Cover = m.Cover
i.Goto = gt
i.Param = strconv.Itoa(int(m.MediaID))
i.URI = m.GotoURL
i.MediaType = m.MediaType
i.PlayState = m.PlayState
i.Style = m.Styles
i.CV = m.CV
i.Staff = m.Staff
if m.MediaScore != nil {
i.Rating = m.MediaScore.Score
i.Vote = m.MediaScore.UserCount
}
i.PTime = m.Pubtime
areas := strings.Split(m.Areas, "、")
if len(areas) != 0 {
i.Area = areas[0]
}
i.Prompt = prompt
var hit string
for _, v := range m.HitColumns {
if v == "cv" {
hit = v
break
} else if v == "staff" {
hit = v
}
}
if hit == "cv" {
for _, v := range getHightLight.FindAllStringSubmatch(m.CV, -1) {
if gt == model.GotoBangumi {
i.Label = fmt.Sprintf("声优: %v...", v[0])
break
} else if gt == model.GotoMovie {
i.Label = fmt.Sprintf("演员: %v...", v[0])
break
}
}
} else if hit == "staff" {
for _, v := range getHightLight.FindAllStringSubmatch(m.Staff, -1) {
i.Label = fmt.Sprintf("制作人员: %v...", v[0])
break
}
}
// get from PGC API.
i.SeasonID = m.SeasonID
ssID := strconv.Itoa(int(m.SeasonID))
if bgm, ok := bangumis[ssID]; ok {
i.IsAttention = bgm.IsFollow
i.IsSelection = bgm.IsSelection
i.SeasonType = bgm.SeasonType
for _, v := range bgm.Episodes {
tmp := &Item{
Param: strconv.Itoa(int(v.ID)),
Index: v.Index,
}
tmp.URI = model.FillURI(model.GotoEP, tmp.Param, nil)
i.Episodes = append(i.Episodes, tmp)
}
}
}
// FromArticle form func
func (i *Item) FromArticle(a *Article) {
i.ID = a.ID
i.Mid = a.Mid
i.TemplateID = a.TemplateID
i.Title = a.Title
i.Desc = a.Desc
i.ImageUrls = a.ImageUrls
i.View = a.View
i.Play = a.View
i.Like = a.Like
i.Reply = a.Reply
i.Goto = model.GotoArticle
i.Param = strconv.Itoa(int(a.ID))
i.URI = model.FillURI(i.Goto, i.Param, nil)
}
// FromChannel form func
func (i *Item) FromChannel(c *Channel) {
i.ID = c.TagID
i.Title = c.TagName
i.Cover = c.Cover
i.Param = strconv.FormatInt(c.TagID, 10)
i.Goto = model.GotoChannel
i.URI = model.FillURI(i.Goto, i.Param, nil)
i.Type = c.Type
i.Attentions = c.AttenCount
}
// FromQuery form func
func (i *Item) FromQuery(qs []*Query) {
i.Goto = model.GotoRecommendWord
for _, q := range qs {
i.List = append(i.List, &Item{Param: strconv.FormatInt(q.ID, 10), Title: q.Name, Type: q.Type, FromSource: q.FromSource})
}
}
// FromTwitter form twitter
func (i *Item) FromTwitter(t *Twitter) {
i.Title = t.Content
i.Covers = t.Cover
i.CoverCount = t.CoverCount
i.Param = strconv.FormatInt(t.ID, 10)
i.Goto = model.GotoTwitter
i.URI = model.FillURI(i.Goto, strconv.FormatInt(t.PicID, 10), nil)
}
// fillArcStat fill func
func (i *Item) fillArcStat(a *api.Arc) {
if a.Access == 0 {
i.Play = int(a.Stat.View)
}
i.Danmaku = int(a.Stat.Danmaku)
i.Reply = int(a.Stat.Reply)
i.Like = int(a.Stat.Like)
}
// fillArtStat fill func
func (i *Item) fillArtStat(m *article.Meta) {
i.Play = int(m.Stats.View)
i.Reply = int(m.Stats.Reply)
}
// FromSuggest3 form func
func (i *Item) FromSuggest3(st *Sug, as map[int64]*api.Arc) {
i.From = "search"
i.Title = st.ShowName
i.KeyWord = st.Term
i.Position = st.Pos
i.Cover = st.Cover
i.CoverSize = st.CoverSize
i.SugType = st.SubType
i.TermType = st.TermType
if st.TermType == SuggestionJump {
switch st.SubType {
case SuggestionAV:
i.Goto = model.GotoAv
i.URI = model.FillURI(i.Goto, strconv.Itoa(int(st.Ref)), model.AvHandler(as[st.Ref], "", nil))
i.SugType = "视频"
}
}
}

View File

@@ -0,0 +1,27 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["tag.go"],
importpath = "go-common/app/interface/main/app-intl/model/tag",
tags = ["automanaged"],
)
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,29 @@
package tag
// Tag struct
type Tag struct {
ID int64 `json:"tag_id,omitempty"`
Name string `json:"tag_name,omitempty"`
IsAtten int8 `json:"is_atten,omitempty"`
Count *struct {
Atten int `json:"atten,omitempty"`
} `json:"count,omitempty"`
Cover string `json:"cover,omitempty"`
Likes int64 `json:"likes,omitempty"`
Hates int64 `json:"hates,omitempty"`
Liked int8 `json:"liked,omitempty"`
Hated int8 `json:"hated,omitempty"`
Attribute int8 `json:"attribute,omitempty"`
}
// Hot struct
type Hot struct {
Rid int16 `json:"rid"`
Tags []*Tag `json:"tags"`
}
// SubTag struct
type SubTag struct {
Count int `json:"count"`
SubTags []*Tag `json:"subscribe"`
}

View File

@@ -0,0 +1,37 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["view.go"],
importpath = "go-common/app/interface/main/app-intl/model/view",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-intl/model:go_default_library",
"//app/interface/main/app-intl/model/bangumi:go_default_library",
"//app/interface/main/app-intl/model/manager:go_default_library",
"//app/interface/main/app-intl/model/tag:go_default_library",
"//app/interface/main/dm2/model:go_default_library",
"//app/service/main/archive/api:go_default_library",
"//app/service/main/archive/model/archive:go_default_library",
"//library/time: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,261 @@
package view
import (
"encoding/json"
"strconv"
"go-common/app/interface/main/app-intl/model"
"go-common/app/interface/main/app-intl/model/bangumi"
"go-common/app/interface/main/app-intl/model/manager"
"go-common/app/interface/main/app-intl/model/tag"
dm2 "go-common/app/interface/main/dm2/model"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
xtime "go-common/library/time"
)
// vip active subID.
const (
VIPActiveView = 1
VIPActivePGC = 2
VIPActiveCenter = 3
)
// View struct
type View struct {
*ViewStatic
// owner_ext
OwnerExt OwnerExt `json:"owner_ext"`
// now user
ReqUser *ReqUser `json:"req_user,omitempty"`
// tag info
Tag []*tag.Tag `json:"tag,omitempty"`
// movie
Movie *bangumi.Movie `json:"movie,omitempty"`
// bangumi
Season *bangumi.Season `json:"season,omitempty"`
// bp
Bp json.RawMessage `json:"bp,omitempty"`
// history
History *History `json:"history,omitempty"`
// audio
Audio *Audio `json:"audio,omitempty"`
// contribute data
Contributions []*Contribution `json:"contributions,omitempty"`
// relate data
Relates []*Relate `json:"relates,omitempty"`
ReturnCode string `json:"-"`
UserFeature string `json:"-"`
IsRec int8 `json:"-"`
// dislike reason
Dislikes []*Dislike `json:"dislike_reasons,omitempty"`
// dm
DMSeg int `json:"dm_seg,omitempty"`
// player_icon
PlayerIcon *PlayerIcon `json:"player_icon,omitempty"`
// vip_active
VIPActive string `json:"vip_active,omitempty"`
// cm config
CMConfig *CMConfig `json:"cm_config,omitempty"`
}
// ViewStatic struct
type ViewStatic struct {
*archive.Archive3
Pages []*Page `json:"pages,omitempty"`
}
// ReqUser struct
type ReqUser struct {
Attention int `json:"attention"`
Favorite int8 `json:"favorite"`
Like int8 `json:"like"`
Dislike int8 `json:"dislike"`
Coin int8 `json:"coin"`
}
// Page struct
type Page struct {
*archive.Page3
Metas []*Meta `json:"metas"`
DMLink string `json:"dmlink"`
Audio *Audio `json:"audio,omitempty"`
DM *dm2.SubjectInfo `json:"dm,omitempty"`
}
// Meta struct
type Meta struct {
Quality int `json:"quality"`
Format string `json:"format"`
Size int64 `json:"size"`
}
// History struct
type History struct {
Cid int64 `json:"cid"`
Progress int64 `json:"progress"`
}
// CMConfig struct
type CMConfig struct {
AdsControl json.RawMessage `json:"ads_control,omitempty"`
MonitorInfo json.RawMessage `json:"monitor_info,omitempty"`
}
// Dislike struct
type Dislike struct {
ID int `json:"reason_id"`
Name string `json:"reason_name"`
}
// OwnerExt struct
type OwnerExt struct {
OfficialVerify struct {
Type int `json:"type"`
Desc string `json:"desc"`
} `json:"official_verify,omitempty"`
Vip struct {
Type int `json:"vipType"`
DueDate int64 `json:"vipDueDate"`
DueRemark string `json:"dueRemark"`
AccessStatus int `json:"accessStatus"`
VipStatus int `json:"vipStatus"`
VipStatusWarn string `json:"vipStatusWarn"`
} `json:"vip"`
Assists []int64 `json:"assists"`
Fans int `json:"fans"`
Archives int `json:"archives"`
}
// Relate struct
type Relate struct {
Aid int64 `json:"aid,omitempty"`
Pic string `json:"pic,omitempty"`
Title string `json:"title,omitempty"`
Author *api.Author `json:"owner,omitempty"`
Stat api.Stat `json:"stat,omitempty"`
Duration int64 `json:"duration,omitempty"`
Goto string `json:"goto,omitempty"`
Param string `json:"param,omitempty"`
URI string `json:"uri,omitempty"`
Rating float64 `json:"rating,omitempty"`
Reserve string `json:"reserve,omitempty"`
From string `json:"from,omitempty"`
Desc string `json:"desc,omitempty"`
RcmdReason string `json:"rcmd_reason,omitempty"`
Badge string `json:"badge,omitempty"`
Cid int64 `json:"cid,omitempty"`
SeasonType int32 `json:"season_type,omitempty"`
RatingCount int32 `json:"rating_count,omitempty"`
// cm ad
AdIndex int `json:"ad_index,omitempty"`
CmMark int `json:"cm_mark,omitempty"`
SrcID int64 `json:"src_id,omitempty"`
RequestID string `json:"request_id,omitempty"`
CreativeID int64 `json:"creative_id,omitempty"`
CreativeType int64 `json:"creative_type,omitempty"`
Type int `json:"type,omitempty"`
Cover string `json:"cover,omitempty"`
ButtonTitle string `json:"button_title,omitempty"`
View int `json:"view,omitempty"`
Danmaku int `json:"danmaku,omitempty"`
IsAd bool `json:"is_ad,omitempty"`
IsAdLoc bool `json:"is_ad_loc,omitempty"`
AdCb string `json:"ad_cb,omitempty"`
ShowURL string `json:"show_url,omitempty"`
ClickURL string `json:"click_url,omitempty"`
ClientIP string `json:"client_ip,omitempty"`
Extra json.RawMessage `json:"extra,omitempty"`
Button *Button `json:"button,omitempty"`
CardIndex int `json:"card_index,omitempty"`
Source string `json:"-"`
AvFeature json.RawMessage `json:"-"`
}
// Button struct
type Button struct {
Title string `json:"title,omitempty"`
URI string `json:"uri,omitempty"`
}
// Contribution struct
type Contribution struct {
Aid int64 `json:"aid,omitempty"`
Pic string `json:"pic,omitempty"`
Title string `json:"title,omitempty"`
Author api.Author `json:"owner,omitempty"`
Stat api.Stat `json:"stat,omitempty"`
CTime xtime.Time `json:"ctime,omitempty"`
}
// Audio struct
type Audio struct {
Title string `json:"title"`
Cover string `json:"cover_url"`
SongID int `json:"song_id"`
Play int `json:"play_count"`
Reply int `json:"reply_count"`
UpperID int `json:"upper_id"`
Entrance string `json:"entrance"`
SongAttr int `json:"song_attr"`
}
// PlayerIcon struct
type PlayerIcon struct {
URL1 string `json:"url1,omitempty"`
Hash1 string `json:"hash1,omitempty"`
URL2 string `json:"url2,omitempty"`
Hash2 string `json:"hash2,omitempty"`
CTime xtime.Time `json:"ctime,omitempty"`
}
// VipPlayURL playurl token struct.
type VipPlayURL struct {
From string `json:"from"`
Ts int64 `json:"ts"`
Aid int64 `json:"aid"`
Cid int64 `json:"cid"`
Mid int64 `json:"mid"`
VIP int `json:"vip"`
SVIP int `json:"svip"`
Owner int `json:"owner"`
Fcs string `json:"fcs"`
}
// NewRelateRec struct
type NewRelateRec struct {
TrackID string `json:"trackid"`
Oid int64 `json:"id"`
Source string `json:"source"`
AvFeature json.RawMessage `json:"av_feature"`
Goto string `json:"goto"`
}
// FromAv func
func (r *Relate) FromAv(a *api.Arc, from, trackid string, ap *archive.PlayerInfo) {
r.Aid = a.Aid
r.Title = a.Title
r.Pic = a.Pic
r.Author = &a.Author
r.Stat = a.Stat
r.Duration = a.Duration
r.Cid = a.FirstCid
r.Goto = model.GotoAv
r.Param = strconv.FormatInt(a.Aid, 10)
r.URI = model.FillURI(r.Goto, r.Param, model.AvHandler(a, trackid, ap))
r.From = from
}
// FromOperate func
func (r *Relate) FromOperate(i *manager.Relate, a *api.Arc, from string) {
switch i.Goto {
case model.GotoAv:
r.FromAv(a, from, "", nil)
}
if r.Title == "" {
r.Title = i.Title
}
if r.RcmdReason == "" {
r.RcmdReason = i.RecReason
}
}