diff --git a/hrp/pkg/uixt/ext.go b/hrp/pkg/uixt/ext.go index 8384709d..13d99aac 100644 --- a/hrp/pkg/uixt/ext.go +++ b/hrp/pkg/uixt/ext.go @@ -49,10 +49,11 @@ func WithThreshold(threshold float64) CVOption { } type Popularity struct { - Stars string `json:"stars"` // 点赞数 - Comments string `json:"comments"` // 评论数 - Favorites string `json:"favorites"` // 收藏数 - Shares string `json:"shares"` // 分享数 + Stars string `json:"stars,omitempty"` // 点赞数 + Comments string `json:"comments,omitempty"` // 评论数 + Favorites string `json:"favorites,omitempty"` // 收藏数 + Shares string `json:"shares,omitempty"` // 分享数 + LiveUsers string `json:"live_users,omitempty"` // 直播间人数 } type OcrResult struct { diff --git a/hrp/pkg/uixt/video_crawler.go b/hrp/pkg/uixt/video_crawler.go index 2b566a17..01225fbf 100644 --- a/hrp/pkg/uixt/video_crawler.go +++ b/hrp/pkg/uixt/video_crawler.go @@ -115,7 +115,7 @@ func (s *VideoStat) incrFeed(ocrResult *OcrResult, driverExt *DriverExt) error { // add popularity data for feed popularityData := ocrResult.Texts.FilterScope(driverExt.GenAbsScope(0.8, 0.5, 1, 0.8)) if len(popularityData) != 4 { - log.Warn().Interface("popularity", popularityData).Msg("get popularity data failed") + log.Warn().Interface("popularity", popularityData).Msg("get feed popularity data failed") } else { ocrResult.Popularity = Popularity{ Stars: popularityData[0].Text, @@ -131,6 +131,26 @@ func (s *VideoStat) incrFeed(ocrResult *OcrResult, driverExt *DriverExt) error { return nil } +// incrLive increases live count and live stat +func (s *VideoStat) incrLive(ocrResult *OcrResult, driverExt *DriverExt) error { + // TODO: check live type + + // add popularity data for live + popularityData := ocrResult.Texts.FilterScope(driverExt.GenAbsScope(0.7, 0.05, 1, 0.15)) + if len(popularityData) != 1 { + log.Warn().Interface("popularity", popularityData).Msg("get live popularity data failed") + } else { + ocrResult.Popularity = Popularity{ + LiveUsers: popularityData[0].Text, + } + log.Info().Interface("popularity", ocrResult.Popularity). + Msg("found live popularity success") + } + + s.LiveCount++ + return nil +} + type TargetLabel struct { Text string `json:"text"` Scope Scope `json:"scope"` @@ -213,18 +233,8 @@ func (l *LiveCrawler) Run(driver *DriverExt, enterPoint PointF) error { return err } - // take screenshot and get screen texts by OCR - imagePath, _, err := l.driver.GetScreenTextsByOCR() - if err != nil { - log.Error().Err(err).Msg("OCR GetTexts failed") - continue - } - l.driver.cacheStepData.OcrResults[imagePath].Tags = []string{"live"} - - // TODO: check live type - // swipe to next live video - err = l.driver.SwipeUp() + err := l.driver.SwipeUp() if err != nil { log.Error().Err(err).Msg("swipe up failed") // TODO: retry maximum 3 times @@ -236,9 +246,19 @@ func (l *LiveCrawler) Run(driver *DriverExt, enterPoint PointF) error { log.Error().Err(err).Msg("sleep random failed") } - // TODO: check live type + // take screenshot and get screen texts by OCR + imagePath, _, err := l.driver.GetScreenTextsByOCR() + if err != nil { + log.Error().Err(err).Msg("OCR GetTexts failed") + continue + } + ocrResult := l.driver.cacheStepData.OcrResults[imagePath] + ocrResult.Tags = []string{"live"} - l.currentStat.LiveCount++ + // check live type and incr live count + if err := l.currentStat.incrLive(ocrResult, l.driver); err != nil { + log.Error().Err(err).Msg("incr live failed") + } } }