go-common/app/interface/main/app-card/model/const.go

786 lines
20 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}