123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- package search
- import (
- "bytes"
- "fmt"
- "regexp"
- "strconv"
- "strings"
- v1 "go-common/app/service/main/archive/api"
- xtime "go-common/library/time"
- )
- // default .
- const (
- GotoBangumi = "bangumi"
- GotoAv = "av"
- GotoWeb = "web"
- GotoMovie = "movie"
- GotoBangumiWeb = "bangumi_web"
- GotoSp = "sp"
- GotoLive = "live"
- GotoGame = "game"
- GotoAuthor = "author"
- GotoClip = "clip"
- GotoAlbum = "album"
- GotoArticle = "article"
- GotoAudio = "audio"
- GotoSpecial = "special"
- GotoBanner = "banner"
- GotoSpecialS = "special_s"
- GotoConverge = "converge"
- GotoPGC = "pgc"
- GotoChannel = "channel"
- GotoEP = "ep"
- GotoTwitter = "twitter"
- CoverIng = "即将上映"
- CoverPay = "付费观看"
- CoverFree = "免费观看"
- CoverVipFree = "付费观看"
- CoverVipOnly = "专享"
- CoverVipFirst = "抢先"
- )
- // UserSearch user search request .
- type UserSearch struct {
- SearchType string `form:"search_type" validate:"required"`
- Order string `form:"order"`
- Category int `form:"category"`
- Platform string `form:"platform"`
- Build string `form:"build"`
- MobiAPP string `form:"mobi_app"`
- Device string `form:"device"`
- Keyword string `form:"keyword" validate:"required"`
- Page int `form:"page" validate:"required,min=1"`
- Pagesize int `form:"pagesize"`
- UserType int `form:"user_type"`
- Highlight int `form:"highlight"`
- OrderSort int `form:"order_sort"`
- FromSource string `form:"from_source"`
- Buvid string `form:"buvid"`
- Duration int `form:"duration"` // 视频时长
- // 传递参数,给到dao用
- SeasonNum int `form:"season_num"`
- MovieNum int `form:"movie_num"`
- RID int `form:"rid"`
- MID int64 `form:"mid"`
- }
- // User struct res .
- type User struct {
- Type string `json:"type"`
- Mid int64 `json:"mid,omitempty"`
- Name string `json:"uname,omitempty"`
- Usign string `json:"usign,omitempty"`
- Fans int `json:"fans,omitempty"`
- Videos int `json:"videos,omitempty"`
- Pic string `json:"upic,omitempty"`
- VerifyInfo string `json:"verify_info"`
- Level int `json:"level,omitempty"`
- Gender int `json:"gender"`
- IsUpuser int `json:"is_upuser,omitempty"`
- IsLive int `json:"is_live,omitempty"`
- RoomID int64 `json:"room_id,omitempty"`
- Res []*struct {
- Aid int64 `json:"aid,omitempty"`
- Title string `json:"title,omitempty"`
- Pubdate int64 `json:"pubdate,omitempty"`
- ArcURL string `json:"arcurl,omitempty"`
- Pic string `json:"pic,omitempty"`
- Play interface{} `json:"play,omitempty"`
- Danmaku int `json:"dm,omitempty"`
- Coin int `json:"coin"`
- Fav int `json:"fav"`
- Desc string `json:"desc"`
- Duration string `json:"duration,omitempty"`
- } `json:"res,omitempty"`
- OfficialVerify *OfficialVerify `json:"official_verify,omitempty"`
- *ResultResponse
- }
- // OfficialVerify struct .
- type OfficialVerify struct {
- Type int `json:"type"`
- Desc string `json:"desc,omitempty"`
- }
- // Search all .
- type Search struct {
- Code int `json:"code,omitempty"`
- Trackid string `json:"seid,omitempty"`
- Page int `json:"page,omitempty"`
- PageSize int `json:"pagesize,omitempty"`
- Total int `json:"total,omitempty"`
- NumResults int `json:"numResults,omitempty"`
- NumPages int `json:"numPages,omitempty"`
- SuggestKeyword string `json:"suggest_keyword,omitempty"`
- Attribute int32 `json:"exp_bits,omitempty"`
- PageInfo struct {
- Bangumi *Page `json:"bangumi,omitempty"`
- UpUser *Page `json:"upuser,omitempty"`
- BiliUser *Page `json:"bili_user,omitempty"`
- User *Page `json:"user,omitempty"`
- Movie *Page `json:"movie,omitempty"`
- Film *Page `json:"pgc,omitempty"`
- MediaBangumi *Page `json:"media_bangumi,omitempty"`
- MediaFt *Page `json:"media_ft,omitempty"`
- } `json:"pageinfo,omitempty"`
- Result struct {
- Bangumi []*Bangumi `json:"bangumi,omitempty"`
- UpUser []*User `json:"upuser,omitempty"`
- BiliUser []*User `json:"bili_user,omitempty"`
- User []*User `json:"user,omitempty"`
- Movie []*Movie `json:"movie,omitempty"`
- Video []*Video `json:"video,omitempty"`
- MediaBangumi []*Media `json:"media_bangumi,omitempty"`
- MediaFt []*Media `json:"media_ft,omitempty"`
- } `json:"result,omitempty"`
- }
- // Media struct .
- type Media struct {
- MediaID int64 `json:"media_id,omitempty"`
- SeasonID int64 `json:"season_id,omitempty"`
- Title string `json:"title,omitempty"`
- OrgTitle string `json:"org_title,omitempty"`
- Styles string `json:"styles,omitempty"`
- Cover string `json:"cover,omitempty"`
- PlayState int `json:"play_state,omitempty"`
- MediaScore *struct {
- Score float64 `json:"score,omitempty"`
- UserCount int `json:"user_count,omitempty"`
- } `json:"media_score,omitempty"`
- MediaType int `json:"media_type,omitempty"`
- CV string `json:"cv,omitempty"`
- Staff string `json:"staff,omitempty"`
- Areas string `json:"areas,omitempty"`
- GotoURL string `json:"goto_url,omitempty"`
- Pubtime xtime.Time `json:"pubtime,omitempty"`
- HitColumns []string `json:"hit_columns,omitempty"`
- }
- // Movie struct .
- type Movie struct {
- Title string `json:"title"`
- SpID string `json:"spid"`
- Type string `json:"type"`
- Aid int64 `json:"aid"`
- Desc string `json:"description"`
- Actors string `json:"actors"`
- Staff string `json:"staff"`
- Cover string `json:"cover"`
- Pic string `json:"pic"`
- ScreenDate string `json:"screenDate"`
- Area string `json:"area"`
- Status int `json:"status"`
- Length int `json:"length"`
- Pages int `json:"numPages"`
- }
- // Video struct .
- type Video struct {
- ID int64 `json:"id"`
- Author string `json:"author"`
- Title string `json:"title"`
- Pic string `json:"pic"`
- Desc string `json:"description"`
- Play interface{} `json:"play"`
- Danmaku int `json:"video_review"`
- Duration string `json:"duration"`
- Pages int `json:"numPages"`
- ViewType string `json:"view_type"`
- RecTags []string `json:"rec_tags"`
- }
- // ResultAll struct .
- type ResultAll struct {
- Trackid string `json:"trackid,omitempty"`
- Page int `json:"page,omitempty"`
- NavInfo []*NavInfo `json:"nav,omitempty"`
- Items ResultItems `json:"items,omitempty"`
- Item []*Item `json:"item,omitempty"` // 混排的数据(未用到)
- Attribute int32 `json:"attribute"` // 实验中开关
- }
- // ResultItems struct .
- type ResultItems struct {
- Season2 []*Item `json:"season2,omitempty"`
- Season []*Item `json:"season,omitempty"` // 老数据字段(未用到)
- Upper []*Item `json:"upper,omitempty"`
- Movie2 []*Item `json:"movie2,omitempty"`
- Movie []*Item `json:"movie,omitempty"` // 老数据字段(未用到)
- Archive []*Item `json:"archive,omitempty"`
- }
- // NavInfo struct .
- type NavInfo struct {
- Name string `json:"name"`
- Total int `json:"total"`
- Pages int `json:"pages"`
- Type int `json:"type"`
- Show int `json:"show_more,omitempty"`
- }
- // Item struct .
- type Item struct {
- TrackID string `json:"trackid,omitempty"`
- LinkType string `json:"linktype,omitempty"`
- Position int `json:"position,omitempty"`
- SuggestKeyword string `json:"suggest_keyword,omitempty"`
- Title string `json:"title,omitempty"`
- Name string `json:"name,omitempty"`
- Cover string `json:"cover,omitempty"`
- URI string `json:"uri,omitempty"`
- Param string `json:"param,omitempty"`
- Goto string `json:"goto,omitempty"`
- // av
- Play int `json:"play,omitempty"`
- Danmaku int `json:"danmaku,omitempty"`
- Author string `json:"author,omitempty"`
- ViewType string `json:"view_type,omitempty"`
- PTime xtime.Time `json:"ptime,omitempty"`
- RecTags []string `json:"rec_tags,omitempty"`
- // media bangumi and mdeia ft
- Prompt string `json:"prompt,omitempty"`
- Episodes []*Item `json:"episodes,omitempty"`
- Label string `json:"label,omitempty"`
- // bangumi season
- Finish int8 `json:"finish,omitempty"`
- Started int8 `json:"started,omitempty"`
- Index string `json:"index,omitempty"`
- NewestCat string `json:"newest_cat,omitempty"`
- NewestSeason string `json:"newest_season,omitempty"`
- CatDesc string `json:"cat_desc,omitempty"`
- TotalCount int `json:"total_count,omitempty"`
- MediaType int `json:"media_type,omitempty"`
- PlayState int `json:"play_state,omitempty"`
- Style string `json:"style,omitempty"`
- CV string `json:"cv,omitempty"`
- Rating float64 `json:"rating,omitempty"`
- Vote int `json:"vote,omitempty"`
- RatingCount int `json:"rating_count,omitempty"`
- BadgeType int `json:"badge_type,omitempty"`
- // upper
- Sign string `json:"sign,omitempty"`
- Fans int `json:"fans,omitempty"`
- Level int `json:"level,omitempty"`
- Desc string `json:"desc,omitempty"`
- OfficialVerify *OfficialVerify `json:"official_verify,omitempty"`
- AvItems []*Item `json:"av_items,omitempty"`
- Item []*Item `json:"item,omitempty"`
- CTime int64 `json:"ctime,omitempty"`
- IsUp bool `json:"is_up,omitempty"`
- LiveURI string `json:"live_uri,omitempty"`
- // movie
- ScreenDate string `json:"screen_date,omitempty"`
- Area string `json:"area,omitempty"`
- CoverMark string `json:"cover_mark,omitempty"`
- // user
- Face string `json:"face,omitempty"`
- // arc and sp
- Arcs int `json:"archives,omitempty"`
- // arc and movie
- Duration string `json:"duration,omitempty"`
- DurationInt int64 `json:"duration_int,omitempty"`
- Actors string `json:"actors,omitempty"`
- Staff string `json:"staff,omitempty"`
- Length int `json:"length,omitempty"`
- Status int `json:"status,omitempty"`
- }
- // Bangumi struct .
- type Bangumi struct {
- Name string `json:"name,omitempty"`
- SeasonID int `json:"season_id,omitempty"`
- Title string `json:"title,omitempty"`
- Cover string `json:"cover,omitempty"`
- Evaluate string `json:"evaluate,omitempty"`
- NewestEpID int `json:"newest_ep_id,omitempty"`
- NewestEpIndex string `json:"newest_ep_index,omitempty"`
- IsFinish int `json:"is_finish,omitempty"`
- IsStarted int `json:"is_started,omitempty"`
- NewestCat string `json:"newest_cat,omitempty"`
- NewestSeason string `json:"newest_season,omitempty"`
- TotalCount int `json:"total_count,omitempty"`
- Pages int `json:"numPages,omitempty"`
- CatList *struct {
- TV int `json:"tv"`
- Movie int `json:"movie"`
- Ova int `json:"ova"`
- } `json:"catlist,omitempty"`
- }
- // TypeSearch struct .
- type TypeSearch struct {
- TrackID string `json:"trackid"`
- Pages int `json:"pages"`
- Total int `json:"total"`
- Items []*Item `json:"items,omitempty"`
- }
- // Card for bangumi .
- type Card struct {
- SeasonID int64 `json:"season_id"`
- IsFollow int `json:"is_follow"`
- IsSelection int `json:"is_selection"`
- Badge string `json:"badge"`
- BadgeType int `json:"badge_type"`
- Episodes []*Episode `json:"episodes"`
- }
- // Episode for bangumi card .
- type Episode struct {
- ID int64 `json:"id"`
- Badge string `json:"badge"`
- BadgeType int `json:"badge_type"`
- Status int `json:"status"`
- Cover string `json:"cover"`
- Index string `json:"index"`
- IndexTitle string `json:"index_title"`
- }
- // StatusMark cover status mark .
- func StatusMark(status int) string {
- if status == 0 {
- return CoverIng
- } else if status == 1 {
- return CoverPay
- } else if status == 2 {
- return CoverFree
- } else if status == 3 {
- return CoverVipFree
- } else if status == 4 {
- return CoverVipOnly
- } else if status == 5 {
- return CoverVipFirst
- }
- return ""
- }
- // FillURI deal app schema .
- func FillURI(gt, param string, f func(uri string) string) (uri string) {
- switch gt {
- case GotoAv, "":
- uri = "bilibili://video/" + param
- case GotoLive:
- uri = "bilibili://live/" + param
- case GotoBangumi:
- uri = "bilibili://bangumi/season/" + param
- case GotoBangumiWeb:
- uri = "http://bangumi.bilibili.com/anime/" + param
- case GotoGame:
- uri = "bilibili://game_center/detail?id=" + param + "&sourceType=adPut"
- case GotoSp:
- uri = "bilibili://splist/" + param
- case GotoAuthor:
- uri = "bilibili://author/" + param
- case GotoClip:
- uri = "bilibili://clip/" + param
- case GotoAlbum:
- uri = "bilibili://album/" + param
- case GotoArticle:
- uri = "bilibili://article/" + param
- case GotoWeb:
- uri = param
- case GotoPGC:
- uri = "https://www.bilibili.com/bangumi/play/ss" + param
- case GotoChannel:
- uri = "bilibili://pegasus/channel/" + param + "/"
- case GotoEP:
- uri = "https://www.bilibili.com/bangumi/play/ep" + param
- case GotoTwitter:
- uri = "bilibili://pictureshow/detail/" + param
- }
- if f != nil {
- uri = f(uri)
- }
- return
- }
- // search const
- var getHightLight = regexp.MustCompile(`<em.*?em>`)
- var (
- // AvHandler .
- AvHandler = func(a *v1.Arc) func(uri string) string {
- return func(uri string) string {
- if a == nil {
- return uri
- }
- if a.Dimension.Height != 0 || a.Dimension.Width != 0 {
- return fmt.Sprintf("%s?player_width=%d&player_height=%d&player_rotate=%d", uri, a.Dimension.Width, a.Dimension.Height, a.Dimension.Rotate)
- }
- return uri
- }
- }
- )
- // FromSeason .
- func (i *Item) FromSeason(b *Bangumi, bangumi string) {
- i.Title = b.Title
- i.Cover = b.Cover
- i.Goto = GotoBangumi
- i.Param = strconv.Itoa(int(b.SeasonID))
- i.URI = FillURI(bangumi, i.Param, nil)
- i.Finish = int8(b.IsFinish)
- i.Started = int8(b.IsStarted)
- i.Index = b.NewestEpIndex
- i.NewestCat = b.NewestCat
- i.NewestSeason = b.NewestSeason
- i.TotalCount = b.TotalCount
- var buf bytes.Buffer
- if b.CatList.TV != 0 {
- buf.WriteString(`TV(`)
- buf.WriteString(strconv.Itoa(b.CatList.TV))
- buf.WriteString(`) `)
- }
- if b.CatList.Movie != 0 {
- buf.WriteString(`剧场版(`)
- buf.WriteString(strconv.Itoa(b.CatList.Movie))
- buf.WriteString(`) `)
- }
- if b.CatList.Ova != 0 {
- buf.WriteString(`OVA/OAD/SP(`)
- buf.WriteString(strconv.Itoa(b.CatList.Ova))
- buf.WriteString(`)`)
- }
- i.CatDesc = buf.String()
- }
- // FromUpUser form func .
- func (i *Item) FromUpUser(u *User, as map[int64]*v1.Arc) {
- i.Title = u.Name
- i.Cover = u.Pic
- i.Goto = GotoAuthor
- i.OfficialVerify = u.OfficialVerify
- i.Param = strconv.Itoa(int(u.Mid))
- i.URI = FillURI(i.Goto, i.Param, nil)
- i.Sign = u.Usign
- i.Fans = u.Fans
- i.Level = u.Level
- i.Arcs = u.Videos
- i.AvItems = make([]*Item, 0, len(u.Res))
- for _, v := range u.Res {
- vi := &Item{}
- vi.Title = v.Title
- vi.Cover = v.Pic
- vi.Goto = GotoAv
- vi.Param = strconv.Itoa(int(v.Aid))
- a, ok := as[v.Aid]
- if ok {
- vi.Play = int(a.Stat.View)
- vi.Danmaku = int(a.Stat.Danmaku)
- } else {
- switch play := v.Play.(type) {
- case float64:
- vi.Play = int(play)
- case string:
- vi.Play, _ = strconv.Atoi(play)
- }
- vi.Danmaku = v.Danmaku
- }
- vi.CTime = v.Pubdate
- vi.Duration = v.Duration
- i.AvItems = append(i.AvItems, vi)
- }
- }
- // FromUser form func .
- func (i *Item) FromUser(u *User, as map[int64]*v1.Arc) {
- i.Title = u.Name
- i.Cover = u.Pic
- i.Goto = GotoAuthor
- i.OfficialVerify = u.OfficialVerify
- i.Param = strconv.Itoa(int(u.Mid))
- i.URI = FillURI(i.Goto, i.Param, nil)
- i.Sign = u.Usign
- i.Fans = u.Fans
- i.Level = u.Level
- i.Arcs = u.Videos
- i.AvItems = make([]*Item, 0, len(u.Res))
- if u.IsUpuser == 1 {
- for _, v := range u.Res {
- vi := &Item{}
- vi.Title = v.Title
- vi.Cover = v.Pic
- vi.Goto = GotoAv
- vi.Param = strconv.Itoa(int(v.Aid))
- a, ok := as[v.Aid]
- if ok {
- vi.Play = int(a.Stat.View)
- vi.Danmaku = int(a.Stat.Danmaku)
- } else {
- switch play := v.Play.(type) {
- case float64:
- vi.Play = int(play)
- case string:
- vi.Play, _ = strconv.Atoi(play)
- }
- vi.Danmaku = v.Danmaku
- }
- vi.CTime = v.Pubdate
- vi.Duration = v.Duration
- i.AvItems = append(i.AvItems, vi)
- }
- i.IsUp = true
- }
- }
- // FromMovie form func .
- func (i *Item) FromMovie(m *Movie, as map[int64]*v1.Arc) {
- i.Title = m.Title
- i.Desc = m.Desc
- if m.Type == "movie" {
- i.Cover = m.Cover
- i.Param = strconv.Itoa(int(m.Aid))
- i.Goto = GotoAv
- i.URI = FillURI(i.Goto, i.Param, AvHandler(as[m.Aid]))
- i.CoverMark = StatusMark(m.Status)
- } else if m.Type == "special" {
- i.Param = m.SpID
- i.Goto = GotoSp
- i.URI = FillURI(i.Goto, i.Param, nil)
- i.Cover = m.Pic
- }
- i.Staff = m.Staff
- i.Actors = m.Actors
- i.Area = m.Area
- i.Length = m.Length
- i.Status = m.Status
- i.ScreenDate = m.ScreenDate
- }
- // FromVideo form func .
- func (i *Item) FromVideo(v *Video, a *v1.Arc) {
- i.Title = v.Title
- i.Cover = v.Pic
- i.Author = v.Author
- i.Param = strconv.Itoa(int(v.ID))
- i.Goto = GotoAv
- if a != nil {
- i.Face = a.Author.Face
- i.URI = FillURI(i.Goto, i.Param, AvHandler(a))
- i.Play = int(a.Stat.View)
- i.Danmaku = int(a.Stat.Danmaku)
- } else {
- i.URI = FillURI(i.Goto, i.Param, nil)
- switch play := v.Play.(type) {
- case float64:
- i.Play = int(play)
- case string:
- i.Play, _ = strconv.Atoi(play)
- }
- i.Danmaku = v.Danmaku
- }
- i.Desc = v.Desc
- i.Duration = v.Duration
- i.ViewType = v.ViewType
- i.RecTags = v.RecTags
- }
- // FromMedia form func .
- func (i *Item) FromMedia(m *Media, prompt string, gt string, bangumis map[string]*Card) {
- i.Title = m.Title
- if i.Title == "" {
- i.Title = m.OrgTitle
- }
- i.Cover = m.Cover
- i.Goto = gt
- i.Param = strconv.Itoa(int(m.SeasonID))
- i.URI = m.GotoURL
- i.MediaType = m.MediaType
- i.PlayState = m.PlayState
- i.Style = m.Styles
- i.CV = m.CV
- i.Staff = m.Staff
- if m.MediaScore != nil {
- i.Rating = m.MediaScore.Score
- i.Vote = m.MediaScore.UserCount
- }
- i.PTime = m.Pubtime
- areas := strings.Split(m.Areas, "、")
- if len(areas) != 0 {
- i.Area = areas[0]
- }
- i.Prompt = prompt
- var hit string
- for _, v := range m.HitColumns {
- if v == "cv" {
- hit = v
- break
- } else if v == "staff" {
- hit = v
- }
- }
- if hit == "cv" {
- for _, v := range getHightLight.FindAllStringSubmatch(m.CV, -1) {
- if gt == GotoBangumi {
- i.Label = fmt.Sprintf("声优: %v...", v[0])
- break
- } else if gt == GotoMovie {
- i.Label = fmt.Sprintf("演员: %v...", v[0])
- break
- }
- }
- } else if hit == "staff" {
- for _, v := range getHightLight.FindAllStringSubmatch(m.Staff, -1) {
- i.Label = fmt.Sprintf("制作人员: %v...", v[0])
- break
- }
- }
- // get from PGC API .
- ssID := strconv.Itoa(int(m.SeasonID))
- if bgm, ok := bangumis[ssID]; ok {
- for _, v := range bgm.Episodes {
- tmp := &Item{
- Param: strconv.Itoa(int(v.ID)),
- Index: v.Index,
- BadgeType: v.BadgeType,
- }
- tmp.URI = FillURI(GotoEP, tmp.Param, nil)
- i.Episodes = append(i.Episodes, tmp)
- }
- }
- }
|