mirror of
				https://github.com/yattee/yattee.git
				synced 2025-11-03 22:22:02 +00:00 
			
		
		
		
	Prefer VP9/WEBM over H.264/MP4 (fix #128)
This commit is contained in:
		@@ -69,16 +69,33 @@ final class MPVBackend: PlayerBackend {
 | 
			
		||||
        clientTimer.eventHandler = getClientUpdates
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typealias AreInIncreasingOrder = (Stream, Stream) -> Bool
 | 
			
		||||
 | 
			
		||||
    func bestPlayable(_ streams: [Stream], maxResolution: ResolutionSetting) -> Stream? {
 | 
			
		||||
        streams
 | 
			
		||||
            .filter { $0.kind == .adaptive && $0.resolution <= maxResolution.value }
 | 
			
		||||
            .max { $0.resolution < $1.resolution } ??
 | 
			
		||||
            .max { lhs, rhs in
 | 
			
		||||
                let predicates: [AreInIncreasingOrder] = [
 | 
			
		||||
                    { $0.format > $1.format },
 | 
			
		||||
                    { $0.resolution < $1.resolution }
 | 
			
		||||
                ]
 | 
			
		||||
 | 
			
		||||
                for predicate in predicates {
 | 
			
		||||
                    if !predicate(lhs, rhs), !predicate(rhs, lhs) {
 | 
			
		||||
                        continue
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return predicate(lhs, rhs)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return false
 | 
			
		||||
            } ??
 | 
			
		||||
            streams.first { $0.kind == .hls } ??
 | 
			
		||||
            streams.first
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func canPlay(_ stream: Stream) -> Bool {
 | 
			
		||||
        stream.resolution != .unknown && stream.format != "AV1"
 | 
			
		||||
        stream.resolution != .unknown && stream.format != .av1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func playStream(_ stream: Stream, of video: Video, preservingTime: Bool, upgrading _: Bool) {
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,49 @@ class Stream: Equatable, Hashable, Identifiable {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enum Format: String, Comparable {
 | 
			
		||||
        case webm
 | 
			
		||||
        case avc1
 | 
			
		||||
        case av1
 | 
			
		||||
        case mp4
 | 
			
		||||
        case unknown
 | 
			
		||||
 | 
			
		||||
        private var sortOrder: Int {
 | 
			
		||||
            switch self {
 | 
			
		||||
            case .webm:
 | 
			
		||||
                return 0
 | 
			
		||||
            case .mp4:
 | 
			
		||||
                return 1
 | 
			
		||||
            case .avc1:
 | 
			
		||||
                return 2
 | 
			
		||||
            case .av1:
 | 
			
		||||
                return 3
 | 
			
		||||
            case .unknown:
 | 
			
		||||
                return 4
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        static func < (lhs: Self, rhs: Self) -> Bool {
 | 
			
		||||
            lhs.sortOrder < rhs.sortOrder
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        static func from(_ string: String) -> Self {
 | 
			
		||||
            let lowercased = string.lowercased()
 | 
			
		||||
 | 
			
		||||
            if lowercased.contains("webm") {
 | 
			
		||||
                return .webm
 | 
			
		||||
            } else if lowercased.contains("avc1") {
 | 
			
		||||
                return .avc1
 | 
			
		||||
            } else if lowercased.contains("av01") {
 | 
			
		||||
                return .av1
 | 
			
		||||
            } else if lowercased.contains("mpeg_4") || lowercased.contains("mp4") {
 | 
			
		||||
                return .mp4
 | 
			
		||||
            } else {
 | 
			
		||||
                return .unknown
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let id = UUID()
 | 
			
		||||
 | 
			
		||||
    var instance: Instance!
 | 
			
		||||
@@ -88,6 +131,7 @@ class Stream: Equatable, Hashable, Identifiable {
 | 
			
		||||
 | 
			
		||||
    var resolution: Resolution!
 | 
			
		||||
    var kind: Kind!
 | 
			
		||||
    var format: Format!
 | 
			
		||||
 | 
			
		||||
    var encoding: String!
 | 
			
		||||
    var videoFormat: String!
 | 
			
		||||
@@ -109,7 +153,7 @@ class Stream: Equatable, Hashable, Identifiable {
 | 
			
		||||
        self.resolution = resolution
 | 
			
		||||
        self.kind = kind
 | 
			
		||||
        self.encoding = encoding
 | 
			
		||||
        self.videoFormat = videoFormat
 | 
			
		||||
        format = .from(videoFormat ?? "")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var quality: String {
 | 
			
		||||
@@ -120,23 +164,8 @@ class Stream: Equatable, Hashable, Identifiable {
 | 
			
		||||
        return kind == .hls ? "adaptive (HLS)" : "\(resolution.name)\(kind == .stream ? " (\(kind.rawValue))" : "")"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var format: String {
 | 
			
		||||
        let lowercasedFormat = (videoFormat ?? "unknown").lowercased()
 | 
			
		||||
        if lowercasedFormat.contains("webm") {
 | 
			
		||||
            return "WEBM"
 | 
			
		||||
        } else if lowercasedFormat.contains("avc1") {
 | 
			
		||||
            return "avc1"
 | 
			
		||||
        } else if lowercasedFormat.contains("av01") {
 | 
			
		||||
            return "AV1"
 | 
			
		||||
        } else if lowercasedFormat.contains("mpeg_4") || lowercasedFormat.contains("mp4") {
 | 
			
		||||
            return "MP4"
 | 
			
		||||
        } else {
 | 
			
		||||
            return lowercasedFormat
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var description: String {
 | 
			
		||||
        let formatString = format == "unknown" ? "" : " (\(format))"
 | 
			
		||||
        let formatString = format == .unknown ? "" : " (\(format.rawValue))"
 | 
			
		||||
        return "\(quality)\(formatString) - \(instance?.description ?? "")"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user