从iPodLibrary获取播客元数据 [英] Getting podcast metadata from from iPodLibrary

查看:205
本文介绍了从iPodLibrary获取播客元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

贝洛(Bellow)是用于在iOS设备的iPod库中获取项目的代码,我遇到的问题与获取正确的MPMediaItemProperty有关.如果我想获取艺术品,注释标题之类的数据,我的理解方式-我必须在- (MPMediaItem *)mediaItemForRow: (NSInteger)row方法中使用MPMediaItemCollection类的一个媒体项.

Bellow is code for fetching items in the iPod library of the iOS device, the problem I am having is to do with getting the right MPMediaItemProperty. The way I understand it if I want to get data like artwork, comments title - I gotta take one media item of the MPMediaItemCollection class in my - (MPMediaItem *)mediaItemForRow: (NSInteger)row method.

此问题是我没有获得与Apple相同的信息-因为我在他们的播客应用中签了名.他们必须使用其他方式来获取数据,因为我只从每个个人播客中获得评论.而且我也只获得某些播客的插图.在播客应用中时,他们都有艺术品.

The problem with this is that I do not get the same info as Apple have - cause I´v checked in their podcast app. They must use some other way of getting the data since I do only get comments from each indivdual podcast episode. and Also I do only get artwork for certain podcasts. While in the podcast app they all have artwork.

所以我在这里一定做错了吗?

So I must be doing something wrong here?

@interface testclassViewController ()
@property (nonatomic, strong)       NSArray                         *audiobooks;
@end

@implementation testclassViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    MPMediaItem *mediaItem = [self mediaItemForRow:0];
    self.testText.text = [mediaItem valueForProperty:MPMediaItemPropertyComments];
    MPMediaItemArtwork *img = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
    UIImage *artworkUIImage = [img imageWithSize:CGSizeMake (128, 128)];
    self.testImage.image = artworkUIImage;



}


#pragma mark - query settings 

- (MPMediaPropertyPredicate *)mediaTypeToFetchFromiPodLibrary
{
    MPMediaPropertyPredicate *abPredicate =
    [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypePodcast]
                                     forProperty:MPMediaItemPropertyMediaType];
    return abPredicate;
}


- (MPMediaQuery *)setMediaQueryOptions: (MPMediaQuery*)abQuery
                         withPredicate: (MPMediaPropertyPredicate*) abPredicate
{
    [abQuery addFilterPredicate:abPredicate];
    //[abQuery setGroupingType:MPMediaGroupingAlbum];
    [abQuery setGroupingType:MPMediaGroupingPodcastTitle];
    return abQuery;
}

#pragma mark -

- (MPMediaItem *)mediaItemForRow: (NSInteger)row
{
    NSArray *audiobooks = self.audiobooks;
    MPMediaItem *mediaItem = nil;

    id object = audiobooks[row];
    if ([object isKindOfClass:[MPMediaItemCollection class]]) {
        MPMediaItemCollection *book = (MPMediaItemCollection *)object;

        id item = [book items][0];
        if ([item isKindOfClass:[MPMediaItem class]]) {
            mediaItem = (MPMediaItem *)item;
        }
    }

    return mediaItem;
}


/* Get´s the sub items for Podcasts title */
- (NSArray *)subMediaItemsForPodcastTitle: (NSString *)podcastTitle
{
    NSMutableArray *subMediaItemsToReturn = [NSMutableArray array];
    for (id collections in self.audiobooks) {
        if ([collections isKindOfClass:[MPMediaItemCollection class]]) {
            MPMediaItemCollection *collection = (MPMediaItemCollection *)collections;
            for (id mediaItems in collection.items) {
                MPMediaItem *mediaitem = (MPMediaItem *)mediaItems;

                NSString *mediaItemTitle = [mediaitem valueForProperty:MPMediaItemPropertyPodcastTitle];
                if ([mediaItemTitle isEqual:podcastTitle]) {
                    //NSLog(@"found mediaItem belonging to title: %@",mediaItemTitle);
                    [subMediaItemsToReturn addObject:mediaitem];
                }
            }
        }
    }
    return  subMediaItemsToReturn;
}

// property getter
- (NSArray *)audiobooks
{
    MPMediaPropertyPredicate *abPredicate = [self mediaTypeToFetchFromiPodLibrary];
    MPMediaQuery *abQuery = [[MPMediaQuery alloc] init];
    abQuery = [self setMediaQueryOptions:abQuery withPredicate:abPredicate]; // Abstract
    NSArray *books = [abQuery collections];

    return books;
}

@end

推荐答案

如果用户使用Podcasts应用程序下载Podcast剧集,则会丢失很多元数据(评论等).如果用户通过使用iTunes sync在设备上获得播客,则其中的大部分数据都在其中.我本来打算提交错误,但还没有.使用MPMediaPlayer框架获取某些可能无法显示的数据的一种方法是使用AVFoundation直接获取id3标签数据.

If a user downloads the podcast episode using the podcasts app, a lot of the metadata is lost(comments etc). If the user gets the podcast on the device by using iTunes sync, most of the data is there. I've meant to file a bug but haven't. One way to get at some data that might not show up using the MPMediaPlayer framework is to use AVFoundation to get the id3 tag data directly.

#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>


MPMediaItem *item;
AVURLAsset *itemAsset = [item valueForProperty:MPMediaItemPropertyAssetURL];
NSArray *mDatsForFormats = [itemAsset metadataForFormat:@"org.id3"];

for (AVMetadataItem *mDatItem in mDatsForFormats){
    if (mDatItem.stringValue) {
        NSLog(@"\nkey %@\nvalue %@",mDatItem.key,mDatItem.stringValue);
    }
    NSLog(@"%@",mDatItem);

}

这篇关于从iPodLibrary获取播客元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