mirror of
https://github.com/yattee/yattee.git
synced 2024-12-23 14:03:41 +00:00
Improve streams quality settings
This commit is contained in:
parent
f9a504c3ff
commit
20876584e8
@ -60,7 +60,7 @@ final class AVPlayerBackend: PlayerBackend {
|
||||
addPlayerTimeControlStatusObserver()
|
||||
}
|
||||
|
||||
func bestPlayable(_ streams: [Stream]) -> Stream? {
|
||||
func bestPlayable(_ streams: [Stream], maxResolution _: ResolutionSetting) -> Stream? {
|
||||
streams.first { $0.kind == .hls } ??
|
||||
streams.filter { $0.kind == .adaptive }.max { $0.resolution < $1.resolution } ??
|
||||
streams.first
|
||||
|
@ -52,8 +52,10 @@ final class MPVBackend: PlayerBackend {
|
||||
clientTimer.eventHandler = getClientUpdates
|
||||
}
|
||||
|
||||
func bestPlayable(_ streams: [Stream]) -> Stream? {
|
||||
streams.filter { $0.kind == .adaptive }.max { $0.resolution < $1.resolution } ??
|
||||
func bestPlayable(_ streams: [Stream], maxResolution: ResolutionSetting) -> Stream? {
|
||||
streams
|
||||
.filter { $0.kind == .adaptive && $0.resolution <= maxResolution.value }
|
||||
.max { $0.resolution < $1.resolution } ??
|
||||
streams.first { $0.kind == .hls } ??
|
||||
streams.first
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ protocol PlayerBackend {
|
||||
var isPlaying: Bool { get }
|
||||
var playerItemDuration: CMTime? { get }
|
||||
|
||||
func bestPlayable(_ streams: [Stream]) -> Stream?
|
||||
func bestPlayable(_ streams: [Stream], maxResolution: ResolutionSetting) -> Stream?
|
||||
func canPlay(_ stream: Stream) -> Bool
|
||||
|
||||
func playStream(
|
||||
|
@ -94,13 +94,7 @@ extension PlayerModel {
|
||||
|
||||
streams = streams.filter { backend.canPlay($0) }
|
||||
|
||||
switch quality {
|
||||
case .best:
|
||||
return backend.bestPlayable(streams)
|
||||
default:
|
||||
let sorted = streams.filter { $0.kind != .hls }.sorted { $0.resolution > $1.resolution }.sorted { $0.kind < $1.kind }
|
||||
return sorted.first(where: { $0.resolution.height <= quality.value.height })
|
||||
}
|
||||
return backend.bestPlayable(streams, maxResolution: quality)
|
||||
}
|
||||
|
||||
func advanceToNextItem() {
|
||||
|
@ -5,7 +5,18 @@ import Foundation
|
||||
// swiftlint:disable:next final_class
|
||||
class Stream: Equatable, Hashable, Identifiable {
|
||||
enum Resolution: String, CaseIterable, Comparable, Defaults.Serializable {
|
||||
case hd2160p, hd1440p60, hd1440p, hd1080p60, hd1080p, hd720p60, hd720p, sd480p, sd360p, sd240p, sd144p, unknown
|
||||
case hd2160p
|
||||
case hd1440p60
|
||||
case hd1440p
|
||||
case hd1080p60
|
||||
case hd1080p
|
||||
case hd720p60
|
||||
case hd720p
|
||||
case sd480p
|
||||
case sd360p
|
||||
case sd240p
|
||||
case sd144p
|
||||
case unknown
|
||||
|
||||
var name: String {
|
||||
"\(height)p\(refreshRate != -1 ? ", \(refreshRate) fps" : "")"
|
||||
|
@ -95,12 +95,23 @@ extension Defaults.Keys {
|
||||
}
|
||||
|
||||
enum ResolutionSetting: String, CaseIterable, Defaults.Serializable {
|
||||
case best, hd720p, sd480p, sd360p, sd240p, sd144p
|
||||
case best
|
||||
case hd2160p
|
||||
case hd1440p60
|
||||
case hd1440p
|
||||
case hd1080p60
|
||||
case hd1080p
|
||||
case hd720p60
|
||||
case hd720p
|
||||
case sd480p
|
||||
case sd360p
|
||||
case sd240p
|
||||
case sd144p
|
||||
|
||||
var value: Stream.Resolution {
|
||||
switch self {
|
||||
case .best:
|
||||
return .hd720p
|
||||
return .hd2160p
|
||||
default:
|
||||
return Stream.Resolution(rawValue: rawValue)!
|
||||
}
|
||||
@ -110,6 +121,8 @@ enum ResolutionSetting: String, CaseIterable, Defaults.Serializable {
|
||||
switch self {
|
||||
case .best:
|
||||
return "Best available quality"
|
||||
case .hd2160p:
|
||||
return "4K, 60fps"
|
||||
default:
|
||||
return value.name
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user