Skip to content

Instantly share code, notes, and snippets.

@JanGorman
Last active December 23, 2024 16:04
Show Gist options
  • Save JanGorman/9592b7c9dce1c3bf6b87e49637d486a4 to your computer and use it in GitHub Desktop.
Save JanGorman/9592b7c9dce1c3bf6b87e49637d486a4 to your computer and use it in GitHub Desktop.
struct Video {
let title: String
let description: String?
let category: String
let thumbnailUrl: URL?
let …
}
fileprivate extension Player {
// MARK: External metadata
func metadata(fromVideo video: Video, completion: @escaping (_ items: [AVMetadataItem]) -> Void) {
var items = stringItems(fromVideo: video)
if let url = video.thumbnailUrl {
metadataArtworkItem(url) { item in
defer {
completion(items)
}
guard let item = item else { return }
items.append(item)
}
} else {
completion(items)
}
}
func stringItems(fromVideo video: Video) -> [AVMetadataItem] {
var allItems: [AVMetadataItem] = []
allItems.append(metadataItem(AVMetadataCommonIdentifierTitle, value: video.title))
allItems.append(metadataItem(AVMetadataCommonIdentifierDescription, value: video.description?))
allItems.append(metadataItem(AVMetadataIdentifierQuickTimeMetadataGenre, value: video.category))
return allItems
}
func metadataItem(_ identifier: String, value: String?) -> AVMetadataItem {
let item = AVMutableMetadataItem()
item.identifier = identifier
if let value = value {
item.value = value as NSString
}
item.extendedLanguageTag = "und"
return item.copy() as! AVMetadataItem
}
func metadataArtworkItem(_ imageUrl: URL, completion: @escaping (_ item: AVMetadataItem?) -> Void) {
let task = URLSession.shared.dataTask(with: imageUrl) { data, _, error in
guard let data = data, let image = UIImage(data: data), error == nil else {
completion(nil)
return
}
let item = AVMutableMetadataItem()
if let data = UIImagePNGRepresentation(image) {
item.value = data as NSData
}
item.dataType = kCMMetadataBaseDataType_PNG as String
item.identifier = AVMetadataCommonIdentifierArtwork
item.extendedLanguageTag = "und"
completion(item as AVMetadataItem)
}
task.resume()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment