2021-10-23 16:49:45 +00:00
|
|
|
import Foundation
|
|
|
|
#if !os(macOS)
|
|
|
|
import UIKit
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extension PlayerModel {
|
|
|
|
#if os(tvOS)
|
|
|
|
var streamsMenu: UIMenu {
|
|
|
|
UIMenu(
|
|
|
|
title: "Streams",
|
|
|
|
image: UIImage(systemName: "antenna.radiowaves.left.and.right"),
|
|
|
|
children: streamsMenuActions
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
var streamsMenuActions: [UIAction] {
|
|
|
|
guard !availableStreams.isEmpty else {
|
|
|
|
return [ // swiftlint:disable:this implicit_return
|
|
|
|
UIAction(title: "Empty", attributes: .disabled) { _ in }
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2022-08-20 21:05:40 +00:00
|
|
|
return availableStreamsSorted.filter { backend.canPlay($0) }.map { stream in
|
2021-10-23 16:49:45 +00:00
|
|
|
let state = stream == streamSelection ? UIAction.State.on : .off
|
|
|
|
|
|
|
|
return UIAction(title: stream.description, state: state) { _ in
|
|
|
|
self.streamSelection = stream
|
|
|
|
self.upgradeToStream(stream)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var restoreLastSkippedSegmentAction: UIAction? {
|
|
|
|
guard let segment = lastSkipped else {
|
|
|
|
return nil // swiftlint:disable:this implicit_return
|
|
|
|
}
|
|
|
|
|
|
|
|
return UIAction(
|
2021-10-24 12:31:10 +00:00
|
|
|
title: "Restore \(segment.title())",
|
2021-10-23 16:49:45 +00:00
|
|
|
image: UIImage(systemName: "arrow.uturn.left.circle")
|
|
|
|
) { _ in
|
|
|
|
self.restoreLastSkippedSegment()
|
|
|
|
}
|
|
|
|
}
|
2021-11-02 17:24:59 +00:00
|
|
|
|
2022-08-20 21:05:40 +00:00
|
|
|
var switchToMPVAction: UIAction? {
|
|
|
|
UIAction(title: "Switch to MPV", image: UIImage(systemName: "m.circle")) { _ in
|
|
|
|
self.avPlayerBackend.controller?.dismiss(animated: false)
|
|
|
|
self.changeActiveBackend(from: .appleAVPlayer, to: .mpv)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-02 17:24:59 +00:00
|
|
|
private var rateMenu: UIMenu {
|
|
|
|
UIMenu(title: "Playback rate", image: UIImage(systemName: rateMenuSystemImage), children: rateMenuActions)
|
|
|
|
}
|
|
|
|
|
|
|
|
private var rateMenuSystemImage: String {
|
|
|
|
[0.0, 1.0].contains(currentRate) ? "speedometer" : (currentRate < 1.0 ? "tortoise.fill" : "hare.fill")
|
|
|
|
}
|
|
|
|
|
|
|
|
private var rateMenuActions: [UIAction] {
|
|
|
|
PlayerModel.availableRates.map { rate in
|
2022-11-10 22:00:17 +00:00
|
|
|
let image = currentRate == rate ? UIImage(systemName: "checkmark") : nil
|
2021-11-02 17:24:59 +00:00
|
|
|
|
|
|
|
return UIAction(title: rateLabel(rate), image: image) { _ in
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
self.currentRate = rate
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-08-25 23:59:42 +00:00
|
|
|
|
|
|
|
private var playbackModeMenu: UIMenu {
|
|
|
|
UIMenu(title: "Playback Mode", image: UIImage(systemName: playbackMode.systemImage), children: playbackModeMenuActions)
|
|
|
|
}
|
|
|
|
|
|
|
|
private var playbackModeMenuActions: [UIAction] {
|
|
|
|
PlaybackMode.allCases.map { mode in
|
|
|
|
UIAction(title: mode.description, image: UIImage(systemName: mode.systemImage)) { _ in
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
self.playbackMode = mode
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-10-23 16:49:45 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
func rebuildTVMenu() {
|
|
|
|
#if os(tvOS)
|
2022-03-27 11:42:20 +00:00
|
|
|
avPlayerBackend.controller?.playerView.transportBarCustomMenuItems = [
|
2021-10-23 16:49:45 +00:00
|
|
|
restoreLastSkippedSegmentAction,
|
2021-11-02 17:24:59 +00:00
|
|
|
rateMenu,
|
2022-08-20 21:05:40 +00:00
|
|
|
streamsMenu,
|
2022-08-25 23:59:42 +00:00
|
|
|
playbackModeMenu,
|
2022-08-20 21:05:40 +00:00
|
|
|
switchToMPVAction
|
2021-10-23 16:49:45 +00:00
|
|
|
].compactMap { $0 }
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|