2012-05-15 8 views
5

Это мой вопрос =)Количество альбомов художников

MPMediaQuery *artistQuery = [MPMediaQuery artistsQuery]; 
NSArray *songsByArtist = [artistQuery collections]; 

Как я могу получить количество альбомов каждого художников MPMediaItemCollections в songsByArtist?

Exemple:

The Beatles 3 Альбомы

AC/DC 6 Альбомы

Спасибо !!

ответ

5

artistsQuery удобства конструктор не сортировать и группы по альбому. artistsQuery возвращает массив коллекций элементов мультимедиа всех художников, отсортированных по алфавиту по имени исполнителя. Вложенная внутри каждой коллекции художник представляет собой массив элементов мультимедиа, связанных со всеми песнями для этого исполнителя. Вложенный массив сортируется по алфавиту по названию песни.

Один из способов сохранить количество альбомов от исполнителя - перечислить все композиции для каждой коллекции исполнителей и использовать NSMutableSet, чтобы отслеживать отдельные названия альбомов, связанные с каждой песней. Затем добавьте счетчик набора как значение для каждого исполнительского ключа в NSMutableDictionary. Любые дублирующие названия альбома не будут добавлены так как NSMutableSet будет принимать только отдельные объекты:

MPMediaQuery *artistQuery = [MPMediaQuery artistsQuery]; 
NSArray *songsByArtist = [artistQuery collections]; 
NSMutableDictionary *artistDictionary = [NSMutableDictionary dictionary]; 
NSMutableSet *tempSet = [NSMutableSet set]; 

[songsByArtist enumerateObjectsUsingBlock:^(MPMediaItemCollection *artistCollection, NSUInteger idx, BOOL *stop) { 
    NSString *artistName = [[artistCollection representativeItem] valueForProperty:MPMediaItemPropertyArtist]; 

    [[artistCollection items] enumerateObjectsUsingBlock:^(MPMediaItem *songItem, NSUInteger idx, BOOL *stop) { 
     NSString *albumName = [songItem valueForProperty:MPMediaItemPropertyAlbumTitle]; 
     [tempSet addObject:albumName]; 
    }]; 
    [artistDictionary setValue:[NSNumber numberWithUnsignedInteger:[tempSet count]] 
         forKey:artistName]; 
    [tempSet removeAllObjects]; 
}]; 
NSLog(@"Artist Album Count Dictionary: %@", artistDictionary); 

Было бы чище, если вы измените запрос albumsQuery. Этот запрос группирует и сортирует коллекцию по названию альбома. Тогда это просто вопрос перечисления в массиве коллекций альбомов и подсчет имени представителя художника для каждого альбома в NSCountedSet. Подсчитывали набор будет отслеживать количество раз объектов вставляются:

MPMediaQuery *albumQuery = [MPMediaQuery albumsQuery]; 
NSArray *albumCollection = [albumQuery collections]; 
NSCountedSet *artistAlbumCounter = [NSCountedSet set]; 

[albumCollection enumerateObjectsUsingBlock:^(MPMediaItemCollection *album, NSUInteger idx, BOOL *stop) { 
    NSString *artistName = [[album representativeItem] valueForProperty:MPMediaItemPropertyArtist]; 
    [artistAlbumCounter addObject:artistName]; 
}]; 
NSLog(@"Artist Album Counted Set: %@", artistAlbumCounter); 

Можно также получить счетчик для данного объекта в NSCountedSet с методом countForObject:.

+0

Это работа отлично !! Большое спасибо !! – Jonathan

5

я получаю количество альбомов и песен для художника, используя предикат:

MPMediaPropertyPredicate *artistNamePredicate = [MPMediaPropertyPredicate predicateWithValue:@"ArtistName" forProperty:MPMediaItemPropertyArtist]; 
MPMediaQuery *myComplexQuery = [[MPMediaQuery alloc] init]; 
[myComplexQuery addFilterPredicate: artistNamePredicate]; 
NSInteger songCount = [[myComplexQuery collections] count]; //number of songs 
myComplexQuery.groupingType = MPMediaGroupingAlbum; 
NSInteger albumCount = [[myComplexQuery collections] count]; //number of albums 
+0

Мне это очень помогает. Спасибо!! – Vishnuvardhan

1

Swift 2 перевод ответа Брайана:

var artistQuery = MPMediaQuery.artistsQuery() 
var artistQuery.groupingType = MPMediaGrouping.AlbumArtist 
var songsByArtist = artistQuery.collections 
var artistDictionary = NSMutableDictionary() 
var tempSet = NSMutableSet() 

songsByArtist.enumerateObjectsUsingBlock { (artistCollection, idx, stop) -> Void in 
    let collection = artistCollection as! MPMediaItemCollection 
    let rowItem = collection.representativeItem 

    let artistName = rowItem?.valueForProperty(MPMediaItemPropertyAlbumArtist) 

    let collectionContent:NSArray = collection.items 

    collectionContent.enumerateObjectsUsingBlock { (songItem, idx, stop) -> Void in 
      let item = songItem as! MPMediaItem 

      let albumName = item.valueForProperty(MPMediaItemPropertyAlbumTitle) 
      self.tempSet.addObject(albumName!) 
    } 

    self.artistDictionary.setValue(NSNumber(unsignedInteger: self.tempSet.count), forKey: artistName! as! String) 
    self.tempSet.removeAllObjects() 
} 
print("Album Count Dictionary: \(artistDictionary)") 
0

