Как получить трек iTunes через ScriptingBridge?

У меня две ситуации. Учитывая идентификатор трека песни, установите рейтинг в некоторое целое число. Второй такой же, за исключением того, что мне дан массив идентификаторов треков. Я знаю, что могу использовать ScriptingBridge для поиска объекта iTunesTrack на основе названия песни, но есть ли способ получить его на основе идентификатора дорожки? Что-то вроде:

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
NSInteger *rating;
NSInteger *id;

if ( [iTunes isRunning] ) {
    iTunesTrack *track = [ iTunes trackForDatabaseID:id ];
    [ track setValue:rating forkey:@"rating" ];
}

Во второй ситуации, есть ли способ получить объект SBElementArray iTunesTrack с учетом массива идентификаторов дорожек? Что-то типа:

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
NSArray *ids; //array of NSIntegers

if ( [iTunes isRunning] ) {
    SBElementArray *tracks = [ iTunes tracksForDatabaseIDs:ids ];
    [ tracks setValue:rating forkey:@"rating" ];
}

Я считаю, что это было бы более эффективно, чем итеративный поиск в библиотеке по названию песни.


person jp.rider63    schedule 14.06.2011    source источник
comment
Вы узнали, как это сделать?   -  person david    schedule 17.06.2011
comment
Неа. На данный момент я просто повторяю, используя название трека.   -  person jp.rider63    schedule 23.06.2011


Ответы (1)


Я сделал это недавно. Что-то вроде этого должно сработать для вас. Вам нужно запросить список воспроизведения библиотеки (в этом примере с именем libraryPlaylist), а не приложение.

NSArray *trackIDs = blah; // the ids you're searching for
NSString *searchFilter = @"databaseID == %@";
NSMutableArray *filters = [NSMutableArray arrayWithCapacity:[trackIDs count]];
for (int i = 0; i < [trackIDs count]; i++) {
    [filters addObject:searchFilter];
}
searchFilter = [filters componentsJoinedByString:@" OR "];
NSArray *trackResult = [[libraryPlaylist tracks] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:searchFilter argumentArray:trackIDs]];

И это прекрасно работает, если массив trackIDs содержит только один элемент, поэтому нет необходимости писать специальный код для этого случая.

person Rob McBroom    schedule 25.11.2011