800aee09de
* chore: format swift code * chore: format clang code * chore: format kotlin code * refactor: rename folder "API" to "api"
49 lines
1.9 KiB
Swift
49 lines
1.9 KiB
Swift
import AVFoundation
|
|
import AVKit
|
|
import Foundation
|
|
|
|
/*!
|
|
* Collection of helper functions for tvOS specific features
|
|
*/
|
|
|
|
#if os(tvOS)
|
|
enum RCTVideoTVUtils {
|
|
static func makeNavigationMarkerGroups(_ chapters: [Chapter]) -> [AVNavigationMarkersGroup] {
|
|
var metadataGroups = [AVTimedMetadataGroup]()
|
|
|
|
// Iterate over the defined chapters and build a timed metadata group object for each.
|
|
chapters.forEach { chapter in
|
|
metadataGroups.append(makeTimedMetadataGroup(for: chapter))
|
|
}
|
|
|
|
return [AVNavigationMarkersGroup(title: nil, timedNavigationMarkers: metadataGroups)]
|
|
}
|
|
|
|
static func makeTimedMetadataGroup(for chapter: Chapter) -> AVTimedMetadataGroup {
|
|
var metadata = [AVMetadataItem]()
|
|
|
|
// Create a metadata item that contains the chapter title.
|
|
let titleItem = RCTVideoUtils.createMetadataItem(for: .commonIdentifierTitle, value: chapter.title)
|
|
metadata.append(titleItem)
|
|
|
|
// Create a time range for the metadata group.
|
|
let timescale: Int32 = 600
|
|
let startTime = CMTime(seconds: chapter.startTime, preferredTimescale: timescale)
|
|
let endTime = CMTime(seconds: chapter.endTime, preferredTimescale: timescale)
|
|
let timeRange = CMTimeRangeFromTimeToTime(start: startTime, end: endTime)
|
|
|
|
// Image
|
|
if let imgUri = chapter.uri,
|
|
let uri = URL(string: imgUri),
|
|
let imgData = try? Data(contentsOf: uri),
|
|
let image = UIImage(data: imgData),
|
|
let pngData = image.pngData() {
|
|
let imageItem = RCTVideoUtils.createMetadataItem(for: .commonIdentifierArtwork, value: pngData)
|
|
metadata.append(imageItem)
|
|
}
|
|
|
|
return AVTimedMetadataGroup(items: metadata, timeRange: timeRange)
|
|
}
|
|
}
|
|
#endif
|