diff --git a/internal/app/api/handler/bilbil_video.go b/internal/app/api/handler/bilbil_video.go index f07aa85..c5eb636 100644 --- a/internal/app/api/handler/bilbil_video.go +++ b/internal/app/api/handler/bilbil_video.go @@ -26,3 +26,31 @@ func BilibiliVideoSearch(s *service.BilbilVideo) func(ctx *gin.Context) { } } } + +func CheckVideo(s *service.BilbilVideo) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + var req idl.CheckBilibiliVideoReq + if err := ctx.ShouldBindJSON(&req); err != nil { + _ = ctx.Error(apperrors.NewValidationError(400, err.Error()).Wrap(err)) + return + } + + if resp, err := s.CheckVideo(ctx, req); err != nil { + _ = ctx.Error(err) + return + } else { + ctx.JSON(http.StatusOK, help.SuccessJson(resp)) + } + } +} + +func GetAnalysis(s *service.BilbilVideo) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + if resp, err := s.GetAnalysis(ctx); err != nil { + _ = ctx.Error(err) + return + } else { + ctx.JSON(http.StatusOK, help.SuccessJson(resp)) + } + } +} diff --git a/internal/app/api/idl/bilbil_video.go b/internal/app/api/idl/bilbil_video.go index 1b5492a..14d6086 100644 --- a/internal/app/api/idl/bilbil_video.go +++ b/internal/app/api/idl/bilbil_video.go @@ -8,6 +8,14 @@ import ( "vlink.dev/eoefans/internal/app/api/util/query_parser" ) +type CheckBilibiliVideoReq struct { + BvidList []string `form:"bvid_list" json:"bvid_list" binding:"required,dive,required"` +} + +type CheckBilibiliVideoResp struct { + StatusMap map[string]uint8 `json:"status_map"` +} + type BilibiliVideoSearchReq struct { Order BilibiliVideoOrder `form:"order" binding:"required,oneof=pubdate view score"` Page int64 `form:"page,default=1" binding:"omitempty,gt=0"` @@ -82,6 +90,7 @@ type BilibiliVideoRepository interface { Failure(bvid string) error FindAllByBvidList(bvidList []string) (list []*BilibiliVideo, err error) + FindStatusMapByBvidList(bvidList []string) (map[string]uint8, error) FindAllByPubDate(from time.Time, to time.Time, page, size int64) (list []*BilibiliVideo, total int64, err error) Search(queryItems []query_parser.QueryItem, order BilibiliVideoOrder, page, size int64) (list []*BilibiliVideo, total int64, err error) diff --git a/internal/app/api/provide.go b/internal/app/api/provide.go index edce402..97c18d6 100644 --- a/internal/app/api/provide.go +++ b/internal/app/api/provide.go @@ -6,6 +6,7 @@ import ( "vlink.dev/eoefans/internal/app/api/router" "vlink.dev/eoefans/internal/app/api/service" "vlink.dev/eoefans/internal/app/api/util/password" + "vlink.dev/eoefans/internal/app/spider/video_analysis" "vlink.dev/eoefans/internal/pkg/cache" "vlink.dev/eoefans/internal/pkg/iversion" "vlink.dev/eoefans/internal/pkg/log" @@ -19,6 +20,7 @@ func Provide() fx.Option { ServiceProvider(), smsclient.Provide(), + video_analysis.Provide(), fx.Provide(cache.NewGoCache), fx.Provide(smsclient.NewRandomNumberCodeGenerator), fx.Provide(password.NewDefaultPasswordHandler), diff --git a/internal/app/api/router/router.go b/internal/app/api/router/router.go index 51c86dc..68cd9c5 100644 --- a/internal/app/api/router/router.go +++ b/internal/app/api/router/router.go @@ -40,6 +40,13 @@ func InitRouters( // 视频搜索 r.GET("/v1/video-interface/advanced-search", handler.BilibiliVideoSearch(bvService)) + + // check 视频 + r.POST("/v1/video-interface/check", handler.CheckVideo(bvService)) + + // 获取视频黑名单 + r.GET("/v1/video-interface/analysis", handler.GetAnalysis(bvService)) + //图片 picApi := r.Group("/v1/pic") { diff --git a/internal/app/api/service/bilbil_video.go b/internal/app/api/service/bilbil_video.go index 4a69c42..a61c621 100644 --- a/internal/app/api/service/bilbil_video.go +++ b/internal/app/api/service/bilbil_video.go @@ -3,9 +3,9 @@ package service import ( "context" "fmt" + "github.com/pkg/errors" "strconv" "strings" - "vlink.dev/eoefans/internal/app/api/apperrors" "vlink.dev/eoefans/internal/app/api/idl" "vlink.dev/eoefans/internal/app/api/util/query_parser" @@ -110,3 +110,28 @@ func queryCheck() map[string]func(item query_parser.QueryItem) (bool, string) { "pubdate": _numericCheck, } } + +func (b *BilbilVideo) CheckVideo(ctx context.Context, req idl.CheckBilibiliVideoReq) (*idl.CheckBilibiliVideoResp, error) { + tx := b.db.WithContext(ctx) + sMap, err := repository.NewBilibiliVideo(tx).FindStatusMapByBvidList(req.BvidList) + if err != nil { + return nil, err + } + + return &idl.CheckBilibiliVideoResp{StatusMap: sMap}, nil +} + +func (b *BilbilVideo) GetAnalysis(ctx context.Context) (interface{}, error) { + var list []*struct { + Type string `json:"type"` + Key string `json:"key"` + Score int64 `json:"score"` + } + + result := b.db.WithContext(ctx).Table("video_analysis").Find(&list) + if result.Error != nil { + return nil, errors.Wrapf(result.Error, "get analysis failed.") + } + + return list, nil +} diff --git a/internal/repository/bilbil_video.go b/internal/repository/bilbil_video.go index 84d9b2e..804ed09 100644 --- a/internal/repository/bilbil_video.go +++ b/internal/repository/bilbil_video.go @@ -194,3 +194,22 @@ func (impl *BilibiliVideoMysqlImpl) FindAllByBvidList(bvidList []string) (list [ return list, nil } + +func (impl *BilibiliVideoMysqlImpl) FindStatusMapByBvidList(bvidList []string) (map[string]uint8, error) { + list := make([]*struct { + Bvid string + Status uint8 + }, 0, len(bvidList)) + + result := impl.tx.Table(bilibiliVideoTableName).Where("bvid IN (?)", bvidList).Select("bvid", "status").Find(&list) + if result.Error != nil { + return nil, errors.Wrap(result.Error, fmt.Sprintf("select %s error", bilibiliVideoTableName)) + } + + m := make(map[string]uint8, len(list)) + for _, item := range list { + m[item.Bvid] = item.Status + } + + return m, nil +} diff --git a/internal/repository/bilbil_video_pg.go b/internal/repository/bilbil_video_pg.go index 81dddf2..68bbbd0 100644 --- a/internal/repository/bilbil_video_pg.go +++ b/internal/repository/bilbil_video_pg.go @@ -162,3 +162,22 @@ func (impl *BilibiliVideoPostgresImpl) FindAllByBvidList(bvidList []string) (lis return toBilibiliVideoList(newList), nil } + +func (impl *BilibiliVideoPostgresImpl) FindStatusMapByBvidList(bvidList []string) (map[string]uint8, error) { + list := make([]*struct { + Bvid string + Status uint8 + }, 0, len(bvidList)) + + result := impl.tx.Table(bilibiliVideoTableName).Where("bvid IN (?)", bvidList).Select("bvid", "status").Find(&list) + if result.Error != nil { + return nil, errors.Wrap(result.Error, fmt.Sprintf("select %s error", bilibiliVideoTableName)) + } + + m := make(map[string]uint8, len(list)) + for _, item := range list { + m[item.Bvid] = item.Status + } + + return m, nil +}