Получение метаданных подкаста из iPodLibrary

Ниже приведен код для извлечения элементов из библиотеки iPod устройства iOS, проблема, с которой я столкнулся, связана с получением правильного файла MPMediaItemProperty. Как я понимаю, если я хочу получить данные, такие как обложка, заголовок комментария, я должен взять один элемент мультимедиа класса MPMediaItemCollection в моем методе - (MPMediaItem *)mediaItemForRow: (NSInteger)row.

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

Значит, я должен делать что-то не так здесь?

@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

person Tom Lilletveit    schedule 31.08.2013    source источник


Ответы (2)


Если пользователь загружает эпизод подкаста с помощью приложения для подкастов, многие метаданные теряются (комментарии и т. д.). Если пользователь получает подкаст на устройстве с помощью синхронизации iTunes, большая часть данных находится там. Я хотел сообщить об ошибке, но не стал. Один из способов получить некоторые данные, которые могут не отображаться с помощью платформы MPMediaPlayer, — использовать AVFoundation для прямого получения данных тега id3.

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

}
person dave234    schedule 15.09.2013
comment
Да, я заметил, что те же данные, что и в моей библиотеке iTunes, синхронизируются с моим Mac. Но в приложении подкаста/музыкального проигрывателя на iOS они получают данные откуда-то еще. - person Tom Lilletveit; 17.09.2013
comment
@Dave Спасибо за совет! Я ищу ответ на похожий вопрос о метаданных iTunes, и мне было интересно, может ли это решение помочь с этим ? Я совершенно новичок в тегах ID3 и методе 3 из 3 в этом article указывает, что теги, связанные с видео, не отображаются как ID3 (но видны? что бы это ни значило?), но есть ли шанс, что такой метод может получить доступ к свойствам Episode # и Season # в MPMediaItem и т. д.? - person Nerrolken; 31.05.2015
comment
обратите внимание, что в Swift 2017 ключ формата не org.id3, а константа AVMetadataFormatID3Metadata - person NSTJ; 24.04.2017
comment
В iOS 10 я обнаружил, что обложка подкаста доступна только для эпизодов, которые были загружены с помощью приложения iOS Podcasts. Эпизоды, которые были синхронизированы с iTunes на Mac, не содержали обложек подкастов. Надеюсь, это поможет кому-то еще. - person lifjoy; 06.06.2017
comment
@lifjoy Спасибо, это то, что я хотел знать. Возможно, стоит дать это как ответ, потому что комментарии изменчивы и не доступны для поиска. - person matt; 19.06.2018

В iOS 10 я обнаружил, что обложка подкаста доступна только для эпизодов, которые были загружены с помощью приложения iOS Podcasts. Эпизоды, которые были синхронизированы с iTunes на Mac, не содержали обложек подкастов. Надеюсь, это поможет кому-то еще. (Добавлено это как ответ, поскольку комментарии изменчивы и не доступны для поиска).

person lifjoy    schedule 10.07.2018