Re: Scripting Bridge && filteredArrayUsingPredicate
Re: Scripting Bridge && filteredArrayUsingPredicate
- Subject: Re: Scripting Bridge && filteredArrayUsingPredicate
- From: has <email@hidden>
- Date: Wed, 2 Jan 2008 19:34:35 +0000
On 2 Jan 2008, at 16:58, email@hidden wrote:
On a similar note, I recently stumbled upon what appears to be
another
major flaw in filteredArrayUsingPredicate:. If the predicate is
set to
match an empty string "" (a common enough operation when dealing
with
meta tags, for example in iTunes), filteredArrayUsingPredicate:
always
returns an empty array, regardless if the objects in the unfiltered
array matches the predicate or not.
Seems to work here. One reason you might not get matches is if you're
using an empty string where some other value is expected (integer,
'missing value' constant, etc).
Really? How did you accomplish that? I'd love to see a working
example.
The following works here, picking up all tracks that lack an album name:
#####################
#!/usr/bin/ruby
require 'osx/cocoa'
include OSX
OSX.require_framework 'ScriptingBridge'
iTunes =
SBApplication.applicationWithBundleIdentifier("com.apple.itunes")
the_album = ""
track_array =
iTunes.sources.objectAtIndex(0).playlists.objectAtIndex(0).tracks
predicate = NSPredicate.predicateWithFormat("album like[cd] %@",
the_album)
track_array = track_array.filteredArrayUsingPredicate(predicate)
puts track_array.arrayByApplyingSelector(:name)
#####################
(
"Track 01",
"Track 01",
"Track 02",
"Track 02",
"Track 03",
"Track 03",
"Track 04",
"Track 04",
"Track 05",
"Track 05",
...
)
#####################
If in doubt, check against AppleScript to see if the problem is with
the bridge or with the target application, e.g.:
tell app "iTunes" to name of (every track whose album is "") of
playlist 1 of source 1
I'll also add a caveat that I don't yet know much about how SB applies
predicates - I think it maps at least some tests to Apple event
equivalents, but none of this stuff is publicly documented so it's
hard to know what's going on behind the scenes.
Anyway, my advice FWIW would be: 1. learn how Apple event IPC really
works, and 2. use appscript to do it.
Cool. I hadn't heard about appscript before. I'll play around with it
later and see how it compares.
As I've said elsewhere, objc-appscript is still officially alphaware
so the usual caveats apply. There's still a few implementation details
to take care of; however, the basic architecture is already quite
solid since it's based on the proven Python appscript design, and the
high-level API is settling down now so there shouldn't be much more
disturbance from your POV.
For example:
// To create iTunes glue: osaglue -o ITGlue -p IT iTunes
#import <Foundation/Foundation.h>
#import "ITGlue/ITGlue.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
ITApplication *itunes;
ITReference *ref;
NSError *err;
NSString *albumName;
NSArray *trackNames;
albumName = @"";
itunes = [[ITApplication alloc] initWithBundleID: @"com.apple.itunes"];
ref = [[[[[itunes playlists] at: 1] tracks] byTest: [[ITIts album]
equals: albumName]] name];
trackNames = [[ref get] sendWithError: &err];
if (!trackNames)
NSLog(@"Error: %@", err);
else
NSLog(@"Result: %@", trackNames);
[itunes release];
[pool drain];
return 0;
}
HTH
has
--
http://appscript.sourceforge.net
http://rb-appscript.rubyforge.org
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden