#import "TGEmbedVKPlayerView.h" #import #import "TGEmbedYoutubePlayerView.h" #import "TGEmbedVimeoPlayerView.h" #import "TGEmbedCoubPlayerView.h" #import "TGEmbedVideoPlayerView.h" @interface TGEmbedVKPlayerView () { NSString *_url; TGEmbedPlayerView *_subPlayerView; SMetaDisposable *_disposable; } @end @implementation TGEmbedVKPlayerView - (instancetype)initWithWebPageAttachment:(TGWebPageMediaAttachment *)webPage thumbnailSignal:(SSignal *)thumbnailSignal alternateCachePathSignal:(SSignal *)alternateCachePathSignal { self = [super initWithWebPageAttachment:webPage thumbnailSignal:thumbnailSignal alternateCachePathSignal:alternateCachePathSignal]; if (self != nil) { _url = webPage.embedUrl; } return self; } - (void)dealloc { [_disposable dispose]; } - (void)setFrame:(CGRect)frame { [super setFrame:frame]; if (_subPlayerView != nil) _subPlayerView.frame = self.bounds; } - (void)setRequestFullscreen:(void (^)(NSTimeInterval))requestFullscreen { [super setRequestFullscreen:requestFullscreen]; if (_subPlayerView != nil) [_subPlayerView setRequestFullscreen:requestFullscreen]; } - (void)setRequestPictureInPicture:(void (^)(TGEmbedPIPCorner))requestPictureInPicture { [super setRequestPictureInPicture:requestPictureInPicture]; if (_subPlayerView != nil) [_subPlayerView setRequestPictureInPicture:requestPictureInPicture]; } - (void)_prepareToEnterFullscreen { [super _prepareToEnterFullscreen]; if (_subPlayerView != nil) [_subPlayerView _prepareToEnterFullscreen]; } - (void)_prepareToLeaveFullscreen { [super _prepareToLeaveFullscreen]; if (_subPlayerView != nil) [_subPlayerView _prepareToLeaveFullscreen]; } - (void)playVideo { [super playVideo]; if (_subPlayerView != nil) { [_subPlayerView playVideo]; return; } } - (void)pauseVideo:(bool)manually { [super pauseVideo:manually]; if (_subPlayerView != nil) { [_subPlayerView pauseVideo:manually]; return; } } - (void)seekToPosition:(NSTimeInterval)position { if (_subPlayerView != nil) { [_subPlayerView seekToPosition:position]; return; } } - (void)onLockInPlace { [super onLockInPlace]; if (_subPlayerView != nil) { [_subPlayerView onLockInPlace]; return; } } - (void)setupWithEmbedSize:(CGSize)embedSize { [super setupWithEmbedSize:embedSize]; [self initializePlayer]; [self setLoadProgress:0.01f duration:0.01]; } - (void)_requestSystemPictureInPictureMode { if (_subPlayerView != nil) [_subPlayerView _requestSystemPictureInPictureMode]; else [super _requestSystemPictureInPictureMode]; } - (TGEmbedPlayerState *)state { if (_subPlayerView != nil) return [_subPlayerView state]; else return [super state]; } - (SSignal *)stateSignal { if (_subPlayerView != nil) return [_subPlayerView stateSignal]; else return [super stateSignal]; } - (void)initializePlayer { __weak TGEmbedVKPlayerView *weakSelf = self; SSignal *signal = [[[LegacyComponentsGlobals provider] dataForHttpLocation:_url] map:^NSString *(NSData *data) { return [[NSString alloc] initWithData:data encoding:NSWindowsCP1251StringEncoding]; }]; _disposable = [[SMetaDisposable alloc] init]; [_disposable setDisposable:[[signal deliverOn:[SQueue mainQueue]] startWithNext:^(NSString *next) { __strong TGEmbedVKPlayerView *strongSelf = weakSelf; if (strongSelf == nil) return; NSRange ytRange = [next rangeOfString:@"youtube.com/embed/"]; if (ytRange.location != NSNotFound) { NSString *videoId = [self _getVideoId:next location:ytRange.location + @"youtube.com/embed/".length stopChar:'?']; if (videoId.length > 0) { TGWebPageMediaAttachment *webPage = [[TGWebPageMediaAttachment alloc] init]; webPage.embedUrl = [NSString stringWithFormat:@"https://www.youtube.com/embed/%@", videoId]; [self _setupWithSubPlayerView:[[TGEmbedYoutubePlayerView alloc] initWithWebPageAttachment:webPage]]; } } NSRange vimeoRange = [next rangeOfString:@"vimeo.com/video/"]; if (vimeoRange.location != NSNotFound) { NSString *videoId = [self _getVideoId:next location:vimeoRange.location + @"vimeo.com/video/".length stopChar:'?']; if (videoId.length > 0) { TGWebPageMediaAttachment *webPage = [[TGWebPageMediaAttachment alloc] init]; webPage.embedUrl = [NSString stringWithFormat:@"https://player.vimeo.com/video/%@", videoId]; [self _setupWithSubPlayerView:[[TGEmbedVimeoPlayerView alloc] initWithWebPageAttachment:webPage]]; } } NSRange coubRange = [next rangeOfString:@"coub.com/embed/"]; if (coubRange.location != NSNotFound) { NSString *videoId = [self _getVideoId:next location:coubRange.location + @"coub.com/embed/".length stopChar:'"']; if (videoId.length > 0) { TGWebPageMediaAttachment *webPage = [[TGWebPageMediaAttachment alloc] init]; webPage.embedUrl = [NSString stringWithFormat:@"https://coub.com/embed/%@", videoId]; [self _setupWithSubPlayerView:[[TGEmbedCoubPlayerView alloc] initWithWebPageAttachment:webPage]]; } } NSRange vkRange = [next rangeOfString:@"