Skip to content

Commit 2d8704b

Browse files
committed
fix #74
1 parent e5ae3bd commit 2d8704b

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

SJMediaCacheServer.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Pod::Spec.new do |s|
1010
s.name = 'SJMediaCacheServer'
11-
s.version = '2.0.3'
11+
s.version = '2.0.4'
1212
s.summary = <<-DESC
1313
SJMediaCacheServer 是一个高效的 HTTP 媒体缓存框架,旨在代理媒体数据请求并优先提供缓存数据,从而减少网络流量并增强播放的流畅性。该框架支持两种类型的远程资源:基于文件的媒体,如 MP3、AAC、WAV、FLAC、OGG、MP4 和 MOV 等常见格式,以及 HLS(HTTP Live Streaming)流。它会自动解析 HLS 播放列表并代理各个媒体片段。
1414
DESC

SJMediaCacheServer/Core/Asset/FILE/FILEAsset.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ - (float)completeness {
160160
NSString *pathExtension = response.pathExtension;
161161
NSUInteger totalLength = response.totalLength;
162162
NSUInteger offset = response.range.location;
163+
164+
if ( totalLength == NSUIntegerMax ) return nil;
165+
163166
if ( !mMetadataReady ) {
164167
mMetadataReady = YES;
165168
_totalLength = totalLength;

SJMediaCacheServer/Core/Asset/HLS/HLSAsset.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,8 @@ - (BOOL)isStored {
408408
case MCSDataTypeFILEMask:
409409
case MCSDataTypeFILE: return nil; /* return nil; */
410410
case MCSDataTypeHLSSegment: { // only segment
411+
if ( response.totalLength == NSUIntegerMax ) return nil;
412+
411413
@synchronized (self) {
412414
id<HLSAssetSegment>content = nil;
413415
NSString *segmentIdentifier = [self generateSegmentIdentifierWithOriginalURL:response.originalRequest.URL];

SJMediaCacheServer/Core/Common/MCSInterfaces.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ NS_ASSUME_NONNULL_BEGIN
4040
#pragma mark -
4141

4242
@protocol MCSResponse <NSObject>
43-
@property (nonatomic, readonly) NSUInteger totalLength;
43+
@property (nonatomic, readonly) NSUInteger totalLength; // 200请求时, NSUIntegerMax表示服务器未提供content-length;
4444
@property (nonatomic, readonly) NSRange range; // 206请求时length不为0
4545
@property (nonatomic, copy, readonly) NSString *contentType; // default is "application/octet-stream"
4646
@end

SJMediaCacheServer/Core/Download/MCSDownload.m

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#import "MCSUtils.h"
1313
#import "MCSLogger.h"
1414
#import "NSURLRequest+MCS.h"
15+
#import "MCSConsts.h"
1516

1617
@interface NSURLSessionTask (MCSDownloadExtended)<MCSDownloadTask>
1718

@@ -58,15 +59,26 @@ - (instancetype)init {
5859
mDefaultResponseHandler = ^id<MCSDownloadResponse> _Nullable (NSURLSessionTask *task, NSURLResponse *response) {
5960
if ( ![response isKindOfClass:NSHTTPURLResponse.class] ) return nil;
6061
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
61-
MCSResponseContentRange contentRange = MCSResponseGetContentRange(res);
62-
if ( MCSResponseRangeIsUndefined(contentRange) ) return nil;
63-
NSRange range = MCSResponseRange(contentRange);
64-
NSUInteger totalLength = contentRange.totalLength;
65-
6662
NSInteger statusCode = res.statusCode;
6763
NSString *_Nullable contentType = MCSResponseGetContentType(res);
6864
NSString *_Nullable pathExtension = MCSSuggestedPathExtension(res);
69-
return [MCSDownloadResponse.alloc initWithOriginalRequest:task.originalRequest currentRequest:task.currentRequest statusCode:statusCode pathExtension:pathExtension totalLength:totalLength range:range contentType:contentType];
65+
switch (statusCode) {
66+
case 206: {
67+
MCSResponseContentRange contentRange = MCSResponseGetContentRange(res);
68+
if ( MCSResponseRangeIsUndefined(contentRange) ) return nil;
69+
NSRange range = MCSResponseRange(contentRange);
70+
NSUInteger totalLength = contentRange.totalLength;
71+
return [MCSDownloadResponse.alloc initWithOriginalRequest:task.originalRequest currentRequest:task.currentRequest statusCode:statusCode pathExtension:pathExtension totalLength:totalLength range:range contentType:contentType];
72+
}
73+
break;
74+
case 200: {
75+
NSUInteger totalLength = MCSResponseGetContentLength(res) ?: NSUIntegerMax;
76+
NSRange range = NSMakeRange(0, totalLength);
77+
return [MCSDownloadResponse.alloc initWithOriginalRequest:task.originalRequest currentRequest:task.currentRequest statusCode:statusCode pathExtension:pathExtension totalLength:totalLength range:range contentType:contentType];
78+
}
79+
break;
80+
default: return nil;
81+
}
7082
};
7183
_responseHandler = mDefaultResponseHandler;
7284
}

0 commit comments

Comments
 (0)