MacGui: convert the last usage of NSDictionary to a proper class, fix external subtit...
authorDamiano Galassi <damiog@gmail.com>
Tue, 13 Aug 2019 08:27:05 +0000 (10:27 +0200)
committerDamiano Galassi <damiog@gmail.com>
Tue, 13 Aug 2019 08:27:05 +0000 (10:27 +0200)
18 files changed:
macosx/HBAudio.h
macosx/HBAudio.m
macosx/HBAudioTrack.h
macosx/HBAudioTrack.m
macosx/HBJob+HBJobConversion.m
macosx/HBJob+UIAdditions.m
macosx/HBJob.m
macosx/HBRemoteCore.m
macosx/HBSecurityAccessToken.h
macosx/HBSubtitles.h
macosx/HBSubtitles.m
macosx/HBSubtitlesTrack.h
macosx/HBSubtitlesTrack.m
macosx/HBTitle+Private.h
macosx/HBTitle.h
macosx/HBTitle.m
macosx/HandBrakeXPCService/HandBrakeXPCService.entitlements
macosx/HandBrakeXPCService/HandBrakeXPCService.m

index d2bee2dc233870c079130ca10d4ceb4beac01479..2c643cda30cc9ba3d3d7fea726b7ebae755ab135 100644 (file)
@@ -8,6 +8,7 @@
 #import "HBPresetCoding.h"
 
 @class HBAudioTrack;
+@class HBTitleAudioTrack;
 @class HBAudioDefaults;
 
 NS_ASSUME_NONNULL_BEGIN
@@ -16,7 +17,7 @@ extern NSString *HBAudioEncoderChangedNotification;
 
 @interface HBAudio : NSObject <NSSecureCoding, NSCopying>
 
-@property (nonatomic, readonly) NSArray<NSDictionary *> *sourceTracks;
+@property (nonatomic, readonly) NSArray<HBTitleAudioTrack *> *sourceTracks;
 @property (nonatomic, readonly) NSMutableArray<HBAudioTrack *> *tracks;
 
 @property (nonatomic, readwrite) HBAudioDefaults *defaults;
index 093d70dff00c3f281b199ac7cc6bf62b611b15e2..f6427b8db0dc04e62d5b8527a45a7ba865b55c97 100644 (file)
@@ -44,8 +44,8 @@ NSString *HBAudioEncoderChangedNotification = @"HBAudioEncoderChangedNotificatio
         _defaults = [[HBAudioDefaults alloc] init];
 
         // Add the none and foreign track to the source array
-        NSMutableArray *sourceTracks = [job.title.audioTracks mutableCopy];
-        NSDictionary *none = @{keyAudioTrackName: HBKitLocalizedString(@"None", @"HBAudio -> none track name")};
+        NSMutableArray<HBTitleAudioTrack *> *sourceTracks = [job.title.audioTracks mutableCopy];
+        HBTitleAudioTrack *none = [[HBTitleAudioTrack alloc] initWithDisplayName:HBKitLocalizedString(@"None", @"HBAudio -> none track name")];
         [sourceTracks insertObject:none atIndex:0];
         _sourceTracks = [sourceTracks copy];
     }
@@ -54,18 +54,18 @@ NSString *HBAudioEncoderChangedNotification = @"HBAudioEncoderChangedNotificatio
 
 #pragma mark - Data Source
 
