refactor: handle video type

This commit is contained in:
lilong.129
2023-09-07 15:38:55 +08:00
parent c15e324b43
commit 2148789eb8
+45 -33
View File
@@ -111,28 +111,24 @@ func (vc *VideoCrawler) isTargetAchieved() bool {
return vc.isFeedTargetAchieved() && vc.isLiveTargetAchieved() return vc.isFeedTargetAchieved() && vc.isLiveTargetAchieved()
} }
func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes bool) { func (vc *VideoCrawler) getLiveEntryPoint(video *Video) (enterPoint PointF, err error) {
if video.Type != VideoType_PreviewLive {
return PointF{}, false
}
// take screenshot and get OCR texts via image service // take screenshot and get OCR texts via image service
texts, err := vc.driverExt.GetScreenTexts() texts, err := vc.driverExt.GetScreenTexts()
if err != nil { if err != nil {
return PointF{}, false return PointF{}, err
} }
// 预览流入口:DY/KS // 预览流入口:DY/KS
// 标签文案:点击进入直播间|进入直播间领金币 // 标签文案:点击进入直播间|进入直播间领金币
points, err := texts.FindTexts([]string{".*进入直播间.*"}, WithScope(0, 0.3, 1, 0.8), WithRegex(true)) points, err := texts.FindTexts([]string{".*进入直播间.*"}, WithScope(0, 0.3, 1, 0.8), WithRegex(true))
if err == nil { if err == nil {
return points[0].Center(), true return points[0].Center(), nil
} }
// 标签文案:直播中|直播卖货|直播团购 // 标签文案:直播中|直播卖货|直播团购
points, err = texts.FindTexts([]string{"直播中|直播卖货|直播团购"}, points, err = texts.FindTexts([]string{"直播中|直播卖货|直播团购"},
WithScope(0, 0.7, 0.5, 1), WithRegex(true)) WithScope(0, 0.7, 0.5, 1), WithRegex(true))
if err == nil { if err == nil {
return points[0].Center(), true return points[0].Center(), nil
} }
// 预览流入口:KS/KSLite // 预览流入口:KS/KSLite
@@ -144,12 +140,12 @@ func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes boo
X: point.X, X: point.X,
Y: point.Y - 300, Y: point.Y - 300,
} }
return enterPoint, true return enterPoint, nil
} }
// TODO: 头像入口 // TODO: 头像入口
return PointF{}, false return PointF{}, errors.New("live entry not found")
} }
// run live video crawler // run live video crawler
@@ -187,7 +183,7 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
vc.failedCount++ vc.failedCount++
log.Warn(). log.Warn().
Int64("failedCount", vc.failedCount). Int64("failedCount", vc.failedCount).
Str("videoType", string(liveRoom.Type)). Interface("video", liveRoom).
Msg("get current live room failed") Msg("get current live room failed")
continue continue
} }
@@ -244,14 +240,8 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
} }
func (vc *VideoCrawler) exitLiveRoom() error { func (vc *VideoCrawler) exitLiveRoom() error {
log.Info().Msg("exit live room") log.Info().Msg("press back to exit live room")
// swipe right twice to exit live room return vc.driverExt.Driver.PressBack()
for i := 0; i < 2; i++ {
vc.driverExt.SwipeRelative(0.1, 0.5, 0.9, 0.5)
time.Sleep(2 * time.Second)
}
// TODO: check exit live room success
return nil
} }
func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) { func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
@@ -305,7 +295,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
swipeFinishTime := time.Now() swipeFinishTime := time.Now()
// get app event trackings // get app event trackings
// retry 3 times if get feed failed, abort if fail 3 consecutive times // retry 10 times if get feed failed, abort if fail 10 consecutive times
feedVideo, err := crawler.getCurrentVideo() feedVideo, err := crawler.getCurrentVideo()
if err != nil || feedVideo.Type == "" { if err != nil || feedVideo.Type == "" {
if crawler.failedCount >= 10 { if crawler.failedCount >= 10 {
@@ -332,26 +322,49 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
screenResult := &ScreenResult{ screenResult := &ScreenResult{
Resolution: dExt.windowSize, Resolution: dExt.windowSize,
Video: feedVideo,
// log swipe timelines
SwipeStartTime: swipeStartTime.UnixMilli(),
SwipeFinishTime: swipeFinishTime.UnixMilli(),
} }
dExt.cacheStepData.screenResults[time.Now().String()] = screenResult dExt.cacheStepData.screenResults[time.Now().String()] = screenResult
// check if live video && run live crawler switch feedVideo.Type {
if enterPoint, isLive := crawler.checkLiveVideo(feedVideo); isLive { case VideoType_PreviewLive:
// 直播预览流 // 直播预览流
log.Info().Msg("live video found") log.Info().Msg("get preview live video")
if !crawler.isLiveTargetAchieved() { if crawler.isLiveTargetAchieved() {
if err := crawler.startLiveCrawler(enterPoint); err != nil { log.Info().Msg("live count achieved, skip")
} else {
// live target not achieved, enter live
enterPoint, err := crawler.getLiveEntryPoint(feedVideo)
if err != nil {
log.Error().Err(err).Msg("get live entry failed")
continue
}
// start live crawler
err = crawler.startLiveCrawler(enterPoint)
if err != nil {
if errors.Is(err, code.TimeoutError) || errors.Is(err, code.InterruptError) { if errors.Is(err, code.TimeoutError) || errors.Is(err, code.InterruptError) {
return err return err
} }
log.Error().Err(err).Msg("run live crawler failed, continue") log.Error().Err(err).Msg("run live crawler failed, continue")
continue
} }
continue
} }
} else {
case VideoType_Live:
// 直播
log.Info().Msg("get live video")
case VideoType_Image:
// 图文
log.Info().Msg("get image video")
default:
// 点播 // 点播
// check feed type and incr feed count // check feed type and incr feed count
screenResult.Video = feedVideo
crawler.FeedCount++ crawler.FeedCount++
log.Info(). log.Info().
Strs("tags", screenResult.Tags). Strs("tags", screenResult.Tags).
@@ -368,7 +381,11 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
// simulation watch feed video // simulation watch feed video
sleepStrict(swipeFinishTime, screenResult.Video.PlayDuration) sleepStrict(swipeFinishTime, screenResult.Video.PlayDuration)
log.Warn().Interface("video", feedVideo).
Msg("get unexpected video type")
} }
screenResult.TotalElapsed = time.Since(swipeFinishTime).Milliseconds()
// check if target count achieved // check if target count achieved
if crawler.isTargetAchieved() { if crawler.isTargetAchieved() {
@@ -376,11 +393,6 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
return nil return nil
} }
// log swipe timelines
screenResult.SwipeStartTime = swipeStartTime.UnixMilli()
screenResult.SwipeFinishTime = swipeFinishTime.UnixMilli()
screenResult.TotalElapsed = time.Since(swipeFinishTime).Milliseconds()
// reset failed count // reset failed count
crawler.failedCount = 0 crawler.failedCount = 0
} }