Спасибо Тим E, я не мог получить свой код для работы первый раз, но я изменил это на это, и теперь он работает.

let artistQuery = MPMediaQuery.artistsQuery() 
    artistQuery.groupingType = MPMediaGrouping.AlbumArtist 

    let songsByArtist = artistQuery.collections! as NSArray 
    let artistDictionary = NSMutableDictionary() 
    let tempSet = NSMutableSet() 

    songsByArtist.enumerateObjectsUsingBlock({ (artistCollection, idx, stop) -> Void in 
     let collection = artistCollection as! MPMediaItemCollection 
     let rowItem = collection.representativeItem 

     let artistName = rowItem?.valueForProperty(MPMediaItemPropertyAlbumArtist) 

     let collectionContent:NSArray = collection.items 

     collectionContent.enumerateObjectsUsingBlock({ (songItem, idx, stop) -> Void in 
      let item = songItem as! MPMediaItem 

      let albumName = item.valueForProperty(MPMediaItemPropertyAlbumTitle) 
      tempSet.addObject(albumName!) 
     }) 

     artistDictionary.setValue(NSNumber(unsignedInteger: UInt(tempSet.count)), forKey: artistName! as! String) 
     tempSet.removeAllObjects() 
    }) 

    print("Album Count Dictionary: \(artistDictionary)") 
0

Извините за поздний ответ.

Отправка моего ответа в случае, если это кому-то полезно.

Ниже код получает группу художников от исполнителя альбома и получает все альбомы и песни внутри альбома.

/// Get all artists and their songs 
/// 
func getAllArtists() { 
    let query: MPMediaQuery = MPMediaQuery.artists() 
    query.groupingType = .albumArtist 

    let artistsColelctions = query.collections 

    artists.removeAll() 


    var tempSet = NSMutableSet() 



    guard artistsColelctions != nil else { 
     return 
    } 

    // 1. Create Artist Objects from collection 

    for collection in artistsColelctions! { 
     let item: MPMediaItem? = collection.representativeItem 

     var artistName = item?.value(forKey: MPMediaItemPropertyArtist) as? String ?? "<Unknown>" 
     artistName = artistName.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines) 
     let artistId = item!.value(forProperty: MPMediaItemPropertyArtistPersistentID) as! NSNumber 


     // temp 
     let albumName = item?.albumTitle 
     let albumID = item?.albumPersistentID 

     print(albumName) 
     print(albumID) 



     // Create artist item 

     let artist = Artist() 
     artist.name = artistName 
     artist.artworkTitle = String(artistName.characters.prefix(1)).uppercased() 
     artist.artistId = String(describing: artistId) 


     // 2. Get Albums for respective Artist object 
     //-------------------------------------------- 

     let mediaQuery2 = MPMediaQuery.albums() 
     let predicate2 = MPMediaPropertyPredicate.init(value: artistId, forProperty: MPMediaItemPropertyArtistPersistentID) 
     mediaQuery2.addFilterPredicate(predicate2) 

     let albums = mediaQuery2.collections 

     for collection in albums! { 
      let item: MPMediaItem? = collection.representativeItem 

      let albumName = item?.value(forKey: MPMediaItemPropertyAlbumTitle) as? String ?? "<Unknown>" 
      let albumId = item!.value(forProperty: MPMediaItemPropertyAlbumPersistentID) as! NSNumber 
      let artistName = item?.value(forKey: MPMediaItemPropertyAlbumArtist) as? String ?? "unknown" 

      let genreName = item?.genre ?? "" 

      let year = item?.releaseDate ?? item?.dateAdded 

      let dateAdded = item?.dateAdded 

      // Create album object 

      let album = Album() 
      album.name = albumName 
      album.artistName = artistName 
      album.genre = genreName 
      album.releaseDate = year 
      album.dateAdded = dateAdded 
      album.albumId = String(describing: albumId) 

      // Add artwork to album object 
      let artwork = Artwork.init(forAlbum: item) 
      album.artwork = artwork 


      // 3. Get Songs inside the resepctive Album object 
      //--------------------------------------------------- 

      let mediaQuery = MPMediaQuery.songs() 
      let predicate = MPMediaPropertyPredicate.init(value: albumId, forProperty: MPMediaItemPropertyAlbumPersistentID) 
      mediaQuery.addFilterPredicate(predicate) 
      let song = mediaQuery.items 

      if let allSongs = song { 
       var index = 0 

       for item in allSongs { 
        let pathURL: URL? = item.value(forProperty: MPMediaItemPropertyAssetURL) as? URL 
        let isCloud = item.value(forProperty: MPMediaItemPropertyIsCloudItem) as! Bool 

        let trackInfo = TrackInfo() 
        trackInfo.index = index 
        trackInfo.mediaItem = item 
        trackInfo.isCloudItem = isCloud 

        trackInfo.isExplicitItem = item.isExplicitItem 

        trackInfo.isSelected = false 
        trackInfo.songURL = pathURL 
        album.songs?.append(trackInfo) 
        index += 1 
       } 
      } 


      artist.albums?.append(album) 

     } 

     // Finally add the artist object to Artists Array 
     artists.append(artist) 

     } 


    } 

 Смежные вопросы

  • Нет связанных вопросов^_^