From 370ddd9cea75eeea43a1eee01258ed772fc4d701 Mon Sep 17 00:00:00 2001 From: schmicma Date: Sun, 17 Apr 2022 21:21:15 +0200 Subject: [PATCH] dirty --- kplayer/core/KSettings.swift | 3 ++ kplayer/master/KSettingsView.swift | 3 ++ kplayer/video/SVideoModel.swift | 3 +- kplayer/video/SVideoPlayer.swift | 15 ++++++--- kplayer/web/KBrowserView.swift | 52 +++++++++++++++--------------- 5 files changed, 44 insertions(+), 32 deletions(-) diff --git a/kplayer/core/KSettings.swift b/kplayer/core/KSettings.swift index 408deb6..1a62059 100644 --- a/kplayer/core/KSettings.swift +++ b/kplayer/core/KSettings.swift @@ -18,6 +18,9 @@ class KSettings: ObservableObject { @Published var edit = false + @Published + var automaticallyWaitsToMinimizeStalling = true + convenience init(model: KSettingsModel) { self.init() scale = model.scale diff --git a/kplayer/master/KSettingsView.swift b/kplayer/master/KSettingsView.swift index b95dc22..750a227 100644 --- a/kplayer/master/KSettingsView.swift +++ b/kplayer/master/KSettingsView.swift @@ -27,6 +27,9 @@ struct KSettingsView: View { Toggle(isOn: $kSettings.edit, label: { Text("Edit") }) + Toggle(isOn: $kSettings.automaticallyWaitsToMinimizeStalling, label: { + Text("Stalling") + }) } } Button(action: { diff --git a/kplayer/video/SVideoModel.swift b/kplayer/video/SVideoModel.swift index 407bd4f..b3dcfe1 100644 --- a/kplayer/video/SVideoModel.swift +++ b/kplayer/video/SVideoModel.swift @@ -36,7 +36,8 @@ class SVideoModel : ObservableObject { @Published var proxy: GeometryProxy? - var observer: Any? + @Published var observer: Any? + @Published var observed: AVPlayer? init(allItems: [MediaItem], currentSnapshot: MediaItem, baseItem: MediaItem) { self.allItems = allItems diff --git a/kplayer/video/SVideoPlayer.swift b/kplayer/video/SVideoPlayer.swift index 1ecc96c..e059da7 100644 --- a/kplayer/video/SVideoPlayer.swift +++ b/kplayer/video/SVideoPlayer.swift @@ -51,9 +51,14 @@ struct SVideoPlayer: View, EditItemDelegate { } func cleanup() { - if model.observer != nil { - player.removeTimeObserver(model.observer) - model.observer = nil + if model.observer != nil && model.observed != nil && model.observed! === player { + do { + player.removeTimeObserver(model.observer) + model.observer = nil + } + catch { + print("exception") + } } } @@ -304,6 +309,7 @@ struct SVideoPlayer: View, EditItemDelegate { } .onAppear() { + model.observed = player model.observer = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.02, preferredTimescale: 600), queue: nil) { time in if timeCounter >= 1 { timeCounter -= 1 @@ -348,7 +354,7 @@ struct SVideoPlayer: View, EditItemDelegate { } } - player.automaticallyWaitsToMinimizeStalling = true + player.automaticallyWaitsToMinimizeStalling = LocalManager.sharedInstance.settings.automaticallyWaitsToMinimizeStalling let item = model.currentPlayerItem() @@ -385,7 +391,6 @@ struct SVideoPlayer: View, EditItemDelegate { player.pause() player.replaceCurrentItem(with: nil) model.currentURL = nil - cleanup() completionHandler!(withSave) } diff --git a/kplayer/web/KBrowserView.swift b/kplayer/web/KBrowserView.swift index 4fdd039..1c105f2 100644 --- a/kplayer/web/KBrowserView.swift +++ b/kplayer/web/KBrowserView.swift @@ -17,6 +17,7 @@ struct KBrowserView: View { @State var webTitle = "" @State var serverMessage = "On Server" @State var dlUrls = [String]() + @State var cookieString = "" var item: String var completionHandler: (() -> Void)? @@ -83,6 +84,7 @@ struct KBrowserView: View { Spacer() Text (serverMessage).foregroundColor(Color.blue) Button(action: { + getCookieHeader() NetworkManager.sharedInstance.dlserverlen { c in serverMessage = "On Server: \(c)"; } @@ -92,18 +94,15 @@ struct KBrowserView: View { }) .buttonStyle(BorderlessButtonStyle()).confirmationDialog("Open", isPresented: $downloadOptions) { - ForEach(dlUrls, id: \.self) { ur in + ForEach(dlUrls, id: \.self) { urlspace in + let ur = urlspace.replacingOccurrences(of: " ", with: "%20") let name = makeLabel(url: ur) HStack { Button(name) { - Task { - await self.preview(url: ur, dl: false) - } + self.preview(url: ur, dl: false) } Button("download \(name)") { - Task { - await self.preview(url: ur, dl: true) - } + self.preview(url: ur, dl: true) } } } @@ -151,7 +150,7 @@ struct KBrowserView: View { }.fullScreenCover(isPresented: $showVideoView, content: { SVideoPlayer(completionHandler: { saved in showVideoView = false - }, model: videoModel!) + }, model: videoModel!).background(Color.black) }) } @@ -173,7 +172,7 @@ struct KBrowserView: View { return name } - func preview(url: String, dl: Bool) async { + func preview(url: String, dl: Bool) { showVideoView = false let url2 = URL(string: url)! @@ -193,23 +192,19 @@ struct KBrowserView: View { let hostcomp = host.split(separator: ".") let site = String(hostcomp[hostcomp.count-2]) - let item = MediaItem(name: name, path: name, root: site, type: ItemType.VIDEO) + let mitem = MediaItem(name: name, path: name, root: site, type: ItemType.VIDEO) if url.starts(with: "/") { - item.externalURL = host + url + mitem.externalURL = host + url } else { - item.externalURL = url + mitem.externalURL = url } - if hostcomp.count > 2 { - let hostEnd = String(hostcomp[1] + "." + hostcomp[2]) - - item.cookies = await getCookieHeader(for: hostEnd) - } + mitem.cookies = cookieString if ((url2.pathExtension == "mp4" || url2.pathExtension == "m3u8") && dl) { - NetworkManager.sharedInstance.downloadToServer(path: site, url: URL(string: item.externalURL!)!, cookies: item.cookies, result: { + NetworkManager.sharedInstance.downloadToServer(path: site, url: URL(string: mitem.externalURL!)!, cookies: mitem.cookies, result: { (r) in print(r) // self.showAlert(title: "download ready", message: r) @@ -219,24 +214,29 @@ struct KBrowserView: View { }) } else { - showVideo(selectedItem: item) + showVideo(selectedItem: mitem) } } - func getCookieHeader(for domain: String? = nil) async -> String { + func getCookieHeader() { + var domain = item + + if let dotRange = domain.range(of: ".") { + domain.removeSubrange(domain.startIndex..