|
|
|
@ -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..<dotRange.lowerBound) |
|
|
|
} |
|
|
|
|
|
|
|
let httpCookieStore = viewModel.httpCookieStore! |
|
|
|
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) { |
|
|
|
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) { |
|
|
|
|