1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093 |
- package music
- import (
- "context"
- "go-common/app/interface/main/creative/conf"
- "go-common/app/interface/main/creative/dao/account"
- "go-common/app/interface/main/creative/dao/archive"
- material "go-common/app/interface/main/creative/dao/material"
- music "go-common/app/interface/main/creative/dao/music"
- "go-common/app/interface/main/creative/dao/up"
- appMdl "go-common/app/interface/main/creative/model/app"
- mMdl "go-common/app/interface/main/creative/model/music"
- sMdl "go-common/app/interface/main/creative/model/search"
- "go-common/app/interface/main/creative/service"
- accMdl "go-common/app/service/main/account/model"
- "go-common/app/service/main/archive/api"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "go-common/library/queue/databus/report"
- "go-common/library/sync/errgroup"
- "sort"
- "time"
- )
- const hotvalArcFactor = int(357)
- //Service struct.
- type Service struct {
- c *conf.Config
- music *music.Dao
- material *material.Dao
- acc *account.Dao
- archive *archive.Dao
- up *up.Dao
- LatestBgm *mMdl.Music
- MscWithTypes map[int][]*mMdl.Music
- AllMsc map[int64]*mMdl.Music
- Types []*mMdl.Category
- Subtitles []*mMdl.Subtitle
- Fonts []*mMdl.Font
- Filters []*mMdl.Filter
- FilterWithCategory []*mMdl.FilterCategory
- VstickerWithCategory []*mMdl.VstickerCategory
- Hotwords []*mMdl.Hotword
- Stickers []*mMdl.Sticker
- Intros []*mMdl.Intro
- Vstickers []*mMdl.VSticker
- Transitions []*mMdl.Transition
- // from app535 for sticker whitelist
- stickerUps map[int64]int64
- Themes []*mMdl.Theme
- Cooperates []*mMdl.Cooperate
- p *service.Public
- }
- //New get service.
- func New(c *conf.Config, rpcdaos *service.RPCDaos, p *service.Public) *Service {
- s := &Service{
- c: c,
- music: music.New(c),
- material: material.New(c),
- acc: rpcdaos.Acc,
- archive: rpcdaos.Arc,
- up: rpcdaos.Up,
- Types: make([]*mMdl.Category, 0),
- MscWithTypes: make(map[int][]*mMdl.Music),
- AllMsc: make(map[int64]*mMdl.Music),
- Subtitles: make([]*mMdl.Subtitle, 0),
- Fonts: make([]*mMdl.Font, 0),
- Filters: make([]*mMdl.Filter, 0),
- FilterWithCategory: make([]*mMdl.FilterCategory, 0),
- VstickerWithCategory: make([]*mMdl.VstickerCategory, 0),
- Hotwords: make([]*mMdl.Hotword, 0),
- Stickers: make([]*mMdl.Sticker, 0),
- Intros: make([]*mMdl.Intro, 0),
- Vstickers: make([]*mMdl.VSticker, 0),
- Transitions: make([]*mMdl.Transition, 0),
- Themes: make([]*mMdl.Theme, 0),
- Cooperates: make([]*mMdl.Cooperate, 0),
- p: p,
- }
- s.loadUpSpecialSticker()
- s.loadPreValues()
- s.loadMaterial()
- go s.loadproc()
- return s
- }
- // loadUpSpecialSticker 拍摄贴纸支持灰度分发,配合Sticker.white字段使用
- func (s *Service) loadUpSpecialSticker() {
- ups, err := s.up.UpSpecial(context.TODO(), 18)
- if err != nil {
- return
- }
- s.stickerUps = ups
- }
- func (s *Service) loadproc() {
- for {
- time.Sleep(time.Duration(2 * time.Minute))
- s.loadPreValues()
- s.loadMaterial()
- s.loadUpSpecialSticker()
- }
- }
- func (s *Service) loadMaterial() {
- var (
- basic = make(map[string]interface{})
- err error
- g = &errgroup.Group{}
- ctx = context.TODO()
- )
- c := context.TODO()
- if basic, err = s.material.Basic(c); err != nil {
- log.Error("s.material.basic err(%+v)", err)
- return
- }
- if subtitles, ok := basic["subs"].([]*mMdl.Subtitle); ok {
- log.Info("s.material.subs (%+d)", len(subtitles))
- s.Subtitles = subtitles
- }
- if fonts, ok := basic["fons"].([]*mMdl.Font); ok {
- log.Info("s.material.fons (%+d)", len(fonts))
- s.Fonts = fonts
- }
- if hotwords, ok := basic["hots"].([]*mMdl.Hotword); ok {
- log.Info("s.material.hots (%+d)", len(hotwords))
- s.Hotwords = hotwords
- }
- if stickers, ok := basic["stis"].([]*mMdl.Sticker); ok {
- log.Info("s.material.stis (%+d)", len(stickers))
- s.Stickers = stickers
- }
- if intros, ok := basic["ints"].([]*mMdl.Intro); ok {
- log.Info("s.material.ints (%+d)", len(intros))
- s.Intros = intros
- }
- if trans, ok := basic["trans"].([]*mMdl.Transition); ok {
- log.Info("s.material.trans (%+d)", len(trans))
- s.Transitions = trans
- }
- if themes, ok := basic["themes"].([]*mMdl.Theme); ok {
- log.Info("s.material.themes (%+d)", len(themes))
- s.Themes = themes
- }
- g.Go(func() error {
- s.getFilterAndItsCategory(ctx)
- return nil
- })
- g.Go(func() error {
- s.getVStickerAndItsCategory(ctx)
- return nil
- })
- g.Go(func() error {
- s.getCooperates(ctx)
- return nil
- })
- g.Wait()
- }
- func (s *Service) loadPreValues() {
- var (
- mcategory []*mMdl.Mcategory
- resCategorys []*mMdl.Category
- tids []int64
- sids []int64
- err error
- musicMap map[int64]*mMdl.Music
- // latestBgm *mMdl.Music
- jointimeMap = make(map[int64]int64)
- jointimes = make([]int64, 0)
- c = context.TODO()
- sidTidMapIdx = make(map[int64][](map[int]int))
- sidTidMapJoinUnix = make(map[int64][](map[int]int64))
- categoryMaps = make(map[int]*mMdl.Category)
- )
- if mcategory, err = s.music.MCategorys(c); err != nil {
- log.Error("s.music.MCategorys err(%+v)", err)
- return
- }
- for _, v := range mcategory {
- joinUnix := v.CTime.Time().Unix()
- jointimeMap[joinUnix] = v.SID
- jointimes = append(jointimes, joinUnix)
- tid := v.Tid
- tidx := v.Index
- sid := v.SID
- tids = append(tids, int64(tid))
- sids = append(sids, sid)
- if _, ok := sidTidMapIdx[sid]; !ok {
- sidTidMapIdx[sid] = make([](map[int]int), 0)
- }
- sidTidMapIdx[sid] = append(sidTidMapIdx[sid], map[int]int{
- tid: tidx,
- })
- if _, ok := sidTidMapJoinUnix[sid]; !ok {
- sidTidMapJoinUnix[sid] = make([](map[int]int64), 0)
- }
- sidTidMapJoinUnix[sid] = append(sidTidMapJoinUnix[sid], map[int]int64{
- tid: joinUnix,
- })
- }
- if len(tids) > 0 {
- if resCategorys, categoryMaps, err = s.music.Categorys(c, tids); err != nil {
- log.Error("s.music.Categorys tids(%+v)|err(%+v)", tids, err)
- return
- }
- if len(resCategorys) > 0 && len(sids) > 0 {
- if musicMap, err = s.music.Music(c, sids); err != nil {
- log.Error("s.music.Music tids(%+v)|sids(%+v)|err(%+v)", tids, sids, err)
- return
- }
- // get last jointime bgm
- if len(jointimes) > 0 {
- sort.Slice(jointimes, func(i, j int) bool {
- return jointimes[i] >= jointimes[j]
- })
- lastJoinUnix := jointimes[0]
- lastSid := jointimeMap[lastJoinUnix]
- if bgm, ok := musicMap[lastSid]; ok {
- s.LatestBgm = bgm
- }
- }
- s.AllMsc = musicMap
- bgms := make(map[int][]*mMdl.Music)
- upNamesMap, _ := s.getUpNames(c, musicMap)
- for sid, msc := range musicMap {
- if tpsSlice, okM := sidTidMapIdx[sid]; okM {
- for _, tpIdx := range tpsSlice {
- for tp, idx := range tpIdx {
- if _, ok := categoryMaps[tp]; !ok {
- continue
- }
- if _, ok := bgms[tp]; !ok {
- bgms[tp] = make([]*mMdl.Music, 0)
- }
- var (
- junix int64
- upName string
- )
- if name, okU := upNamesMap[msc.UpMID]; okU {
- upName = name
- }
- for _, Jmap := range sidTidMapJoinUnix[sid] {
- if joinUnix, okJ := Jmap[tp]; okJ {
- junix = joinUnix
- }
- }
- bgm := &mMdl.Music{
- ID: msc.ID,
- TID: tp,
- Index: idx,
- SID: msc.SID,
- Name: msc.Name,
- Musicians: upName,
- UpMID: msc.UpMID,
- Cover: msc.Cover,
- Stat: msc.Stat,
- Playurl: msc.Playurl,
- Duration: msc.Duration,
- FileSize: msc.FileSize,
- CTime: msc.CTime,
- MTime: msc.MTime,
- Pubtime: msc.Pubtime,
- Tl: msc.Tl,
- RecommendPoint: msc.RecommendPoint,
- Cooperate: msc.Cooperate,
- CooperateURL: msc.CooperateURL,
- }
- // freash bgm.Tags by joinunix
- if junix+86400*7 >= time.Now().Unix() {
- bgm.New = 1
- bgm.Tags = []string{"NEW"}
- } else {
- bgm.Tags = make([]string, 0)
- }
- if len(msc.Tags) > 0 {
- bgm.Tags = append(bgm.Tags, msc.Tags...)
- }
- topLen := 3
- if len(bgm.Tags) > topLen {
- bgm.Tags = bgm.Tags[:topLen]
- }
- bgms[tp] = append(bgms[tp], bgm)
- }
- }
- }
- }
- if len(bgms) > 0 {
- s.MscWithTypes = bgms
- }
- var filterdCategorys []*mMdl.Category
- for _, t := range resCategorys {
- if len(bgms[t.ID]) > 0 {
- sort.Slice(bgms[t.ID], func(i, j int) bool {
- return bgms[t.ID][i].Index < bgms[t.ID][j].Index
- })
- t.Children = bgms[t.ID]
- filterdCategorys = append(filterdCategorys, t)
- }
- }
- s.Types = filterdCategorys
- }
- }
- log.Info("loadPreValues (%d)|(%d)", len(s.MscWithTypes), len(s.Types))
- }
- // BgmExt fn
- func (s *Service) BgmExt(c context.Context, mid, sid int64) (ret *mMdl.BgmExt, err error) {
- var (
- bgm *mMdl.Music
- upMid int64
- shouldFollowMids []int64
- g = &errgroup.Group{}
- ctx = context.TODO()
- extSidMap map[int]int64
- )
- log.Warn("BgmExt allMsc(%d)", len(s.AllMsc))
- if v, ok := s.AllMsc[sid]; ok {
- bgm = v
- ret = &mMdl.BgmExt{
- Msc: bgm,
- }
- } else {
- return
- }
- log.Warn("BgmExt finish find bgm allMsc(%d)|bgm(%+v)", len(s.AllMsc), bgm)
- if bgm == nil {
- return
- }
- log.Warn("BgmExt bgm info (%+v)", bgm)
- upMid = bgm.UpMID
- ret.ExtMscs, extSidMap = s.UperOtherBgmsFromRecom(ctx, upMid, sid)
- ip := metadata.String(c, metadata.RemoteIP)
- // step 1: get ext aids and rpc archives
- g.Go(func() error {
- ret.ExtArcs, ret.Msc.Hotval, err = s.ExtArcsWithSameBgm(ctx, sid)
- log.Warn("BgmExt step 1: extArcs(%+v)|hotVal(%+v)|sid(%+d)|err(%+v)", ret.ExtArcs, ret.Msc.Hotval, sid, err)
- return nil
- })
- // step 2: get ext mscs
- g.Go(func() error {
- ret.ExtMscs, err = s.ExtSidHotMapAndSort(ctx, ret.ExtMscs, extSidMap)
- log.Warn("BgmExt step 2: ExtMscs(%+v)|extSidMap(%+v)|err(%+v)", ret.ExtMscs, extSidMap, err)
- return nil
- })
- // step 3: get up info and if should follow
- g.Go(func() error {
- ret.UpProfile, err = s.acc.Profile(ctx, upMid, ip)
- log.Warn("BgmExt step 3: profile mid(%+v)", upMid)
- return nil
- })
- // step 4: get up info and if should follow
- g.Go(func() error {
- shouldFollowMids, err = s.acc.ShouldFollow(ctx, mid, []int64{upMid}, ip)
- if len(shouldFollowMids) == 1 {
- ret.ShouldFollow = true
- }
- log.Warn("BgmExt step 4: shouldFollow(%+v)", ret.ShouldFollow)
- return nil
- })
- g.Wait()
- return
- }
- // ExtSidHotMapAndSort fn, sorry ...
- func (s *Service) ExtSidHotMapAndSort(c context.Context, ExtMscs []*mMdl.Music, extSidMap map[int]int64) (res []*mMdl.Music, err error) {
- var (
- s1total, s2total, s3total int
- s1hot, s2hot, s3hot int
- )
- if len(extSidMap) > 0 {
- var (
- g = &errgroup.Group{}
- ctx = context.TODO()
- )
- if sid, ok := extSidMap[1]; ok {
- g.Go(func() error {
- if _, s1total, err = s.music.ExtAidsWithSameBgm(ctx, sid, 1); err != nil {
- log.Error("ExtAidsWithSameBgm S1 error(%v)", err)
- }
- s1hot = s1total * hotvalArcFactor
- return nil
- })
- }
- if sid, ok := extSidMap[2]; ok {
- g.Go(func() error {
- if _, s2total, err = s.music.ExtAidsWithSameBgm(ctx, sid, 1); err != nil {
- log.Error("ExtAidsWithSameBgm S2 error(%v)", err)
- }
- s2hot = s2total * hotvalArcFactor
- return nil
- })
- }
- if sid, ok := extSidMap[3]; ok {
- g.Go(func() error {
- if _, s3total, err = s.music.ExtAidsWithSameBgm(ctx, sid, 1); err != nil {
- log.Error("ExtAidsWithSameBgm S3 error(%v)", err)
- }
- s3hot = s3total * hotvalArcFactor
- return nil
- })
- }
- g.Wait()
- }
- for idx, v := range ExtMscs {
- if idx == 0 {
- v.Hotval = s1hot
- }
- if idx == 1 {
- v.Hotval = s2hot
- }
- if idx == 2 {
- v.Hotval = s3hot
- }
- }
- sort.Slice(ExtMscs, func(i, j int) bool {
- return ExtMscs[i].Hotval > ExtMscs[j].Hotval
- })
- res = ExtMscs
- return
- }
- // ExtArcsWithSameBgm fn
- func (s *Service) ExtArcsWithSameBgm(c context.Context, sid int64) (res []*api.Arc, hot int, err error) {
- var (
- arcMap map[int64]*api.Arc
- aids []int64
- total int
- )
- aids, total, err = s.music.ExtAidsWithSameBgm(c, sid, 100)
- if len(aids) > 0 {
- ip := metadata.String(c, metadata.RemoteIP)
- if arcMap, err = s.archive.Archives(c, aids, ip); err != nil {
- log.Error("s.archive.Archives Stats (%v) error(%v)", aids, err)
- err = ecode.CreativeArcServiceErr
- return
- }
- for _, aid := range aids {
- if arc, ok := arcMap[aid]; ok && arc.State >= 0 {
- res = append(res, arc)
- }
- }
- }
- topLen := 20
- if len(res) > topLen {
- res = res[:topLen]
- }
- hot = total * hotvalArcFactor
- return
- }
- // UperOtherBgmsFromRecom fn, 最多三个同一个Up主的bgms
- func (s *Service) UperOtherBgmsFromRecom(c context.Context, upmid, sid int64) (res []*mMdl.Music, extSidMap map[int]int64) {
- extSidMap = make(map[int]int64)
- idx := int(1)
- for _, mscs := range s.MscWithTypes {
- for _, msc := range mscs {
- if msc.SID != sid &&
- msc.UpMID == upmid &&
- len(extSidMap) < 3 {
- res = append(res, msc)
- extSidMap[idx] = msc.SID
- idx++
- }
- }
- }
- return
- }
- // BgmView fn
- func (s *Service) BgmView(c context.Context, sid int64) (ret *mMdl.Music) {
- for _, msc := range s.AllMsc {
- if msc.ID == sid {
- ret = msc
- break
- }
- }
- return
- }
- // PreByFrom fn
- func (s *Service) PreByFrom(c context.Context, from int) (types []*mMdl.Category) {
- if from == 1 {
- sort.Slice(s.Types, func(i, j int) bool {
- return s.Types[i].CameraIndex <= s.Types[j].CameraIndex
- })
- } else {
- sort.Slice(s.Types, func(i, j int) bool {
- return s.Types[i].Index <= s.Types[j].Index
- })
- }
- types = s.Types
- return
- }
- // BgmList fn
- func (s *Service) BgmList(c context.Context, tid int) (ret []*mMdl.Music) {
- if len(s.MscWithTypes) > 0 {
- if mics, ok := s.MscWithTypes[tid]; ok {
- ret = mics
- }
- }
- return
- }
- // getUpNames fn
- func (s *Service) getUpNames(c context.Context, mmap map[int64]*mMdl.Music) (ret map[int64]string, err error) {
- var (
- minfos map[int64]*accMdl.Info
- mids []int64
- )
- ret = make(map[int64]string)
- for _, msc := range mmap {
- mids = append(mids, msc.UpMID)
- }
- if len(mids) > 0 {
- minfos, err = s.acc.Infos(c, mids, "localhost")
- if err != nil {
- log.Info("minfos err mids (%+v)|err(%+v)", mids, err)
- return
- }
- for _, info := range minfos {
- ret[info.Mid] = info.Name
- }
- }
- return
- }
- // Cooperate fn
- func (s *Service) Cooperate(c context.Context, id, mid int64) (res *mMdl.Cooperate) {
- _, white := s.stickerUps[mid]
- for _, v := range s.Cooperates {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- return
- }
- // Material fn
- func (s *Service) Material(c context.Context, id int64, tp int8, mid int64) (res interface{}) {
- if _, ok := mMdl.ViewTpMap[tp]; !ok {
- return
- }
- _, white := s.stickerUps[mid]
- switch tp {
- case appMdl.TypeSubtitle:
- for _, v := range s.Subtitles {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeFont:
- for _, v := range s.Fonts {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeFilter:
- for _, v := range s.Filters {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeSticker:
- for _, v := range s.Stickers {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeVideoupSticker:
- for _, v := range s.Vstickers {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeTransition:
- for _, v := range s.Transitions {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeCooperate:
- for _, v := range s.Cooperates {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- case appMdl.TypeTheme:
- for _, v := range s.Themes {
- if v.White == 1 && !white {
- return
- }
- if v.ID == id {
- return v
- }
- }
- }
- return
- }
- // MaterialPre fn
- func (s *Service) MaterialPre(c context.Context, mid int64, platStr string, build int) (res map[string]interface{}) {
- var (
- hotwords = []*mMdl.Hotword{}
- stickers = []*mMdl.Sticker{}
- vstickers = []*mMdl.VSticker{}
- trans = []*mMdl.Transition{}
- cooperates = []*mMdl.Cooperate{}
- themes = []*mMdl.Theme{}
- intros = []*mMdl.Intro{}
- intro = &mMdl.Intro{}
- subs = []*mMdl.Subtitle{}
- fonts = []*mMdl.Font{}
- filters = []*mMdl.Filter{}
- filterWithCategory = make([]*mMdl.FilterCategory, 0)
- vstickerWithCategory = make([]*mMdl.VstickerCategory, 0)
- white bool
- )
- _, white = s.stickerUps[mid]
- for _, v := range s.Subtitles {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- subs = append(subs, v)
- }
- for _, v := range s.Fonts {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- fonts = append(fonts, v)
- }
- for _, v := range s.Filters {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- filters = append(filters, v)
- }
- for _, v := range s.Hotwords {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- hotwords = append(hotwords, v)
- }
- for _, v := range s.Stickers {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- stickers = append(stickers, v)
- }
- for _, v := range s.Intros {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- intros = append(intros, v)
- }
- for _, v := range s.Vstickers {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- vstickers = append(vstickers, v)
- }
- for _, v := range s.Transitions {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- trans = append(trans, v)
- }
- for _, v := range s.Themes {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- themes = append(themes, v)
- }
- for _, v := range s.Cooperates {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- cooperates = append(cooperates, v)
- }
- for _, fcategory := range s.FilterWithCategory {
- fcategoryChilds := make([]*mMdl.Filter, 0)
- for _, v := range fcategory.Children {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- fcategoryChilds = append(fcategoryChilds, v)
- }
- if len(fcategoryChilds) > 0 {
- filterWithCategory = append(filterWithCategory, &mMdl.FilterCategory{
- ID: fcategory.ID,
- Name: fcategory.Name,
- Rank: fcategory.Rank,
- Tp: fcategory.Tp,
- Children: fcategoryChilds,
- })
- }
- }
- for _, vscategory := range s.VstickerWithCategory {
- vscategoryChilds := make([]*mMdl.VSticker, 0)
- for _, v := range vscategory.Children {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- vscategoryChilds = append(vscategoryChilds, v)
- }
- if len(vscategoryChilds) > 0 {
- vstickerWithCategory = append(vstickerWithCategory, &mMdl.VstickerCategory{
- ID: vscategory.ID,
- Name: vscategory.Name,
- Rank: vscategory.Rank,
- Tp: vscategory.Tp,
- Children: vscategoryChilds,
- })
- }
- }
- if len(intros) > 0 {
- intro = intros[0]
- }
- res = map[string]interface{}{
- "filter": filters,
- "filter_with_category": filterWithCategory,
- "hotword": hotwords,
- "sticker": stickers,
- "intro": intro,
- "subtitle": subs,
- "font": fonts,
- "trans": trans,
- "themes": themes,
- "cooperates": cooperates,
- "videoup_sticker": vstickers,
- "vsticker_with_category": vstickerWithCategory,
- "latests": s.genLatests(intros, filters, subs, fonts, hotwords, stickers, vstickers, trans, cooperates, themes),
- }
- return
- }
- // begin from app 536
- func (s *Service) genLatests(intros []*mMdl.Intro, filters []*mMdl.Filter, subs []*mMdl.Subtitle, fonts []*mMdl.Font, hotwords []*mMdl.Hotword, stickers []*mMdl.Sticker, vstickers []*mMdl.VSticker, trans []*mMdl.Transition, coos []*mMdl.Cooperate, themes []*mMdl.Theme) (latests map[int8]interface{}) {
- latests = make(map[int8]interface{})
- latests[appMdl.TypeBGM] = s.LatestBgm
- if len(intros) > 0 {
- sort.Slice(intros, func(i, j int) bool {
- return intros[i].MTime >= intros[j].MTime
- })
- latests[appMdl.TypeIntro] = intros[0]
- }
- if len(themes) > 0 {
- cthemes := make([]*mMdl.Theme, len(themes))
- copy(cthemes, themes)
- sort.Slice(cthemes, func(i, j int) bool {
- return cthemes[i].MTime >= cthemes[j].MTime
- })
- latests[appMdl.TypeTheme] = cthemes[0]
- }
- if len(coos) > 0 {
- ccoos := make([]*mMdl.Cooperate, len(coos))
- copy(ccoos, coos)
- sort.Slice(ccoos, func(i, j int) bool {
- return ccoos[i].MTime >= ccoos[j].MTime
- })
- latests[appMdl.TypeCooperate] = ccoos[0]
- }
- if len(trans) > 0 {
- ctrans := make([]*mMdl.Transition, len(trans))
- copy(ctrans, trans)
- sort.Slice(ctrans, func(i, j int) bool {
- return ctrans[i].MTime >= ctrans[j].MTime
- })
- latests[appMdl.TypeTransition] = ctrans[0]
- }
- if len(vstickers) > 0 {
- cvstickers := make([]*mMdl.VSticker, len(vstickers))
- copy(cvstickers, vstickers)
- sort.Slice(cvstickers, func(i, j int) bool {
- return cvstickers[i].MTime >= cvstickers[j].MTime
- })
- latests[appMdl.TypeVideoupSticker] = cvstickers[0]
- }
- if len(stickers) > 0 {
- cstickers := make([]*mMdl.Sticker, len(stickers))
- copy(cstickers, stickers)
- sort.Slice(cstickers, func(i, j int) bool {
- return cstickers[i].MTime >= cstickers[j].MTime
- })
- latests[appMdl.TypeSticker] = cstickers[0]
- }
- if len(hotwords) > 0 {
- chotwords := make([]*mMdl.Hotword, len(hotwords))
- copy(chotwords, hotwords)
- sort.Slice(chotwords, func(i, j int) bool {
- return chotwords[i].MTime >= chotwords[j].MTime
- })
- latests[appMdl.TypeHotWord] = chotwords[0]
- }
- if len(fonts) > 0 {
- cfonts := make([]*mMdl.Font, len(fonts))
- copy(cfonts, fonts)
- sort.Slice(cfonts, func(i, j int) bool {
- return cfonts[i].MTime >= cfonts[j].MTime
- })
- latests[appMdl.TypeFont] = cfonts[0]
- }
- if len(filters) > 0 {
- cfilters := make([]*mMdl.Filter, len(filters))
- copy(cfilters, filters)
- sort.Slice(cfilters, func(i, j int) bool {
- return cfilters[i].MTime >= cfilters[j].MTime
- })
- latests[appMdl.TypeFilter] = cfilters[0]
- }
- if len(subs) > 0 {
- csubs := make([]*mMdl.Subtitle, len(subs))
- copy(csubs, subs)
- sort.Slice(csubs, func(i, j int) bool {
- return csubs[i].MTime >= csubs[j].MTime
- })
- latests[appMdl.TypeSubtitle] = csubs[0]
- }
- return
- }
- // AddBgmFeedBack send to log service
- func (s *Service) AddBgmFeedBack(c context.Context, name, musicians, platform string, mid int64) (err error) {
- uInfo := &report.UserInfo{
- Mid: mid,
- Platform: platform,
- Business: 82, // app投稿业务
- Type: 1, //投稿bgm反馈
- Oid: mid,
- Action: "add_bgm_feedback",
- Ctime: time.Now(),
- IP: metadata.String(c, metadata.RemoteIP),
- Index: []interface{}{name, musicians, mid},
- }
- uInfo.Content = map[string]interface{}{
- "name": name,
- "musicians": musicians,
- "mid": mid,
- }
- report.User(uInfo)
- log.Info("send AddBgmFeedBack Log data(%+v)", uInfo)
- return
- }
- // BgmSearch fn
- func (s *Service) BgmSearch(c context.Context, kw string, mid int64, pn, ps int) (res *sMdl.BgmSearchRes) {
- res = &sMdl.BgmSearchRes{
- Bgms: make([]*mMdl.Music, 0),
- Pager: &sMdl.Pager{
- Num: pn,
- Size: ps,
- Total: 0,
- },
- }
- if len(kw) == 0 {
- return
- }
- var (
- err error
- resIDS = make([]int64, 0)
- mids = make([]int64, 0)
- pager *sMdl.Pager
- minfos map[int64]*accMdl.Info
- )
- if resIDS, pager, err = s.music.SearchBgmSIDs(c, kw, pn, ps); err != nil {
- log.Error("s.music.SearchBgmSIDs kw(%s)|pn(%d)|ps(%d) error(%v)", kw, pn, ps, err)
- return
- }
- for _, sid := range resIDS {
- if msc, ok := s.AllMsc[sid]; ok {
- res.Bgms = append(res.Bgms, msc)
- mids = append(mids, msc.UpMID)
- }
- }
- if len(mids) > 0 {
- minfos, err = s.acc.Infos(c, mids, "localhost")
- if err != nil {
- log.Info("minfos err mids (%+v)|err(%+v)", mids, err)
- return
- }
- for _, v := range res.Bgms {
- if up, ok := minfos[v.UpMID]; ok {
- v.Musicians = up.Name
- }
- }
- }
- if pager != nil {
- res.Pager.Total = pager.Total
- }
- return
- }
- func (s *Service) getFilterAndItsCategory(ctx context.Context) {
- var (
- err error
- filters []*mMdl.Filter
- filterMap map[int64]*mMdl.Filter
- filterCategory = make([]*mMdl.FilterCategory, 0)
- filterBinds []*mMdl.MaterialBind
- )
- c := context.Background()
- if filters, filterMap, err = s.material.Filters(c); err != nil {
- log.Error("s.material.Filters err(%+v)", err)
- return
- }
- s.Filters = filters
- if filterBinds, err = s.material.CategoryBind(c, appMdl.TypeFilter); err != nil {
- log.Error("s.material.CategoryBind err(%+v)", err)
- return
- }
- mapsByCID := make(map[int64]*mMdl.FilterCategory)
- for _, bind := range filterBinds {
- oldF := filterMap[bind.MID]
- if oldF == nil {
- continue
- }
- newF := &mMdl.Filter{
- ID: oldF.ID,
- Name: oldF.Name,
- Cover: oldF.Cover,
- DownloadURL: oldF.DownloadURL,
- Rank: bind.BRank,
- Extra: oldF.Extra,
- Material: oldF.Material,
- MTime: oldF.MTime,
- New: oldF.New,
- Tags: oldF.Tags,
- FilterType: oldF.FilterType,
- }
- if _, ok := mapsByCID[bind.CID]; !ok {
- mapsByCID[bind.CID] = &mMdl.FilterCategory{
- ID: bind.CID,
- Name: bind.CName,
- Rank: bind.CRank,
- Tp: bind.Tp,
- New: bind.New,
- Children: []*mMdl.Filter{newF},
- }
- } else {
- mapsByCID[bind.CID].Children = append(mapsByCID[bind.CID].Children, newF)
- }
- }
- for _, v := range mapsByCID {
- sort.Slice(v.Children, func(i, j int) bool {
- return v.Children[i].Rank <= v.Children[j].Rank
- })
- filterCategory = append(filterCategory, v)
- }
- sort.Slice(filterCategory, func(i, j int) bool {
- return filterCategory[i].Rank <= filterCategory[j].Rank
- })
- s.FilterWithCategory = filterCategory
- }
- func (s *Service) getCooperates(ctx context.Context) {
- var (
- err error
- coos []*mMdl.Cooperate
- daids []int64
- darcMap map[int64]*api.Arc
- )
- c := context.Background()
- if coos, daids, err = s.material.Cooperates(c); err != nil {
- log.Error("s.material.Cooperates err(%+v)", err)
- return
- }
- ip := metadata.String(c, metadata.RemoteIP)
- if len(daids) > 0 {
- if darcMap, err = s.archive.Archives(c, daids, ip); err != nil {
- log.Error("s.archive.Archives err(%+v)", err)
- return
- }
- }
- for _, v := range coos {
- mtime := v.MTime.Time()
- hot1 := 20000
- hot2 := mtime.Hour()*100 + mtime.Minute()
- hot3 := 567 * v.ArcCnt
- v.HotVal = hot1 + hot2 + hot3
- if arc, ok := darcMap[v.DemoAID]; ok {
- v.Cover = arc.Pic
- }
- }
- s.Cooperates = coos
- }
- func (s *Service) getVStickerAndItsCategory(ctx context.Context) {
- var (
- err error
- vstickers []*mMdl.VSticker
- vstickersMap map[int64]*mMdl.VSticker
- vstickerCategory = make([]*mMdl.VstickerCategory, 0)
- vstickerBinds []*mMdl.MaterialBind
- )
- c := context.Background()
- if vstickers, vstickersMap, err = s.material.Vstickers(c); err != nil {
- log.Error("s.material.vstickers err(%+v)", err)
- return
- }
- s.Vstickers = vstickers
- if vstickerBinds, err = s.material.CategoryBind(c, appMdl.TypeVideoupSticker); err != nil {
- log.Error("s.material.CategoryBind err(%+v)", err)
- return
- }
- mapsByCID := make(map[int64]*mMdl.VstickerCategory)
- for _, bind := range vstickerBinds {
- oldF := vstickersMap[bind.MID]
- if oldF == nil {
- continue
- }
- newF := &mMdl.VSticker{
- ID: oldF.ID,
- Name: oldF.Name,
- Cover: oldF.Cover,
- DownloadURL: oldF.DownloadURL,
- Rank: bind.BRank,
- Extra: oldF.Extra,
- Material: oldF.Material,
- }
- if _, ok := mapsByCID[bind.CID]; !ok {
- mapsByCID[bind.CID] = &mMdl.VstickerCategory{
- ID: bind.CID,
- Name: bind.CName,
- Rank: bind.CRank,
- Tp: bind.Tp,
- New: bind.New,
- Children: []*mMdl.VSticker{newF},
- }
- } else {
- mapsByCID[bind.CID].Children = append(mapsByCID[bind.CID].Children, newF)
- }
- }
- for _, v := range mapsByCID {
- sort.Slice(v.Children, func(i, j int) bool {
- return v.Children[i].Rank <= v.Children[j].Rank
- })
- vstickerCategory = append(vstickerCategory, v)
- }
- sort.Slice(vstickerCategory, func(i, j int) bool {
- return vstickerCategory[i].Rank <= vstickerCategory[j].Rank
- })
- s.VstickerWithCategory = vstickerCategory
- }
- // CooperatePre fn
- func (s *Service) CooperatePre(c context.Context, mid int64, platStr string, build int) (cooperates []*mMdl.Cooperate) {
- var (
- white bool
- )
- cooperates = make([]*mMdl.Cooperate, 0)
- _, white = s.stickerUps[mid]
- for _, v := range s.Cooperates {
- if !v.AllowMaterial(v.Material, platStr, build, white) {
- continue
- }
- cooperates = append(cooperates, v)
- }
- for _, x := range cooperates {
- if x.MissionID > 0 {
- if mis, ok := s.p.ActMapCache[x.MissionID]; ok {
- x.Mission = mis
- }
- }
- }
- return
- }
|