VLCNetworkServerBrowserVLCMedia.m 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*****************************************************************************
  2. * VLCNetworkServerBrowserVLCMedia.m
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2015 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Tobias Conradi <videolan # tobias-conradi.de>
  9. *
  10. * Refer to the COPYING file of the official project for license.
  11. *****************************************************************************/
  12. #import "VLCNetworkServerBrowserVLCMedia.h"
  13. @interface VLCNetworkServerBrowserVLCMedia () <VLCMediaListDelegate>
  14. @property (nonatomic) VLCMedia *rootMedia;
  15. @property (nonatomic) VLCMediaList *mediaList;
  16. @property (nonatomic) NSMutableArray<id<VLCNetworkServerBrowserItem>> *mutableItems;
  17. @end
  18. @implementation VLCNetworkServerBrowserVLCMedia
  19. @synthesize delegate = _delegate;
  20. - (instancetype)initWithMedia:(VLCMedia *)media
  21. {
  22. self = [super init];
  23. if (self) {
  24. _mutableItems = [[NSMutableArray alloc] init];
  25. _rootMedia = media;
  26. [media parseWithOptions:VLCMediaParseNetwork];
  27. _mediaList = [_rootMedia subitems];
  28. _mediaList.delegate = self;
  29. }
  30. return self;
  31. }
  32. - (void)update {
  33. [self.rootMedia parseWithOptions:VLCMediaParseNetwork];
  34. }
  35. - (NSString *)title {
  36. return [self.rootMedia metadataForKey:VLCMetaInformationTitle];
  37. }
  38. - (NSArray<id<VLCNetworkServerBrowserItem>> *)items {
  39. return self.mutableItems.copy;
  40. }
  41. #pragma mark - media list delegate
  42. - (void)mediaList:(VLCMediaList *)aMediaList mediaAdded:(VLCMedia *)media atIndex:(NSInteger)index
  43. {
  44. [media parseWithOptions:VLCMediaParseNetwork];
  45. [self.mutableItems addObject:[[VLCNetworkServerBrowserItemVLCMedia alloc] initWithMedia:media]];
  46. [self.delegate networkServerBrowserDidUpdate:self];
  47. }
  48. - (void)mediaList:(VLCMediaList *)aMediaList mediaRemovedAtIndex:(NSInteger)index {
  49. [self.mutableItems removeObjectAtIndex:index];
  50. [self.delegate networkServerBrowserDidUpdate:self];
  51. }
  52. @end
  53. @interface VLCNetworkServerBrowserItemVLCMedia ()
  54. @property (nonatomic, readonly) VLCMedia *media;
  55. @end
  56. @implementation VLCNetworkServerBrowserItemVLCMedia
  57. @synthesize name = _name, container = _container, fileSizeBytes = _fileSizeBytes, URL = _URL;
  58. - (instancetype)initWithMedia:(VLCMedia *)media
  59. {
  60. self = [super init];
  61. if (self) {
  62. _media = media;
  63. _container = media.mediaType == VLCMediaTypeDirectory;
  64. NSString *title = [media metadataForKey:VLCMetaInformationTitle];
  65. if (!title) {
  66. title = media.url.lastPathComponent;
  67. }
  68. if (!title) {
  69. title = media.url.absoluteString;
  70. }
  71. _name = title;
  72. _URL = media.url;
  73. // _downloadable = NO; //TODO: add property for downloadable?
  74. }
  75. return self;
  76. }
  77. - (id<VLCNetworkServerBrowser>)containerBrowser {
  78. return [[VLCNetworkServerBrowserVLCMedia alloc] initWithMedia:self.media];
  79. }
  80. @end
  81. @implementation VLCNetworkServerBrowserVLCMedia (SMB)
  82. + (instancetype)SMBNetworkServerBrowserWithURL:(NSURL *)url username:(NSString *)username password:(NSString *)password workgroup:(NSString *)workgroup {
  83. VLCMedia *media = [VLCMedia mediaWithURL:url];
  84. NSDictionary *mediaOptions = @{@"smb-user" : username ?: @"",
  85. @"smb-pwd" : password ?: @"",
  86. @"smb-domain" : workgroup?: @"WORKGROUP"};
  87. [media addOptions:mediaOptions];
  88. return [[self alloc] initWithMedia:media];
  89. }
  90. @end