You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.9 KiB
Objective-C
185 lines
5.9 KiB
Objective-C
#import "SuperPlayerModel.h"
|
|
#import "SuperPlayer.h"
|
|
#import "AFNetworking/AFNetworking.h"
|
|
#import "J2Obj.h"
|
|
#import "AdaptiveStream.h"
|
|
#import "SPPlayCGIParser.h"
|
|
#import "SuperPlayerModelInternal.h"
|
|
|
|
const NSString *kPlayCGIHostname = @"playvideo.qcloud.com";
|
|
NSString * const kErrorDomain = @"SuperPlayerCGI";
|
|
const NSInteger kInvalidResponseErrorCode = -100;
|
|
|
|
@implementation SuperPlayerVideoId
|
|
@end
|
|
|
|
@implementation SuperPlayerModel {
|
|
}
|
|
|
|
- (instancetype)init {
|
|
self = [super init];
|
|
if (self) {
|
|
_sessionManager = [AFHTTPSessionManager manager];
|
|
_defaultPlayIndex = NSUIntegerMax;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
// [_sessionManager invalidateSessionCancelingTasks:YES];
|
|
[_sessionManager invalidateSessionCancelingTasks:YES resetSession:NO];
|
|
}
|
|
|
|
- (NSString *)playingDefinitionUrl
|
|
{
|
|
NSString *url;
|
|
for (int i = 0; i < self.multiVideoURLs.count; i++) {
|
|
if ([self.multiVideoURLs[i].title isEqualToString:self.playingDefinition]) {
|
|
url = self.multiVideoURLs[i].url;
|
|
}
|
|
}
|
|
if (url == nil)
|
|
url = self.videoURL;
|
|
if (url == nil) {
|
|
if (self.multiVideoURLs.count > 0)
|
|
url = self.multiVideoURLs.firstObject.url;
|
|
}
|
|
return url;
|
|
}
|
|
|
|
- (void)setDefaultPlayIndex:(NSUInteger)defaultPlayIndex {
|
|
_defaultPlayIndex = defaultPlayIndex;
|
|
if (defaultPlayIndex < _multiVideoURLs.count) {
|
|
self.playingDefinition = _multiVideoURLs[defaultPlayIndex].title;
|
|
}
|
|
}
|
|
|
|
- (void)setMultiVideoURLs:(NSArray<SuperPlayerUrl *> *)multiVideoURLs {
|
|
_multiVideoURLs = multiVideoURLs;
|
|
if (_defaultPlayIndex < multiVideoURLs.count) {
|
|
self.playingDefinition = _multiVideoURLs[_defaultPlayIndex].title;
|
|
}
|
|
}
|
|
|
|
- (NSArray *)playDefinitions
|
|
{
|
|
NSMutableArray *array = @[].mutableCopy;
|
|
for (int i = 0; i < self.multiVideoURLs.count; i++) {
|
|
[array addObject:self.multiVideoURLs[i].title ?: @""];
|
|
}
|
|
return array;
|
|
}
|
|
|
|
- (NSInteger)playingDefinitionIndex
|
|
{
|
|
for (int i = 0; i < self.multiVideoURLs.count; i++) {
|
|
if ([self.multiVideoURLs[i].title isEqualToString:self.playingDefinition]) {
|
|
return i;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
- (NSURLSessionTask *)requestWithCompletion:
|
|
(void(^)(NSError *, SuperPlayerModel *model))completion
|
|
{
|
|
AFHTTPSessionManager *manager = self.sessionManager;
|
|
int ver = self.videoId ? 4 : 2;
|
|
NSString *url = [NSString stringWithFormat:@"https://%@/getplayinfo/v%d/%ld/%@",
|
|
kPlayCGIHostname, ver, self.appId, self.videoId ? self.videoId.fileId : self.videoIdV2.fileId];
|
|
|
|
// 防盗链参数
|
|
NSDictionary *params = [self _buildParams];
|
|
|
|
__weak SuperPlayerModel *weakSelf = self;
|
|
|
|
return [manager GET:url parameters:params headers:nil progress:nil
|
|
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
|
|
__strong SuperPlayerModel *self = weakSelf;
|
|
#if DEBUG
|
|
NSLog(@"%@", responseObject);
|
|
#endif
|
|
NSInteger code = [responseObject[@"code"] integerValue];
|
|
if (code != 0) {
|
|
NSString *msg = responseObject[@"message"];
|
|
NSString *requestID = responseObject[@"requestId"];
|
|
NSString *warning = responseObject[@"warning"];
|
|
NSError *error = [NSError errorWithDomain:kErrorDomain
|
|
code:code
|
|
userInfo:@{NSLocalizedDescriptionKey: msg,
|
|
@"requestID": requestID ?: @"",
|
|
@"warning": warning ?: @""
|
|
}];
|
|
if (completion) {
|
|
completion(error, self);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
|
|
NSInteger responseVersion = [responseObject[@"version"] integerValue];
|
|
if (responseVersion == 0) {
|
|
responseVersion = 2;
|
|
}
|
|
Class<SPPlayCGIParserProtocol> parser = [SPPlayCGIParser parserOfVersion:responseVersion];
|
|
SPPlayCGIParseResult *result = [parser parseResponse:responseObject];
|
|
if (result == nil) {
|
|
if (completion) {
|
|
NSError *error = [NSError errorWithDomain:kErrorDomain
|
|
code:kInvalidResponseErrorCode
|
|
userInfo:@{NSLocalizedDescriptionKey:@"Invalid response."}];
|
|
completion(error, self);
|
|
}
|
|
return;
|
|
}
|
|
self.drmType = result.drmType;
|
|
self.videoURL = result.url;
|
|
self.multiVideoURLs = result.multiVideoURLs;
|
|
self.keyFrameDescList = result.keyFrameDescList;
|
|
self.imageSprite = result.imageSprite;
|
|
|
|
if (responseVersion == 4) {
|
|
self.drmToken = result.drmToken;
|
|
self.originalDuration = result.originalDuration;
|
|
}
|
|
if (completion) {
|
|
completion(nil, self);
|
|
}
|
|
|
|
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
|
|
if (error.code != NSURLErrorCancelled) {
|
|
if (completion) {
|
|
completion(error, self);
|
|
}
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (NSDictionary *)_buildParams {
|
|
NSMutableDictionary *params = [NSMutableDictionary new];
|
|
if (self.videoId) {
|
|
if (self.videoId.psign) {
|
|
params[@"psign"] = self.videoId.psign;
|
|
}
|
|
} else if (self.videoIdV2) {
|
|
if (self.videoIdV2.timeout) {
|
|
params[@"t"] = self.videoIdV2.timeout;
|
|
}
|
|
if (self.videoIdV2.us) {
|
|
params[@"us"] = self.videoIdV2.us;
|
|
}
|
|
if (self.videoIdV2.sign) {
|
|
params[@"sign"] = self.videoIdV2.sign;
|
|
}
|
|
if (self.videoIdV2.exper >= 0) {
|
|
params[@"exper"] = @(self.videoIdV2.exper);
|
|
}
|
|
}
|
|
return params;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation SuperPlayerVideoIdV2
|
|
@end
|