-- (NSDictionary<NSString *, id> *)sourceTrackAtIndex:(NSUInteger)idx
+- (HBTitleAudioTrack *)sourceTrackAtIndex:(NSUInteger)idx
 {
     return self.sourceTracks[idx];
 }
 
 - (NSArray<NSString *> *)sourceTracksArray
 {
-    NSMutableArray *sourceNames = [NSMutableArray array];
+    NSMutableArray<NSString *> *sourceNames = [NSMutableArray array];
 
-    for (NSDictionary *track in self.sourceTracks)
+    for (HBTitleAudioTrack *track in self.sourceTracks)
     {
-        [sourceNames addObject:track[keyAudioTrackName]];
+        [sourceNames addObject:track.displayName];
     }
 
     return sourceNames;
@@ -278,7 +278,7 @@ NSString *HBAudioEncoderChangedNotification = @"HBAudioEncoderChangedNotificatio
     self = [super init];
 
     decodeInt(_container); if (_container != HB_MUX_MP4 && _container != HB_MUX_MKV && _container != HB_MUX_WEBM) { goto fail; }
-    decodeCollectionOfObjects3(_sourceTracks, NSArray, NSDictionary, NSString, NSNumber);
+    decodeCollectionOfObjects(_sourceTracks, NSArray, HBTitleAudioTrack);
     decodeCollectionOfObjects(_tracks, NSMutableArray, HBAudioTrack);
 
     for (HBAudioTrack *track in _tracks)
index b0a5e0bea28697e0847a81f6a85bc9756322fabe..678c138eb23dbfa227a792321815d4889f076173 100644 (file)
@@ -7,23 +7,12 @@
 #import <Foundation/Foundation.h>
 
 @class HBAudioTrack;
+@class HBTitleAudioTrack;
 
 NS_ASSUME_NONNULL_BEGIN
 
-/**
- *  Audio track dicts keys.
- */
-extern NSString *keyAudioTrackIndex;
-extern NSString *keyAudioTrackName;
-extern NSString *keyAudioInputBitrate;
-extern NSString *keyAudioInputSampleRate;
-extern NSString *keyAudioInputCodec;
-extern NSString *keyAudioInputCodecParam;
-extern NSString *keyAudioInputChannelLayout;
-extern NSString *keyAudioTrackLanguageIsoCode;
-
 @protocol HBAudioTrackDataSource <NSObject>
-- (NSDictionary<NSString *, id> *)sourceTrackAtIndex:(NSUInteger)idx;
+- (HBTitleAudioTrack *)sourceTrackAtIndex:(NSUInteger)idx;
 - (NSArray<NSString *> *)sourceTracksArray;
 @end
 
@@ -57,6 +46,8 @@ extern NSString *keyAudioTrackLanguageIsoCode;
 @property (nonatomic, readwrite) double gain;
 @property (nonatomic, readwrite) double drc;
 
+@property (nonatomic, readwrite, nullable) NSString *title;
+
 @property (nonatomic, readonly, getter=isEnabled) BOOL enabled;
 
 /**
index c854d7fdc028fe403a996aac3d645dd5219aacf3..c3cc22c3e43b7d4e342f70387505097823f060c7 100644 (file)
@@ -8,17 +8,9 @@
 #import "HBAudioController.h"
 #import "HBJob.h"
 #import "HBCodingUtilities.h"
+#import "HBTitle.h"
 #import "hb.h"
 
-NSString *keyAudioTrackIndex = @"keyAudioTrackIndex";
-NSString *keyAudioTrackName = @"keyAudioTrackName";
-NSString *keyAudioInputBitrate = @"keyAudioInputBitrate";
-NSString *keyAudioInputSampleRate = @"keyAudioInputSampleRate";
-NSString *keyAudioInputCodec = @"keyAudioInputCodec";
-NSString *keyAudioInputCodecParam = @"keyAudioInputCodecParam";
-NSString *keyAudioInputChannelLayout = @"keyAudioInputChannelLayout";
-NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
-
 #define DEFAULT_SAMPLERATE 48000
 
 @interface HBAudioTrack ()
@@ -230,8 +222,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 {
     if (proposedEncoder)
     {
-        NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
-        int inputCodec = [sourceTrack[keyAudioInputCodec] intValue];
+        HBTitleAudioTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+        int inputCodec = sourceTrack.codec;
 
         hb_encoder_t *proposedEncoderInfo = hb_audio_encoder_get_from_codec(proposedEncoder);
 
@@ -261,8 +253,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 
 - (int)sanatizeMixdownValue:(int)proposedMixdown
 {
-    NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
-    unsigned long long channelLayout = [sourceTrack[keyAudioInputChannelLayout] unsignedLongLongValue];
+    HBTitleAudioTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+    uint64_t channelLayout = sourceTrack.channelLayout;
 
     if (!hb_mixdown_is_supported(proposedMixdown, self.encoder, channelLayout))
     {
@@ -308,8 +300,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 {
     NSMutableArray<NSString *> *encoders = [[NSMutableArray alloc] init];
 
-    NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
-    int inputCodec = [sourceTrack[keyAudioInputCodec] intValue];
+    HBTitleAudioTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+    int inputCodec = sourceTrack.codec;
 
     for (const hb_encoder_t *audio_encoder = hb_audio_encoder_get_next(NULL);
          audio_encoder != NULL;
@@ -339,8 +331,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 {
     NSMutableArray<NSString *> *mixdowns = [[NSMutableArray alloc] init];
 
-    NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
-    unsigned long long channelLayout = [sourceTrack[keyAudioInputChannelLayout] unsignedLongLongValue];
+    HBTitleAudioTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+    uint64_t channelLayout = sourceTrack.channelLayout;
 
     for (const hb_mixdown_t *mixdown = hb_mixdown_get_next(NULL);
          mixdown != NULL;
@@ -438,10 +430,10 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 
     if (retval)
     {
-        NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+        HBTitleAudioTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
 
-        int inputCodec = [sourceTrack[keyAudioInputCodec] intValue];
-        int inputCodecParam = [sourceTrack[keyAudioInputCodecParam] intValue];
+        int inputCodec = sourceTrack.codec;
+        int inputCodecParam = sourceTrack.codecParam;
         if (!hb_audio_can_apply_drc(inputCodec, inputCodecParam, self.encoder))
         {
             retval = NO;
@@ -539,7 +531,7 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 
 - (void)encodeWithCoder:(NSCoder *)coder
 {
-    [coder encodeInt:3 forKey:@"HBAudioTrackVersion"];
+    [coder encodeInt:4 forKey:@"HBAudioTrackVersion"];
 
     encodeInteger(_sourceTrackIdx);
     encodeInt(_container);
@@ -551,6 +543,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
 
     encodeDouble(_gain);
     encodeDouble(_drc);
+
+    encodeObject(_title);
 }
 
 - (instancetype)initWithCoder:(NSCoder *)decoder
@@ -568,6 +562,8 @@ NSString *keyAudioTrackLanguageIsoCode = @"keyAudioTrackLanguageIsoCode";
     decodeDouble(_gain);
     decodeDouble(_drc);
 
+    decodeObject(_title, NSString);
+
     return self;
 
 fail:
index d8417d3382c13492b1957f31fc644f7b9e433745..a58e1333bfdc33487037d8fbee0fa617ca5c7874 100644 (file)
             hb_audio_config_t *audio = (hb_audio_config_t *)calloc(1, sizeof(*audio));
             hb_audio_config_init(audio);
 
-            NSDictionary *inputTrack = self.audio.sourceTracks[audioTrack.sourceTrackIdx];
+            HBTitleAudioTrack *inputTrack = self.audio.sourceTracks[audioTrack.sourceTrackIdx];
 
             int sampleRateToUse = (audioTrack.sampleRate == 0 ?
-                                   [inputTrack[keyAudioInputSampleRate] intValue] :
+                                   inputTrack.sampleRate :
                                    audioTrack.sampleRate);
 
             audio->in.track = (int)audioTrack.sourceTrackIdx - 1;
                 audio->out.gain = 0;
             }
 
-            if (hb_audio_can_apply_drc([inputTrack[keyAudioInputCodec] intValue],
-                                       [inputTrack[keyAudioInputCodecParam] intValue],
+            if (hb_audio_can_apply_drc(inputTrack.codec,
+                                       inputTrack.codecParam,
                                        audioTrack.encoder))
             {
                 audio->out.dynamic_range_compression = audioTrack.drc;
index 061d5fb6c30c76244f144eb796a0f1062d9dd73e..fdfddee6a5a5654ec8aa05f2ad418f01c865f302 100644 (file)
@@ -536,7 +536,7 @@ static NSDictionary            *shortHeightAttr;
         if (audioTrack.isEnabled)
         {
             NSMutableString *detailString = [NSMutableString stringWithFormat:HBKitLocalizedString(@"%@ ▸ Encoder: %@", @"Audio description"),
-                                      self.audio.sourceTracks[audioTrack.sourceTrackIdx][keyAudioTrackName],
+                                      self.audio.sourceTracks[audioTrack.sourceTrackIdx].displayName,
                                       @(hb_audio_encoder_get_name(audioTrack.encoder))];
 
             if ((audioTrack.encoder  & HB_ACODEC_PASS_FLAG) == 0)
@@ -594,7 +594,7 @@ static NSDictionary            *shortHeightAttr;
             NSMutableString *detailString = [NSMutableString string];
 
             // remember that index 0 of Subtitles can contain "Foreign Audio Search
-            [detailString appendString:self.subtitles.sourceTracks[track.sourceTrackIdx][@"keySubTrackName"]];
+            [detailString appendString:self.subtitles.sourceTracks[track.sourceTrackIdx].displayName];
 
             if (track.forcedOnly)
             {
@@ -790,7 +790,7 @@ static NSDictionary            *shortHeightAttr;
         if (track.isEnabled)
         {
             // remember that index 0 of Subtitles can contain "Foreign Audio Search
-            [info appendString:self.subtitles.sourceTracks[track.sourceTrackIdx][@"keySubTrackName"]];
+            [info appendString:self.subtitles.sourceTracks[track.sourceTrackIdx].displayName];
 
             if (track.burnedIn)
             {
index d3b4de8b886b48f61426de01f4b28ea31a4ef313..ad32a0895ce01bf78f10f8001e7f30b110ce4a73 100644 (file)
@@ -371,7 +371,7 @@ NSString *HBChaptersChangedNotification  = @"HBChaptersChangedNotification";
 
 - (void)encodeWithCoder:(NSCoder *)coder
 {
-    [coder encodeInt:4 forKey:@"HBJobVersion"];
+    [coder encodeInt:5 forKey:@"HBJobVersion"];
 
     encodeObject(_name);
     encodeObject(_presetName);
@@ -424,7 +424,7 @@ NSString *HBChaptersChangedNotification  = @"HBChaptersChangedNotification";
 {
     int version = [decoder decodeIntForKey:@"HBJobVersion"];
 
-    if (version == 4 && (self = [super init]))
+    if (version == 5 && (self = [super init]))
     {
         decodeObjectOrFail(_name, NSString);
         decodeObjectOrFail(_presetName, NSString);
index 243845fafd4b0f177186dcea6527a9aa71fb63b5..ff03a4ddd4a7d2dbcd23f2a54e3b0cc68f3d41a5 100644 (file)
 
 - (void)scanURL:(NSURL *)url titleIndex:(NSUInteger)index previews:(NSUInteger)previewsNum minDuration:(NSUInteger)seconds progressHandler:(nonnull HBCoreProgressHandler)progressHandler completionHandler:(nonnull HBCoreCompletionHandler)completionHandler
 {
+
 #ifdef __SANDBOX_ENABLED__
+    __block HBSecurityAccessToken *token = [HBSecurityAccessToken tokenWithObject:url];
+
     NSData *bookmark = [url bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
-    [_proxy provideResourceAccessWithBookmarks:@[bookmark]];
+    if (bookmark)
+    {
+        [_proxy provideResourceAccessWithBookmarks:@[bookmark]];
+    }
 #endif
 
     self.progressHandler = progressHandler;
             HBCoreCompletionHandler handler = weakSelf.completionHandler;
             weakSelf.completionHandler = nil;
             weakSelf.progressHandler = nil;
+#ifdef __SANDBOX_ENABLED__
+            token = nil;
+#endif
             handler(result);
         });
     }];
 - (void)encodeJob:(HBJob *)job progressHandler:(HBCoreProgressHandler)progressHandler completionHandler:(HBCoreCompletionHandler)completionHandler
 {
 #ifdef __SANDBOX_ENABLED__
+    __block HBSecurityAccessToken *token = [HBSecurityAccessToken tokenWithObject:job];
+
+    NSMutableArray<NSData *> *bookmarks = [NSMutableArray array];
+
+    for (HBSubtitlesTrack *track in job.subtitles.tracks)
+    {
+        if (track.fileURL)
+        {
+            NSData *subtitlesBookmark = [track.fileURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
+            if (subtitlesBookmark)
+            {
+                [bookmarks addObject:subtitlesBookmark];
+            }
+        }
+    }
+
     NSData *bookmark = [job.outputURL bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
-    [_proxy provideResourceAccessWithBookmarks:@[bookmark]];
+    if (bookmark)
+    {
+        [bookmarks addObject:bookmark];
+    }
+
+    [_proxy provideResourceAccessWithBookmarks:bookmarks];
+
 #endif
 
     self.progressHandler = progressHandler;
             HBCoreCompletionHandler handler = weakSelf.completionHandler;
             weakSelf.completionHandler = nil;
             weakSelf.progressHandler = nil;
+#ifdef __SANDBOX_ENABLED__
+            token = nil;
+#endif
             handler(result);
         });
     }];
index 10fccc1fcb484f91c56fa8f8e0e56556faa5a1d3..f19f40143822909d9c3deca1867f1a96d8d7f875 100644 (file)
@@ -5,6 +5,7 @@
  It may be used under the terms of the GNU General Public License. */
 
 #import <Foundation/Foundation.h>
+#import "HBJob.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -21,10 +22,9 @@ NS_ASSUME_NONNULL_BEGIN
 @end
 
 @interface NSURL (HBSecurityScope) <HBSecurityScope>
+@end
 
-- (BOOL)startAccessingSecurityScopedResource;
-- (void)stopAccessingSecurityScopedResource;
-
+@interface HBJob (HBSecurityScope) <HBSecurityScope>
 @end
 
 @interface HBSecurityAccessToken : NSObject
index 03e75e2b4dd7feb2feaed00515b2e102f0237c06..6be256b366323e028689ab576171c91f0984487f 100644 (file)
@@ -10,6 +10,7 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @class HBSubtitlesTrack;
+@class HBTitleSubtitlesTrack;
 @class HBSubtitlesDefaults;
 
 @interface HBSubtitles : NSObject <NSSecureCoding, NSCopying>
@@ -20,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)addExternalTrackFromURL:(NSURL *)fileURL;
 
