Create & Init Project...
This commit is contained in:
38
app/interface/main/favorite/model/BUILD
Normal file
38
app/interface/main/favorite/model/BUILD
Normal file
@ -0,0 +1,38 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"archive.go",
|
||||
"job.go",
|
||||
"music.go",
|
||||
"topic.go",
|
||||
"video.go",
|
||||
],
|
||||
importpath = "go-common/app/interface/main/favorite/model",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/service/main/archive/api: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"],
|
||||
)
|
60
app/interface/main/favorite/model/archive.go
Normal file
60
app/interface/main/favorite/model/archive.go
Normal file
@ -0,0 +1,60 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"go-common/app/service/main/archive/api"
|
||||
xtime "go-common/library/time"
|
||||
)
|
||||
|
||||
type Archive struct {
|
||||
Id int64 `json:"id"`
|
||||
Mid int64 `json:"mid"`
|
||||
Fid int64 `json:"fid"`
|
||||
Aid int64 `json:"aid"`
|
||||
CTime xtime.Time `json:"-"`
|
||||
MTime xtime.Time `json:"-"`
|
||||
}
|
||||
|
||||
type SearchArchive struct {
|
||||
Code int `json:"code,omitempty"`
|
||||
Seid string `json:"seid"`
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"pagesize"`
|
||||
NumPages int `json:"numPages,omitempty"`
|
||||
PageCount int `json:"pagecount"`
|
||||
NumResults int `json:"numResults,omitempty"`
|
||||
Total int `json:"total"`
|
||||
SuggestKeyword string `json:"suggest_keyword"`
|
||||
Mid int64 `json:"mid"`
|
||||
Fid int64 `json:"fid"`
|
||||
Tid int `json:"tid"`
|
||||
Order string `json:"order"`
|
||||
Keyword string `json:"keyword"`
|
||||
TList []struct {
|
||||
Tid int `json:"tid"`
|
||||
Name string `json:"name"`
|
||||
Count int `json:"count"`
|
||||
} `json:"tlist,omitempty"`
|
||||
Result []*SearchArchiveResult `json:"result,omitempty"`
|
||||
Archives []*FavArchive `json:"archives"`
|
||||
}
|
||||
|
||||
type SearchArchiveResult struct {
|
||||
ID int64 `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Play string `json:"play"`
|
||||
FavTime int64 `json:"fav_time"`
|
||||
}
|
||||
|
||||
type FavArchive struct {
|
||||
*api.Arc
|
||||
FavAt int64 `json:"fav_at"`
|
||||
PlayNum string `json:"play_num"`
|
||||
HighlightTitle string `json:"highlight_title"`
|
||||
}
|
||||
|
||||
type AppInfo struct {
|
||||
Platform string
|
||||
Build string
|
||||
MobiApp string
|
||||
Device string
|
||||
}
|
47
app/interface/main/favorite/model/job.go
Normal file
47
app/interface/main/favorite/model/job.go
Normal file
@ -0,0 +1,47 @@
|
||||
package model
|
||||
|
||||
const (
|
||||
// type
|
||||
FieldFav = "folder"
|
||||
FieldArc = "video"
|
||||
FieldResource = "resource"
|
||||
// action
|
||||
ActionAdd = "add"
|
||||
ActionDel = "del"
|
||||
ActionMove = "move"
|
||||
ActionCopy = "copy"
|
||||
ActionMdel = "mdel"
|
||||
ActionIndef = "indef"
|
||||
ActionIncol = "incol"
|
||||
ActionClean = "clean"
|
||||
ActionInitRelationFids = "initRelationFids"
|
||||
ActionInitFolderRelations = "initFolderRelations"
|
||||
ActionMultiAdd = "multiAdd"
|
||||
ActionMultiDel = "multiDel"
|
||||
ActionFolderAdd = "folderAdd"
|
||||
ActionFolderDel = "folderDel"
|
||||
)
|
||||
|
||||
type Message struct {
|
||||
Field string `json:"field"`
|
||||
Action string `json:"action"`
|
||||
Oid int64 `json:"oid"`
|
||||
Type int8 `json:"type"`
|
||||
Mid int64 `json:"mid"`
|
||||
OldMid int64 `json:"old_mid"`
|
||||
Fid int64 `json:"fid"`
|
||||
FidState int8 `json:"fid_state"`
|
||||
FolderAttr int8 `json:"folder_attr"`
|
||||
OldFolderAttr int8 `json:"old_folder_attr"`
|
||||
NewFolderAttr int8 `json:"new_folder_attr"`
|
||||
Aid int64 `json:"aid"`
|
||||
OldFid int64 `json:"old_fid"`
|
||||
OldFidState int8 `json:"old_fid_state"`
|
||||
NewFid int64 `json:"new_fid"`
|
||||
NewFidState int8 `json:"new_fid_state"`
|
||||
Affected int64 `json:"affected"`
|
||||
Aids []int64 `json:"aids"`
|
||||
Oids []int64 `json:"oids"`
|
||||
Mids []int64 `json:"mids"`
|
||||
FTime int64 `json:"ftime"`
|
||||
}
|
12
app/interface/main/favorite/model/music.go
Normal file
12
app/interface/main/favorite/model/music.go
Normal file
@ -0,0 +1,12 @@
|
||||
package model
|
||||
|
||||
type MusicResult struct {
|
||||
Code int `json:"code"`
|
||||
Data map[int64]*Music `json:"data"`
|
||||
}
|
||||
|
||||
type Music struct {
|
||||
ID int64 `json:"song_id"`
|
||||
Cover string `json:"cover_url"`
|
||||
Title string `json:"title"`
|
||||
}
|
67
app/interface/main/favorite/model/topic.go
Normal file
67
app/interface/main/favorite/model/topic.go
Normal file
@ -0,0 +1,67 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"go-common/library/time"
|
||||
)
|
||||
|
||||
const (
|
||||
TopicCacheMiss = -1
|
||||
// http mode
|
||||
HttpMode4Http = 1 // eg "http://a.bilibili.com"
|
||||
HttpMode4Https = 2 // eg "https://a.bilibili.com"
|
||||
HttpMode4Both = 3 // eg "//a.bilibili.com"
|
||||
)
|
||||
|
||||
var ErrTopicRequest = errors.New("Get topic info request error")
|
||||
|
||||
// TopicsResult topics.
|
||||
type TopicsResult struct {
|
||||
Code int `json:"code"`
|
||||
Data struct {
|
||||
List []*Topic `json:"list"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
type TopicFav struct {
|
||||
ID int64 `json:"id"`
|
||||
Mid int64 `json:"mid"`
|
||||
TpID int64 `json:"tpid"`
|
||||
Ctime time.Time `json:"ctime"`
|
||||
Mtime time.Time `json:"mtime"`
|
||||
}
|
||||
|
||||
type Topic struct {
|
||||
ID int64 `json:"id"`
|
||||
TpID int64 `json:"tp_id"`
|
||||
MID int64 `json:"mid"`
|
||||
FavAt time.Time `json:"fav_at"`
|
||||
State int64 `json:"state"`
|
||||
Stime string `json:"stime"`
|
||||
Etime string `json:"etime"`
|
||||
Ctime string `json:"ctime"`
|
||||
Mtime string `json:"mtime"`
|
||||
Name string `json:"name"`
|
||||
Author string `json:"author"`
|
||||
PCUrl string `json:"pc_url"`
|
||||
H5Url string `json:"h5_url"`
|
||||
PCCover string `json:"pc_cover"`
|
||||
H5Cover string `json:"h5_cover"`
|
||||
Rank int64 `json:"rank"`
|
||||
PageName string `json:"page_name"`
|
||||
Plat int64 `json:"plat"`
|
||||
Desc string `json:"desc"`
|
||||
Click int64 `json:"click"`
|
||||
TPType int64 `json:"type"`
|
||||
Mold int64 `json:"mold"`
|
||||
Series int64 `json:"series"`
|
||||
Dept int64 `json:"dept"`
|
||||
ReplyID int64 `json:"reply_id"`
|
||||
}
|
||||
|
||||
type TopicList struct {
|
||||
PageNum int `json:"page"`
|
||||
PageSize int `json:"pagesize"`
|
||||
Total int64 `json:"total"`
|
||||
List []*Topic `json:"list"`
|
||||
}
|
206
app/interface/main/favorite/model/video.go
Normal file
206
app/interface/main/favorite/model/video.go
Normal file
@ -0,0 +1,206 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
xtime "go-common/library/time"
|
||||
)
|
||||
|
||||
const (
|
||||
bit1 = int8(1)
|
||||
bit2 = int8(1) << 1
|
||||
StateDefaultPublic = int8(0) // binary 00 / int 0
|
||||
StateDefaultNoPublic = int8(0) | bit1 // binary 01 / int 1
|
||||
StateNormalPublic = bit2 | int8(0) // binary 10 / int 2
|
||||
StateNormalNoPublic = bit2 | bit1 // binary 11 / int 3
|
||||
// DefaultFolderName default name of favorite folder
|
||||
DefaultFolderName = "默认收藏夹"
|
||||
// AllFidFlag all folder id flag
|
||||
AllFidFlag = -1
|
||||
// CDFlag cool down flag
|
||||
CDFlag = -1
|
||||
// search error code
|
||||
SearchErrWordIllegal = -110 // 非法搜索词错误
|
||||
// clean state
|
||||
StateAllowToClean = 0
|
||||
StateCleaning = 1
|
||||
StateCleanCD = 2
|
||||
)
|
||||
|
||||
type VideoFolder struct {
|
||||
Fid int64 `json:"fid"`
|
||||
Mid int64 `json:"mid"`
|
||||
Name string `json:"name"`
|
||||
MaxCount int `json:"max_count"`
|
||||
CurCount int `json:"cur_count"`
|
||||
AttenCount int `json:"atten_count"`
|
||||
Favoured int8 `json:"favoured"`
|
||||
State int8 `json:"state"`
|
||||
CTime xtime.Time `json:"ctime"`
|
||||
MTime xtime.Time `json:"mtime"`
|
||||
Cover []*Cover `json:"cover,omitempty"`
|
||||
}
|
||||
|
||||
// IsPublic return true if folder is public.
|
||||
func (f *VideoFolder) IsPublic() bool {
|
||||
return f.State&bit1 == int8(0)
|
||||
}
|
||||
|
||||
// IsDefault return true if folder is default.
|
||||
func (f *VideoFolder) IsDefault() bool {
|
||||
return f.State&bit2 == int8(0)
|
||||
}
|
||||
|
||||
// StatePub return folder's public state.
|
||||
func (f *VideoFolder) StatePub() int8 {
|
||||
return f.State & bit1
|
||||
}
|
||||
|
||||
// StateDef return folder's default state.
|
||||
func (f *VideoFolder) StateDef() int8 {
|
||||
return f.State & bit2
|
||||
}
|
||||
|
||||
// IsDefault return true if state is default state.
|
||||
func IsDefault(state int8) bool {
|
||||
return (state&(int8(1)<<1) == int8(0))
|
||||
}
|
||||
|
||||
// CheckPublic check user update public value in [0, 1].
|
||||
func CheckPublic(state int8) bool {
|
||||
return state == int8(0) || state == bit1
|
||||
}
|
||||
|
||||
type VideoFolders []*VideoFolder
|
||||
|
||||
func (f VideoFolders) Len() int { return len(f) }
|
||||
|
||||
func (f VideoFolders) Less(i, j int) bool {
|
||||
if f[i].IsDefault() {
|
||||
return true
|
||||
}
|
||||
if f[j].IsDefault() {
|
||||
return false
|
||||
}
|
||||
if f[i].Fid > f[j].Fid {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (f VideoFolders) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
|
||||
|
||||
// Cover image
|
||||
type Cover struct {
|
||||
Aid int64 `json:"aid"`
|
||||
Pic string `json:"pic"`
|
||||
}
|
||||
|
||||
// VideoFolderSort folder index.
|
||||
type VideoFolderSort struct {
|
||||
ID int64 `json:"id"`
|
||||
Mid int64 `json:"mid"`
|
||||
Sort []int64 `json:"sort"`
|
||||
Map map[int64]struct{} `json:"map"`
|
||||
CTime xtime.Time `json:"ctime"`
|
||||
MTime xtime.Time `json:"mtime"`
|
||||
}
|
||||
|
||||
// Index return index for fids.
|
||||
func (f *VideoFolderSort) Index() []byte {
|
||||
var (
|
||||
i int
|
||||
v int64
|
||||
fs = f.Sort
|
||||
n = len(fs) * 8
|
||||
b = make([]byte, n)
|
||||
)
|
||||
for i = 0; i < n; i += 8 {
|
||||
v = fs[i/8]
|
||||
b[i] = byte(v >> 56)
|
||||
b[i+1] = byte(v >> 48)
|
||||
b[i+2] = byte(v >> 40)
|
||||
b[i+3] = byte(v >> 32)
|
||||
b[i+4] = byte(v >> 24)
|
||||
b[i+5] = byte(v >> 16)
|
||||
b[i+6] = byte(v >> 8)
|
||||
b[i+7] = byte(v)
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// SetIndex set sort fids.
|
||||
func (f *VideoFolderSort) SetIndex(b []byte) (err error) {
|
||||
var (
|
||||
i int
|
||||
id int64
|
||||
n = len(b)
|
||||
ids = make([]int64, n)
|
||||
)
|
||||
if len(b)%8 != 0 {
|
||||
err = fmt.Errorf("invalid sort index:%v", b)
|
||||
return
|
||||
}
|
||||
f.Map = make(map[int64]struct{}, n)
|
||||
for i = 0; i < n; i += 8 {
|
||||
id = int64(b[i+7]) |
|
||||
int64(b[i+6])<<8 |
|
||||
int64(b[i+5])<<16 |
|
||||
int64(b[i+4])<<24 |
|
||||
int64(b[i+3])<<32 |
|
||||
int64(b[i+2])<<40 |
|
||||
int64(b[i+1])<<48 |
|
||||
int64(b[i])<<56
|
||||
ids[i/8] = id
|
||||
f.Map[id] = struct{}{}
|
||||
}
|
||||
f.Sort = ids
|
||||
return
|
||||
}
|
||||
|
||||
// SortFavs sort the favorites by index.
|
||||
func (f *VideoFolderSort) SortFavs(fs map[int64]*VideoFolder, isSelf bool) (res []*VideoFolder, update bool) {
|
||||
var (
|
||||
ok bool
|
||||
id int64
|
||||
sorted []int64
|
||||
fav *VideoFolder
|
||||
idx = f.Sort
|
||||
)
|
||||
res = make([]*VideoFolder, 0, len(fs))
|
||||
if len(f.Sort) == 0 {
|
||||
for _, fav = range fs {
|
||||
if !isSelf && !fav.IsPublic() {
|
||||
continue
|
||||
}
|
||||
res = append(res, fav)
|
||||
}
|
||||
sort.Sort(VideoFolders(res))
|
||||
return
|
||||
}
|
||||
if len(idx) != len(fs) {
|
||||
sorted = append(sorted, idx[0])
|
||||
for id = range fs {
|
||||
if _, ok = f.Map[id]; !ok {
|
||||
sorted = append(sorted, id)
|
||||
}
|
||||
}
|
||||
for _, id := range idx[1:] {
|
||||
if _, ok = fs[id]; ok {
|
||||
sorted = append(sorted, id)
|
||||
}
|
||||
}
|
||||
update = true
|
||||
f.Sort = sorted
|
||||
}
|
||||
for _, id = range f.Sort {
|
||||
if fav, ok = fs[id]; ok {
|
||||
if !isSelf && !fav.IsPublic() {
|
||||
continue
|
||||
}
|
||||
res = append(res, fav)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user