RQVideoModule.m 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. //
  2. // RQVideoModule.m
  3. // SDJK
  4. //
  5. // Created by 张嵘 on 2021/10/25.
  6. //
  7. #import "RQVideoModule.h"
  8. /// 播放视频
  9. NSString * const RQPlayVideoUrlNotification = @"RQPlayVideoUrlNotification";
  10. /// 播放视频Model
  11. NSString * const RQPlayVideoItemKey = @"RQPlayVideoItemKey";
  12. /// 播放视频ModelArr
  13. NSString * const RQPlayVideoItemArrKey = @"RQPlayVideoItemArrKey";
  14. /// 视频Index
  15. NSString * const RQVideoItemIndexKey = @"RQVideoItemIndexKey";
  16. /// 视频IndexPath
  17. NSString * const RQVideoItemIndexPathKey = @"RQVideoItemIndexPathKey";
  18. @interface RQVideoModule ()
  19. @property (nonatomic, readwrite, strong) ZFPlayerControlView *controlView;
  20. @property (nonatomic, readwrite, assign) RQADDoType adDoType;
  21. @property (nonatomic, readwrite, assign) ZFPlayerPlaybackState playState;
  22. @property (nonatomic, readwrite, assign) BOOL isShow;
  23. @property (nonatomic, readwrite, assign) BOOL isSH;
  24. @property (nonatomic, readwrite, strong) RQVipPlaceHolderView *vipPlaceHolderView;
  25. @end
  26. @implementation RQVideoModule
  27. @def_singleton(RQVideoModule);
  28. - (BOOL)isCanWatchWithVideosItem:(VideosItem *)videosItem {
  29. @weakify(self)
  30. [RQ_COMMON_MANAGER checkVersionWithComplete:^(BOOL isSH) {
  31. @strongify(self)
  32. self.isSH = isSH;
  33. }];
  34. return YES;
  35. }
  36. - (void)playVideoWithVideosItem:(VideosItem *)videosItem videosItemArr:(NSArray *)videosItemArr playView:(UIView *)playView scrollView:(UIScrollView *)scrollView {
  37. if (self.playerController && self.playerController.isPlaying) {
  38. [self.playerController stop];
  39. self.playerController = [[MPPlayerController alloc] initWithContainerView:playView];
  40. [self requestDataWithVideosItem:videosItem videosItemArr:videosItemArr playView:playView scrollView:scrollView];
  41. } else {
  42. self.playerController = [[MPPlayerController alloc] initWithContainerView:playView];
  43. [self requestDataWithVideosItem:videosItem videosItemArr:videosItemArr playView:playView scrollView:scrollView];
  44. }
  45. }
  46. - (void)requestDataWithVideosItem:(VideosItem *)videoItem videosItemArr:(NSArray *)videosItemArr playView:(UIView *)playView scrollView:(UIScrollView *)scrollView {
  47. @weakify(self)
  48. if (RQ_Video_Module.currentpPlayVideosItem.isPlaying) {
  49. RQ_Video_Module.currentpPlayVideosItem.isPlaying = NO;
  50. }
  51. [self.playerController.player setExitFullScreenWhenStop:NO];
  52. self.playerController.playableArray = videosItemArr;
  53. self.playerController.controlView = self.controlView;
  54. [self.controlView showTitle:videoItem.title coverURLString:videoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic];
  55. [self.playerController playWithPlayable:videoItem];
  56. [self.playerController.currentPlayerManager pause];
  57. [RQ_AD_MANAGER loadAdWithAdType:RQADType_native customView:playView];
  58. [RQ_AD_MANAGER initCloseBlock:^(RQADDoType adDoType) {
  59. self.adDoType = adDoType;
  60. ZFPlayerPlaybackState playState = self.playerController.currentPlayerManager.playState;
  61. if (adDoType == RQADDoType_Miss) {
  62. }
  63. switch (adDoType) {
  64. case RQADDoType_Success:
  65. case RQADDoType_Click:{
  66. if (playState == ZFPlayerPlayStatePlaying) {
  67. [self.playerController.currentPlayerManager pause];
  68. }
  69. break;
  70. }
  71. case RQADDoType_Faild:
  72. case RQADDoType_Close:{
  73. if (playState == ZFPlayerPlayStatePaused) {
  74. NSLog(@"%@",NSStringFromClass([RQControllerHelper.currentViewController class]));
  75. if (!self.playerController.player.isFullScreen) {
  76. [self.playerController.currentPlayerManager play];
  77. self.adDoType = RQADDoType_Miss;
  78. } else {
  79. if ([NSStringFromClass([RQControllerHelper.currentViewController class]) isEqualToString:@"ZFLandscapeViewController"]) {
  80. [self.playerController.currentPlayerManager play];
  81. self.adDoType = RQADDoType_Miss;
  82. } else {
  83. }
  84. }
  85. }
  86. break;
  87. }
  88. default:
  89. break;
  90. }
  91. }];
  92. self.playerController.player.playerPlayTimeChanged = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) {
  93. @strongify(self)
  94. if (self.isSH) {
  95. ///
  96. } else {
  97. if (RQ_USER_MANAGER.isVip <= 0) {
  98. if (self.playerController.player.currentTime >= 15) {
  99. [self.playerController.currentPlayerManager pause];
  100. if ([RQ_USER_MANAGER isShouldLogin]) {
  101. [self.playerController.containerView addSubview:self.vipPlaceHolderView];
  102. [self.vipPlaceHolderView.reLookBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  103. [self.vipPlaceHolderView removeFromSuperview];
  104. self.controlView = nil;
  105. self.playerController.controlView = self.controlView;
  106. [self.controlView showTitle:videoItem.title coverURLString:videoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic];
  107. [self.playerController playWithPlayable:videoItem];
  108. }];
  109. }
  110. }
  111. }
  112. }
  113. };
  114. self.playerController.currentPlayerManager.playerDidToEnd = ^(id<ZFPlayerMediaPlayback> _Nonnull asset) {
  115. @strongify(self)
  116. if (!self.playerController.player.isFullScreen) {
  117. NSInteger currentIndex = [videosItemArr indexOfObject:videoItem];
  118. NSInteger nextIndex = (currentIndex + 1 >= self.playerController.playableArray.count)? 0 : currentIndex + 1;
  119. VideosItem *nextVideoItem = (VideosItem *)videosItemArr[nextIndex];
  120. if ([self isCanWatchWithVideosItem:nextVideoItem]) {
  121. videoItem.isPlaying = NO;
  122. nextVideoItem.isPlaying = YES;
  123. [self playVideoWithVideosItem:nextVideoItem videosItemArr:videosItemArr playView:playView scrollView:scrollView];
  124. [scrollView zf_scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:nextIndex inSection:0] atScrollPosition:ZFPlayerScrollViewScrollPositionCenteredVertically animated:YES completionHandler:nil];
  125. }
  126. } else {
  127. NSInteger currentIndex = [videosItemArr indexOfObject:RQ_Video_Module.currentpPlayVideosItem];
  128. NSInteger nextIndex = (currentIndex + 1 >= self.playerController.playableArray.count)? 0 : currentIndex + 1;
  129. VideosItem *nextVideoItem = (VideosItem *)videosItemArr[nextIndex];
  130. if ([self isCanWatchWithVideosItem:nextVideoItem]) {
  131. [RQ_AD_MANAGER loadAdWithAdType:RQADType_fullScreen customView:nil];
  132. __block BOOL isSure;
  133. SCLAlertView *alert = [[SCLAlertView alloc] initWithNewWindow];
  134. alert.backgroundViewColor = RQ_BACKGROUNDCOLOR_1;
  135. alert.customViewColor = RQ_MAIN_COLOR;
  136. [alert addButton:@"立即播放 " actionBlock:^(void) {
  137. isSure = YES;
  138. RQ_Video_Module.currentpPlayVideosItem.isPlaying = NO;
  139. [self.playerController playWithPlayable:nextVideoItem];
  140. nextVideoItem.isPlaying = YES;
  141. [self.playerController.currentPlayerManager pause];
  142. [self.controlView updateTitle:nextVideoItem.title coverURLString:nextVideoItem.coverFileUrl placeholderImage:RQWebVideoImagePlaceholder() fullScreenMode:ZFFullScreenModeAutomatic];
  143. RQ_Video_Module.currentpPlayVideosItem = nextVideoItem;
  144. }];
  145. [alert addTimerToButtonIndex:0 reverse:YES];
  146. [alert showNotice:@"温馨提示" subTitle:@"即将播放下一个视频" closeButtonTitle:@"取消" duration:5.0f];
  147. [alert alertIsDismissed:^{
  148. if (isSure) {
  149. [RQ_AD_MANAGER showAdWithAdType:RQADType_fullScreen];
  150. }
  151. }];
  152. }
  153. }
  154. };
  155. //延时
  156. [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  157. [subscriber sendNext:@"延时1.f秒"];
  158. return nil;
  159. }] delay:1.f] subscribeNext:^(id x) {
  160. NSInteger index = [videosItemArr indexOfObject:videoItem];
  161. [scrollView zf_scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:ZFPlayerScrollViewScrollPositionCenteredVertically animated:YES completionHandler:nil];
  162. }];
  163. videoItem.isPlaying = YES;
  164. RQ_Video_Module.currentpPlayVideosItem = videoItem;
  165. }
  166. #pragma mark - LazyLoad
  167. - (ZFPlayerControlView *)controlView {
  168. if (!_controlView) {
  169. _controlView = [[ZFPlayerControlView alloc] init];
  170. @weakify(self)
  171. [_controlView.portraitControlView.backBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  172. @strongify(self)
  173. [self.playerController stop];
  174. [RQ_APPDELEGATE.services popViewModelAnimated:YES];
  175. }];
  176. }
  177. return _controlView;
  178. }
  179. - (RQVipPlaceHolderView *)vipPlaceHolderView {
  180. if (!_vipPlaceHolderView) {
  181. _vipPlaceHolderView = [RQVipPlaceHolderView vipPlaceHolderView];
  182. _vipPlaceHolderView.size = self.playerController.containerView.size;
  183. [_vipPlaceHolderView.openBtn setTapActionWithBlock:^(UITapGestureRecognizer *tap) {
  184. [RQ_APPDELEGATE.services pushViewModel:[[RQActivateVIPViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:nil] animated:YES];
  185. }];
  186. }
  187. return _vipPlaceHolderView;
  188. }
  189. @end