// // RQVideoModule.m // JSJP // // Created by 张嵘 on 2021/10/25. // #import "RQVideoModule.h" #import "UIView+ZFFrame.h" #import /// 播放视频 NSString * const RQPlayVideoUrlNotification = @"RQPlayVideoUrlNotification"; /// 播放视频Model NSString * const RQPlayVideoItemKey = @"RQPlayVideoItemKey"; /// 播放视频ModelArr NSString * const RQPlayVideoItemArrKey = @"RQPlayVideoItemArrKey"; /// 视频Index NSString * const RQVideoItemIndexKey = @"RQVideoItemIndexKey"; /// 视频IndexPath NSString * const RQVideoItemIndexPathKey = @"RQVideoItemIndexPathKey"; @implementation RQVideoPermissionStateModel @end @interface RQVideoModule () @property (nonatomic, readwrite, strong) ZFPlayerControlView *controlView; @property (nonatomic, readwrite, assign) RQADDoType adDoType; @property (nonatomic, readwrite, assign) ZFPlayerPlaybackState playState; @property (nonatomic, readwrite, strong) RQVipPlaceHolderView *vipPlaceHolderView; @property (nonatomic, readwrite, strong) UIView *playView; @property (nonatomic, readwrite, strong) UIScrollView *scrollView; @end @implementation RQVideoModule static id rq_VideoModule = nil; #pragma mark - init + (instancetype)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ rq_VideoModule = [[self alloc] init]; }); return rq_VideoModule; } - (instancetype)init { if (self = [super init]) { self.playerController.controlView = self.controlView; } return self; } - (BOOL)isCanWatchWithVideosItem:(VideosItem *)videosItem { if (RQ_USER_MANAGER.isLogin) { if (!RQ_COMMON_MANAGER.APP_SWITCH) { if (videosItem.videoType == RQVideoType_KaoChang) { if (videosItem.permission == 2) { if (videosItem.placeVideoListModel.placeListModel.isCheckVip) { return YES; } else { [QMUITips showInfo:@"请购买该考场VIP会员"]; return NO; } } else { return YES; } } else { if (videosItem.subject == 1) { if (RQ_VIP_Module.isSubject2Vip) { return YES; } else { if (videosItem.permission == 2) { [RQ_VIP_Module gotoBuyVipWithVipPageType:RQVIPPageType_Full]; return NO; } else { return YES; } } } else if (videosItem.subject == 2) { if (RQ_VIP_Module.isSubject3Vip) { return YES; } else { if (videosItem.permission == 2) { [RQ_VIP_Module gotoBuyVipWithVipPageType:RQVIPPageType_Full]; return NO; } else { return YES; } } } else { return YES; } } } else { return YES; } } else { if (videosItem.permission == 0) { return YES; } else { RQ_USER_MANAGER.isShouldLogin; return NO; } } } - (void)playVideoWithVideosItem:(VideosItem *)videosItem videosItemArr:(NSArray *)videosItemArr playView:(UIView *)playView scrollView:(UIScrollView *)scrollView { if (self.playerController && self.playerController.isPlaying) { [self.playerController stop]; } self.playView = playView; self.scrollView = scrollView; [self.playerController updateNoramlPlayerWithContainerView:playView]; [self requestDataWithVideosItem:videosItem videosItemArr:videosItemArr]; } - (void)requestDataWithVideosItem:(VideosItem *)videoItem videosItemArr:(NSArray *)videosItemArr { WeakSelf(weakSelf) if (RQ_Video_Module.currentpPlayVideosItem.isPlaying) { RQ_Video_Module.currentpPlayVideosItem.isPlaying = NO; } self.playerController.playableArray = videosItemArr; [self.controlView showTitle:videoItem.title coverURLString:videoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic]; [self.playerController playWithPlayable:videoItem]; if ((videoItem.subject == 1 && RQ_VIP_Module.isSubject2Vip) || (videoItem.subject == 2 && RQ_VIP_Module.isSubject3Vip)) { } else { [self.playerController.currentPlayerManager pause]; if (_payState>0) return; NSLog(@"AD-广告"); [RQ_AD_MANAGER loadAdWithAdType:RQADType_native customView:self.playView]; _payState = 1; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ _payState = 0; }); [RQ_AD_MANAGER initCloseBlock:^(RQADDoType adDoType) { dispatch_async(dispatch_get_main_queue(), ^{ // @strongify(self) weakSelf.adDoType = adDoType; ZFPlayerPlaybackState playState = weakSelf.playerController.currentPlayerManager.playState; if (adDoType == RQADDoType_Miss) { } switch (adDoType) { case RQADDoType_Success: case RQADDoType_Click:{ if (playState == ZFPlayerPlayStatePlaying) { [weakSelf.playerController.currentPlayerManager pause]; } break; } case RQADDoType_Faild: case RQADDoType_Close:{ if (playState == ZFPlayerPlayStatePaused) { if (!weakSelf.playerController.player.isFullScreen) { //延时 [[[[RACSignal createSignal:^RACDisposable *(id subscriber) { [subscriber sendNext:@"延时.2f秒"]; return nil; }] delay:.2f] deliverOnMainThread] subscribeNext:^(id x) { // @strongify(self) [weakSelf.playerController.currentPlayerManager play]; weakSelf.adDoType = RQADDoType_Miss; }]; } else { if ([NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"ZFLandscapeViewController"]) { [weakSelf.playerController.currentPlayerManager play]; weakSelf.adDoType = RQADDoType_Miss; } } } break; } default: break; } }); }]; } __block BOOL isBuy = videoItem.placeVideoListModel.placeListModel.isCheckVip; [[[[RACObserve(RQ_COMMON_MANAGER, vipListArr) deliverOnMainThread] takeUntil:self.rac_willDeallocSignal] skip:1] subscribeNext:^(id _Nullable x) { isBuy = [RQ_COMMON_MANAGER.vipListArr containsObject:videoItem.placeVideoListModel.examName]; }]; if (!RQ_COMMON_MANAGER.APP_SWITCH) { self.playerController.player.playerPlayTimeChanged = ^(id _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) { // @strongify(self) if (videoItem.permission == 1) { if (videoItem.videoType == RQVideoType_KaoChang) { if (!isBuy) { NSInteger tryLookSecond = RQStringIsEmpty(videoItem.placeVideoListModel.tryLookSecond)? 0 : videoItem.placeVideoListModel.tryLookSecond.integerValue; if (tryLookSecond > 0) { if (weakSelf.playerController.player.currentTime >= tryLookSecond) { [weakSelf.playerController.currentPlayerManager pause]; weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通考场会员观看完整视频"; [weakSelf.playerController.containerView addSubview:weakSelf.vipPlaceHolderView]; [weakSelf.vipPlaceHolderView.reLookBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [weakSelf.vipPlaceHolderView removeFromSuperview]; weakSelf.controlView = nil; weakSelf.playerController.controlView = weakSelf.controlView; [weakSelf.controlView showTitle:videoItem.title coverURLString:videoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic]; [weakSelf.playerController playWithPlayable:videoItem]; }]; [weakSelf.vipPlaceHolderView.openBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [RQ_APPDELEGATE.services popViewModelAnimated:YES]; }]; } } } } else { if ((videoItem.subject == 1 && RQ_VIP_Module.isSubject2Vip) || (videoItem.subject == 2 && RQ_VIP_Module.isSubject3Vip)) { } else { if (weakSelf.playerController.player.currentTime >= 15) { [weakSelf.playerController.currentPlayerManager pause]; switch (videoItem.subject) { case 0: weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通科一会员观看完整视频"; break; case 1: weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通科二会员观看完整视频"; break; case 2: weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通科三会员观看完整视频"; break; case 3: weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通科四会员观看完整视频"; break; default: weakSelf.vipPlaceHolderView.myTitleLabel.text = @"试看结束,开通会员观看完整视频"; break; } [weakSelf.playerController.containerView addSubview:weakSelf.vipPlaceHolderView]; [weakSelf.vipPlaceHolderView.reLookBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [weakSelf.vipPlaceHolderView removeFromSuperview]; weakSelf.controlView = nil; weakSelf.playerController.controlView = weakSelf.controlView; [weakSelf.controlView showTitle:videoItem.title coverURLString:videoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic]; [weakSelf.playerController playWithPlayable:videoItem]; }]; [weakSelf.vipPlaceHolderView.openBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [RQ_VIP_Module gotoBuyVipWithVipPageType:RQVIPPageType_Full]; }]; } } } } }; } self.playerController.currentPlayerManager.playerDidToEnd = ^(id _Nonnull asset) { // @strongify(self) if (!weakSelf.playerController.player.isFullScreen) { NSInteger currentIndex = [videosItemArr indexOfObject:videoItem]; NSInteger nextIndex = (currentIndex + 1 >= weakSelf.playerController.playableArray.count)? 0 : currentIndex + 1; VideosItem *nextVideoItem = (VideosItem *)videosItemArr[nextIndex]; if ([weakSelf isCanWatchWithVideosItem:nextVideoItem]) { videoItem.isPlaying = NO; nextVideoItem.isPlaying = YES; [weakSelf requestDataWithVideosItem:nextVideoItem videosItemArr:videosItemArr]; } } else { NSInteger currentIndex = [videosItemArr indexOfObject:RQ_Video_Module.currentpPlayVideosItem]; NSInteger nextIndex = (currentIndex + 1 >= weakSelf.playerController.playableArray.count)? 0 : currentIndex + 1; VideosItem *nextVideoItem = (VideosItem *)videosItemArr[nextIndex]; if ([weakSelf isCanWatchWithVideosItem:nextVideoItem]) { if ((videoItem.subject == 1 && RQ_VIP_Module.isSubject2Vip) || (videoItem.subject == 2 && RQ_VIP_Module.isSubject3Vip)) { } else { [RQ_AD_MANAGER loadAdWithAdType:RQADType_fullScreen customView:nil]; } __block BOOL isSure; SCLAlertView *alert = [[SCLAlertView alloc] initWithNewWindow]; alert.backgroundViewColor = RQ_BACKGROUNDCOLOR_1; alert.customViewColor = RQ_MAIN_COLOR; [alert addButton:@"立即播放 " actionBlock:^(void) { isSure = YES; RQ_Video_Module.currentpPlayVideosItem.isPlaying = NO; [weakSelf.playerController playWithPlayable:nextVideoItem]; nextVideoItem.isPlaying = YES; [weakSelf.playerController.currentPlayerManager pause]; [weakSelf.controlView updateTitle:nextVideoItem.title coverURLString:nextVideoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic]; RQ_Video_Module.currentpPlayVideosItem = nextVideoItem; }]; [alert addTimerToButtonIndex:0 reverse:YES]; [alert showNotice:@"温馨提示" subTitle:@"即将播放下一个视频" closeButtonTitle:@"取消" duration:5.0f]; [alert alertIsDismissed:^{ if (isSure) { if ((videoItem.subject == 1 && RQ_VIP_Module.isSubject2Vip) || (videoItem.subject == 2 && RQ_VIP_Module.isSubject3Vip)) { } else { [RQ_AD_MANAGER showAdWithAdType:RQADType_fullScreen]; } } }]; } } }; //延时 [[[[RACSignal createSignal:^RACDisposable *(id subscriber) { [subscriber sendNext:@"延时.5f秒"]; return nil; }] delay:.5f] deliverOnMainThread] subscribeNext:^(id x) { NSInteger index = [videosItemArr indexOfObject:videoItem]; [self.scrollView zf_scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:ZFPlayerScrollViewScrollPositionCenteredVertically animated:YES completionHandler:nil]; }]; videoItem.isPlaying = YES; RQ_Video_Module.currentpPlayVideosItem = videoItem; } #pragma mark - LazyLoad - (ZFPlayerControlView *)controlView { if (!_controlView) { _controlView = [[ZFPlayerControlView alloc] init]; // @weakify(self) WeakSelf(weakSelf) [_controlView.portraitControlView.backBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) { [RQNotificationCenter removeObserver:weakSelf.videoDetailViewController name:RQPlayVideoUrlNotification object:nil]; [weakSelf.playerController stop]; [RQ_APPDELEGATE.services popViewModelAnimated:YES]; }]; _controlView.portraitControlView.topToolView.alpha = 1; _controlView.portraitControlView.topToolView.zf_y = 0; [[[[RACObserve(_controlView, portraitControlView.topToolView.alpha) deliverOnMainThread] distinctUntilChanged] takeUntil:weakSelf.rac_willDeallocSignal] subscribeNext:^(id _Nullable x) { // @strongify(_controlView) if (_controlView.portraitControlView.topToolView.alpha < 1) { _controlView.portraitControlView.topToolView.alpha = 1; } }]; [[[[RACObserve(_controlView, portraitControlView.topToolView.zf_y) deliverOnMainThread] distinctUntilChanged] takeUntil:weakSelf.rac_willDeallocSignal] subscribeNext:^(id _Nullable x) { // @strongify(_controlView) if (_controlView.portraitControlView.topToolView.zf_y < 0) { _controlView.portraitControlView.topToolView.zf_y = 0; } }]; } return _controlView; } - (RQVipPlaceHolderView *)vipPlaceHolderView { if (!_vipPlaceHolderView) { _vipPlaceHolderView = [RQVipPlaceHolderView vipPlaceHolderView]; _vipPlaceHolderView.size = self.playerController.containerView.size; } return _vipPlaceHolderView; } - (MPPlayerController *)playerController { if (!_playerController) { _playerController = [MPPlayerController playrWithContainerView:UIView.new]; [_playerController.player setExitFullScreenWhenStop:NO]; } return _playerController; } - (ZFPlayerController *)zfPlayerController { if (!_zfPlayerController) { ZFAVPlayerManager *playerManager = [[ZFAVPlayerManager alloc] init]; playerManager.shouldAutoPlay = YES; _zfPlayerController = [ZFPlayerController playerWithPlayerManager:playerManager containerView:UIView.new]; [_zfPlayerController setExitFullScreenWhenStop:YES]; } return _zfPlayerController; } @end