Commit 9c077418 authored by Pierre SAGASPE's avatar Pierre SAGASPE Committed by Felix Paul Kühne

LocalServer: Add "VLC for ios" Media server for stream or download (exchange...

LocalServer: Add "VLC for ios" Media server for stream or download (exchange of media between idevice)
Signed-off-by: Felix Paul Kühne's avatarFelix Paul Kühne <fkuehne@videolan.org>
parent 0c204f91
......@@ -19,6 +19,8 @@
#import "VLCLocalNetworkListCell.h"
#import "VLCLocalServerFolderListViewController.h"
#import "VLCLocalPlexFolderListViewController.h"
#import "VLCSharedLibraryListViewController.h"
#import "VLCSharedLibraryParser.h"
#import <QuartzCore/QuartzCore.h>
#import "GHRevealViewController.h"
#import "VLCNetworkLoginViewController.h"
......@@ -51,6 +53,8 @@
VLCNetworkLoginViewController *_loginViewController;
VLCSharedLibraryParser *_httpParser;
UIRefreshControl *_refreshControl;
UIActivityIndicatorView *_activityIndicator;
Reachability *_reachability;
......@@ -179,6 +183,7 @@
self.uploadController = [[VLCHTTPUploaderController alloc] init];
_myHostName = [self.uploadController hostname];
_httpParser = [[VLCSharedLibraryParser alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachabilityChanged:) name:kReachabilityChangedNotification object:nil];
}
......@@ -396,7 +401,8 @@
NSString *name = [_httpServicesInfo[row] objectForKey:@"name"];
NSString *hostName = [_httpServicesInfo[row] objectForKey:@"hostName"];
NSString *portNum = [_httpServicesInfo[row] objectForKey:@"port"];
APLog(@"Hello I'm a http Server, my name is %@ my adress is %@%@", name, hostName, portNum);
VLCSharedLibraryListViewController *targetViewController = [[VLCSharedLibraryListViewController alloc] initWithHttpServer:name serverAddress:hostName portNumber:portNum];
[[self navigationController] pushViewController:targetViewController animated:YES];
} else if (section == 4) {
VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate openMovieFromURL:[[_sapDiscoverer.discoveredMedia mediaAtIndex:row] url]];
......@@ -534,14 +540,16 @@
}
} else if ([aNetService.type isEqualToString:@"_http._tcp."]) {
if ([[aNetService hostName] rangeOfString:_myHostName].location == NSNotFound) {
if (![_httpServices containsObject:aNetService]) {
[_httpServices addObject:aNetService];
NSMutableDictionary *_dictService = [[NSMutableDictionary alloc] init];
[_dictService setObject:[aNetService name] forKey:@"name"];
[_dictService setObject:[aNetService hostName] forKey:@"hostName"];
NSString *portStr = [[NSString alloc] initWithFormat:@":%ld", (long)[aNetService port]];
[_dictService setObject:portStr forKey:@"port"];
[_httpServicesInfo addObject:_dictService];
if ([_httpParser isVLCMediaServer:[aNetService hostName] port:[NSString stringWithFormat:@":%ld", (long)[aNetService port]]]) {
if (![_httpServices containsObject:aNetService]) {
[_httpServices addObject:aNetService];
NSMutableDictionary *_dictService = [[NSMutableDictionary alloc] init];
[_dictService setObject:[aNetService name] forKey:@"name"];
[_dictService setObject:[aNetService hostName] forKey:@"hostName"];
NSString *portStr = [[NSString alloc] initWithFormat:@":%ld", (long)[aNetService port]];
[_dictService setObject:portStr forKey:@"port"];
[_httpServicesInfo addObject:_dictService];
}
}
}
}
......
/*****************************************************************************
* VLCSharedLibraryListViewController.h
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
* Pierre SAGASPE <pierre.sagaspe # me.com>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
#import <UIKit/UIKit.h>
@interface VLCSharedLibraryListViewController : UIViewController
@property (nonatomic, strong) UITableView *tableView;
- (id)initWithHttpServer:(NSString *)serverName serverAddress:(NSString *)serverAddress portNumber:(NSString *)portNumber;
@end
/*****************************************************************************
* VLCSharedLibraryListViewController.m
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
*
* Authors: Felix Paul Kühne <fkuehne # videolan.org>
* Pierre SAGASPE <pierre.sagaspe # me.com>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
#import "VLCSharedLibraryListViewController.h"
#import "VLCSharedLibraryParser.h"
#import "VLCLocalNetworkListCell.h"
#import "VLCAppDelegate.h"
#import "VLCPlaylistViewController.h"
#import "UINavigationController+Theme.h"
#import "VLCDownloadViewController.h"
#import "NSString+SupportedMedia.h"
#import "VLCStatusLabel.h"
#import "VLCAlertView.h"
#import "UIDevice+VLC.h"
@interface VLCSharedLibraryListViewController () <UITableViewDataSource, UITableViewDelegate, VLCLocalNetworkListCell, UISearchBarDelegate, UISearchDisplayDelegate>
{
NSMutableArray *_mutableObjectList;
NSCache *_imageCache;
NSString *_httpServerName;
NSString *_httpServerAddress;
NSString *_httpServerPort;
VLCSharedLibraryParser *_httpParser;
NSMutableArray *_searchData;
UISearchBar *_searchBar;
UISearchDisplayController *_searchDisplayController;
UIRefreshControl *_refreshControl;
UIBarButtonItem *_menuButton;
}
@end
@implementation VLCSharedLibraryListViewController
- (void)loadView
{
_tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
_tableView.backgroundColor = [UIColor VLCDarkBackgroundColor];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.rowHeight = [VLCLocalNetworkListCell heightOfCell];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.view = _tableView;
}
- (id)initWithHttpServer:(NSString *)serverName serverAddress:(NSString *)serverAddress portNumber:(NSString *)portNumber
{
self = [super init];
if (self) {
_httpServerName = serverName;
_httpServerAddress = serverAddress;
_httpServerPort = portNumber;
_mutableObjectList = [[NSMutableArray alloc] init];
_imageCache = [[NSCache alloc] init];
[_imageCache setCountLimit:50];
_httpParser = [[VLCSharedLibraryParser alloc] init];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[_mutableObjectList removeAllObjects];
_mutableObjectList = [_httpParser VLCLibraryServerParser:_httpServerAddress port:_httpServerPort];
self.tableView.separatorColor = [UIColor VLCDarkBackgroundColor];
self.view.backgroundColor = [UIColor VLCDarkBackgroundColor];
NSString *titleValue;
if (_mutableObjectList.count == 0)
titleValue = _httpServerAddress;
else
titleValue = [_mutableObjectList[0] objectForKey:@"libTitle"];
self.title = titleValue;
_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
UINavigationBar *navBar = self.navigationController.navigationBar;
if (SYSTEM_RUNS_IOS7_OR_LATER)
_searchBar.barTintColor = navBar.barTintColor;
_searchBar.tintColor = navBar.tintColor;
_searchBar.translucent = navBar.translucent;
_searchBar.opaque = navBar.opaque;
_searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
_searchDisplayController.delegate = self;
_searchDisplayController.searchResultsDataSource = self;
_searchDisplayController.searchResultsDelegate = self;
if (SYSTEM_RUNS_IOS7_OR_LATER)
_searchDisplayController.searchBar.searchBarStyle = UIBarStyleBlack;
_searchDisplayController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_searchDisplayController.searchResultsTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
_searchBar.delegate = self;
_searchBar.hidden = YES;
UITapGestureRecognizer *tapTwiceGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTwiceGestureAction:)];
[tapTwiceGesture setNumberOfTapsRequired:2];
[self.navigationController.navigationBar addGestureRecognizer:tapTwiceGesture];
// Active le Pull down to refresh
_refreshControl = [[UIRefreshControl alloc] init];
_refreshControl.backgroundColor = [UIColor VLCDarkBackgroundColor];
_refreshControl.tintColor = [UIColor whiteColor];
// Call the refresh function
[_refreshControl addTarget:self action:@selector(handleRefresh) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:_refreshControl];
_searchData = [[NSMutableArray alloc] init];
[_searchData removeAllObjects];
}
- (BOOL)shouldAutorotate
{
UIInterfaceOrientation toInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
return NO;
return YES;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView)
return _searchData.count;
else
return _mutableObjectList.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"libraryVLCCellDetail";
VLCLocalNetworkListCell *cell = (VLCLocalNetworkListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [VLCLocalNetworkListCell cellWithReuseIdentifier:CellIdentifier];
NSMutableArray *ObjList = [[NSMutableArray alloc] init];
[ObjList removeAllObjects];
if (tableView == self.searchDisplayController.searchResultsTableView)
[ObjList addObjectsFromArray:_searchData];
else
[ObjList addObjectsFromArray:_mutableObjectList];
[cell setTitle:[[ObjList objectAtIndex:indexPath.row] objectForKey:@"title"]];
[cell setIcon:[UIImage imageNamed:@"blank"]];
NSString *thumbPath = [[ObjList objectAtIndex:indexPath.row] objectForKey:@"thumb"];
if (thumbPath) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(queue, ^{
UIImage *img = [self getCachedImage:thumbPath];
dispatch_async(dispatch_get_main_queue(), ^{
if (!img)
[cell setIcon:[UIImage imageNamed:@"blank"]];
else
[cell setIcon:img];
});
});
}
NSInteger size = [[[ObjList objectAtIndex:indexPath.row] objectForKey:@"size"] integerValue];
NSString *mediaSize = [NSByteCountFormatter stringFromByteCount:size countStyle:NSByteCountFormatterCountStyleFile];
NSString *duration = [[ObjList objectAtIndex:indexPath.row] objectForKey:@"duration"];
[cell setIsDirectory:NO];
[cell setSubtitle:[NSString stringWithFormat:@"%@ (%@)", mediaSize, duration]];
[cell setIsDownloadable:YES];
[cell setDelegate:self];
return cell;
}
- (UIImage *)getCachedImage:(NSString *)url
{
UIImage *image = [_imageCache objectForKey:url];
if ((image != nil) && [image isKindOfClass:[UIImage class]]) {
return image;
} else {
NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
if (imageData) {
image = [[UIImage alloc] initWithData:imageData];
[_imageCache setObject:image forKey:url];
}
return image;
}
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(VLCLocalNetworkListCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIColor *color = (indexPath.row % 2 == 0)? [UIColor blackColor]: [UIColor VLCDarkBackgroundColor];
cell.contentView.backgroundColor = cell.titleLabel.backgroundColor = cell.folderTitleLabel.backgroundColor = cell.subtitleLabel.backgroundColor = color;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSMutableArray *ObjList = [[NSMutableArray alloc] init];
[ObjList removeAllObjects];
if (tableView == self.searchDisplayController.searchResultsTableView)
[ObjList addObjectsFromArray:_searchData];
else
[ObjList addObjectsFromArray:_mutableObjectList];
NSURL *itemURL = [NSURL URLWithString:[[ObjList objectAtIndex:indexPath.row] objectForKey:@"pathfile"]];
if (itemURL) {
VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate openMovieWithExternalSubtitleFromURL:itemURL externalSubURL:nil];
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
#pragma mark - Specifics
- (void)_downloadFileFromMediaItem:(NSURL *)itemURL
{
if (![[itemURL absoluteString] isSupportedFormat]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"FILE_NOT_SUPPORTED", nil) message:[NSString stringWithFormat:NSLocalizedString(@"FILE_NOT_SUPPORTED_LONG", nil), [itemURL absoluteString]] delegate:self cancelButtonTitle:NSLocalizedString(@"BUTTON_CANCEL", nil) otherButtonTitles:nil];
[alert show];
} else if (itemURL) {
[[(VLCAppDelegate *)[UIApplication sharedApplication].delegate downloadViewController] addURLToDownloadList:itemURL fileNameOfMedia:nil];
}
}
- (void)reloadSharedLibrary
{
[_mutableObjectList removeAllObjects];
_mutableObjectList = [_httpParser VLCLibraryServerParser:_httpServerAddress port:_httpServerPort];
[self.tableView reloadData];
}
#pragma mark - VLCLocalNetworkListCell delegation
- (void)triggerDownloadForCell:(VLCLocalNetworkListCell *)cell
{
NSMutableArray *ObjList = [[NSMutableArray alloc] init];
[ObjList removeAllObjects];
if ([self.searchDisplayController isActive])
[ObjList addObject:_searchData[[self.searchDisplayController.searchResultsTableView indexPathForCell:cell].row]];
else
[ObjList addObject:_mutableObjectList[[self.tableView indexPathForCell:cell].row]];
NSURL *itemURL = [NSURL URLWithString:[ObjList[0] objectForKey:@"pathfile"]];
NSInteger size = [[[ObjList objectAtIndex:0] objectForKey:@"size"] integerValue];
if (size < [[UIDevice currentDevice] freeDiskspace].longLongValue) {
[self _downloadFileFromMediaItem:itemURL];
[cell.statusLabel showStatusMessage:NSLocalizedString(@"DOWNLOADING", nil)];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"DISK_FULL", nil) message:[NSString stringWithFormat:NSLocalizedString(@"DISK_FULL_FORMAT", nil), [[ObjList objectAtIndex:0] objectForKey:@"title"], [[UIDevice currentDevice] model]] delegate:self cancelButtonTitle:NSLocalizedString(@"BUTTON_OK", nil) otherButtonTitles:nil];
[alert show];
}
}
#pragma mark - Search Display Controller Delegate
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[_searchData removeAllObjects];
for (int i = 0; i < [_mutableObjectList count]; i++) {
NSRange nameRange;
nameRange = [[[_mutableObjectList objectAtIndex:i] objectForKey:@"title"] rangeOfString:searchString options:NSCaseInsensitiveSearch];
if (nameRange.location != NSNotFound)
[_searchData addObject:_mutableObjectList[i]];
}
return YES;
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
tableView.rowHeight = 80.0f;
else
tableView.rowHeight = 68.0f;
tableView.backgroundColor = [UIColor blackColor];
}
#pragma mark - Refresh
-(void)handleRefresh
{
//set the title while refreshing
_refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:NSLocalizedString(@"LOCAL_SERVER_REFRESH", nil)];
//set the date and time of refreshing
NSDateFormatter *formattedDate = [[NSDateFormatter alloc]init];
[formattedDate setDateFormat:@"MMM d, h:mm a"];
NSString *lastupdated = [NSString stringWithFormat:NSLocalizedString(@"LOCAL_SERVER_LAST_UPDATE", nil),[formattedDate stringFromDate:[NSDate date]]];
NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
_refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:lastupdated attributes:attrsDictionary];
//end the refreshing
[_refreshControl endRefreshing];
[self performSelector:@selector(reloadSharedLibrary) withObject:nil];
}
#pragma mark - Gesture Action
- (void)tapTwiceGestureAction:(UIGestureRecognizer *)recognizer
{
_searchBar.hidden = !_searchBar.hidden;
if (_searchBar.hidden)
self.tableView.tableHeaderView = nil;
else
self.tableView.tableHeaderView = _searchBar;
[self.tableView setContentOffset:CGPointMake(0.0f, -self.tableView.contentInset.top) animated:NO];
}
@end
/*****************************************************************************
* VLCSharedLibraryParser.h
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
*
* Authors: Pierre Sagaspe <pierre.sagaspe # me.com>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
#import <UIKit/UIKit.h>
@interface VLCSharedLibraryParser : NSObject
- (NSMutableArray *)VLCLibraryServerParser:(NSString *)adress port:(NSString *)port;
- (BOOL)isVLCMediaServer:(NSString *)adress port:(NSString *)port;
@end
/*****************************************************************************
* VLCSharedLibraryParser.m
* VLC for iOS
*****************************************************************************
* Copyright (c) 2015 VideoLAN. All rights reserved.
*
* Authors: Pierre Sagaspe <pierre.sagaspe # me.com>
*
* Refer to the COPYING file of the official project for license.
*****************************************************************************/
#import "VLCSharedLibraryParser.h"
#define kLibraryXmlFile @"libMediaVLC.xml"
@interface VLCSharedLibraryParser () <NSXMLParserDelegate>
{
NSMutableArray *_containerInfo;
NSMutableDictionary *_dicoInfo;
NSString *_libraryServerUrl;
}
@end
@implementation VLCSharedLibraryParser
- (NSMutableArray *)VLCLibraryServerParser:(NSString *)adress port:(NSString *)port
{
_containerInfo = [[NSMutableArray alloc] init];
[_containerInfo removeAllObjects];
_dicoInfo = [[NSMutableDictionary alloc] init];
_libraryServerUrl = [NSString stringWithFormat:@"http://%@%@", adress, port];
NSString *mediaServerUrl = [NSString stringWithFormat:@"%@/%@", _libraryServerUrl, kLibraryXmlFile];
NSURL *url = [[NSURL alloc] initWithString:mediaServerUrl];
NSXMLParser *xmlparser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[xmlparser setDelegate:self];
if (![xmlparser parse])
APLog(@"VLC Library Parser url Errors : %@", url);
return _containerInfo;
}
- (BOOL)isVLCMediaServer:(NSString *)adress port:(NSString *)port
{
NSMutableArray *mutableObjectList = [[NSMutableArray alloc] init];
mutableObjectList = [self VLCLibraryServerParser:adress port:port];
NSString *identifier = [[mutableObjectList objectAtIndex:0] objectForKey:@"identifier"];
if ([identifier isEqualToString:@"org.videolan.vlc-ios"])
return YES;
return NO;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"MediaContainer"]) {
if ([attributeDict objectForKey:@"size"])
[_dicoInfo setObject:[attributeDict objectForKey:@"size"] forKey:@"size"];
if ([attributeDict objectForKey:@"identifier"])
[_dicoInfo setObject:[attributeDict objectForKey:@"identifier"] forKey:@"identifier"];
if ([attributeDict objectForKey:@"libraryTitle"])
[_dicoInfo setObject:[attributeDict objectForKey:@"libraryTitle"] forKey:@"libTitle"];
} else if([elementName isEqualToString:@"Media"]) {
if([attributeDict objectForKey:@"title"])
[_dicoInfo setObject:[attributeDict objectForKey:@"title"] forKey:@"title"];
if([attributeDict objectForKey:@"thumb"])
[_dicoInfo setObject:[attributeDict objectForKey:@"thumb"] forKey:@"thumb"];
if([attributeDict objectForKey:@"duration"])
[_dicoInfo setObject:[attributeDict objectForKey:@"duration"] forKey:@"duration"];
if([attributeDict objectForKey:@"size"])
[_dicoInfo setObject:[attributeDict objectForKey:@"size"] forKey:@"size"];
if([attributeDict objectForKey:@"pathfile"])
[_dicoInfo setObject:[attributeDict objectForKey:@"pathfile"] forKey:@"pathfile"];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if(([elementName isEqualToString:@"Media"] || [elementName isEqualToString:@"MediaContainer"]) && [_dicoInfo count] > 0) {
[_containerInfo addObject:_dicoInfo];
_dicoInfo = [[NSMutableDictionary alloc] init];
}
}
@end
......@@ -15,6 +15,8 @@
260B41E11A75006300DA89C9 /* OneDriveWhite@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 260B41DB1A75006300DA89C9 /* OneDriveWhite@3x.png */; };
265D511C1922746C00E38383 /* VLCLocalPlexFolderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 265D51191922746C00E38383 /* VLCLocalPlexFolderListViewController.m */; };
265D511D1922746C00E38383 /* VLCPlexParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 265D511B1922746C00E38383 /* VLCPlexParser.m */; };
26D4AF8D1A78379000D5EC65 /* VLCSharedLibraryListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 26D4AF8A1A78379000D5EC65 /* VLCSharedLibraryListViewController.m */; };
26D4AF8E1A78379000D5EC65 /* VLCSharedLibraryParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 26D4AF8C1A78379000D5EC65 /* VLCSharedLibraryParser.m */; };
26F1BFD01A770408001DF30C /* libMediaVLC.xml in Resources */ = {isa = PBXBuildFile; fileRef = 26F1BFCF1A770408001DF30C /* libMediaVLC.xml */; };
26FAE63919240C2E00A43737 /* PlexServerIcon@1x.png in Resources */ = {isa = PBXBuildFile; fileRef = 26FAE63619240C2E00A43737 /* PlexServerIcon@1x.png */; };
26FAE63A19240C2E00A43737 /* PlexServerIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 26FAE63719240C2E00A43737 /* PlexServerIcon@2x.png */; };
......@@ -511,6 +513,10 @@
265D51191922746C00E38383 /* VLCLocalPlexFolderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLocalPlexFolderListViewController.m; path = Sources/VLCLocalPlexFolderListViewController.m; sourceTree = SOURCE_ROOT; };
265D511A1922746C00E38383 /* VLCPlexParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCPlexParser.h; path = Sources/VLCPlexParser.h; sourceTree = SOURCE_ROOT; };
265D511B1922746C00E38383 /* VLCPlexParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCPlexParser.m; path = Sources/VLCPlexParser.m; sourceTree = SOURCE_ROOT; };
26D4AF891A78379000D5EC65 /* VLCSharedLibraryListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCSharedLibraryListViewController.h; path = Sources/VLCSharedLibraryListViewController.h; sourceTree = SOURCE_ROOT; };
26D4AF8A1A78379000D5EC65 /* VLCSharedLibraryListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCSharedLibraryListViewController.m; path = Sources/VLCSharedLibraryListViewController.m; sourceTree = SOURCE_ROOT; };
26D4AF8B1A78379000D5EC65 /* VLCSharedLibraryParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCSharedLibraryParser.h; path = Sources/VLCSharedLibraryParser.h; sourceTree = SOURCE_ROOT; };
26D4AF8C1A78379000D5EC65 /* VLCSharedLibraryParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCSharedLibraryParser.m; path = Sources/VLCSharedLibraryParser.m; sourceTree = SOURCE_ROOT; };
26F1BFCF1A770408001DF30C /* libMediaVLC.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = libMediaVLC.xml; sourceTree = "<group>"; };
26FAE63619240C2E00A43737 /* PlexServerIcon@1x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PlexServerIcon@1x.png"; sourceTree = "<group>"; };
26FAE63719240C2E00A43737 /* PlexServerIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "PlexServerIcon@2x.png"; sourceTree = "<group>"; };
......@@ -1789,12 +1795,16 @@
children = (
265D511A1922746C00E38383 /* VLCPlexParser.h */,
265D511B1922746C00E38383 /* VLCPlexParser.m */,
26D4AF8B1A78379000D5EC65 /* VLCSharedLibraryParser.h */,
26D4AF8C1A78379000D5EC65 /* VLCSharedLibraryParser.m */,
7D30F3D1183AB2F100FFC021 /* VLCLocalNetworkListCell.h */,
7D30F3D2183AB2F100FFC021 /* VLCLocalNetworkListCell.m */,
7D30F3D3183AB2F100FFC021 /* VLCLocalServerFolderListViewController.h */,
7D30F3D4183AB2F100FFC021 /* VLCLocalServerFolderListViewController.m */,
265D51181922746C00E38383 /* VLCLocalPlexFolderListViewController.h */,
265D51191922746C00E38383 /* VLCLocalPlexFolderListViewController.m */,
26D4AF891A78379000D5EC65 /* VLCSharedLibraryListViewController.h */,
26D4AF8A1A78379000D5EC65 /* VLCSharedLibraryListViewController.m */,
7D30F3D5183AB2F100FFC021 /* VLCLocalServerListViewController.h */,
7D30F3D6183AB2F100FFC021 /* VLCLocalServerListViewController.m */,
7D30F3DA183AB2F900FFC021 /* VLCNetworkLoginViewController.h */,
......@@ -3209,6 +3219,7 @@
2915542417490A9C00B86CAD /* DDAbstractDatabaseLogger.m in Sources */,
2915542517490A9C00B86CAD /* DDASLLogger.m in Sources */,
2915542617490A9C00B86CAD /* DDFileLogger.m in Sources */,
26D4AF8D1A78379000D5EC65 /* VLCSharedLibraryListViewController.m in Sources */,
2915542717490A9C00B86CAD /* DDLog.m in Sources */,
2915542817490A9C00B86CAD /* DDTTYLogger.m in Sources */,
2915542917490A9C00B86CAD /* ContextFilterLogFormatter.m in Sources */,
......@@ -3268,6 +3279,7 @@
7D5CAA8C1A4AD8E5003F2CBC /* VLCTrackSelectorHeaderView.m in Sources */,
4171D35018A2C19000A16EF9 /* VLCFolderCollectionViewFlowLayout.m in Sources */,
7D30F3CA183AB27A00FFC021 /* VLCDownloadViewController.m in Sources */,
26D4AF8E1A78379000D5EC65 /* VLCSharedLibraryParser.m in Sources */,
7D30F3CD183AB29300FFC021 /* VLCMenuTableViewController.m in Sources */,
7D9CB9DC1A4C55EF00BB74B4 /* VLCPlaybackNavigationController.m in Sources */,
7D30F3D0183AB2AC00FFC021 /* VLCMediaFileDiscoverer.m in Sources */,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment