go-common/app/interface/main/app-card/model/const.go
2019-04-22 18:49:16 +08:00

786 lines
20 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package model
import (
"encoding/json"
"fmt"
"net/url"
"strconv"
"strings"
"time"
"go-common/app/interface/main/app-card/model/card/audio"
"go-common/app/interface/main/app-card/model/card/live"
article "go-common/app/interface/openplatform/article/model"
account "go-common/app/service/main/account/model"
"go-common/app/service/main/archive/model/archive"
"go-common/library/log"
)
// CardGt is
type CardGt string
// CardType is
type CardType string
// ColumnStatus is
type ColumnStatus int8
// Gt is
type Gt string
// Icon is
type Icon int8
// Type is
type Type int8
// BlurStatus is
type BlurStatus int8
// Event is
type Event string
// CoverColor is
type CoverColor string
// Switch is
type Switch string
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 Googleplay.
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)
// PlatIpadHD is int8 for IpadHD
PlatIpadHD = int8(9)
// PlatAndroidTVYST is int8 for AndroidTV_YST Global.
PlatAndroidTVYST = int8(12)
CardGotoAv = CardGt("av")
CardGotoBangumi = CardGt("bangumi")
CardGotoLive = CardGt("live")
CardGotoArticle = CardGt("article")
CardGotoAudio = CardGt("audio")
CardGotoRank = CardGt("rank")
CardGotoConverge = CardGt("converge")
CardGotoDownload = CardGt("download")
CardGotoMoe = CardGt("moe")
CardGotoBanner = CardGt("banner")
CardGotoLogin = CardGt("login")
CardGotoPGC = CardGt("pgc")
CardGotoSpecial = CardGt("special")
CardGotoSubscribe = CardGt("subscribe")
CardGotoBangumiRcmd = CardGt("bangumi_rcmd")
CardGotoUpRcmdAv = CardGt("up_rcmd_av")
CardGotoChannelRcmd = CardGt("channel_rcmd")
CardGotoLiveUpRcmd = CardGt("live_up_rcmd")
CardGotoAdAv = CardGt("ad_av")
CardGotoAdWeb = CardGt("ad_web")
CardGotoAdWebS = CardGt("ad_web_s")
CardGotoPlayer = CardGt("player")
CardGotoPlayerLive = CardGt("player_live")
CardGotoArticleS = CardGt("article_s")
CardGotoSpecialS = CardGt("special_s")
CardGotoShoppingS = CardGt("shopping_s")
CardGotoGameDownloadS = CardGt("game_download_s")
CardGotoHotTopic = CardGt("hottopic")
CardGotoTopstick = CardGt("topstick")
CardGotoSearchSubscribe = CardGt("search_subscribe")
CardGotoPicture = CardGt("picture")
CardGotoInterest = CardGt("interest")
CardGotoFollowMode = CardGt("follow_mode")
// operate tab
CardGotoEntrance = CardGt("entrance")
CardGotoContentRcmd = CardGt("content_rcmd")
CardGotoTagRcmd = CardGt("tag_rcmd")
CardGotoNews = CardGt("news")
CardGotoChannelSquare = CardGt("channel_square")
CardGotoPgcsRcmd = CardGt("pgcs_rcmd")
CardGotoUpRcmdS = CardGt("up_rcmd_s")
CardGotoSearchUpper = CardGt("search_upper")
CardGotoUpRcmdNew = CardGt("up_rcmd_new")
CardGotoDynamicHot = CardGt("hot_dynamic")
CardGotoUpRcmdNewV2 = CardGt("up_rcmd_new_v2")
CardGotoEventTopic = CardGt("event_topic")
// single card
LargeCoverV1 = CardType("large_cover_v1")
SmallCoverV1 = CardType("small_cover_v1")
MiddleCoverV1 = CardType("middle_cover_v1")
ThreeItemV1 = CardType("three_item_v1")
ThreeItemHV1 = CardType("three_item_h_v1")
ThreeItemHV3 = CardType("three_item_h_v3")
TwoItemV1 = CardType("two_item_v1")
CoverOnlyV1 = CardType("cover_only_v1")
BannerV1 = CardType("banner_v1")
CmV1 = CardType("cm_v1")
HotTopic = CardType("hot_topic")
TopStick = CardType("top_stick")
ChannelSquare = CardType("channel_square")
ThreeItemHV4 = CardType("three_item_h_v4")
UpRcmdCover = CardType("up_rcmd_cover")
ThreeItemAll = CardType("three_item_all")
TwoItemHV1 = CardType("two_item_h_v1")
OnePicV1 = CardType("one_pic_v1")
ThreePicV1 = CardType("three_pic_v1")
SmallCoverV5 = CardType("small_cover_v5")
OptionsV1 = CardType("options_v1")
HotDynamic = CardType("hot_dynamic")
ThreeItemAllV2 = CardType("three_item_all_v2")
ThreeItemHV5 = CardType("three_item_h_v5")
MiddleCoverV3 = CardType("middle_cover_v3")
Select = CardType("select")
// double card
SmallCoverV2 = CardType("small_cover_v2")
SmallCoverV3 = CardType("small_cover_v3")
MiddleCoverV2 = CardType("middle_cover_v2")
LargeCoverV2 = CardType("large_cover_v2")
ThreeItemHV2 = CardType("three_item_h_v2")
ThreeItemV2 = CardType("three_item_v2")
TwoItemV2 = CardType("two_item_v2")
SmallCoverV4 = CardType("small_cover_v4")
CoverOnlyV2 = CardType("cover_only_v2")
BannerV2 = CardType("banner_v2")
CmV2 = CardType("cm_v2")
News = CardType("news")
MultiItem = CardType("multi_item")
MultiItemH = CardType("multi_item_h")
ThreePicV2 = CardType("three_pic_v2")
OptionsV2 = CardType("options_v2")
OnePicV2 = CardType("one_pic_v2")
// ipad card
BannerV3 = CardType("banner_v3")
CoverOnlyV3 = CardType("cover_only_v3")
FourItemHV3 = CardType("four_item_h_v3")
ColumnDefault = ColumnStatus(0)
ColumnSvrSingle = ColumnStatus(1)
ColumnSvrDouble = ColumnStatus(2)
ColumnUserSingle = ColumnStatus(3)
ColumnUserDouble = ColumnStatus(4)
GotoWeb = Gt("web")
GotoAv = Gt("av")
GotoBangumi = Gt("bangumi")
GotoLive = Gt("live")
GotoGame = Gt("game")
GotoArticle = Gt("article")
GotoArticleTag = Gt("article_tag")
GotoAudio = Gt("audio")
GotoAudioTag = Gt("audio_tag")
GotoSong = Gt("song")
GotoAlbum = Gt("album")
GotoClip = Gt("clip")
GotoDaily = Gt("daily")
GotoTag = Gt("tag")
GotoMid = Gt("mid")
GotoDynamicMid = Gt("dynamic_mid")
GotoConverge = Gt("converge")
GotoRank = Gt("rank")
GotoLiveTag = Gt("live_tag")
GotoPGC = Gt("pgc")
GotoHotTopic = Gt("hottopic")
GotoTopstick = Gt("topstick")
GotoSpecial = Gt("special")
GotoSubscribe = Gt("subscribe")
GotoPicture = Gt("picture")
GotoPictureTag = Gt("picture_tag")
GotoHotDynamic = Gt("hot_dynamic")
IconPlay = Icon(1)
IconOnline = Icon(2)
IconDanmaku = Icon(3)
IconFavorite = Icon(4)
IconStar = Icon(5)
IconRead = Icon(6)
IconComment = Icon(7)
IconLocation = Icon(8)
IconHeadphone = Icon(9)
IconRank = Icon(10)
IconGoldMedal = Icon(11)
IconSilverMedal = Icon(12)
IconBronzeMedal = Icon(13)
IconTV = Icon(14)
IconBomb = Icon(15)
IconRoleYellow = Icon(16)
IconRoleBlue = Icon(17)
IconRoleVipRed = Icon(18)
IconRoleYearVipRed = Icon(19)
IconLike = Icon(20)
AvatarRound = Type(0)
AvatarSquare = Type(1)
ButtonGrey = Type(1)
ButtonTheme = Type(2)
BlurNo = BlurStatus(0)
BlurYes = BlurStatus(1)
EventUpFollow = Event("up_follow")
EventChannelSubscribe = Event("channel_subscribe")
EventUpClick = Event("up_click")
EventChannelClick = Event("channel_click")
EventButtonClick = Event("button_click")
EventGameClick = Event("game_click")
PurpleCoverBadge = CoverColor("purple")
BgColorOrange = int8(0)
BgColorTransparentOrange = int8(1)
BgColorBlue = int8(2)
BgColorRed = int8(3)
BgTransparentTextOrange = int8(4)
BgColorPurple = int8(5)
BgStyleFill = int8(1)
BgStyleStroke = int8(2)
BgStyleFillAndStroke = int8(3)
BgStyleNoFillAndNoStroke = int8(4)
SwitchFeedIndexLike = Switch("天马卡片好评数替换弹幕数")
SwitchFeedIndexTabThreePoint = Switch("运营tab稿件卡片三点稍后再看")
SwitchCooperationHide = Switch("cooperation_hide")
SwitchCooperationShow = Switch("cooperation_show")
// 热门显示up主信息abtest
HotCardStyleOld = int8(0)
HotCardStyleShowUp = int8(1)
HotCardStyleHideUp = int8(2)
)
var (
OperateType = map[int]Gt{
0: GotoWeb,
1: GotoGame,
2: GotoAv,
3: GotoBangumi,
4: GotoLive,
6: GotoArticle,
7: GotoDaily,
8: GotoAudio,
9: GotoSong,
10: GotoAlbum,
11: GotoClip,
12: GotoSpecial,
13: GotoPicture,
}
Columnm = map[ColumnStatus]ColumnStatus{
ColumnDefault: ColumnSvrDouble,
ColumnSvrSingle: ColumnSvrSingle,
ColumnSvrDouble: ColumnSvrDouble,
ColumnUserSingle: ColumnSvrSingle,
ColumnUserDouble: ColumnSvrDouble,
}
AvatarEvent = map[Gt]Event{
GotoMid: EventUpClick,
GotoTag: EventChannelClick,
GotoDynamicMid: EventUpClick,
}
ButtonEvent = map[Gt]Event{
GotoMid: EventUpFollow,
GotoTag: EventChannelSubscribe,
}
ButtonText = map[Gt]string{
GotoMid: "+ 关注",
GotoTag: "订阅",
}
LiveRoomTagHandler = func(r *live.Room) func(uri string) string {
return func(uri string) string {
if r == nil {
return ""
}
return fmt.Sprintf("%s?parent_area_id=%d&parent_area_name=%s&area_id=%d&area_name=%s", uri, r.AreaV2ParentID, url.QueryEscape(r.AreaV2ParentName), r.AreaV2ID, url.QueryEscape(r.AreaV2Name))
}
}
AudioTagHandler = func(c []*audio.Ctg) func(uri string) string {
return func(uri string) string {
var schema string
if len(c) != 0 {
schema = c[0].Schema
if len(c) > 1 {
schema = c[1].Schema
}
}
return schema
}
}
LiveUpHandler = func(card *live.Card) func(uri string) string {
return func(uri string) string {
if card == nil {
return uri
}
return fmt.Sprintf("%s?broadcast_type=%d", uri, card.BroadcastType)
}
}
LiveRoomHandler = func(r *live.Room) func(uri string) string {
return func(uri string) string {
if r == nil {
return uri
}
return fmt.Sprintf("%s?broadcast_type=%d", uri, r.BroadcastType)
}
}
AvPlayHandler = func(a *archive.Archive3, ap *archive.PlayerInfo, trackID string) 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 {
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
}
}
HottopicHandler = func(l *live.TopicHot) func(uri string) string {
return func(uri string) string {
return fmt.Sprintf("%s?type=topic", uri)
}
}
ArticleTagHandler = func(c []*article.Category, plat int8) func(uri string) string {
return func(uri string) string {
var (
rid int64
tid int64
)
if len(c) > 1 {
if c[0] != nil {
rid = c[0].ID
}
if c[1] != nil {
tid = c[1].ID
}
}
if rid != 0 && tid != 0 {
return fmt.Sprintf("bilibili://article/category/%d?sec_cid=%d", rid, tid)
}
return ""
}
}
)
// IsAndroid check plat is android or ipad.
func IsAndroid(plat int8) bool {
return plat == PlatAndroid || plat == PlatAndroidG || plat == PlatAndroidI
}
// 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 || plat == PlatIpadHD
}
// AdAvIsNormal check advert archive normal.
func AdAvIsNormal(a *archive.ArchiveWithPlayer) bool {
if a == nil || a.Archive3 == nil {
return false
}
return a.State >= 0 || a.State == -6 || a.State == -40
}
func AvIsNormal(a *archive.ArchiveWithPlayer) bool {
if a == nil || a.Archive3 == nil {
return false
}
return a.IsNormal()
}
// FillURI deal app schema.
func FillURI(gt Gt, param string, f func(uri string) string) (uri string) {
switch gt {
case GotoAv:
if param != "" {
uri = "bilibili://video/" + param
}
case GotoLive:
if param != "" {
uri = "bilibili://live/" + param
}
case GotoBangumi:
if param != "" {
uri = "https://www.bilibili.com/bangumi/play/ep" + param
}
case GotoPGC:
if param != "" {
uri = "https://www.bilibili.com/bangumi/play/ss" + param
}
case GotoArticle:
if param != "" {
uri = "bilibili://article/" + param
}
case GotoArticleTag:
// TODO fuck article
case GotoGame:
// TODO fuck game
if param != "" {
uri = "bilibili://game_center/detail?id=" + param + "&sourceType=adPut"
}
case GotoAudio:
if param != "" {
uri = "bilibili://music/menu/detail/" + param
}
case GotoSong:
if param != "" {
uri = "bilibili://music/detail/" + param
}
case GotoAudioTag:
// uri = "bilibili://music/menus/menu?itemId=(请求所需参数)&cateId=(请求所需参数)&itemVal=(分类的标题value)"
case GotoDaily:
if param != "" {
uri = "bilibili://pegasus/list/daily/" + param
}
case GotoAlbum:
if param != "" {
uri = "bilibili://album/" + param
}
case GotoClip:
if param != "" {
uri = "bilibili://clip/" + param
}
case GotoTag:
if param != "" {
uri = "bilibili://pegasus/channel/" + param
}
case GotoMid:
if param != "" {
uri = "bilibili://space/" + param
}
case GotoDynamicMid:
if param != "" {
uri = "bilibili://space/" + param + "?defaultTab=dynamic"
}
case GotoRank:
uri = "bilibili://rank/"
case GotoConverge:
if param != "" {
uri = "bilibili://pegasus/converge/" + param
}
case GotoLiveTag:
uri = "https://live.bilibili.com/app/area"
case GotoHotTopic:
uri = "bilibili://pegasus/channel/" + param
case GotoWeb:
uri = param
case GotoPicture:
uri = "bilibili://following/detail/" + param
case GotoPictureTag:
uri = "bilibili://pegasus/channel/0/?name=" + param + "&type=topic"
case GotoHotDynamic:
uri = "bilibili://following/detail/" + param
default:
uri = param
}
if f != nil {
uri = f(uri)
}
return
}
// DurationString duration to string
func DurationString(second int64) (s string) {
var hour, min, sec int
if second < 1 {
return
}
d, err := time.ParseDuration(strconv.FormatInt(second, 10) + "s")
if err != nil {
log.Error("%+v", err)
return
}
r := strings.NewReplacer("h", ":", "m", ":", "s", ":")
ts := strings.Split(strings.TrimSuffix(r.Replace(d.String()), ":"), ":")
if len(ts) == 1 {
sec, _ = strconv.Atoi(ts[0])
} else if len(ts) == 2 {
min, _ = strconv.Atoi(ts[0])
sec, _ = strconv.Atoi(ts[1])
} else if len(ts) == 3 {
hour, _ = strconv.Atoi(ts[0])
min, _ = strconv.Atoi(ts[1])
sec, _ = strconv.Atoi(ts[2])
}
if hour == 0 {
s = fmt.Sprintf("%d:%02d", min, sec)
return
}
s = fmt.Sprintf("%d:%02d:%02d", hour, min, sec)
return
}
// StatString Stat to string
func StatString(number int32, suffix string) (s string) {
if number == 0 {
s = "-" + suffix
return
}
if number < 10000 {
s = strconv.FormatInt(int64(number), 10) + suffix
return
}
if number < 100000000 {
s = strconv.FormatFloat(float64(number)/10000, 'f', 1, 64)
return strings.TrimSuffix(s, ".0") + "万" + suffix
}
s = strconv.FormatFloat(float64(number)/100000000, 'f', 1, 64)
return strings.TrimSuffix(s, ".0") + "亿" + suffix
}
// ArchiveViewString ArchiveView to string
func ArchiveViewString(number int32) string {
const _suffix = "观看"
return StatString(number, _suffix)
}
// DanmakuString Danmaku to string
func DanmakuString(number int32) string {
const _suffix = "弹幕"
return StatString(number, _suffix)
}
// LikeString Danmaku to string
func LikeString(number int32) string {
const _suffix = "点赞"
return StatString(number, _suffix)
}
// BangumiFavString BangumiFav to string
func BangumiFavString(number int32) string {
const _suffix = "追番"
return StatString(number, _suffix)
}
// LiveOnlineString online to string
func LiveOnlineString(number int32) string {
const _suffix = "人气"
return StatString(number, _suffix)
}
// FanString fan to string
func FanString(number int32) string {
const _suffix = "粉丝"
return StatString(number, _suffix)
}
// AttentionString fan to string
func AttentionString(number int32) string {
const _suffix = "人关注"
return StatString(number, _suffix)
}
// AudioDescString audio to string
func AudioDescString(firstSong string, total int) (desc1, desc2 string) {
desc1 = firstSong
if total == 1 {
desc2 = "共1首歌曲"
return
}
desc2 = "...共" + strconv.Itoa(total) + "首歌曲"
return
}
// AudioTotalStirng audioTotal to string
func AudioTotalStirng(total int) string {
if total == 0 {
return ""
}
return strconv.Itoa(total) + "首歌曲"
}
// AudioBadgeString audioBadge to string
func AudioBadgeString(number int8) string {
if number == 5 {
return "专辑"
}
return "歌单"
}
// AudioPlayString audioPlay to string
func AudioPlayString(number int32) string {
const _suffix = "收听"
return StatString(number, _suffix)
}
// AudioFavString audioFav to string
func AudioFavString(numbber int32) string {
const _suffix = "收藏"
return StatString(numbber, _suffix)
}
// DownloadString download to string
func DownloadString(number int32) string {
if number == 0 {
return ""
}
const _suffix = "下载"
return StatString(number, _suffix)
}
// ArticleViewString articleView to string
func ArticleViewString(number int64) string {
const _suffix = "阅读"
return StatString(int32(number), _suffix)
}
// PictureViewString pictureView to string
func PictureViewString(number int64) string {
const _suffix = "浏览"
return StatString(int32(number), _suffix)
}
// ArticleReplyString articleReply to string
func ArticleReplyString(number int64) string {
const _suffix = "评论"
return StatString(int32(number), _suffix)
}
// SubscribeString subscribe to string
func SubscribeString(number int32) string {
const _suffix = "人已订阅"
return StatString(number, _suffix)
}
// RecommendString recommend to string
func RecommendString(like, dislike int32) string {
rcmd := like / (like + dislike) * 100
if rcmd != 0 {
return strconv.Itoa(int(rcmd)) + "%的人推荐"
}
return ""
}
// ShoppingDuration shopping duration
func ShoppingDuration(stime, etime string) string {
if stime == "" && etime == "" {
return ""
}
return stime + " - " + etime
}
// ScoreString is
func ScoreString(number int32) string {
const _prefix = "综合评分:"
score := StatString(number, "")
if score != "" {
return _prefix + score
}
return _prefix + "-"
}
// ShoppingCover is
func ShoppingCover(cover string) string {
if strings.HasPrefix(cover, "http:") || strings.HasPrefix(cover, "https:") {
return cover
}
return "http:" + cover
}
// BangumiIcon is.
func BangumiIcon(typ int8) (icon Icon) {
switch typ {
case 1, 4:
icon = IconFavorite
case 2, 3, 5:
icon = IconStar
}
return icon
}
// PubDataString is.
func PubDataString(t time.Time) (s string) {
if t.IsZero() {
return
}
now := time.Now()
sub := now.Sub(t)
if sub < time.Minute {
s = "刚刚"
return
}
if sub < time.Hour {
s = strconv.FormatFloat(sub.Minutes(), 'f', 0, 64) + "分钟前"
return
}
if sub < 24*time.Hour {
s = strconv.FormatFloat(sub.Hours(), 'f', 0, 64) + "小时前"
return
}
if now.Year() == t.Year() {
if now.YearDay()-t.YearDay() == 1 {
s = "昨天"
return
}
s = t.Format("01-02")
return
}
s = t.Format("2006-01-02")
return
}
// PictureCountString is.
func PictureCountString(count int) string {
return strconv.Itoa(count) + "P"
}
// OfficialIcon return 认证图标1 UP 主认证2 身份认证黄标3 企业认证4 政府认证5 媒体认证6 其他认证)蓝标
func OfficialIcon(cd *account.Card) (icon Icon) {
if cd == nil {
return
}
switch cd.Official.Role {
case 1, 2:
icon = IconRoleYellow
case 3, 4, 5, 6:
icon = IconRoleBlue
}
return
}