123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- //
- // RQVideoModule.m
- // JSJP
- //
- // Created by 张嵘 on 2021/10/25.
- //
- #import "RQVideoModule.h"
- #import "UIView+ZFFrame.h"
- #import <ZFPlayer/ZFAVPlayerManager.h>
- /// 播放视频
- 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 if (videosItem.subject == 5) {
- if (RQ_VIP_Module.isSpSubject1Vip) {
- return YES;
- } else {
- if (videosItem.permission == 2) {
- [RQ_VIP_Module gotoBuyVipWithVipPageType:RQVIPPageType_Full];
- return NO;
- } else {
- return YES;
- }
- }
- } else if (videosItem.subject == 6) {
- if (RQ_VIP_Module.isSpSubject4Vip) {
- 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) ||
- (videoItem.subject == 5 && RQ_VIP_Module.isSpSubject1Vip) ||
- (videoItem.subject == 6 && RQ_VIP_Module.isSpSubject4Vip)) {
- } 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;
- });
- //广告关闭监听-时间监听 2025-2-19 ning
- [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(RQ_AD_MANAGER.adType==RQADType_fullScreen||RQ_AD_MANAGER.adType==RQADType_native){
- // break;
- // }
- if (!weakSelf.playerController.player.isFullScreen) {
- //延时
- if ([NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"ZFLandscapeViewController"]||
- [NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"NYLIVideoDetailViewController"]) {
- [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> 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"]||
- [NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"NYLIVideoDetailViewController"]) {
- [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) { //播放时间监听 2025-2-19 ning
- self.playerController.player.playerPlayTimeChanged = ^(id<ZFPlayerMediaPlayback> _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 == 0 && RQ_VIP_Module.isSubject1Vip) ||
- (videoItem.subject == 1 && RQ_VIP_Module.isSubject2Vip) ||
- (videoItem.subject == 2 && RQ_VIP_Module.isSubject3Vip) ||
- (videoItem.subject == 5 && RQ_VIP_Module.isSpSubject1Vip) ||
- (videoItem.subject == 6 && RQ_VIP_Module.isSpSubject4Vip)) {
-
- } else {
- NSInteger tryLookSecond = RQStringIsEmpty(videoItem.tryLookSecond)? 15 : videoItem.tryLookSecond.integerValue;
-
- if (weakSelf.playerController.player.currentTime >= tryLookSecond) {
- [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];
- }];
- }
- }
- }
- }
- };
- // }
-
- //播放结束监听 2025-2-19 ning
- self.playerController.currentPlayerManager.playerDidToEnd = ^(id<ZFPlayerMediaPlayback> _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) ||
- (videoItem.subject == 5 && RQ_VIP_Module.isSpSubject1Vip) ||
- (videoItem.subject == 6 && RQ_VIP_Module.isSpSubject4Vip)) {
-
- } 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) ||
- (videoItem.subject == 5 && RQ_VIP_Module.isSpSubject1Vip) ||
- (videoItem.subject == 6 && RQ_VIP_Module.isSpSubject4Vip)) {
-
- } else {
- [RQ_AD_MANAGER showAdWithAdType:RQADType_fullScreen];
- }
- }
- }];
- }
- }
- };
-
- //延时
- [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> 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;
- }
- //延迟播放
- - (void)delayPlaydo:(NSInteger)subject {
- WeakSelf(weakSelf)
- if ((subject == 1 && RQ_VIP_Module.isSubject2Vip) ||
- (subject == 2 && RQ_VIP_Module.isSubject3Vip) ||
- (subject == 5 && RQ_VIP_Module.isSpSubject1Vip) ||
- (subject == 6 && RQ_VIP_Module.isSpSubject4Vip)) {
- [weakSelf.vipPlaceHolderView removeFromSuperview];
- weakSelf.controlView = nil;
- weakSelf.playerController.controlView = weakSelf.controlView;
- //延时
- if ([NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"ZFLandscapeViewController"]||
- [NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"NYLIVideoDetailViewController"]) {
- [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
- [subscriber sendNext:@"延时.2f秒"];
- return nil;
- }] delay:.2f] deliverOnMainThread] subscribeNext:^(id x) {
- // @strongify(self)
- [weakSelf.playerController.currentPlayerManager play];
- weakSelf.adDoType = RQADDoType_Miss;
- }];
- }
- }
- }
- - (void)backBtnClickActiondo{
- [self.controlView backBtnClickActiondo];
- }
- #pragma mark - LazyLoad
- - (ZFPlayerControlView *)controlView {
- if (!_controlView) {
- _controlView = [[ZFPlayerControlView alloc] init];
- // @weakify(self)
- WeakSelf(weakSelf)
- [_controlView.portraitControlView.backBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
- if(weakSelf.livideoDetailViewController.tagTyp>0&&weakSelf.failSpecialDetailViewController==NULL&&weakSelf.videoDetailViewController==NULL){//tbar 中的视频不用关闭
- return;
- }
- [RQNotificationCenter removeObserver:weakSelf.videoDetailViewController name:RQPlayVideoUrlNotification object:nil];
- [RQNotificationCenter removeObserver:weakSelf.failSpecialDetailViewController name:RQPlayVideoUrlNotification object:nil];
- [RQNotificationCenter removeObserver:weakSelf.livideoDetailViewController 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
|