2013-08-31 2 views
0

벨로우 (Bellow)는 iOS 장치의 iPod 라이브러리에있는 항목을 가져 오는 코드입니다. 오른쪽에있는 문제는 바로 MPMediaItemProperty입니다. 아트 워크와 같은 데이터를 얻고 싶다면 주석의 제목을 이해하십시오. - (MPMediaItem *)mediaItemForRow: (NSInteger)row 메서드에서 MPMediaItemCollection 클래스의 미디어 항목 하나를 가져와야합니다.iPodLibrary에서 팟 캐스트 메타 데이터 가져 오기

이 문제는 제가 애플과 같은 정보를 얻지 못한다는 것입니다 - 왜냐하면 그들의 포드 캐스트 앱을 체크했기 때문입니다. 각 개별 팟 캐스트 에피소드에서만 의견을 얻으므로 다른 방법으로 데이터를 가져와야합니다. 또한 특정 Podcast에만 삽화를 제공합니다. Podcast 앱에서 그들은 모두 작품을 가지고 있습니다.

그래서 나는 여기서 뭔가 잘못하고있을 것입니까?

@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 

답변

1

사용자가 podcast 앱을 사용하여 podcast 에피소드를 다운로드하면 많은 메타 데이터가 손실됩니다 (설명 등). 사용자가 iTunes 동기화를 사용하여 장치에서 Podcast를 가져 오는 경우 대부분의 데이터가 있습니다. 나는 버그를 제기하려했지만 그렇게하지 않았다. 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); 

} 
+0

예 iTunes에서 가져온 것과 동일한 데이터가 Mac에 동기화되어 있습니다. 하지만 iOS의 Podcast/Music Player 앱에서는 다른 곳에서 데이터를 가져옵니다. –

+0

@Dave Thanks for the tip! iTunes 메타 데이터에 대한 [비슷한 질문] (http://stackoverflow.com/q/29283960/1418688)에 대한 답변을 찾고 있는데,이 솔루션이 도움이 될지 궁금합니다. 나는 ID3 태그에 완전히 익숙하지 않으며 [이 기사] (http://www.wikihow.com/Convert-Tags-Between-iTunes-and-ID3)의 "Method 3 of 3" 관련 태그는 ID3으로 표시되지 않지만 (의미는 무엇입니까?) MPMediaItem 등의 "Episode #"및 "Season #"속성에 액세스 할 수있는 기회가 있습니까? – Nerrolken

+0

2017 Swift에서 형식 키는 "org.id3"이 아니라 오히려 상수'AVMetadataFormatID3Metadata'입니다. – NSTJ