/* HBAutoNamer.m $ This file is part of the HandBrake source code. Homepage: . It may be used under the terms of the GNU General Public License. */ #import "HBAutoNamer.h" #import "HBJob.h" #import "HBJob+HBAdditions.h" #import "HBPreferencesKeys.h" static void *HBAutoNamerPrefsContext = &HBAutoNamerPrefsContext; static void *HBAutoNamerContext = &HBAutoNamerContext; @interface HBAutoNamer () @property (nonatomic) HBJob *job; @property (nonatomic) NSArray *format; @end @implementation HBAutoNamer - (instancetype)initWithJob:(HBJob *)job { self = [super init]; if (self) { _job = job; _format = [NSUserDefaults.standardUserDefaults objectForKey:HBAutoNamingFormat]; [self addFormatObservers]; [self addJobObservers]; [self addPrefsObservers]; } return self; } - (void)dealloc { [self removeFormatObservers]; [self removeJobObservers]; [self removePrefsObservers]; } #pragma mark - KVO - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == HBAutoNamerContext) { [self updateFileName]; } else if (context == HBAutoNamerPrefsContext) { [self removeJobObservers]; self.format = [NSUserDefaults.standardUserDefaults objectForKey:HBAutoNamingFormat]; [self addJobObservers]; [self updateFileName]; [self updateFileExtension]; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } - (void)addPrefsObservers { NSUserDefaultsController *ud = [NSUserDefaultsController sharedUserDefaultsController]; [ud addObserver:self forKeyPath:@"values.HBAutoNamingFormat" options:0 context:HBAutoNamerPrefsContext]; [ud addObserver:self forKeyPath:@"values.HBAutoNamingRemoveUnderscore" options:0 context:HBAutoNamerPrefsContext]; [ud addObserver:self forKeyPath:@"values.HBAutoNamingRemovePunctuation" options:0 context:HBAutoNamerPrefsContext]; [ud addObserver:self forKeyPath:@"values.HBAutoNamingTitleCase" options:0 context:HBAutoNamerPrefsContext]; } - (void)removePrefsObservers { NSUserDefaultsController *ud = [NSUserDefaultsController sharedUserDefaultsController]; [ud removeObserver:self forKeyPath:@"values.HBAutoNamingFormat" context:HBAutoNamerPrefsContext]; [ud removeObserver:self forKeyPath:@"values.HBAutoNamingRemoveUnderscore" context:HBAutoNamerPrefsContext]; [ud removeObserver:self forKeyPath:@"values.HBAutoNamingRemovePunctuation" context:HBAutoNamerPrefsContext]; [ud removeObserver:self forKeyPath:@"values.HBAutoNamingTitleCase" context:HBAutoNamerPrefsContext]; } #pragma mark - File extension - (void)addFormatObservers { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateFileExtension:) name:HBAudioEncoderChangedNotification object:self.job.audio]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateFileExtension:) name:HBChaptersChangedNotification object:self.job]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateFileExtension:) name:HBRangeChangedNotification object:self.job.range]; } - (void)removeFormatObservers { [[NSNotificationCenter defaultCenter] removeObserver:self name:HBAudioEncoderChangedNotification object:self.job.audio]; [[NSNotificationCenter defaultCenter] removeObserver:self name:HBChaptersChangedNotification object:self.job]; [[NSNotificationCenter defaultCenter] removeObserver:self name:HBRangeChangedNotification object:_job.range]; } - (void)updateFileExtension:(NSNotification *)notification { NSUndoManager *undo = self.job.undo; if (self.job && !(undo.isUndoing || undo.isRedoing)) { NSString *extension = self.job.automaticExt; if (![extension isEqualTo:self.job.outputFileName.pathExtension]) { self.job.outputFileName = [[self.job.outputFileName stringByDeletingPathExtension] stringByAppendingPathExtension:extension]; } } } - (void)updateFileExtension { [self updateFileExtension:nil]; } #pragma mark - File name - (void)addJobObservers { for (NSString *formatKey in self.format) { if ([formatKey isEqualToString:@"{Chapters}"]) { [self.job addObserver:self forKeyPath:@"range.chapterStart" options:0 context:HBAutoNamerContext]; [self.job addObserver:self forKeyPath:@"range.chapterStop" options:0 context:HBAutoNamerContext]; } else if ([formatKey isEqualToString:@"{Quality/Bitrate}"]) { [self.job addObserver:self forKeyPath:@"video.qualityType" options:0 context:HBAutoNamerContext]; [self.job addObserver:self forKeyPath:@"video.avgBitrate" options:0 context:HBAutoNamerContext]; [self.job addObserver:self forKeyPath:@"video.quality" options:0 context:HBAutoNamerContext]; } } } - (void)removeJobObservers { for (NSString *formatKey in self.format) { if ([formatKey isEqualToString:@"{Chapters}"]) { [self.job removeObserver:self forKeyPath:@"range.chapterStart" context:HBAutoNamerContext]; [self.job removeObserver:self forKeyPath:@"range.chapterStop" context:HBAutoNamerContext]; } else if ([formatKey isEqualToString:@"{Quality/Bitrate}"]) { [self.job removeObserver:self forKeyPath:@"video.qualityType" context:HBAutoNamerContext]; [self.job removeObserver:self forKeyPath:@"video.avgBitrate" context:HBAutoNamerContext]; [self.job removeObserver:self forKeyPath:@"video.quality" context:HBAutoNamerContext]; } } } - (void)updateFileName { NSUndoManager *undo = self.job.undo; if ([NSUserDefaults.standardUserDefaults boolForKey:HBDefaultAutoNaming] && self.job && !(undo.isUndoing || undo.isRedoing)) { // Generate a new file name NSString *fileName = self.job.automaticName; // Swap the old one with the new one self.job.outputFileName = [NSString stringWithFormat:@"%@.%@", fileName, self.job.outputFileName.pathExtension]; } } @end