Jelajahi Sumber

VLCHTTPConnection: implement JSON responses for 'playing' and 'playlist'

Felix Paul Kühne 9 tahun lalu
induk
melakukan
121f84d8b5
1 mengubah file dengan 100 tambahan dan 0 penghapusan
  1. 100 0
      Sources/VLCHTTPConnection.m

+ 100 - 0
Sources/VLCHTTPConnection.m

@@ -21,6 +21,7 @@
 #import "HTTPFileResponse.h"
 #import "MultipartMessageHeaderField.h"
 #import "HTTPDynamicFileResponse.h"
+#import "HTTPErrorResponse.h"
 #import "NSString+SupportedMedia.h"
 #import "UIDevice+VLC.h"
 #import "VLCHTTPUploaderController.h"
@@ -420,6 +421,98 @@
     return fileResponse;
 }
 
+#if TARGET_OS_TV
+- (NSObject <HTTPResponse> *)_HTTPGETPlaying
+{
+    /* JSON response:
+     {
+        "currentTime": 42,
+        "media": {
+            "id": "some id",
+            "title": "some title",
+            "duration": 120000
+        }
+     }
+     */
+
+    VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
+    if (!vpc.activePlaybackSession) {
+        return [[HTTPErrorResponse alloc] initWithErrorCode:404];
+    }
+    VLCMediaPlayer *player = vpc.mediaPlayer;
+    VLCMedia *media = player.media;
+    if (!media) {
+        return [[HTTPErrorResponse alloc] initWithErrorCode:404];
+    }
+
+    NSString *mediaTitle = vpc.mediaTitle;
+    if (!mediaTitle)
+        mediaTitle = @"";
+    NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString,
+                                 @"title" : mediaTitle,
+                                 @"duration" : @(media.length.intValue)};
+    NSDictionary *returnDict = @{ @"currentTime" : @(player.time.intValue),
+                                  @"media" : mediaDict };
+
+    NSError *error;
+    NSData *returnData = [NSJSONSerialization dataWithJSONObject:returnDict options:0 error:&error];
+    if (error != nil) {
+        APLog(@"JSON serialization failed %@", error);
+        return [[HTTPErrorResponse alloc] initWithErrorCode:500];
+    }
+
+    return [[HTTPDataResponse alloc] initWithData:returnData];
+}
+
+- (NSObject <HTTPResponse> *)_HTTPGETPlaylist
+{
+    /* JSON response:
+     [
+        {
+            "media": {
+                "id": "some id 1",
+                "title": "some title 1",
+                "duration": 120000
+            }
+        },
+     ...]
+     */
+
+    VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
+    if (!vpc.activePlaybackSession || !vpc.mediaList) {
+        return [[HTTPErrorResponse alloc] initWithErrorCode:404];
+    }
+
+    VLCMediaList *mediaList = vpc.mediaList;
+    [mediaList lock];
+    NSUInteger mediaCount = mediaList.count;
+    NSMutableArray *retArray = [NSMutableArray array];
+    for (NSUInteger x = 0; x < mediaCount; x++) {
+        VLCMedia *media = [mediaList mediaAtIndex:x];
+        NSString *mediaTitle;
+        if (media.isParsed) {
+            mediaTitle = [media metadataForKey:VLCMetaInformationTitle];
+        } else {
+            mediaTitle = media.url.lastPathComponent;
+        }
+
+        NSDictionary *mediaDict = @{ @"id" : media.url.absoluteString,
+                                     @"title" : mediaTitle,
+                                     @"duration" : @(media.length.intValue) };
+        [retArray addObject:@{ @"media" : mediaDict }];
+    }
+    [mediaList unlock];
+
+    NSError *error;
+    NSData *returnData = [NSJSONSerialization dataWithJSONObject:retArray options:0 error:&error];
+    if (error != nil) {
+        APLog(@"JSON serialization failed %@", error);
+        return [[HTTPErrorResponse alloc] initWithErrorCode:500];
+    }
+
+    return [[HTTPDataResponse alloc] initWithData:returnData];
+}
+#endif
 
 - (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
 {
@@ -433,6 +526,13 @@
     if ([path hasPrefix:@"/thumbnail"]) {
         return [self _httpGETThumbnailForPath:path];
     }
+#else
+    if ([path hasPrefix:@"/playing"]) {
+        return [self _HTTPGETPlaying];
+    }
+    if ([path hasPrefix:@"/playlist"]) {
+        return [self _HTTPGETPlaylist];
+    }
 #endif
 
     NSString *filePath = [self filePathForURI:path];