package http import ( "strconv" "time" cdm "go-common/app/interface/main/app-card/model" "go-common/app/interface/main/app-card/model/card" "go-common/app/interface/main/app-card/model/card/ai" "go-common/app/interface/main/app-card/model/card/operate" "go-common/app/interface/main/app-feed/model" "go-common/app/interface/main/app-feed/model/feed" "go-common/library/ecode" bm "go-common/library/net/http/blademaster" ) const ( _headerBuvid = "Buvid" _headerDisplayID = "Display-ID" _headerDeviceID = "Device-ID" _androidFnvalBuild = 5325000 _iosFnvalBuild = 8160 _iosQnBuildGt = 8170 _iosQnBuildLt = 8190 _androidQnBuildLt = 5335000 _qn480 = 32 ) func feedIndex(c *bm.Context) { var mid int64 params := c.Request.Form header := c.Request.Header if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } // get params mobiApp := params.Get("mobi_app") device := params.Get("device") platform := params.Get("platform") network := params.Get("network") buildStr := params.Get("build") idxStr := params.Get("idx") pullStr := params.Get("pull") styleStr := params.Get("style") loginEventStr := params.Get("login_event") openEvent := params.Get("open_event") bannerHash := params.Get("banner_hash") adExtra := params.Get("ad_extra") qnStr := params.Get("qn") interest := params.Get("interest") flushStr := params.Get("flush") autoplayCard, _ := strconv.Atoi(params.Get("autoplay_card")) fnver, _ := strconv.Atoi(params.Get("fnver")) fnval, _ := strconv.Atoi(params.Get("fnval")) // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } plat := model.Plat(mobiApp, device) if (model.IsAndroid(plat) && build <= _androidFnvalBuild) || (model.IsIOSNormal(plat) && build <= _iosFnvalBuild) { fnval = 0 } style, _ := strconv.Atoi(styleStr) flush, _ := strconv.Atoi(flushStr) // get audit data, if check audit hit. is, ok := feedSvc.Audit(c, mobiApp, plat, build) if ok { c.JSON(is, nil) return } buvid := header.Get(_headerBuvid) disid := header.Get(_headerDisplayID) dvcid := header.Get(_headerDeviceID) // page idx, err := strconv.ParseInt(idxStr, 10, 64) if err != nil || idx < 0 { idx = 0 } // pull default pull, err := strconv.ParseBool(pullStr) if err != nil { pull = true } // login event loginEvent, err := strconv.Atoi(loginEventStr) if err != nil { loginEvent = 0 } // qn qn, _ := strconv.Atoi(qnStr) now := time.Now() // index data, userFeature, isRcmd, newUser, code, feedclean, autoPlayInfoc, err := feedSvc.Index(c, mid, plat, build, buvid, network, mobiApp, device, platform, openEvent, loginEvent, idx, pull, now, bannerHash, adExtra, qn, interest, style, flush, fnver, fnval, autoplayCard) res := map[string]interface{}{ "data": data, "config": map[string]interface{}{ "feed_clean_abtest": feedclean, }, } c.JSONMap(res, err) if err != nil { return } // infoc items := make([]*ai.Item, 0, len(data)) for _, item := range data { items = append(items, item.AI) } feedSvc.IndexInfoc(c, mid, plat, build, buvid, disid, "/x/feed/index", userFeature, style, code, items, isRcmd, pull, newUser, now, "", dvcid, network, flush, autoPlayInfoc, 0) } func feedUpper(c *bm.Context) { var mid int64 params := c.Request.Form midInter, _ := c.Get("mid") mid = midInter.(int64) // get params mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") pnStr := params.Get("pn") psStr := params.Get("ps") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } // check page pn, err := strconv.Atoi(pnStr) if err != nil || pn < 1 { pn = 1 } ps, err := strconv.Atoi(psStr) if err != nil || ps < 1 { ps = 20 } else if ps > 200 { ps = 200 } plat := model.Plat(mobiApp, device) now := time.Now() uas, _ := feedSvc.Upper(c, mid, plat, build, pn, ps, now) data := map[string]interface{}{} if len(uas) != 0 { data["item"] = uas } else { data["item"] = []struct{}{} } uls, count := feedSvc.UpperLive(c, mid) if len(uls) != 0 { data["live"] = struct { Item []*feed.Item `json:"item"` Count int `json:"count"` Conut int `json:"conut"` }{uls, count, count} } c.JSON(data, nil) } func feedUpperArchive(c *bm.Context) { var mid int64 params := c.Request.Form midInter, _ := c.Get("mid") mid = midInter.(int64) // get params mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") pnStr := params.Get("pn") psStr := params.Get("ps") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } // check page pn, err := strconv.Atoi(pnStr) if err != nil || pn < 1 { pn = 1 } ps, err := strconv.Atoi(psStr) if err != nil || ps < 1 { ps = 20 } else if ps > 200 { ps = 200 } plat := model.Plat(mobiApp, device) now := time.Now() uas, _ := feedSvc.UpperArchive(c, mid, plat, build, pn, ps, now) data := map[string]interface{}{} if len(uas) != 0 { data["item"] = uas } else { data["item"] = []struct{}{} } c.JSON(data, nil) } func feedUpperBangumi(c *bm.Context) { var mid int64 params := c.Request.Form midInter, _ := c.Get("mid") mid = midInter.(int64) // get params mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") pnStr := params.Get("pn") psStr := params.Get("ps") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } // check page pn, err := strconv.Atoi(pnStr) if err != nil || pn < 1 { pn = 1 } ps, err := strconv.Atoi(psStr) if err != nil || ps < 1 { ps = 20 } else if ps > 200 { ps = 200 } plat := model.Plat(mobiApp, device) now := time.Now() uas, _ := feedSvc.UpperBangumi(c, mid, plat, build, pn, ps, now) data := map[string]interface{}{} if len(uas) != 0 { data["item"] = uas } else { data["item"] = []struct{}{} } c.JSON(data, nil) } func feedUpperArticle(c *bm.Context) { var mid int64 params := c.Request.Form midInter, _ := c.Get("mid") mid = midInter.(int64) // get params mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") pnStr := params.Get("pn") psStr := params.Get("ps") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } // check page pn, err := strconv.Atoi(pnStr) if err != nil || pn < 1 { pn = 1 } ps, err := strconv.Atoi(psStr) if err != nil || ps < 1 { ps = 20 } else if ps > 200 { ps = 200 } plat := model.Plat(mobiApp, device) now := time.Now() uas, _ := feedSvc.UpperArticle(c, mid, plat, build, pn, ps, now) data := map[string]interface{}{} if len(uas) != 0 { data["item"] = uas } else { data["item"] = []struct{}{} } c.JSON(data, nil) } func feedUnreadCount(c *bm.Context) { var mid int64 params := c.Request.Form midInter, _ := c.Get("mid") mid = midInter.(int64) // get params mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } plat := model.Plat(mobiApp, device) total, feedCount, articleCount := feedSvc.UnreadCount(c, mid, plat, build, time.Now()) c.JSON(struct { Total int `json:"total"` Count int `json:"count"` Article int `json:"article"` }{total, feedCount, articleCount}, nil) } func feedDislike(c *bm.Context) { var mid int64 params := c.Request.Form header := c.Request.Header if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } gt := params.Get("goto") if gt == "" { c.JSON(nil, ecode.RequestErr) return } id, _ := strconv.ParseInt(params.Get("id"), 10, 64) reasonID, _ := strconv.ParseInt(params.Get("reason_id"), 10, 64) cmreasonID, _ := strconv.ParseInt(params.Get("cm_reason_id"), 10, 64) feedbackID, _ := strconv.ParseInt(params.Get("feedback_id"), 10, 64) upperID, _ := strconv.ParseInt(params.Get("mid"), 10, 64) rid, _ := strconv.ParseInt(params.Get("rid"), 10, 64) tagID, _ := strconv.ParseInt(params.Get("tag_id"), 10, 64) adcb := params.Get("ad_cb") buvid := header.Get(_headerBuvid) if buvid == "" && mid == 0 { c.JSON(nil, ecode.RequestErr) return } c.JSON(nil, feedSvc.Dislike(c, mid, id, buvid, gt, reasonID, cmreasonID, feedbackID, upperID, rid, tagID, adcb, time.Now())) } func feedDislikeCancel(c *bm.Context) { var mid int64 params := c.Request.Form header := c.Request.Header if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } gt := params.Get("goto") if gt == "" { c.JSON(nil, ecode.RequestErr) return } id, _ := strconv.ParseInt(params.Get("id"), 10, 64) reasonID, _ := strconv.ParseInt(params.Get("reason_id"), 10, 64) cmreasonID, _ := strconv.ParseInt(params.Get("cm_reason_id"), 10, 64) feedbackID, _ := strconv.ParseInt(params.Get("feedback_id"), 10, 64) upperID, _ := strconv.ParseInt(params.Get("mid"), 10, 64) rid, _ := strconv.ParseInt(params.Get("rid"), 10, 64) tagID, _ := strconv.ParseInt(params.Get("tag_id"), 10, 64) adcb := params.Get("ad_cb") buvid := header.Get(_headerBuvid) if buvid == "" && mid == 0 { c.JSON(nil, ecode.RequestErr) return } c.JSON(nil, feedSvc.DislikeCancel(c, mid, id, buvid, gt, reasonID, cmreasonID, feedbackID, upperID, rid, tagID, adcb, time.Now())) } func feedUpperRecent(c *bm.Context) { var mid int64 params := c.Request.Form if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } aidStr := params.Get("param") aid, err := strconv.ParseInt(aidStr, 10, 64) if err != nil { c.JSON(nil, ecode.RequestErr) return } upperStr := params.Get("vmid") upperID, err := strconv.ParseInt(upperStr, 10, 64) if err != nil { c.JSON(nil, ecode.RequestErr) return } c.JSON(struct { Item []*feed.Item `json:"item"` }{feedSvc.UpperRecent(c, mid, upperID, aid, time.Now())}, nil) } func feedIndexTab(c *bm.Context) { var ( id int64 items []*feed.Item isBnj bool bnjDays int cover string err error mid int64 ) params := c.Request.Form if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } now := time.Now() idStr := params.Get("id") mobiApp := params.Get("mobi_app") device := params.Get("device") buildStr := params.Get("build") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } plat := model.Plat(mobiApp, device) if id, _ = strconv.ParseInt(idStr, 10, 64); id <= 0 { c.JSON(struct { Tab []*operate.Menu `json:"tab"` }{feedSvc.Menus(c, plat, build, now)}, nil) return } items, cover, isBnj, bnjDays, err = feedSvc.Actives(c, id, mid, now) c.JSON(struct { Cover string `json:"cover"` IsBnj bool `json:"is_bnj,omitempty"` BnjDays int `json:"bnj_days,omitempty"` Item []*feed.Item `json:"item"` }{cover, isBnj, bnjDays, items}, err) } func feedIndex2(c *bm.Context) { var mid int64 if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } header := c.Request.Header buvid := header.Get(_headerBuvid) disid := header.Get(_headerDisplayID) dvcid := header.Get(_headerDeviceID) param := &feed.IndexParam{} // get params if err := c.Bind(param); err != nil { c.JSON(nil, ecode.RequestErr) return } _, ok := cdm.Columnm[param.Column] if !ok { c.JSON(nil, ecode.RequestErr) return } // 兼容老的style逻辑,3为新单列 style := int(cdm.Columnm[param.Column]) if style == 1 { style = 3 } // check params plat := model.Plat(param.MobiApp, param.Device) // get audit data, if check audit hit. if data, ok := feedSvc.Audit2(c, param.MobiApp, plat, param.Build, param.Column); ok { c.JSON(struct { Item []card.Handler `json:"items"` }{Item: data}, nil) return } if (model.IsAndroid(plat) && param.Build <= _androidFnvalBuild) || (model.IsIOSNormal(plat) && param.Build <= _iosFnvalBuild) { param.Fnval = 0 } if (model.IsAndroid(plat) && param.Build > _androidFnvalBuild && param.Build < _androidQnBuildLt) || (model.IsIOSNormal(plat) && param.Build > _iosQnBuildGt && param.Build <= _iosQnBuildLt) || param.Qn <= 0 { param.Qn = _qn480 } now := time.Now() // index plat = model.PlatAPPBuleChange(plat) data, config, infc, err := feedSvc.Index2(c, buvid, mid, plat, param, style, now) c.JSON(struct { Item []card.Handler `json:"items"` Config *feed.Config `json:"config"` }{Item: data, Config: config}, err) if err != nil { return } // infoc items := make([]*ai.Item, 0, len(data)) for _, item := range data { items = append(items, item.Get().Rcmd) } feedSvc.IndexInfoc(c, mid, plat, param.Build, buvid, disid, "/x/feed/index", infc.UserFeature, style, infc.Code, items, infc.IsRcmd, param.Pull, infc.NewUser, now, "", dvcid, param.Network, param.Flush, infc.AutoPlayInfoc, param.DeviceType) } func feedIndexTab2(c *bm.Context) { var ( id int64 items []card.Handler isBnj bool bnjDays int cover string err error mid int64 ) params := c.Request.Form if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } now := time.Now() idStr := params.Get("id") mobiApp := params.Get("mobi_app") device := params.Get("device") forceHost, _ := strconv.Atoi(params.Get("force_host")) buildStr := params.Get("build") // check params build, err := strconv.Atoi(buildStr) if err != nil { c.JSON(nil, ecode.RequestErr) return } plat := model.Plat(mobiApp, device) if id, _ = strconv.ParseInt(idStr, 10, 64); id <= 0 { c.JSON(struct { Tab []*operate.Menu `json:"tab"` }{feedSvc.Menus(c, plat, build, now)}, nil) return } items, cover, isBnj, bnjDays, err = feedSvc.Actives2(c, id, mid, mobiApp, plat, build, forceHost, now) c.JSON(struct { Cover string `json:"cover"` IsBnj bool `json:"is_bnj,omitempty"` BnjDays int `json:"bnj_days,omitempty"` Item []card.Handler `json:"items"` }{cover, isBnj, bnjDays, items}, err) } func feedIndexConverge(c *bm.Context) { var ( mid int64 title string cover string uri string ) if midInter, ok := c.Get("mid"); ok { mid = midInter.(int64) } param := &feed.ConvergeParam{} if err := c.Bind(param); err != nil { return } plat := model.Plat(param.MobiApp, param.Device) if (model.IsAndroid(plat) && param.Build <= _androidFnvalBuild) || (model.IsIOSNormal(plat) && param.Build <= _iosFnvalBuild) { param.Fnval = 0 } data, converge, err := feedSvc.Converge(c, mid, plat, param, time.Now()) if converge != nil { title = converge.Title cover = converge.Cover uri = converge.URI } c.JSON(struct { Items []card.Handler `json:"items,omitempty"` Title string `json:"title,omitempty"` Cover string `json:"cover,omitempty"` Param string `json:"param,omitempty"` URI string `json:"uri,omitempty"` }{Items: data, Title: title, Cover: cover, Param: strconv.FormatInt(param.ID, 10), URI: uri}, err) }