2010-03-10 48 views
0

下面的代码应该在iTunes中显示出一定的轨迹:iTunes的脚本桥接揭示不起作用

NSString* iTunesPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.iTunes"]; 

iTunesApplication *iTunes = nil; 
if (iTunesPath) { 
iTunes = [[SBApplication alloc] initWithURL:[NSURL fileURLWithPath:iTunesPath]]; 
[iTunes setDelegate:self]; 
} 

iTunesSource *librarySource = nil; 
NSArray *sources = [iTunes sources]; 
for (iTunesSource *source in sources) { 
if ([source kind] == iTunesESrcLibrary) { 
    librarySource = source; 
    break; 
} 
} 
SBElementArray *libraryPlaylist = [librarySource libraryPlaylists]; 
iTunesLibraryPlaylist *iTLibPlaylist = nil; 
if ([libraryPlaylist count] > 0) { 
iTLibPlaylist = [libraryPlaylist objectAtIndex:0]; 
} 


SBElementArray *fileTracks = [iTLibPlaylist fileTracks]; 

iTunesFileTrack *track = [fileTracks objectAtIndex:4]; 
NSLog(@"Try to reveal track: %@ at path :%@",[track description],[[track location] path]); 
[track reveal]; 

输出:

Try to reveal track: <ITunesFileTrack @0x1364ed20: ITunesFileTrack 4 of ITunesLibraryPlaylist 0 of ITunesSource 0 of application "iTunes" (2474)> at path :/Users/... 

但绝对提的发生。我究竟做错了什么? (iTunes版本:9.0.3)

回答

3

库中的播放列表不再存在于用户界面中;它就在模型中,所以它显示在AppleScript中,但试图揭示它或任何内容都不会在UI中做任何事情,正如你看到的那样。你也可以在AppleScript中重现这一点(reveal track 5 of library playlist 1 of source 1)。

解决方案是与音乐播放列表进行通话,而不是音乐库播放列表。 “音乐”是AppleScript中的第二个播放列表playlist 2,Cocoa中的[[librarySource playlists] objectAtIndex:1]

如果您想在任何播放列表中显示播放项目,请使用reveal current track(应该是[[iTunes currentTrack] reveal],尽管我没有测试过)。

+0

解决了我的问题。多谢! – V1ru8 2010-03-11 13:39:58

2

这帮我解决了related issue。谢谢。

我建议不要使用[[librarySource playlists] objectAtIndex:1]来获取播放列表。这感觉太像猜测了。您还应该避免使用for循环通过脚本桥迭代阵列。

这个例子解决了两个问题:

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0]; 
iTunesLibraryPlaylist *lp = [[[[library playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0]; 

[[library playlists] objectWithName:@"Music"]也可以,但是我不知道这是依赖于语言环境(和名称可能在以后的更新变化)。

1

只是添加到Rob McBroom的答案,它会更好地使用firstObject而不是objectAtIndex:0。它将防止发生异常,以防您的查询失败并返回空数组。当您搜索互联网广播源(种类== iTunesESrcRadioTuner)时,会发生这种情况,并且首选项中禁用了互联网广播库。

iTunesApplication* iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
iTunesSource* radioTunerSource = [[[[iTunesApp sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcRadioTuner]] firstObject];