-@property (nonatomic, readonly) NSArray<NSDictionary *> *sourceTracks;
+@property (nonatomic, readonly) NSArray<HBTitleSubtitlesTrack *> *sourceTracks;
 @property (nonatomic, readonly) NSMutableArray<HBSubtitlesTrack *> *tracks;
 
 @property (nonatomic, readwrite, strong) HBSubtitlesDefaults *defaults;
index 4856035605d5b0328953faeeeffe61cc34d8c0db..017fbea24ec61877aab52b8d6bc8a39f1304c5e3 100644 (file)
 
 #include "common.h"
 
-extern NSString *keySubTrackName;
-extern NSString *keySubTrackLanguageIsoCode;
-extern NSString *keySubTrackType;
-
-extern NSString *keySubTrackExternalFileURL;
-extern NSString *keySubTrackExternalFileURLBookmark;
-
 #define NONE_TRACK_INDEX        0
 #define FOREIGN_TRACK_INDEX     1
 
 @interface HBSubtitles () <HBTrackDataSource, HBTrackDelegate>
 
-@property (nonatomic, readwrite) NSArray<NSDictionary *> *sourceTracks;
+@property (nonatomic, readwrite) NSArray<HBTitleSubtitlesTrack *> *sourceTracks;
 
 @property (nonatomic, readonly) NSMutableArray<HBSecurityAccessToken *> *tokens;
 @property (nonatomic, readwrite) NSInteger *accessCount;
@@ -59,7 +52,7 @@ extern NSString *keySubTrackExternalFileURLBookmark;
         _defaults = [[HBSubtitlesDefaults alloc] init];
         _tokens = [NSMutableArray array];
 
-        NSMutableArray *sourceTracks = [job.title.subtitlesTracks mutableCopy];
+        NSMutableArray<HBTitleSubtitlesTrack *> *sourceTracks = [job.title.subtitlesTracks mutableCopy];
 
         int foreignAudioType = VOBSUB;
 
@@ -67,11 +60,10 @@ extern NSString *keySubTrackExternalFileURLBookmark;
         NSMutableString *foreignAudioSearchTrackName = [HBKitLocalizedString(@"Foreign Audio Search", "HBSubtitles -> search pass name") mutableCopy];
 
         // Add the none and foreign track to the source array
-        NSDictionary *none = @{ keySubTrackName: HBKitLocalizedString(@"None", @"HBSubtitles -> none track name")};
+        HBTitleSubtitlesTrack *none = [[HBTitleSubtitlesTrack alloc] initWithDisplayName:HBKitLocalizedString(@"None", @"HBSubtitles -> none track name") type:0 fileURL:nil];
         [sourceTracks insertObject:none atIndex:0];
 
-        NSDictionary *foreign = @{ keySubTrackName: [foreignAudioSearchTrackName copy],
-                                   keySubTrackType: @(foreignAudioType) };
+        HBTitleSubtitlesTrack *foreign = [[HBTitleSubtitlesTrack alloc] initWithDisplayName:foreignAudioSearchTrackName type:foreignAudioType fileURL:nil];
         [sourceTracks insertObject:foreign atIndex:1];
 
         _sourceTracks = [sourceTracks copy];
@@ -82,18 +74,18 @@ extern NSString *keySubTrackExternalFileURLBookmark;
 
 #pragma mark - Data Source
 
-- (NSDictionary<NSString *, id> *)sourceTrackAtIndex:(NSUInteger)idx
+- (HBTitleSubtitlesTrack *)sourceTrackAtIndex:(NSUInteger)idx
 {
     return self.sourceTracks[idx];
 }
 
 - (NSArray<NSString *> *)sourceTracksArray
 {
-    NSMutableArray *sourceNames = [NSMutableArray array];
+    NSMutableArray<NSString *> *sourceNames = [NSMutableArray array];
 
-    for (NSDictionary *track in self.sourceTracks)
+    for (HBTitleSubtitlesTrack *track in self.sourceTracks)
     {
-        [sourceNames addObject:track[keySubTrackName]];
+        [sourceNames addObject:track.displayName];
     }
 
     return sourceNames;
@@ -204,26 +196,11 @@ extern NSString *keySubTrackExternalFileURLBookmark;
 {
     int type = [fileURL.pathExtension.lowercaseString isEqualToString:@"srt"] ? IMPORTSRT : IMPORTSSA;
 
-#ifdef __SANDBOX_ENABLED__
-    // Create the security scoped bookmark
-    NSData *bookmark = [HBUtilities bookmarkFromURL:fileURL
-                                    options:NSURLBookmarkCreationWithSecurityScope |
-                                            NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess];
-#endif
-
     // Create a new entry for the subtitle source array so it shows up in our subtitle source list
-    NSMutableArray *sourceTrack = [self.sourceTracks mutableCopy];
-#ifdef __SANDBOX_ENABLED__
-    [sourceTrack addObject:@{keySubTrackName: fileURL.lastPathComponent,
-                             keySubTrackType: @(type),
-                             keySubTrackExternalFileURL: fileURL,
-                             keySubTrackExternalFileURLBookmark: bookmark}];
-#else
-    [sourceTrack addObject:@{keySubTrackName: fileURL.lastPathComponent,
-                             keySubTrackType: @(type),
-                             keySubTrackExternalFileURL: fileURL}];
-#endif
-    self.sourceTracks = [sourceTrack copy];
+    NSMutableArray<HBTitleSubtitlesTrack *> *sourceTracks = [self.sourceTracks mutableCopy];
+    [sourceTracks addObject:[[HBTitleSubtitlesTrack alloc] initWithDisplayName:fileURL.lastPathComponent type:type fileURL:fileURL]];
+
+    self.sourceTracks = [sourceTracks copy];
     HBSubtitlesTrack *track = [self trackFromSourceTrackIndex:self.sourceTracksArray.count - 1];
     [self insertObject:track inTracksAtIndex:[self countOfTracks] - 1];
 }
@@ -404,11 +381,11 @@ extern NSString *keySubTrackExternalFileURLBookmark;
 #ifdef __SANDBOX_ENABLED__
     if (self.accessCount == 0)
     {
-        for (NSDictionary *sourceTrack in self.sourceTracks)
+        for (HBTitleSubtitlesTrack *sourceTrack in self.sourceTracks)
         {
-            if (sourceTrack[keySubTrackExternalFileURLBookmark])
+            if (sourceTrack.fileURL)
             {
-                [self.tokens addObject:[HBSecurityAccessToken tokenWithObject:sourceTrack[keySubTrackExternalFileURL]]];
+                [self.tokens addObject:[HBSecurityAccessToken tokenWithObject:sourceTrack.fileURL]];
             }
         }
     }
@@ -481,36 +458,10 @@ extern NSString *keySubTrackExternalFileURLBookmark;
 {
     self = [super init];
 
-#ifdef __SANDBOX_ENABLED__
-    NSMutableArray *sourceTracks = [NSMutableArray array];
-#endif
-
     _tokens = [NSMutableArray array];
 
     decodeInt(_container); if (_container != HB_MUX_MP4 && _container != HB_MUX_MKV && _container != HB_MUX_WEBM) { goto fail; }
-    decodeCollectionOfObjects5(_sourceTracks, NSArray, NSDictionary, NSURL, NSData, NSString, NSNumber);
-
-#ifdef __SANDBOX_ENABLED__
-    for (NSDictionary *sourceTrack in _sourceTracks)
-    {
-        if (sourceTrack[keySubTrackExternalFileURLBookmark])
-        {
-            NSMutableDictionary<NSString *, id> *copy =  [sourceTrack mutableCopy];
-            NSURL *srtURL = [HBUtilities URLFromBookmark:sourceTrack[keySubTrackExternalFileURLBookmark]];
-            if (srtURL)
-            {
-                copy[keySubTrackExternalFileURL] = srtURL;
-            }
-            [sourceTracks addObject:copy];
-        }
-        else
-        {
-            [sourceTracks addObject:sourceTrack];
-        }
-    }
-    _sourceTracks = [sourceTracks copy];
-#endif
-
+    decodeCollectionOfObjects(_sourceTracks, NSArray, HBTitleSubtitlesTrack);
     decodeCollectionOfObjects(_tracks, NSMutableArray, HBSubtitlesTrack);
 
     for (HBSubtitlesTrack *track in _tracks)
index 099cd6808e2a809fcfcda45275dc423a15c335eb..0461b282e02ffcaee0115d789602855100c88b6f 100644 (file)
@@ -8,13 +8,14 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+@class HBTitleSubtitlesTrack;
 @class HBSubtitlesTrack;
 
 /**
  *  HBTrackDataSource
  */
 @protocol HBTrackDataSource <NSObject>
-- (NSDictionary<NSString *, id> *)sourceTrackAtIndex:(NSUInteger)idx;
+- (HBTitleSubtitlesTrack *)sourceTrackAtIndex:(NSUInteger)idx;
 - (NSArray<NSString *> *)sourceTracksArray;
 @end
 
@@ -50,6 +51,9 @@ NS_ASSUME_NONNULL_BEGIN
 /// Whether is the default track.
 @property (nonatomic, readwrite) BOOL def;
 
+@property (nonatomic, readwrite, nullable) NSString *title;
+
+
 /// The URL of the external subtitles file.
 @property (nonatomic, readwrite, copy, nullable) NSURL *fileURL;
 /// The ISO 639/2 language code of the external subtitles file.
index 795aa68c5a061cece7d41cd24825b679ad53708a..27d1d0b1dab1329852c0175f6e42ef2ed010b7cc 100644 (file)
@@ -6,6 +6,7 @@
 
 #import "HBSubtitlesTrack.h"
 #import "HBCodingUtilities.h"
+#import "HBTitle.h"
 
 #include "common.h"
 #include "lang.h"
 static NSArray *charEncodingArray = nil;
 static NSArray *_languagesArray = nil;
 
-NSString *keySubTrackName = @"keySubTrackName";
-NSString *keySubTrackLanguageIsoCode = @"keySubTrackLanguageIsoCode";
-NSString *keySubTrackType = @"keySubTrackType";
-NSString *keySubTrackExternalFileURL = @"keySubTrackSrtFileURL";
-NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
-
 @interface HBSubtitlesTrack ()
 @property (nonatomic, readwrite) BOOL validating;
 @end
@@ -71,8 +66,8 @@ NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
 
 - (void)validateSettings
 {
-    NSDictionary *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
-    self.type = [sourceTrack[keySubTrackType] intValue];
+    HBTitleSubtitlesTrack *sourceTrack = [_dataSource sourceTrackAtIndex:_sourceTrackIdx];
+    self.type = sourceTrack.type;
 
     if (!hb_subtitle_can_burn(_type))
     {
@@ -100,7 +95,7 @@ NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
     // check to see if we are an srt, in which case set our file path and source track type kvp's
     if (_type == IMPORTSRT || _type == IMPORTSSA)
     {
-        self.fileURL = [sourceTrack[keySubTrackExternalFileURL] copy];
+        self.fileURL = sourceTrack.fileURL;
         self.isoLanguage = @"eng";
         self.charCode = charEncodingArray[CHAR_CODE_DEFAULT_INDEX];
     }
@@ -350,7 +345,7 @@ NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
 
 - (void)encodeWithCoder:(NSCoder *)coder
 {
-    [coder encodeInt:1 forKey:@"HBSubtitlesTrackVersion"];
+    [coder encodeInt:2 forKey:@"HBSubtitlesTrackVersion"];
 
     encodeInteger(_sourceTrackIdx);
     encodeInt(_type);
@@ -359,6 +354,7 @@ NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
     encodeBool(_forcedOnly);
     encodeBool(_burnedIn);
     encodeBool(_def);
+    encodeObject(_title);
 
     encodeObject(_fileURL);
     encodeObject(_isoLanguage);
@@ -377,6 +373,7 @@ NSString *keySubTrackExternalFileURLBookmark = @"keySubTrackSrtFileURLBookmark";
     decodeBool(_forcedOnly);
     decodeBool(_burnedIn);
     decodeBool(_def);
+    decodeObject(_title, NSString);
 
     decodeObject(_fileURL, NSURL);
     decodeObject(_isoLanguage, NSString);
index 76aecdba4f0cfc215640d0ab3c0e064823976e0d..b55854e22bff6bd717515f18a01a2edda861778e 100644 (file)
@@ -1,13 +1,12 @@
-//
-//  HBTitlePrivate.h
-//  HandBrake
-//
-//  Created by Damiano Galassi on 30/05/15.
-//
-//
+/*  HBTitlePrivate.h $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
 
 #import <Foundation/Foundation.h>
 #import "HBTitle.h"
+#import "HBPreset.h"
 #include "hb.h"
 
 @interface HBTitle (Private)
index bf87c13851a91b302916b39f27289e06db3b1b34..cf6a25d9e69dad27f4a7a00f44642a477fd91a61 100644 (file)
@@ -9,7 +9,6 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @class HBChapter;
-@class HBPreset;
 
 @interface HBMetadata : NSObject
 
@@ -26,6 +25,37 @@ NS_ASSUME_NONNULL_BEGIN
 
 @end
 
+@interface HBTitleAudioTrack : NSObject<NSSecureCoding>
+
+- (instancetype)initWithDisplayName:(NSString *)displayName;
+
+@property (nonatomic, readonly) NSString *displayName;
+@property (nonatomic, readonly, nullable) NSString *title;
+
+@property (nonatomic, readonly) int bitRate;
+@property (nonatomic, readonly) int sampleRate;
+@property (nonatomic, readonly) int codec;
+@property (nonatomic, readonly) int codecParam;
+@property (nonatomic, readonly) uint64_t channelLayout;
+
+@property (nonatomic, readonly) NSString *isoLanguageCode;
+
+@end
+
+@interface HBTitleSubtitlesTrack : NSObject<NSSecureCoding>
+
+- (instancetype)initWithDisplayName:(NSString *)displayName type:(int)type fileURL:(nullable NSURL *)fileURL;
+
+@property (nonatomic, readonly) NSString *displayName;
+@property (nonatomic, readonly, nullable) NSString *title;
+
+@property (nonatomic, readonly) int type;
+@property (nonatomic, readonly) NSString *isoLanguageCode;
+
+@property (nonatomic, readonly, nullable) NSURL *fileURL;
+
+@end
+
 /**
  * HBTitles is an interface to the low-level hb_title_t.
  * the properties are lazy-loaded.
@@ -57,8 +87,8 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, readonly) int autoCropLeft;
 @property (nonatomic, readonly) int autoCropRight;
 
-@property (nonatomic, readonly) NSArray<NSDictionary<NSString *, id> *> *audioTracks;
-@property (nonatomic, readonly) NSArray<NSDictionary<NSString *, id> *> *subtitlesTracks;
+@property (nonatomic, readonly) NSArray<HBTitleAudioTrack *> *audioTracks;
+@property (nonatomic, readonly) NSArray<HBTitleSubtitlesTrack *> *subtitlesTracks;
 @property (nonatomic, readonly) NSArray<HBChapter *> *chapters;
 
 @property (nonatomic, readonly) HBMetadata *metadata;
index d060ef42773736ee60c9b933c982046853d78ee5..2012142276677cf7bcd95faf71c550047830bbe8 100644 (file)
 #import "HBPreset.h"
 #import "NSDictionary+HBAdditions.h"
 #import "HBLocalizationUtilities.h"
+#import "HBCodingUtilities.h"
+#import "HBSecurityAccessToken.h"
+#import "HBUtilities.h"
 
 #include "lang.h"
 
-extern NSString *keyAudioTrackIndex;
-extern NSString *keyAudioTrackName;
-extern NSString *keyAudioInputBitrate;
-extern NSString *keyAudioInputSampleRate;
-extern NSString *keyAudioInputCodec;
-extern NSString *keyAudioInputCodecParam;
-extern NSString *keyAudioInputChannelLayout;
-extern NSString *keyAudioTrackLanguageIsoCode;
-
-extern NSString *keySubTrackName;
-extern NSString *keySubTrackLanguageIsoCode;
-extern NSString *keySubTrackType;
-
 @interface HBMetadata ()
 
 @property (nonatomic, readonly) hb_metadata_t *hb_metadata;
@@ -55,6 +45,166 @@ extern NSString *keySubTrackType;
 
 @end
 
+@implementation HBTitleAudioTrack
+
+- (instancetype)initWithDisplayName:(NSString *)displayName
+{
+    self = [super init];
+    if (self)
+    {
+        _displayName = [displayName copy];
+        _title = @"";
+        _isoLanguageCode = @"";
+    }
+    return self;
+}
+
+- (instancetype)initWithAudioTrack:(hb_audio_config_t *)audio index:(int)index
+{
+    self = [super init];
+    if (self)
+    {
+        _displayName = [NSString stringWithFormat: @"%d: %@", index, @(audio->lang.description)];
+        _title = audio->in.name ? @(audio->in.name) : nil;
+        _bitRate = audio->in.bitrate / 1000;
+        _sampleRate = audio->in.samplerate;
+        _codec = audio->in.codec;
+        _codecParam = audio->in.codec_param;
+        _channelLayout = audio->in.channel_layout;
+
+        _isoLanguageCode = @(audio->lang.iso639_2);
+
+    }
+    return self;
+}
+
++ (BOOL)supportsSecureCoding { return YES; }
+
+- (void)encodeWithCoder:(nonnull NSCoder *)coder
+{
+    encodeObject(_displayName);
+    encodeObject(_title);
+    encodeInt(_bitRate);
+    encodeInt(_sampleRate);
+    encodeInt(_codec);
+    encodeInt(_codecParam);
+    encodeInteger(_channelLayout);
+
+    encodeObject(_isoLanguageCode);
+}
+
+- (nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder
+{
+    self = [super init];
+    if (self)
+    {
+        decodeObjectOrFail(_displayName, NSString);
+        decodeObject(_title, NSString);
+        decodeInt(_bitRate);
+        decodeInt(_sampleRate);
+        decodeInt(_codec);
+        decodeInt(_codecParam);
+        decodeInteger(_channelLayout);
+        decodeObjectOrFail(_isoLanguageCode, NSString);
+    }
+    return self;
+fail:
+    return nil;
+}
+
+@end
+
+
+@interface HBTitleSubtitlesTrack ()
+
+@property (nonatomic, readonly, nullable) NSData *bookmark;
+
+@end
+
+@implementation HBTitleSubtitlesTrack
+
+- (instancetype)initWithDisplayName:(NSString *)displayName type:(int)type fileURL:(nullable NSURL *)fileURL
+{
+    self = [super init];
+    if (self)
+    {
+        _displayName = [displayName copy];
+        _title = @"";
+        _type = type;
+        _isoLanguageCode = @"";
+        _fileURL = fileURL;
+    }
+    return self;
+}
+
+- (instancetype)initWithSubtitlesTrack:(hb_subtitle_t *)subtitle index:(int)index
+{
+    self = [super init];
+    if (self)
+    {
+        _displayName = [NSString stringWithFormat:@"%d: %@", index, @(subtitle->lang)];
+        _title = subtitle->name ? @(subtitle->name) : nil;
+        _type = subtitle->source;
+        _isoLanguageCode = @(subtitle->iso639_2);
+    }
+    return self;
+}
+
++ (BOOL)supportsSecureCoding { return YES ;}
+
+- (void)encodeWithCoder:(nonnull NSCoder *)coder
+{
+    encodeObject(_displayName);
+    encodeObject(_title);
+    encodeInt(_type);
+    encodeObject(_isoLanguageCode);
+#ifdef __SANDBOX_ENABLED__
+    if (_fileURL)
+    {
+        if (!_bookmark)
+        {
+            _bookmark = [HBUtilities bookmarkFromURL:_fileURL
+                                                options:NSURLBookmarkCreationWithSecurityScope | NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess];
+        }
+        encodeObject(_bookmark);
+    }
+#endif
+    encodeObject(_fileURL);
+}
+
+- (nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder
+{
+    self = [super init];
+    if (self)
+    {
+        decodeObjectOrFail(_displayName, NSString);
+        decodeObject(_title, NSString);
+        decodeInt(_type);
+        decodeObjectOrFail(_isoLanguageCode, NSString);
+
+#ifdef __SANDBOX_ENABLED__
+        decodeObject(_bookmark, NSData);
+
+        if (_bookmark)
+        {
+            _fileURL =  [HBUtilities URLFromBookmark:_bookmark];
+
+            if (!_fileURL)
+            {
+                decodeObjectOrFail(_fileURL, NSURL);
+            }
+        }
+#else
+        decodeObject(_fileURL, NSURL);
+#endif
+    }
+    return self;
+fail:
+    return nil;
+}
+
+@end
+
 @interface HBTitle ()
 
 @property (nonatomic, readonly) hb_title_t *hb_title;
@@ -62,8 +212,8 @@ extern NSString *keySubTrackType;
 @property (nonatomic, readwrite, copy) NSString *name;
 @property (nonatomic, readwrite) HBMetadata *metadata;
 @property (nonatomic, readwrite) NSArray *audioTracks;
-@property (nonatomic, readwrite) NSArray *subtitlesTracks;
-@property (nonatomic, readwrite) NSArray *chapters;
+@property (nonatomic, readwrite) NSArray<HBTitleSubtitlesTrack *> *subtitlesTracks;
+@property (nonatomic, readwrite) NSArray<HBChapter *> *chapters;
 
 @end
 
@@ -253,11 +403,11 @@ extern NSString *keySubTrackType;
 }
 
 
-- (NSArray *)audioTracks
+- (NSArray<HBTitleAudioTrack *> *)audioTracks
 {
     if (!_audioTracks)
     {
-        NSMutableArray *tracks = [NSMutableArray array];
+        NSMutableArray<HBTitleAudioTrack *> *tracks = [NSMutableArray array];
         hb_list_t *list = self.hb_title->list_audio;
         int count = hb_list_count(list);
 
@@ -265,14 +415,7 @@ extern NSString *keySubTrackType;
         for (int i = 0; i < count; i++)
         {
             hb_audio_config_t *audio = hb_list_audio_config_item(list, i);
-            [tracks addObject: @{keyAudioTrackIndex: @(i + 1),
-                                           keyAudioTrackName: [NSString stringWithFormat: @"%d: %@", i, @(audio->lang.description)],
-                                           keyAudioInputBitrate: @(audio->in.bitrate / 1000),
-                                           keyAudioInputSampleRate: @(audio->in.samplerate),
-                                           keyAudioInputCodec: @(audio->in.codec),
-                                           keyAudioInputCodecParam: @(audio->in.codec_param),
-                                           keyAudioInputChannelLayout: @(audio->in.channel_layout),
-                                           keyAudioTrackLanguageIsoCode: @(audio->lang.iso639_2)}];
+            [tracks addObject:[[HBTitleAudioTrack alloc ] initWithAudioTrack:audio index:i]];
         }
 
         _audioTracks = [tracks copy];
@@ -281,22 +424,18 @@ extern NSString *keySubTrackType;
     return _audioTracks;
 }
 
-- (NSArray *)subtitlesTracks
+- (NSArray<HBTitleSubtitlesTrack *> *)subtitlesTracks
 {
     if (!_subtitlesTracks)
     {
-        NSMutableArray *tracks = [NSMutableArray array];
+        NSMutableArray<HBTitleSubtitlesTrack *> *tracks = [NSMutableArray array];
         hb_list_t *list = self.hb_title->list_subtitle;
         int count = hb_list_count(list);
 
         for (int i = 0; i < count; i++)
         {
             hb_subtitle_t *subtitle = hb_list_item(self.hb_title->list_subtitle, i);
-
-            // create a dictionary of source subtitle information to store in our array
-            [tracks addObject:@{keySubTrackName: [NSString stringWithFormat:@"%d: %@", i, @(subtitle->lang)],
-                                              keySubTrackType: @(subtitle->source),
-                                              keySubTrackLanguageIsoCode: @(subtitle->iso639_2)}];
+            [tracks addObject:[[HBTitleSubtitlesTrack alloc] initWithSubtitlesTrack:subtitle index:i]];
         }
 
         _subtitlesTracks = [tracks copy];
index 6431476bac01644d8a541b0e3aeb2f38281511c9..e55cdca5215e307780566dbe11a2297abb489be2 100644 (file)
@@ -4,10 +4,6 @@
 <dict>
        <key>com.apple.security.app-sandbox</key>
        <true/>
-       <key>com.apple.security.temporary-exception.apple-events</key>
-       <array>
-               <string>com.apple.systemevents</string>
-       </array>
        <key>com.apple.security.temporary-exception.files.absolute-path.read-only</key>
        <array>
                <string>/usr/local/</string>
index 8bae398456844aa9e53f95fcc3e40351d9599b54..960f5b98a86f5e083c8b16d8aac18bf5ae1f69b7 100644 (file)
@@ -85,11 +85,16 @@ static void *HandBrakeXPCServiceContext = &HandBrakeXPCServiceContext;
 - (void)provideResourceAccessWithBookmarks:(NSArray<NSData *> *)bookmarks
 {
     dispatch_sync(_queue, ^{
+        NSMutableArray<NSURL *> *urls = [NSMutableArray array];
         for (NSData *bookmark in bookmarks)
         {
             NSURL *url = [NSURL URLByResolvingBookmarkData:bookmark options:0 relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];
-            self.urls = @[url];
+            if (url)
+            {
+                [urls addObject:url];
+            }
         }
+        self.urls = urls;
     });
 }