2012-05-15 10 views
5

Esa es mi pregunta =)Número de discos de artistas

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

¿Cómo puedo obtener el número de álbumes de cada uno de los artistas MPMediaItemCollections en songsByArtist?

Ejemplo:

los Beatles 3 álbumes

AC/DC 6 álbumes

Gracias !!

Respuesta

5

La conveniencia constructor artistsQuery no ordenar y agrupar por álbum. artistsQuery devuelve una colección de colecciones de elementos multimedia de todos los artistas ordenados alfabéticamente por nombre de artista. Anidado dentro de cada colección de artistas hay una serie de elementos multimedia asociados con todas las canciones para ese artista. La matriz anidada se ordena alfabéticamente por título de la canción.

Una forma de mantener un recuento de álbumes por artista es enumerar a través de todos los elementos de la canción para cada colección de artistas y utilizar un NSMutableSet para realizar un seguimiento de títulos de álbumes distintos asociados con cada canción. A continuación, agregue el recuento del conjunto como el valor para cada clave de artista en un NSMutableDictionary. Cualquier títulos de los álbumes duplicados no se añadirán desde un NSMutableSet solamente se llevará a objetos distintos:

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); 

Sería más limpia si cambia la consulta a albumsQuery. Esta consulta agrupa y ordena la colección por nombre de álbum. A continuación, solo se trata de enumerar a través de la matriz de colecciones de álbumes y llevar un recuento del nombre del artista representativo de cada álbum en un NSCountedSet. El conjunto contado rastreará se inserta el número de veces que los objetos:

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); 

También puede recuperar el recuento de un objeto dado en un NSCountedSet con el método countForObject:.

+0

¡¡¡Funciona perfectamente !! Muchas gracias !! – Jonathan

5

que obtiene el número de álbumes y canciones para el artista utilizando el predicado:

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

Me ayuda mucho. ¡¡Gracias!! – Vishnuvardhan

1

Swift 2 traducción de la respuesta de Bryan:

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

Gracias Tim E, que no podía obtener su código para trabajar primera vez, pero modifiqué esto y funciona ahora.

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

Disculpa por la respuesta tardía.

Publicando mi respuesta en caso de que sea útil para alguien.

Debajo del código obtiene todos los artistas por grupo por artista de álbum y obtiene todos sus álbumes y canciones dentro del álbum.

/// 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) 

     } 


    } 
Cuestiones relacionadas