5

それが私の質問です=)

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

songsByArtistのMPMediaItemCollectionsの各アーティストのアルバム数を取得するにはどうすればよいですか?

例:

ビートルズ3アルバム

AC /DC6アルバム

ありがとうございました !!

4

6 に答える 6

6

述語を使用して、アーティストのアルバムと曲の数を取得します。

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
于 2015-04-09T17:37:43.137 に答える
5

コンビニエンスコンストラクターは、artistsQueryアルバムごとに並べ替えやグループ化を行いません。artistsQueryアーティスト名のアルファベット順にソートされたすべてのアーティストのメディアアイテムコレクションの配列を返します。各アーティストコレクション内には、そのアーティストのすべての曲に関連付けられた一連のメディアアイテムがネストされています。ネストされた配列は、曲のタイトルのアルファベット順に並べ替えられます。

アーティストごとにアルバムの数を保持する1つの方法は、各アーティストコレクションのすべての曲アイテムを列挙し、を使用しNSMutableSetて各曲に関連付けられた個別のアルバムタイトルを追跡することです。次に、セットのカウントを各アーティストキーの値として追加しますNSMutableDictionaryNSMutableSetは個別のオブジェクトのみを取得するため、重複するアルバムタイトルは追加されません。

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:

于 2012-06-14T00:22:52.453 に答える
1

ブライアンの答えのスイフト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)")
于 2015-09-21T18:49:20.290 に答える
0

albumsQueryが役立つ場合は、これをクエリするか、以下のこのリンクで詳細を確認してください

http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMediaQuery_ClassReference/Reference/Reference.html

于 2012-05-15T08:36:05.667 に答える
0

Tim 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)") 
于 2016-05-16T20:30:47.610 に答える
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)

        }


    }
于 2017-08-09T07:32:39.337 に答える