|
@@ -18,18 +18,17 @@
|
|
|
#import "VLCStatusLabel.h"
|
|
|
#import "VLCPlaybackController.h"
|
|
|
#import "VLCDownloadViewController.h"
|
|
|
-#import "UIDevice+VLC.h"
|
|
|
-#import "NSString+SupportedMedia.h"
|
|
|
-#import "UIDevice+VLC.h"
|
|
|
+
|
|
|
|
|
|
#import "VLCNetworkServerBrowser-Protocol.h"
|
|
|
+#import "VLCServerBrowsingController.h"
|
|
|
|
|
|
@interface VLCNetworkServerBrowserViewController () <VLCNetworkServerBrowserDelegate,VLCNetworkListCellDelegate, UITableViewDataSource, UITableViewDelegate, UIActionSheetDelegate>
|
|
|
{
|
|
|
UIRefreshControl *_refreshControl;
|
|
|
}
|
|
|
@property (nonatomic) id<VLCNetworkServerBrowser> serverBrowser;
|
|
|
-@property (nonatomic) NSByteCountFormatter *byteCounterFormatter;
|
|
|
+@property (nonatomic) VLCServerBrowsingController *browsingController;
|
|
|
@property (nonatomic) NSArray<id<VLCNetworkServerBrowserItem>> *searchArray;
|
|
|
@end
|
|
|
|
|
@@ -41,6 +40,8 @@
|
|
|
if (self) {
|
|
|
_serverBrowser = browser;
|
|
|
browser.delegate = self;
|
|
|
+ _browsingController = [[VLCServerBrowsingController alloc] init];
|
|
|
+ _browsingController.allowsFileDownload = YES;
|
|
|
}
|
|
|
return self;
|
|
|
}
|
|
@@ -93,44 +94,9 @@
|
|
|
[self update];
|
|
|
}
|
|
|
|
|
|
-#pragma mark -
|
|
|
-- (NSByteCountFormatter *)byteCounterFormatter {
|
|
|
- if (!_byteCounterFormatter) {
|
|
|
- _byteCounterFormatter = [[NSByteCountFormatter alloc] init];
|
|
|
- }
|
|
|
- return _byteCounterFormatter;
|
|
|
-}
|
|
|
|
|
|
#pragma mark - server browser item specifics
|
|
|
|
|
|
-- (void)_downloadItem:(id<VLCNetworkServerBrowserItem>)item
|
|
|
-{
|
|
|
- NSString *filename = item.name;
|
|
|
- if (filename.pathExtension.length == 0) {
|
|
|
- /* there are few crappy UPnP servers who don't reveal the correct file extension, so we use a generic fake (#11123) */
|
|
|
- NSString *urlExtension = item.URL.pathExtension;
|
|
|
- NSString *extension = urlExtension.length != 0 ? urlExtension : @"vlc";
|
|
|
- filename = [filename stringByAppendingPathExtension:extension];
|
|
|
- }
|
|
|
- [[VLCDownloadViewController sharedInstance] addURLToDownloadList:item.URL
|
|
|
- fileNameOfMedia:filename];
|
|
|
-}
|
|
|
-
|
|
|
-- (BOOL)triggerDownloadForItem:(id<VLCNetworkServerBrowserItem>)item
|
|
|
-{
|
|
|
- if (item.fileSizeBytes.longLongValue < [[UIDevice currentDevice] freeDiskspace].longLongValue) {
|
|
|
- [self _downloadItem:item];
|
|
|
- return YES;
|
|
|
- } else {
|
|
|
- NSString *title = NSLocalizedString(@"DISK_FULL", nil);
|
|
|
- NSString *messsage = [NSString stringWithFormat:NSLocalizedString(@"DISK_FULL_FORMAT", nil), item.name, [[UIDevice currentDevice] model]];
|
|
|
- NSString *button = NSLocalizedString(@"BUTTON_OK", nil);
|
|
|
- [self vlc_showAlertWithTitle:title message:messsage buttonTitle:button];
|
|
|
- return NO;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
|
|
|
- (void)didSelectItem:(id<VLCNetworkServerBrowserItem>)item index:(NSUInteger)index singlePlayback:(BOOL)singlePlayback
|
|
|
{
|
|
@@ -139,117 +105,16 @@
|
|
|
[self.navigationController pushViewController:targetViewController animated:YES];
|
|
|
} else {
|
|
|
if (singlePlayback) {
|
|
|
- [self _streamFileForItem:item];
|
|
|
+ [self.browsingController streamFileForItem:item];
|
|
|
} else {
|
|
|
VLCMediaList *mediaList = self.serverBrowser.mediaList;
|
|
|
- [self configureSubtitlesInMediaList:mediaList];
|
|
|
- [self _streamMediaList:mediaList startingAtIndex:index];
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-- (void)configureSubtitlesInMediaList:(VLCMediaList *)mediaList {
|
|
|
- NSArray *items = self.serverBrowser.items;
|
|
|
- id<VLCNetworkServerBrowserItem> loopItem;
|
|
|
- [mediaList lock];
|
|
|
- NSUInteger count = mediaList.count;
|
|
|
- for (NSUInteger i = 0; i < count; i++) {
|
|
|
- loopItem = items[i];
|
|
|
- NSString *URLofSubtitle = nil;
|
|
|
- NSURL *remoteSubtitleURL = nil;
|
|
|
- if ([loopItem respondsToSelector:@selector(subtitleURL)]) {
|
|
|
- [loopItem subtitleURL];
|
|
|
- }
|
|
|
- if (remoteSubtitleURL == nil) {
|
|
|
- NSArray *subtitlesList = [self _searchSubtitle:loopItem.URL.lastPathComponent];
|
|
|
- remoteSubtitleURL = subtitlesList.firstObject;
|
|
|
- }
|
|
|
-
|
|
|
- if(remoteSubtitleURL != nil) {
|
|
|
- URLofSubtitle = [self _getFileSubtitleFromServer:remoteSubtitleURL];
|
|
|
- if (URLofSubtitle != nil)
|
|
|
- [[mediaList mediaAtIndex:i] addOptions:@{ kVLCSettingSubtitlesFilePath : URLofSubtitle }];
|
|
|
+ [self.browsingController configureSubtitlesInMediaList:mediaList];
|
|
|
+ [self.browsingController streamMediaList:mediaList startingAtIndex:index];
|
|
|
}
|
|
|
}
|
|
|
- [mediaList unlock];
|
|
|
}
|
|
|
|
|
|
|
|
|
-- (NSString *)_getFileSubtitleFromServer:(NSURL *)subtitleURL
|
|
|
-{
|
|
|
- NSString *FileSubtitlePath = nil;
|
|
|
- NSData *receivedSub = [NSData dataWithContentsOfURL:subtitleURL]; // TODO: fix synchronous load
|
|
|
-
|
|
|
- if (receivedSub.length < [[UIDevice currentDevice] freeDiskspace].longLongValue) {
|
|
|
- NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
|
|
|
- NSString *directoryPath = searchPaths[0];
|
|
|
- FileSubtitlePath = [directoryPath stringByAppendingPathComponent:[subtitleURL lastPathComponent]];
|
|
|
-
|
|
|
- NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
|
- if (![fileManager fileExistsAtPath:FileSubtitlePath]) {
|
|
|
- //create local subtitle file
|
|
|
- [fileManager createFileAtPath:FileSubtitlePath contents:nil attributes:nil];
|
|
|
- if (![fileManager fileExistsAtPath:FileSubtitlePath]) {
|
|
|
- APLog(@"file creation failed, no data was saved");
|
|
|
- return nil;
|
|
|
- }
|
|
|
- }
|
|
|
- [receivedSub writeToFile:FileSubtitlePath atomically:YES];
|
|
|
- } else {
|
|
|
-
|
|
|
- [self vlc_showAlertWithTitle:NSLocalizedString(@"DISK_FULL", nil)
|
|
|
- message:[NSString stringWithFormat:NSLocalizedString(@"DISK_FULL_FORMAT", nil), [subtitleURL lastPathComponent], [[UIDevice currentDevice] model]]
|
|
|
- buttonTitle:NSLocalizedString(@"BUTTON_OK", nil)];
|
|
|
- }
|
|
|
-
|
|
|
- return FileSubtitlePath;
|
|
|
-}
|
|
|
-
|
|
|
-- (void)_streamMediaList:(VLCMediaList *)mediaList startingAtIndex:(NSInteger)startIndex
|
|
|
-{
|
|
|
- VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
|
|
|
- [vpc playMediaList:mediaList firstIndex:startIndex];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)_streamFileForItem:(id<VLCNetworkServerBrowserItem>)item
|
|
|
-{
|
|
|
- NSString *URLofSubtitle = nil;
|
|
|
- NSURL *remoteSubtitleURL = nil;
|
|
|
- if ([item respondsToSelector:@selector(subtitleURL)]) {
|
|
|
- remoteSubtitleURL = [item subtitleURL];
|
|
|
- }
|
|
|
- if (!remoteSubtitleURL) {
|
|
|
- NSArray *SubtitlesList = [self _searchSubtitle:item.URL.lastPathComponent];
|
|
|
- remoteSubtitleURL = SubtitlesList.firstObject;
|
|
|
- }
|
|
|
-
|
|
|
- if(remoteSubtitleURL)
|
|
|
- URLofSubtitle = [self _getFileSubtitleFromServer:remoteSubtitleURL];
|
|
|
-
|
|
|
- NSURL *URLToPlay = item.URL;
|
|
|
-
|
|
|
- VLCPlaybackController *vpc = [VLCPlaybackController sharedInstance];
|
|
|
- [vpc playURL:URLToPlay subtitlesFilePath:URLofSubtitle];
|
|
|
-}
|
|
|
-
|
|
|
-- (NSArray<NSURL*> *)_searchSubtitle:(NSString *)url
|
|
|
-{
|
|
|
- NSString *urlTemp = [[url lastPathComponent] stringByDeletingPathExtension];
|
|
|
-
|
|
|
- NSMutableArray<NSURL*> *urls = [NSMutableArray arrayWithArray:[self.serverBrowser.items valueForKey:@"URL"]];
|
|
|
-
|
|
|
- NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"SELF.path contains[c] %@", urlTemp];
|
|
|
- [urls filterUsingPredicate:namePredicate];
|
|
|
-
|
|
|
- NSPredicate *formatPrediate = [NSPredicate predicateWithBlock:^BOOL(NSURL *_Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
|
|
- return [evaluatedObject.path isSupportedSubtitleFormat];
|
|
|
- }];
|
|
|
- [urls filterUsingPredicate:formatPrediate];
|
|
|
-
|
|
|
- return [NSArray arrayWithArray:urls];
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
#pragma mark - table view data source, for more see super
|
|
|
|
|
@@ -275,43 +140,9 @@
|
|
|
item = self.serverBrowser.items[indexPath.row];
|
|
|
}
|
|
|
|
|
|
- cell.title = item.name;
|
|
|
-
|
|
|
- if (item.isContainer) {
|
|
|
- cell.isDirectory = YES;
|
|
|
- cell.icon = [UIImage imageNamed:@"folder"];
|
|
|
- } else {
|
|
|
- cell.isDirectory = NO;
|
|
|
- cell.icon = [UIImage imageNamed:@"blank"];
|
|
|
-
|
|
|
- NSString *sizeString = item.fileSizeBytes ? [self.byteCounterFormatter stringFromByteCount:item.fileSizeBytes.longLongValue] : nil;
|
|
|
-
|
|
|
- NSString *duration = nil;
|
|
|
- if ([item respondsToSelector:@selector(duration)]) {
|
|
|
- duration = item.duration;
|
|
|
- }
|
|
|
-
|
|
|
- NSString *subtitle = nil;
|
|
|
- if (sizeString && duration) {
|
|
|
- subtitle = [NSString stringWithFormat:@"%@ (%@)",sizeString, duration];
|
|
|
- } else if (sizeString) {
|
|
|
- subtitle = sizeString;
|
|
|
- } else if (duration) {
|
|
|
- subtitle = duration;
|
|
|
- }
|
|
|
- cell.subtitle = sizeString;
|
|
|
- cell.isDownloadable = YES;
|
|
|
- cell.delegate = self;
|
|
|
+ [self.browsingController configureCell:cell withItem:item];
|
|
|
|
|
|
- NSURL *thumbnailURL = nil;
|
|
|
- if ([item respondsToSelector:@selector(thumbnailURL)]) {
|
|
|
- thumbnailURL = item.thumbnailURL;
|
|
|
- }
|
|
|
-
|
|
|
- if (thumbnailURL) {
|
|
|
- [cell setIconURL:thumbnailURL];
|
|
|
- }
|
|
|
- }
|
|
|
+ cell.delegate = self;
|
|
|
|
|
|
return cell;
|
|
|
}
|
|
@@ -344,7 +175,6 @@
|
|
|
[tableView deselectRowAtIndexPath:indexPath animated:NO];
|
|
|
}
|
|
|
|
|
|
-
|
|
|
#pragma mark - VLCNetworkListCell delegation
|
|
|
- (void)triggerDownloadForCell:(VLCNetworkListCell *)cell
|
|
|
{
|
|
@@ -354,7 +184,7 @@
|
|
|
else
|
|
|
item = self.serverBrowser.items[[self.tableView indexPathForCell:cell].row];
|
|
|
|
|
|
- if ([self triggerDownloadForItem:item]) {
|
|
|
+ if ([self.browsingController triggerDownloadForItem:item]) {
|
|
|
[cell.statusLabel showStatusMessage:NSLocalizedString(@"DOWNLOADING", nil)];
|
|
|
}
|
|
|
}
|