2015-04-03 5 views
2

В ITunes поиск апи doc есть пример поиска для художника называется бордовый и URL, как так:Как совместить поиски типа лица в яблоневых ITunes поиск апи

https://itunes.apple.com/search?term=maroon&entity=allArtist&attribute=allArtistTerm 

Это возвращает более 50 результатов, которые начинаются примерно так:

{ 
    "resultCount": 50, 
    "results": [ 
     { 
      "wrapperType": "artist", 
      "artistType": "Artist", 
      "artistName": "Maroon 5", 
      "artistLinkUrl": "https://itunes.apple.com/us/artist/maroon-5/id1798556?uo=4", 
      "artistId": 1798556, 
      "amgArtistId": 529962, 
      "primaryGenreName": "Pop", 
      "primaryGenreId": 14, 
      "radioStationUrl": "https://itunes.apple.com/station/idra.1798556" 
     }, 
     { 
      "wrapperType": "artist", 
      "artistType": "Software Artist", 
      "artistName": "MaroonEntertainment", 
      "artistLinkUrl": "https://itunes.apple.com/us/artist/maroonentertainment/id537029262?uo=4", 
      "artistId": 537029262, 
      "radioStationUrl": "https://itunes.apple.com/station/idra.537029262" 
     }, 

Что приятно. Однако вот моя проблема: я хотел бы создать поисковый запрос, который является настолько конкретным, насколько это возможно, объединив поиск как исполнителя, так и название песни и название альбома.

Так, например, я получил эту песню:

  • песня: Через Great Divide
  • альбом: Great Divide
  • Исполнитель: Semisonic

я могу найти имя художника только:

https://itunes.apple.com/search?term=Semisonic&entity=allArtist&attribute=allArtistTerm 

Я могу найти термин песни только:

https://itunes.apple.com/search?term=Across the Great Divide&entity=song&attribute=songTerm 

Я могу найти название альбома только:

https://itunes.apple.com/search?term=Great Divide&entity=album&attribute=albumTerm 

Однако ни один из этих ребята не дал мне результат, который я хочу (я могу найти результат, который я ищу среди, возможно, 50 других .. но я просто wan t поисковый запрос должен быть достаточно конкретным, чтобы избежать фильтрации на стороне клиента).

Как я могу объединить эти поиски? если я просто добавить два поиск вместе (в этом примере я ищу как для песни и художника):

https://itunes.apple.com/search?term=Across the Great Divide&entity=song&attribute=songTerm&term=Semisonic&entity=allArtist&attribute=allArtistTerm 

того яблоко будет просто игнорировать первый тип поиска (то есть песни) и возвращать результаты для художника только).

идеи?

ответ

1

Ну это скорее «обходной» ответ .. но это решение я использую .. так, возможно, и распространять любовь а?

Это 100% -ное решение на стороне клиента (т. Е. Вся база данных музыки itunes может быть загружена на мой собственный сервер .. тогда я могу создать вокруг него все поисковые оболочки ... но это сам проект).

это то, что я получил:

// this is just a wrapper around the apple search api.. it makes your 
// average joe http get request 
[[AppleServer shared] searchForSongWithTitle:track.title andAlbumName:track.albumName completion:^(NSArray *results, NSError *error){ 
    if ([results count] >0) { 
     NSLog(@"[%d] unfiltered songs retrieved from apple search api", [results count]); 
     NSDictionary *filteredResult = [[self class] filterResults:results ToMatchTrack:track]; 
     if (!filteredResult) { 
      NSLog(@"Filtering may be too strict, we got [%d] results from apple search api but none past our filter", [results count]); 
      return; 
     } 

     .. process results 


+ (NSDictionary *)filterResults:(NSArray *)results ToMatchTrack:(VBSong *)track 
{ 

    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *evaluatedTrack, NSDictionary *bindings){  
     BOOL result = 
     ([track.title isLooselyEqualToString:evaluatedTrack[@"trackName"]] && 
      [track.artistName isLooselyEqualToString:evaluatedTrack[@"artistName"]] && 
      [track.albumName isLooselyEqualToString:evaluatedTrack[@"collectionName"]]); 

     NSLog(@"match?[%d]", result); 

     return result; 
    }]; 

    return [[results filteredArrayUsingPredicate:predicate] firstObject]; 
} 

ключ метод здесь isLooselyEqualToString .. это определено в категории NSString как так:

/** 
* Tests if one string equals another substring, relaxing the following contraints 
* - one string can be a substring of another 
* - it's a case insensitive comparison 
* - all special characters are removed from both strings 
* 
*  ie this should return true for this comparison: 
*  - comparing self:"Circus One (Presented By Doctor P and Flux Pavilion)" 
       and str:"Circus One presented by Doctor P" 
* 
* @param str string to compare self against 
* @return if self is the same as str, relaxing the contraints described above 
*/ 
- (BOOL)isLooselyEqualToString:(NSString *)str 
{ 
    return [[self removeSpecialCharacters] containSubstringBothDirections:[str removeSpecialCharacters]]; 
} 

/** 
* Tests if one string is a substring of another 
*  ie this should return true for both these comparisons: 
*  - comparing self:"Doctor P & Flux Pavilion" and substring:"Flux Pavilion" 
*  - comparing self:"Flux Pavilion" and substring:"Doctor P & Flux Pavilion" 
* 
* @param substring to compare self against 
* @return if self is a substring of substring 
*/ 
-(BOOL)containSubstringBothDirections:(NSString*)substring 
{ 
    if (substring == nil) return self.length == 0; 

    if ([self rangeOfString:substring options:NSCaseInsensitiveSearch].location == NSNotFound) { 
     if ([substring rangeOfString:self options:NSCaseInsensitiveSearch].location == NSNotFound) { 
      return NO; 
     } else { 
      return YES; 
     } 
    } else { 
     return YES; 
    } 
} 

- (NSString *)removeSpecialCharacters 
{ 
    NSMutableCharacterSet *specialCharsSet = [[NSCharacterSet letterCharacterSet] mutableCopy]; 
    [specialCharsSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
    return [[self componentsSeparatedByCharactersInSet:[specialCharsSet invertedSet]] componentsJoinedByString:@""]; 
} 

Bonus Это решение, которое мы В настоящее время я использую .. Я полностью понимаю, что могут возникнуть некоторые термины, которые нарушают этот алгоритм. Поэтому у нас есть единичный тест для этого, что мы постепенно добавляем термины, чтобы мы продолжали улучшать наш алгоритм wh ile не вызывает ошибок регрессии. Я отправлю его, если я получу достаточно голосов на этот ответ.

1

abbood,

К сожалению, вы не можете попасть туда отсюда! (Если кто-то еще не нашел что-то новое.)

В настоящее время я разрабатываю приложение, которое объединит результаты нескольких запросов.

Для более приключений Apple предоставляет «фид данных полного набора метаданных из iTunes и App Store» партнерам-партнерам. Чтобы использовать это, я бы поставил службу базы данных где-нибудь в облаке и использовал ее для создания более подробных запросов и отображения деталей, не возвращенных API поиска.

Если я завершаю свое приложение и его используют более 5 человек, я могу посмотреть на всю версию базы данных.

Дэвид

+0

посмотреть на мой [ответ] (http://stackoverflow.com/a/29530049/766570) David – abbood

+0

@DavidReich Привет, Дэвид, вы когда-нибудь проходили с использованием Apple DataFeed? И если да, то что вам нужно сделать, чтобы получить партнерский партнер? –

+1

@ThreadPitt Я никогда не заканчивал приложение. Я обнаружил, что Apple использует ключевые слова, которые отсутствуют в возвращаемых записях из API поиска URL и которые отсутствуют в DataFeed. Например ... Я выполнил поиск, который вернул записи аудиокниг. У этих записей не было условия поиска, которые я использовал! Я тоже не думаю, что это было в DataFeed. (Это было несколько лет назад.) Я посмотрел аудиокнигу на Amazon. Поисковый термин назывался «рассказчиком». Я сдался после этого! Филиал был также несколько лет назад. Еще несколько шагов за пределами обычной учетной записи разработчика. –