Cocoa iTunes脚本无法工作
以下代码应显示iTunes中的特定曲目:Cocoa iTunes脚本无法工作,cocoa,macos,applescript,itunes,Cocoa,Macos,Applescript,Itunes,以下代码应显示iTunes中的特定曲目: NSString* iTunesPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.iTunes"]; iTunesApplication *iTunes = nil; if ( iTunesPath ) { iTunes = [[SBApplication alloc] initWithURL:[NSURL fileURLW
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/...
尝试显示轨迹:在路径:/Users/。。。
但绝对没有发生什么。我做错了什么?
(iTunes版本:9.0.3)用户界面中不再存在库播放列表;它在模型中,所以它显示在AppleScript中,但试图显示它或其中的任何内容都不会在UI中起任何作用,正如您所看到的。您也可以在AppleScript中复制此内容(
显示源1的库播放列表1的曲目5
)
解决方案是与音乐播放列表通话,而不是与库中的播放列表通话。“音乐”是AppleScript中的第二个播放列表-playlist 2
,Cocoa中的[[librarySource playlists]objectAtIndex:1]
如果您想在播放的任何播放列表中显示播放项目,请使用
显示当前曲目
(应该是[[iTunes currentTrack]显示]
,尽管我没有测试过它)。库播放列表在UI中不再存在;它在模型中,所以它显示在AppleScript中,但试图显示它或其中的任何内容都不会在UI中起任何作用,正如您所看到的。您也可以在AppleScript中复制此内容(显示源1的库播放列表1的曲目5
)
解决方案是与音乐播放列表通话,而不是与库中的播放列表通话。“音乐”是AppleScript中的第二个播放列表-playlist 2
,Cocoa中的[[librarySource playlists]objectAtIndex:1]
如果您想在播放的任何播放列表中显示播放项目,请使用显示当前曲目
(应该是[[iTunes currentTrack]显示]
,尽管我还没有测试过它)。这帮助我解决了一个问题。谢谢
我建议不要使用[[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”]
也可以,但我不确定这是否取决于语言环境(名称可能会在将来的更新中更改)。这帮助我解决了一个问题。谢谢
我建议不要使用[[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”]
也可以,但我不确定这是否取决于语言环境(名称可能会在将来的更新中更改)。只需添加Rob McBroom的答案,使用firstObject而不是objectAtIndex:0就更好了。如果查询失败并返回空数组,它将防止出现异常。当您搜索Internet无线电源(种类==iTunesRescRadioTuner)并且在首选项中禁用Internet无线电库时,将发生这种情况
iTunesApplication* iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource* radioTunerSource = [[[[iTunesApp sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcRadioTuner]] firstObject];
为了补充Rob McBroom的答案,最好使用firstObject而不是objectAtIndex:0。如果查询失败并返回空数组,它将防止出现异常。当您搜索Internet无线电源(种类==iTunesRescRadioTuner)并且在首选项中禁用Internet无线电库时,将发生这种情况
iTunesApplication* iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource* radioTunerSource = [[[[iTunesApp sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcRadioTuner]] firstObject];