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