Как установить художественное произведение к песне iTunes, используя NSApplescript в XCode? - PullRequest
2 голосов
/ 06 октября 2011

здесь есть несколько похожих вопросов, но ни один не затрагивает NSApplescript.

Я пытаюсь добавить обложку iTunes к выбранной дорожке, мой код:

set newFile to add aFileName as POSIX file to ipod_lib
set current_track to newFile
set jpegFilename to ":temp:artwork.jpg" as string
set data of artwork 1 of current_track to (read (file jpegFilename) as picture)
tell current_track
  set name to "Song Name" as string
  set artist to "Custom Artist" as string
  set album to "Custom Album" as string
  set year to "2011" as string
  set track number to "1" as number
  set track count to "38" as number
end tell

Где aFileName - это путь к mp3. Я тестирую это с помощью Script Debugger 4.5, и он работает нормально, но когда я копирую код в свой проект Xcode и запускаю его, не задает иллюстрацию и другие метаданные. Но если я прокомментирую строку «set data of artwork ..», то она устанавливает другие метаданные (имя, исполнитель и т. Д.)

Мой код Xcode:

NSString *scriptote = @"with timeout of 600 seconds\n"
    "tell application \"iTunes\"\n" 
...
    "set newFile to add aFileName as POSIX file to ipod_lib\n"
    "set current_track to newFile\n"
    "set jpegFilename to \":temp:artwork.jpg\" as string\n"
    // If a comment the following line, everything else works, if I left this line, no meta data is set.
    "set data of artwork 1 of current_track to (read (file jpegFilename) as picture)\n" 
    "tell current_track\n"
    "set name to \"Song Name\" as string\n"
    "set artist to \"Custom Artist\" as string\n"
    "set album to \"Custom Album\" as string\n"
    "set year to \"2011\" as string\n"
    "set track number to \"1\" as number\n"
    "set track count to \"38\" as number\n"
    "end tell\n"
...    
;

    if ((ascript = [[NSAppleScript alloc] initWithSource:scriptote])) {
        status = [[ascript executeAndReturnError:&errorInfo] stringValue];
        if (!errorInfo) {
            // do something 
            NSLog(@"NO Error");
        } else {
            // process errors
           // NSRange errorRange = [[errorInfo objectForKey:@"NSAppleScriptErrorRange"] rangeValue];
            NSLog(@"Error\n Error line: ");
        }   
        [ascript release];
    }

Я искал в Google много часов без удачи. Я не хочу использовать фреймворк ScriptBridge, потому что мне нужно будет переводить много сценариев apple, так что сейчас это не вариант для меня.

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 07 октября 2011

Найдена проблема, в случае, если кто-то еще достигнет здесь в будущем, проблема была со стилем формата пути HFS.

Я получал путь к своей работе, используя NSSearchPathForDirectoriesInDomains, а затем заменял все @ "/" на @ ":" для форматирования пути в стиле HFS.

Проблема в том, что стилю формата пути HFS нужен полный путь, включая имя тома и NSSearchPathForDirectoriesInDomain, а также любые другие методы NSFileManager возвращают пути, начиная с / Users / ...., и мне нужен такой путь: Macintosh HD / Users /. ..

Чтобы получить полный путь HFS, я использовал следующий код:

// Get an HFS-style reference to a specified file
// (imagePath is an NSString * containing a POSIX-style path to the artwork image file)
NSURL *fileURL = [NSURL fileURLWithPath:imagePath];
NSString *pathFormatted = (NSString *)CFURLCopyFileSystemPath((CFURLRef)fileURL, kCFURLHFSPathStyle);

Это решает проблему, используйте строку pathFormatted для установки данных обложки, и она должна работать.

Надеюсь, это когда-нибудь кому-нибудь поможет -)

...