Browse Source

dirty

master
schmicma 4 years ago
parent
commit
370ddd9cea
  1. 3
      kplayer/core/KSettings.swift
  2. 3
      kplayer/master/KSettingsView.swift
  3. 3
      kplayer/video/SVideoModel.swift
  4. 15
      kplayer/video/SVideoPlayer.swift
  5. 52
      kplayer/web/KBrowserView.swift

3
kplayer/core/KSettings.swift

@ -18,6 +18,9 @@ class KSettings: ObservableObject {
@Published @Published
var edit = false var edit = false
@Published
var automaticallyWaitsToMinimizeStalling = true
convenience init(model: KSettingsModel) { convenience init(model: KSettingsModel) {
self.init() self.init()
scale = model.scale scale = model.scale

3
kplayer/master/KSettingsView.swift

@ -27,6 +27,9 @@ struct KSettingsView: View {
Toggle(isOn: $kSettings.edit, label: { Toggle(isOn: $kSettings.edit, label: {
Text("Edit") Text("Edit")
}) })
Toggle(isOn: $kSettings.automaticallyWaitsToMinimizeStalling, label: {
Text("Stalling")
})
} }
} }
Button(action: { Button(action: {

3
kplayer/video/SVideoModel.swift

@ -36,7 +36,8 @@ class SVideoModel : ObservableObject {
@Published var proxy: GeometryProxy? @Published var proxy: GeometryProxy?
var observer: Any?
@Published var observer: Any?
@Published var observed: AVPlayer?
init(allItems: [MediaItem], currentSnapshot: MediaItem, baseItem: MediaItem) { init(allItems: [MediaItem], currentSnapshot: MediaItem, baseItem: MediaItem) {
self.allItems = allItems self.allItems = allItems

15
kplayer/video/SVideoPlayer.swift

@ -51,9 +51,14 @@ struct SVideoPlayer: View, EditItemDelegate {
} }
func cleanup() { 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() { .onAppear() {
model.observed = player
model.observer = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.02, preferredTimescale: 600), queue: nil) { time in model.observer = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.02, preferredTimescale: 600), queue: nil) { time in
if timeCounter >= 1 { if timeCounter >= 1 {
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() let item = model.currentPlayerItem()
@ -385,7 +391,6 @@ struct SVideoPlayer: View, EditItemDelegate {
player.pause() player.pause()
player.replaceCurrentItem(with: nil) player.replaceCurrentItem(with: nil)
model.currentURL = nil model.currentURL = nil
cleanup()
completionHandler!(withSave) completionHandler!(withSave)
} }

52
kplayer/web/KBrowserView.swift

@ -17,6 +17,7 @@ struct KBrowserView: View {
@State var webTitle = "" @State var webTitle = ""
@State var serverMessage = "On Server" @State var serverMessage = "On Server"
@State var dlUrls = [String]() @State var dlUrls = [String]()
@State var cookieString = ""
var item: String var item: String
var completionHandler: (() -> Void)? var completionHandler: (() -> Void)?
@ -83,6 +84,7 @@ struct KBrowserView: View {
Spacer() Spacer()
Text (serverMessage).foregroundColor(Color.blue) Text (serverMessage).foregroundColor(Color.blue)
Button(action: { Button(action: {
getCookieHeader()
NetworkManager.sharedInstance.dlserverlen { c in NetworkManager.sharedInstance.dlserverlen { c in
serverMessage = "On Server: \(c)"; serverMessage = "On Server: \(c)";
} }
@ -92,18 +94,15 @@ struct KBrowserView: View {
}) })
.buttonStyle(BorderlessButtonStyle()).confirmationDialog("Open", isPresented: $downloadOptions) { .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) let name = makeLabel(url: ur)
HStack { HStack {
Button(name) { Button(name) {
Task {
await self.preview(url: ur, dl: false)
}
self.preview(url: ur, dl: false)
} }
Button("download \(name)") { 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: { }.fullScreenCover(isPresented: $showVideoView, content: {
SVideoPlayer(completionHandler: { saved in SVideoPlayer(completionHandler: { saved in
showVideoView = false showVideoView = false
}, model: videoModel!)
}, model: videoModel!).background(Color.black)
}) })
} }
@ -173,7 +172,7 @@ struct KBrowserView: View {
return name return name
} }
func preview(url: String, dl: Bool) async {
func preview(url: String, dl: Bool) {
showVideoView = false showVideoView = false
let url2 = URL(string: url)! let url2 = URL(string: url)!
@ -193,23 +192,19 @@ struct KBrowserView: View {
let hostcomp = host.split(separator: ".") let hostcomp = host.split(separator: ".")
let site = String(hostcomp[hostcomp.count-2]) 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: "/") { if url.starts(with: "/") {
item.externalURL = host + url
mitem.externalURL = host + url
} }
else { 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) { 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 (r) in
print(r) print(r)
// self.showAlert(title: "download ready", message: r) // self.showAlert(title: "download ready", message: r)
@ -219,24 +214,29 @@ struct KBrowserView: View {
}) })
} }
else { 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..<dotRange.lowerBound)
}
let httpCookieStore = viewModel.httpCookieStore! let httpCookieStore = viewModel.httpCookieStore!
var cookieDict = [HTTPCookie]() var cookieDict = [HTTPCookie]()
let cookies = await httpCookieStore.allCookies()
for cookie in cookies {
if let domain = domain {
let cookies = httpCookieStore.getAllCookies { cookies in
for cookie in cookies {
if cookie.domain.contains(domain) { if cookie.domain.contains(domain) {
cookieDict.append(cookie) cookieDict.append(cookie)
} }
} }
}
let values = HTTPCookie.requestHeaderFields(with: cookieDict)
let values = HTTPCookie.requestHeaderFields(with: cookieDict)
return values["Cookie"]!
cookieString = values["Cookie"]!
}
} }
func showVideo(selectedItem: MediaItem) { func showVideo(selectedItem: MediaItem) {

Loading…
Cancel
Save