import AVFoundation import MediaAccessibility let RCTVideoUnset = -1 /*! * Collection of mutating functions */ enum RCTPlayerOperations { static func setSideloadedText(player:AVPlayer?, textTracks:[TextTrack]?, criteria:SelectedTrackCriteria?) { let type = criteria?.type let textTracks:[TextTrack]! = textTracks ?? RCTVideoUtils.getTextTrackInfo(player) // The first few tracks will be audio & video track let firstTextIndex:Int = 0 for firstTextIndex in 0..<(player?.currentItem?.tracks.count ?? 0) { if player?.currentItem?.tracks[firstTextIndex].assetTrack?.hasMediaCharacteristic(.legible) ?? false { break } } var selectedTrackIndex:Int = RCTVideoUnset if (type == "disabled") { // Do nothing. We want to ensure option is nil } else if (type == "language") { let selectedValue = criteria?.value as? String for i in 0.. index { selectedTrackIndex = index } } } // in the situation that a selected text track is not available (eg. specifies a textTrack not available) if (type != "disabled") && selectedTrackIndex == RCTVideoUnset { let captioningMediaCharacteristics = MACaptionAppearanceCopyPreferredCaptioningMediaCharacteristics(.user) as! CFArray let captionSettings = captioningMediaCharacteristics as? [AnyHashable] if ((captionSettings?.contains(AVMediaCharacteristic.transcribesSpokenDialogForAccessibility)) != nil) { selectedTrackIndex = 0 // If we can't find a match, use the first available track let systemLanguage = NSLocale.preferredLanguages.first for i in 0.. index { mediaOption = group.options[index] } } } else { // default. invalid type or "system" player?.currentItem?.selectMediaOptionAutomatically(in: group) return } // If a match isn't found, option will be nil and text tracks will be disabled player?.currentItem?.select(mediaOption, in:group) } static func setMediaSelectionTrackForCharacteristic(player:AVPlayer?, characteristic:AVMediaCharacteristic, criteria:SelectedTrackCriteria?) { let type = criteria?.type let group:AVMediaSelectionGroup! = player?.currentItem?.asset.mediaSelectionGroup(forMediaCharacteristic: characteristic) var mediaOption:AVMediaSelectionOption! if (type == "disabled") { // Do nothing. We want to ensure option is nil } else if (type == "language") || (type == "title") { let value = criteria?.value as? String for i in 0.. index { mediaOption = group.options[index] } } } else if let group = group { // default. invalid type or "system" player?.currentItem?.selectMediaOptionAutomatically(in: group) return } if let group = group { // If a match isn't found, option will be nil and text tracks will be disabled player?.currentItem?.select(mediaOption, in:group) } } }