Question

there are some similars questions here but none involves NSApplescript.

I'm trying to add iTunes artwork to a selected track, my code is:

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

Where aFileName is the path of an mp3. I'm testing this using Script Debugger 4.5 and it works fine, but when I copy the code to my Xcode project and run it wont set the artwork neither the other meta data. But if I comment the "set data of artwork.." line, then it does set the other meta data (name, artist, etc)

My Xcode code is:

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];
    }

I have been searching on google for many hours without luck. I don't want to use ScriptBridge framework because I will need to translate lot of applescripts so its not an option for me right now.

Any help will be greatly appreciated.

Était-ce utile?

La solution

Found the problem, in case someone else reach here in the future the problem was with the HFS path format style.

I was getting the path to my artwork using NSSearchPathForDirectoriesInDomains and then replacing all the @"/" for @":" to format the path in HFS style.

The problem is that HFS path format style need a full path including Volume Name and NSSearchPathForDirectoriesInDomain and any other NSFileManager methods return paths starting in /Users/.... and I needed a path like this: Macintosh HD/Users/...

To get the HFS full path I used the following code:

// 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);

That solves the problem, use the pathFormatted string to set the data of artwork and it should work.

Hope this would help someone someday -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top