From af764cf9e9ee2c9453abfdef7669b752e9330716 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Sun, 8 Jun 2025 10:34:54 +0200 Subject: [PATCH] ok should be good now + better quality parsesr --- .../CustomPlayer/CustomPlayer.swift | 99 +++++++------------ .../Modules/ModuleAdditionSettingsView.swift | 4 +- 2 files changed, 40 insertions(+), 63 deletions(-) diff --git a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift index c7068c2..816c933 100644 --- a/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift +++ b/Sora/Utils/MediaPlayer/CustomPlayer/CustomPlayer.swift @@ -1993,20 +1993,15 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele private func parseM3U8(url: URL, completion: @escaping () -> Void) { var request = URLRequest(url: url) - if let mydict = headers, !mydict.isEmpty - { - for (key,value) in mydict - { + if let mydict = headers, !mydict.isEmpty { + for (key,value) in mydict { request.addValue(value, forHTTPHeaderField: key) } - } - else - { + } else { request.addValue("\(module.metadata.baseUrl)", forHTTPHeaderField: "Referer") request.addValue("\(module.metadata.baseUrl)", forHTTPHeaderField: "Origin") } - request.addValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", - forHTTPHeaderField: "User-Agent") + request.addValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", forHTTPHeaderField: "User-Agent") URLSession.shared.dataTask(with: request) { [weak self] data, response, error in guard let self = self, @@ -2023,59 +2018,51 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele let lines = content.components(separatedBy: .newlines) var qualities: [(String, String)] = [] - qualities.append(("Auto (Recommended)", url.absoluteString)) - - func getQualityName(for height: Int) -> String { - switch height { - case 1080...: return "\(height)p (FHD)" - case 720..<1080: return "\(height)p (HD)" - case 480..<720: return "\(height)p (SD)" - default: return "\(height)p" + func getQualityName(from line: String, url: String) -> String? { + if let resRange = line.range(of: "RESOLUTION=") { + let afterRes = line[resRange.upperBound...] + let resString = afterRes.split(separator: ",").first ?? "" + if let heightStr = resString.split(separator: "x").last, + let height = Int(heightStr) { + switch height { + case 1080...: return "\(height)p (FHD)" + case 720..<1080: return "\(height)p (HD)" + case 480..<720: return "\(height)p (SD)" + default: return "\(height)p" + } + } } + if let match = url.range(of: "rendition=([0-9]+p)", options: .regularExpression) { + let rendition = String(url[match]).replacingOccurrences(of: "rendition=", with: "") + return rendition + } + return nil } for (index, line) in lines.enumerated() { if line.contains("#EXT-X-STREAM-INF"), index + 1 < lines.count { - if let resolutionRange = line.range(of: "RESOLUTION="), - let resolutionEndRange = line[resolutionRange.upperBound...].range(of: ",") - ?? line[resolutionRange.upperBound...].range(of: "\n") { - - let resolutionPart = String(line[resolutionRange.upperBound.. secondHeight } - - if let auto = autoQuality { - sortedQualities.insert(auto, at: 0) - } - self.qualities = sortedQualities completion() } @@ -2090,20 +2077,15 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele let wasPlaying = player.rate > 0 var request = URLRequest(url: url) - if let mydict = headers, !mydict.isEmpty - { - for (key,value) in mydict - { + if let mydict = headers, !mydict.isEmpty { + for (key,value) in mydict { request.addValue(value, forHTTPHeaderField: key) } - } - else - { + } else { request.addValue("\(module.metadata.baseUrl)", forHTTPHeaderField: "Referer") request.addValue("\(module.metadata.baseUrl)", forHTTPHeaderField: "Origin") } - request.addValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", - forHTTPHeaderField: "User-Agent") + request.addValue("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", forHTTPHeaderField: "User-Agent") let asset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": request.allHTTPHeaderFields ?? [:]]) let playerItem = AVPlayerItem(asset: asset) @@ -2129,7 +2111,6 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele private func qualitySelectionMenu() -> UIMenu { var menuItems: [UIMenuElement] = [] - if isHLSStream { if qualities.isEmpty { let loadingAction = UIAction(title: "Loading qualities...", attributes: .disabled) { _ in } @@ -2140,10 +2121,8 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele let selectedQuality = qualities.first(where: { $0.1 == currentURL })?.0 { menuTitle = "Quality: \(selectedQuality)" } - for (name, urlString) in qualities { let isCurrentQuality = currentQualityURL?.absoluteString == urlString - let action = UIAction( title: name, state: isCurrentQuality ? .on : .off, @@ -2153,14 +2132,12 @@ class CustomMediaPlayerViewController: UIViewController, UIGestureRecognizerDele ) menuItems.append(action) } - return UIMenu(title: menuTitle, children: menuItems) } } else { let unavailableAction = UIAction(title: "Quality selection unavailable", attributes: .disabled) { _ in } menuItems.append(unavailableAction) } - return UIMenu(title: "Video Quality", children: menuItems) } diff --git a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift index a68ae76..f901d93 100644 --- a/Sora/Utils/Modules/ModuleAdditionSettingsView.swift +++ b/Sora/Utils/Modules/ModuleAdditionSettingsView.swift @@ -119,8 +119,8 @@ struct ModuleAdditionSettingsView: View { VStack(spacing: 0) { FancyUrlRow(title: "Base URL", value: metadata.baseUrl) Divider().padding(.horizontal, 8) - if let searchBaseUrl = metadata.searchBaseUrl, !searchBaseUrl.isEmpty { - FancyUrlRow(title: "Search URL", value: searchBaseUrl) + if !metadata.searchBaseUrl.isEmpty { + FancyUrlRow(title: "Search URL", value: metadata.searchBaseUrl) Divider().padding(.horizontal, 8) } FancyUrlRow(title: "Script URL", value: metadata.scriptUrl)