2017-03-22 9 views
1

다음과 같은 코드가 있습니다. 일부 파일의 경우 아티스트, 제목 및 기타 메타 데이터가 문제없이 나타납니다. 다른 파일 메타 데이터 목록에 대해서는 nil이지만 타거 (Tagger)와 같은 편집기에서 메타 데이터를 확인하면 다른 메타 데이터가 존재합니다. 또한 적어도 하나의 키에 대해 외부 편집기에서 메타 데이터를 변경할 때 - 코드가 제대로 작동하기 시작합니다.Swift - 일부 mp3 파일 메타 데이터 반환 없음

누군가 내가 실수를 저에게 설명 할 수 있습니까?

static func getBookInCatalog(url: URL) -> Book { 

    let book = Book(url: url) 
    let isDir: ObjCBool = false 
    var directoryContents = [URL]() 
    var totalTime: CMTime? 
    var size: UInt64 = 0 
    var chapters:Int = 0 

    do { 
     directoryContents = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: []) 
    } catch let error as NSError { 
     print(error.localizedDescription) 
     return book 
    } 

    for item in directoryContents { 

     if !isDir.boolValue { 

      let result = appDelegate.fileTypes.filter { $0==item.pathExtension.lowercased() } 
      if !result.isEmpty { 

       chapters += 1 

       let fileSize = (try! FileManager.default.attributesOfItem(atPath: item.path)[FileAttributeKey.size] as! NSNumber).uint64Value 
       size += fileSize 

       let playerItem = AVPlayerItem(url: item) 
       let metadataList = playerItem.asset.commonMetadata 
       let asset = AVURLAsset(url: item, options: nil) 
       let audioDuration = asset.duration 

       if let _ = totalTime { 
        totalTime = totalTime! + audioDuration 
       } else { 
        totalTime = audioDuration 
       } 

       for metadata in metadataList { 

        guard let key = metadata.commonKey, let value = metadata.value else{ 
         continue 
        } 

        switch key { 
        case "albumName": 
         if book.title == nil || book.title == "" { 
          book.title = (value as? String)! 
         } 
        case "artist": 
         if book.author == nil || book.author == "" { 
          book.author = (value as? String)! 
         } 
        case "artwork" where value is NSData: 
         if book.image == nil { 
          book.image = UIImage(data: (value as! NSData) as Data) 
         } 
        default: 
         continue 
        } 

       } 
      } 
     } 
    } 

    if let imageInsideCatalog = getImageFromFolder(url: url){ 
     book.image = imageInsideCatalog 
    } 

    if book.title == nil { 
     book.title = url.deletingPathExtension().lastPathComponent 
    } 

    book.chapters = chapters 
    book.totalTime = totalTime 
    book.size = size 


    return book 
} 

답변

0

MP3 메타 데이터 "표준"지난 몇 년 동안 여러 주요 반복 (http://id3.org 참조)을 통해 갔다. 편집자가 이전 형식 (AVURLAsset이 지원하지 않을 수 있음)을 읽고 변경 후 호환 가능한 최신/현재 표준을 사용하여 저장할 수 있습니다.