123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 |
- package region
- import (
- "context"
- "fmt"
- "strconv"
- "time"
- "go-common/app/interface/main/app-show/model"
- "go-common/app/interface/main/app-show/model/bangumi"
- "go-common/app/interface/main/app-show/model/card"
- "go-common/app/interface/main/app-show/model/region"
- "go-common/app/interface/main/app-show/model/tag"
- "go-common/app/service/main/archive/api"
- resource "go-common/app/service/main/resource/model"
- "go-common/library/log"
- )
- var (
- // 番剧 动画,音乐,舞蹈,游戏,科技,娱乐,鬼畜,电影,时尚, 生活,国漫
- _tids = []int{13, 1, 3, 129, 4, 36, 5, 119, 23, 155, 160, 11, 167}
- )
- // loadBanner1 load banner cache.
- func (s *Service) loadBanner() {
- var (
- resbs = map[int8]map[int][]*resource.Banner{}
- )
- for plat, resIDStr := range _bannersPlat {
- mobiApp := model.MobiApp(plat)
- res, err := s.res.ResBanner(context.TODO(), plat, 515007, 0, resIDStr, "master", "", "", "", mobiApp, "", "", false)
- if err != nil || len(res) == 0 {
- log.Error("s.res.ResBanner is null or err(%v)", err)
- return
- }
- resbs[plat] = res
- }
- if len(resbs) > 0 {
- s.bannerCache = resbs
- }
- log.Info("loadBannerCahce success")
- }
- func (s *Service) loadbgmBanner() {
- bgmBanners := map[int8]map[int][]*bangumi.Banner{}
- for plat, b := range _bannersPGC {
- ridBanners := map[int][]*bangumi.Banner{}
- for rid, pgcID := range b {
- bBanner, err := s.bgm.Banners(context.TODO(), pgcID)
- if err != nil {
- log.Error("s.bgmdao.Banners is null or err(%v)", err)
- return
- }
- ridBanners[rid] = bBanner
- }
- bgmBanners[plat] = ridBanners
- }
- s.bannerBmgCache = bgmBanners
- }
- // loadRegionShow
- func (s *Service) loadShow() {
- // default use android regions TODO
- regionkey := fmt.Sprintf(_initRegionKey, model.PlatAndroid, _initlanguage)
- res := s.cachelist[regionkey]
- var (
- // region tmp
- showTmp = map[int][]*region.ShowItem{} // tmp hotCache
- showNTmp = map[int][]*region.ShowItem{} // tmp newCache
- showD = map[int][]*region.ShowItem{} // tmp dynamicCache
- sTmp = map[int]*region.Show{}
- // region tmp overseas
- showTmpOsea = map[int][]*region.ShowItem{} // tmp overseas hotCache
- showNTmpOsea = map[int][]*region.ShowItem{} // tmp overseas newCache
- showDOsea = map[int][]*region.ShowItem{} // tmp overseas dynamicCache
- sTmpOsea = map[int]*region.Show{}
- // aids
- showDynamicAids = map[int][]int64{}
- // new region feed
- regionFeedTmp = map[int]*region.Show{}
- regionFeedTmpOsea = map[int]*region.Show{}
- )
- for _, v := range res {
- if v.Reid == 0 {
- if v.Rid == 65537 || v.Rid == 65539 || v.Rid == 65541 || v.Rid == 65543 {
- continue
- }
- var (
- tmp, tmpOsea []*region.ShowItem
- aidsTmp []int64
- )
- tmp, tmpOsea = s.loadShowHot(v.Rid)
- showTmp[v.Rid], showTmpOsea[v.Rid] = s.upCache(tmp, tmpOsea, s.hotCache[v.Rid], s.hotOseaCache[v.Rid])
- tmp, tmpOsea = s.loadShowNewRpc(v.Rid)
- showNTmp[v.Rid], showNTmpOsea[v.Rid] = s.upCache(tmp, tmpOsea, s.newCache[v.Rid], s.newOseaCache[v.Rid])
- tmp, tmpOsea, aidsTmp = s.loadShowDynamic(v.Rid)
- showDynamicAids[v.Rid] = s.upAidsCache(aidsTmp, s.showDynamicAidsCache[v.Rid])
- showD[v.Rid], showDOsea[v.Rid] = s.upCache(tmp, tmpOsea, s.dynamicCache[v.Rid], s.dynamicOseaCache[v.Rid])
- sTmp[v.Rid] = s.mergeShow(showTmp[v.Rid], showNTmp[v.Rid], showD[v.Rid])
- // overseas
- sTmpOsea[v.Rid] = s.mergeShow(showTmpOsea[v.Rid], showNTmpOsea[v.Rid], showDOsea[v.Rid])
- // new region feed
- regionFeedTmp[v.Rid], _ = s.mergeChildShow(showTmp[v.Rid], showNTmp[v.Rid])
- regionFeedTmpOsea[v.Rid], _ = s.mergeChildShow(showTmpOsea[v.Rid], showNTmpOsea[v.Rid])
- }
- }
- s.showCache = sTmp
- s.hotCache = showTmp
- s.newCache = showNTmp
- s.dynamicCache = showD
- // overseas
- s.showOseaCache = sTmpOsea
- s.hotOseaCache = showTmpOsea
- s.newOseaCache = showNTmpOsea
- s.dynamicOseaCache = showDOsea
- // new region feed
- s.regionFeedCache = regionFeedTmp
- s.regionFeedOseaCache = regionFeedTmpOsea
- // aids
- s.showDynamicAidsCache = showDynamicAids
- }
- // loadShowChild
- func (s *Service) loadShowChild() {
- // default use android regions TODO
- regionkey := fmt.Sprintf(_initRegionKey, model.PlatAndroid, _initlanguage)
- res := s.cachelist[regionkey]
- var (
- scTmp = map[int]*region.Show{}
- showC = map[int][]*region.ShowItem{} // tmp childHotCache
- showCN = map[int][]*region.ShowItem{} // tmp childNewCache
- // region tmp overseas
- scTmpOsea = map[int]*region.Show{}
- showCOsea = map[int][]*region.ShowItem{} // tmp overseas childHotCache
- showCNOsea = map[int][]*region.ShowItem{} // tmp overseas childNewCache
- // aids
- showChildAids = map[int][]int64{}
- showNewAids = map[int][]int64{}
- )
- for _, v := range res {
- if v.Reid != 0 {
- var (
- tmp, tmpOsea []*region.ShowItem
- aidsTmp []int64
- )
- tmp, tmpOsea, aidsTmp = s.loadShowChileHot(v.Rid)
- showChildAids[v.Rid] = s.upAidsCache(aidsTmp, s.childHotAidsCache[v.Rid])
- showC[v.Rid], showCOsea[v.Rid] = s.upCache(tmp, tmpOsea, s.childHotCache[v.Rid], s.childHotOseaCache[v.Rid])
- tmp, tmpOsea, aidsTmp = s.loadShowChildNew(v.Rid)
- showNewAids[v.Rid] = s.upAidsCache(aidsTmp, s.childNewAidsCache[v.Rid])
- showCN[v.Rid], showCNOsea[v.Rid] = s.upCache(tmp, tmpOsea, s.childNewCache[v.Rid], s.childNewOseaCache[v.Rid])
- scTmp[v.Rid], showCN[v.Rid] = s.mergeChildShow(showC[v.Rid], showCN[v.Rid])
- // overseas
- scTmpOsea[v.Rid], showCNOsea[v.Rid] = s.mergeChildShow(showCOsea[v.Rid], showCNOsea[v.Rid])
- }
- }
- s.childShowCache = scTmp
- s.childHotCache = showC
- s.childNewCache = showCN
- // overseas
- s.childShowOseaCache = scTmpOsea
- s.childHotOseaCache = showCOsea
- s.childNewOseaCache = showCNOsea
- // region child aids
- s.childHotAidsCache = showChildAids
- s.childNewAidsCache = showNewAids
- }
- func (s *Service) loadShowChildTagsInfo() {
- // default use android regions TODO
- regionkey := fmt.Sprintf(_initRegionKey, model.PlatAndroid, _initlanguage)
- res := s.cachelist[regionkey]
- reslist := s.regionListCache[regionkey]
- var (
- // tag tmp
- tagsRegionTmp = map[int][]*region.SimilarTag{} // region tags
- tagsTmp = map[string]string{} // tagid cache
- )
- for _, v := range res {
- if v.Reid != 0 {
- //tag
- var rTmp *region.Region
- if r, ok := reslist[v.Reid]; ok {
- rTmp = r
- }
- if tids := s.loadShowChildTagIDs(v.Rid); len(tids) > 0 {
- for _, tag := range tids {
- tagInfo := ®ion.SimilarTag{
- TagId: int(tag.Tid),
- TagName: tag.Name,
- Rid: v.Rid,
- Rname: v.Name,
- }
- if rTmp != nil {
- tagInfo.Reid = rTmp.Rid
- tagInfo.Rename = rTmp.Name
- }
- //tags info
- tagsRegionTmp[v.Rid] = append(tagsRegionTmp[v.Rid], tagInfo)
- key := fmt.Sprintf(_initRegionTagKey, v.Rid, tag.Tid)
- tagsTmp[key] = tag.Name
- }
- }
- }
- }
- // region child aids
- s.regionTagCache = tagsRegionTmp
- s.tagsCache = tagsTmp
- }
- // loadShowHot
- func (s *Service) loadShowHot(rid int) (resData, resOseaData []*region.ShowItem) {
- res, err := s.rcmmnd.RegionHots(context.TODO(), rid)
- if err != nil {
- log.Error("s.rcmmnd.RegionHot(%d) error(%v)", rid, err)
- return
- }
- if len(res) > 8 {
- res = res[:8]
- }
- resData, resOseaData = s.fromAids(context.TODO(), res, false, 0)
- log.Info("loadShowHot(%d) success", rid)
- return
- }
- // loadShowNewRpc
- func (s *Service) loadShowNewRpc(rid int) (resData, resOseaData []*region.ShowItem) {
- arcs, err := s.arc.RankTopArcs(context.TODO(), rid, 1, 20)
- if err != nil {
- log.Error("s.arc.RankTopArcs(%d) error(%v)", rid, err)
- return
- }
- if len(arcs) > 20 {
- arcs = arcs[:20]
- }
- resData, resOseaData = s.fromArchivesPB(arcs)
- log.Info("loadShowNewRpc(%d) success", rid)
- return
- }
- // loadShowDynamic
- func (s *Service) loadShowDynamic(rid int) (resData, resOseaData []*region.ShowItem, arcAids []int64) {
- var (
- err error
- arcs []*api.Arc
- )
- arcs, arcAids, err = s.dyn.RegionDynamic(context.TODO(), rid, 1, 100)
- if err != nil || len(arcs) < 20 {
- log.Error("s.rcmmnd.RegionDynamic(%d) error(%v)", rid, err)
- return
- }
- resData, resOseaData = s.fromArchivesPB(arcs)
- log.Info("loadShowRPCDynamic(%d) success", rid)
- return
- }
- // loadShowChileHot
- func (s *Service) loadShowChileHot(rid int) (resData, resOseaData []*region.ShowItem, arcAids []int64) {
- var err error
- arcAids, err = s.rcmmnd.RegionChildHots(context.TODO(), rid)
- if err != nil || len(arcAids) < 4 {
- log.Error("s.rcmmnd.RegionChildHots(%d) error(%v)", rid, err)
- return
- }
- resData, resOseaData = s.fromAids(context.TODO(), arcAids, false, 0)
- log.Info("loadShowChileHot(%d) success", rid)
- return
- }
- // loadShowChildNew
- func (s *Service) loadShowChildNew(rid int) (resData, resOseaData []*region.ShowItem, arcAids []int64) {
- var (
- err error
- arcs []*api.Arc
- )
- arcs, arcAids, err = s.arc.RanksArcs(context.TODO(), rid, 1, 300)
- if err != nil || len(arcAids) < 20 {
- log.Error("s.arc.RanksArc(%d) error(%v)", rid, err)
- return
- }
- resData, resOseaData = s.fromArchivesPB(arcs)
- log.Info("loadShowChildNew(%d) success", rid)
- return
- }
- // loadShowChildTagIDs
- func (s *Service) loadShowChildTagIDs(rid int) (tags []*tag.Tag) {
- tags, err := s.tag.TagHotsId(context.TODO(), rid, time.Now())
- if err != nil || len(tags) == 0 {
- log.Error("s.tag.loadShowChildTagIDs(%d) error(%v)", rid, err)
- return
- }
- return
- }
- // loadRankRegionCache
- func (s *Service) loadRankRegionCache() {
- var (
- tmp = map[int][]*region.ShowItem{}
- tmpOsea = map[int][]*region.ShowItem{}
- )
- for _, rid := range _tids {
- aids, others, scores, err := s.rcmmnd.RankAppRegion(context.TODO(), rid)
- if err != nil {
- log.Error("s.rcmmnd.RankAppRegion rid (%v) error(%v)", rid, err)
- return
- }
- tRank, tOseaRank := s.fromRankAids(context.TODO(), aids, others, scores)
- tmp[rid] = tRank
- tmpOsea[rid] = tOseaRank
- }
- if len(tmp) > 0 {
- s.rankCache = tmp
- }
- if len(tmpOsea) > 0 {
- s.rankOseaCache = tmpOsea
- }
- }
- // loadRegionListCache
- func (s *Service) loadRegionListCache() {
- res, err := s.dao.RegionPlat(context.TODO())
- if err != nil {
- log.Error("s.dao.RegionPlat error(%v)", err)
- return
- }
- tmpRegion := map[int]*region.Region{}
- tmp := map[int]*region.Region{}
- for _, v := range res {
- // region list map
- tmpRegion[v.Rid] = v
- }
- for _, r := range res {
- if r.Reid != 0 {
- if rerg, ok := tmpRegion[r.Reid]; ok {
- tmp[r.Rid] = rerg
- }
- }
- }
- s.reRegionCache = tmp
- }
- func (s *Service) loadColumnListCache(now time.Time) {
- var (
- tmpChild = map[int]*card.ColumnList{}
- )
- columns, err := s.cdao.ColumnList(context.TODO(), now)
- if err != nil {
- log.Error("s.cdao.ColumnList error(%v)", err)
- return
- }
- for _, column := range columns {
- tmpChild[column.Cid] = column
- }
- s.columnListCache = tmpChild
- }
- // loadCardCache load all card cache
- func (s *Service) loadCardCache(now time.Time) {
- hdm, err := s.cdao.PosRecs(context.TODO(), now)
- if err != nil {
- log.Error("s.cdao.PosRecs error(%v)", err)
- return
- }
- itm, aids, err := s.cdao.RecContents(context.TODO(), now)
- if err != nil {
- log.Error("s.cdao.RecContents error(%v)", err)
- return
- }
- tmpItem := map[int]map[int64]*region.ShowItem{}
- for recid, aid := range aids {
- tmpItem[recid] = s.fromCardAids(context.TODO(), aid)
- }
- tmp := s.mergeCard(context.TODO(), hdm, itm, tmpItem, now)
- s.cardCache = tmp
- }
- func (s *Service) mergeCard(c context.Context, hdm map[int8]map[int][]*card.Card, itm map[int][]*card.Content, tmpItems map[int]map[int64]*region.ShowItem, now time.Time) (res map[string][]*region.Head) {
- // default use android regions TODO
- var (
- _topic = 1
- _activity = 0
- regionkey = fmt.Sprintf(_initRegionKey, model.PlatAndroid, _initlanguage)
- regionList = s.cachelist[regionkey]
- )
- res = map[string][]*region.Head{}
- for _, v := range regionList {
- if v.Reid != 0 {
- continue
- }
- for plat, phds := range hdm {
- hds, ok := phds[v.Rid]
- if !ok {
- continue
- }
- for _, hd := range hds {
- key := fmt.Sprintf(_initCardKey, plat, v.Rid)
- var (
- sis []*region.ShowItem
- )
- its, ok := itm[hd.ID]
- if !ok {
- its = []*card.Content{}
- }
- tmpItem, ok := tmpItems[hd.ID]
- if !ok {
- tmpItem = map[int64]*region.ShowItem{}
- }
- // 1 daily 2 topic 3 activity 4 rank 5 polymeric_card
- switch hd.Type {
- case 1:
- for _, ci := range its {
- si := s.fillCardItem(ci, tmpItem)
- if si.Title != "" {
- sis = append(sis, si)
- }
- }
- case 2:
- if topicID, err := strconv.ParseInt(hd.Rvalue, 10, 64); err == nil {
- if actm, err := s.act.Activitys(c, []int64{topicID}, _topic, ""); err != nil {
- log.Error("s.act.Activitys topicID error (%v)", topicID, err)
- } else {
- if act, ok := actm[topicID]; ok && act.H5Cover != "" && act.H5URL != "" {
- si := ®ion.ShowItem{}
- si.FromTopic(act)
- sis = []*region.ShowItem{si}
- }
- }
- }
- case 3:
- if topicID, err := strconv.ParseInt(hd.Rvalue, 10, 64); err == nil {
- if actm, err := s.act.Activitys(c, []int64{topicID}, _activity, ""); err != nil {
- log.Error("s.act.Activitys topicID error (%v)", topicID, err)
- } else {
- if act, ok := actm[topicID]; ok && act.H5Cover != "" && act.H5URL != "" {
- si := ®ion.ShowItem{}
- si.FromActivity(act, now)
- sis = []*region.ShowItem{si}
- }
- }
- }
- case 4:
- if tmpRank, ok := s.rankCache[v.Rid]; ok {
- if len(tmpRank) > 3 {
- sis = tmpRank[:3]
- } else {
- sis = tmpRank
- }
- }
- case 5, 6, 8:
- for _, ci := range its {
- si := s.fillCardItem(ci, tmpItem)
- if si.Title != "" {
- sis = append(sis, si)
- }
- }
- case 7:
- si := ®ion.ShowItem{
- Title: hd.Title,
- Cover: hd.Cover,
- Desc: hd.Desc,
- Goto: hd.Goto,
- Param: hd.Param,
- }
- if hd.Goto == model.GotoColumnStage {
- paramInt, _ := strconv.Atoi(hd.Param)
- if c, ok := s.columnListCache[paramInt]; ok {
- cidStr := strconv.Itoa(c.Ceid)
- si.URI = model.FillURICategory(hd.Goto, cidStr, hd.Param)
- }
- } else {
- si.URI = hd.URi
- }
- sis = append(sis, si)
- default:
- continue
- }
- if len(sis) == 0 {
- continue
- }
- sw := ®ion.Head{
- CardID: hd.ID,
- Title: hd.Title,
- Type: hd.TypeStr,
- Build: hd.Build,
- Condition: hd.Condition,
- Plat: hd.Plat,
- }
- if hd.Cover != "" {
- sw.Cover = hd.Cover
- }
- switch sw.Type {
- case model.GotoDaily:
- sw.Date = now.Unix()
- sw.Param = hd.Rvalue
- sw.URI = hd.URi
- sw.Goto = hd.Goto
- case model.GotoCard:
- sw.URI = hd.URi
- sw.Goto = hd.Goto
- sw.Param = hd.Param
- case model.GotoRank:
- sw.Param = strconv.Itoa(v.Rid)
- case model.GotoTopic, model.GotoActivity:
- if sw.Title == "" {
- if len(sis) > 0 {
- sw.Title = sis[0].Title
- }
- }
- case model.GotoVeidoCard:
- sw.Param = hd.Param
- if hd.Goto == model.GotoColumnStage {
- paramInt, _ := strconv.Atoi(hd.Param)
- if c, ok := s.columnListCache[paramInt]; ok {
- cidStr := strconv.Itoa(c.Ceid)
- sw.URI = model.FillURICategory(hd.Goto, cidStr, hd.Param)
- }
- sw.Goto = model.GotoColumn
- } else {
- sw.Goto = hd.Goto
- sw.URI = hd.URi
- }
- if sisLen := len(sis); sisLen > 1 {
- if sisLen%2 != 0 {
- sis = sis[:sisLen-1]
- }
- } else {
- continue
- }
- case model.GotoSpecialCard:
- sw.Cover = ""
- case model.GotoTagCard:
- if hd.TagID > 0 {
- var tagIDInt int64
- sw.Title, tagIDInt = s.fromTagIDByName(c, hd.TagID, now)
- sw.Param = strconv.FormatInt(tagIDInt, 10)
- sw.Goto = model.GotoTagID
- }
- }
- sw.Body = sis
- res[key] = append(res[key], sw)
- }
- }
- }
- return
- }
- // fillCardItem
- func (s *Service) fillCardItem(csi *card.Content, tsi map[int64]*region.ShowItem) (si *region.ShowItem) {
- si = ®ion.ShowItem{}
- switch csi.Type {
- case model.CardGotoAv:
- si.Goto = model.GotoAv
- si.Param = csi.Value
- }
- si.URI = model.FillURI(si.Goto, si.Param, nil)
- if si.Goto == model.GotoAv {
- aid, err := strconv.ParseInt(si.Param, 10, 64)
- if err != nil {
- log.Error("strconv.ParseInt(%s) error(%v)", si.Param, err)
- } else {
- if it, ok := tsi[aid]; ok {
- si = it
- if csi.Title != "" {
- si.Title = csi.Title
- }
- } else {
- si = ®ion.ShowItem{}
- }
- }
- }
- return
- }
- // fromTagIDByName from tag_id by tag_name
- func (s *Service) fromTagIDByName(ctx context.Context, tagID int, now time.Time) (tagName string, tagIDInt int64) {
- tag, err := s.tag.TagInfo(ctx, 0, tagID, now)
- if err != nil {
- log.Error("s.tag.TagInfo(%d) error(%v)", tagID, err)
- return
- }
- tagName = tag.Name
- tagIDInt = tag.Tid
- return
- }
- // upCahce update cache
- func (s *Service) upCache(new, newOsea, old, oldOsea []*region.ShowItem) (res, resOsea []*region.ShowItem) {
- if len(new) > 0 {
- res = new
- } else {
- res = old
- }
- if len(newOsea) > 0 {
- resOsea = newOsea
- } else {
- resOsea = oldOsea
- }
- return
- }
- // upAidsCache update aids cache
- func (s *Service) upAidsCache(new, old []int64) (aids []int64) {
- if len(new) > 0 {
- aids = new
- } else {
- aids = old
- }
- return
- }
|