Browse Source

Webview

master
marcoschmickler 4 years ago
parent
commit
1dd53e7751
  1. 4
      kplayer.xcodeproj/project.pbxproj
  2. 2
      kplayer.xcodeproj/xcuserdata/marcoschmickler.xcuserdatad/xcschemes/xcschememanagement.plist
  3. 3
      kplayer/core/KSettings.swift
  4. 18
      kplayer/core/NetworkManager.swift
  5. 3
      kplayer/master/KSettingsView.swift
  6. 8
      kplayer/video/SVideoPlayer.swift
  7. 96
      kplayer/web/KBrowserView.swift
  8. 48
      kplayer/web/WebView.swift
  9. 5
      kplayer/web/WebViewModel.swift
  10. 6
      package.json

4
kplayer.xcodeproj/project.pbxproj

@ -50,6 +50,7 @@
1C736A622876405F3EE2D043 /* EditItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7366C09381DC0052B52B69 /* EditItemView.swift */; };
1C736A7B6221A1D50FB3904C /* ItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73631C96E6C860833052CA /* ItemType.swift */; };
1C736B4B0889BD35DC566124 /* nspersistentcontainer-defaults-swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7361F01841F546FA7AFD58 /* nspersistentcontainer-defaults-swift.swift */; };
1C736C00693A05747578DF87 /* grabber.js in Sources */ = {isa = PBXBuildFile; fileRef = 1C73619BBFA9295A11C9ACBA /* grabber.js */; };
1C736C8DAD6C2FBB9A2EA625 /* SearchItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73654AB95A2D629833BEC5 /* SearchItemView.swift */; };
1C736C9821DA743C2E3F3B07 /* kplayer.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1C7360F9649E40B7C2EAB581 /* kplayer.txt */; };
1C736D16E81BA1FB325200E0 /* HanekeFetchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */; };
@ -102,6 +103,7 @@
1C7360F9835128FC0A198ED0 /* SVideoLoopPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SVideoLoopPlayer.swift; sourceTree = "<group>"; };
1C73611D226B48C24DB37535 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = "<group>"; };
1C73615FFA2AA98BD1C56CD4 /* links.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = links.html; sourceTree = "<group>"; };
1C73619BBFA9295A11C9ACBA /* grabber.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = grabber.js; sourceTree = "<group>"; };
1C7361F01841F546FA7AFD58 /* nspersistentcontainer-defaults-swift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "nspersistentcontainer-defaults-swift.swift"; sourceTree = "<group>"; };
1C73620D01687FB4F1811C5C /* NetworkHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkHelper.swift; sourceTree = "<group>"; };
1C73621E431C9BEC1440B936 /* SVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SVideoPlayer.swift; sourceTree = "<group>"; };
@ -209,6 +211,7 @@
1C73625012D50E457D18A785 /* kplayer.js */,
1C73615FFA2AA98BD1C56CD4 /* links.html */,
1C73645DBD6499A726D34973 /* links.html */,
1C73619BBFA9295A11C9ACBA /* grabber.js */,
);
path = server;
sourceTree = "<group>";
@ -618,6 +621,7 @@
1C7366FF0651A802F09936D6 /* WebViewModel.swift in Sources */,
1C736776CF759CA3DB136F33 /* KBrowserView.swift in Sources */,
1C7369C0A66A8F8CB0E54460 /* WebView.swift in Sources */,
1C736C00693A05747578DF87 /* grabber.js in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

2
kplayer.xcodeproj/xcuserdata/marcoschmickler.xcuserdatad/xcschemes/xcschememanagement.plist

@ -19,7 +19,7 @@
<key>isShown</key>
<false />
<key>orderHint</key>
<integer>5</integer>
<integer>4</integer>
</dict>
<key>kplayerTests.testMyExample.xcscheme</key>
<dict>

3
kplayer/core/KSettings.swift

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

18
kplayer/core/NetworkManager.swift

@ -9,6 +9,7 @@ import Alamofire
class NetworkManager {
static let sharedInstance = NetworkManager()
let localurl = "http://192.168.178.93:8081/"
let nodeurl = "http://linkstation:8081/"
let baseurl = "http://linkstation:8080/tomcat/media"
let vidurl = "http://linkstation:8089"
@ -483,6 +484,23 @@ class NetworkManager {
}
}
func grab(url: URL, cookies: String?, result: @escaping (String) -> ()) {
var queryItems = [URLQueryItem(name: "url", value: url.absoluteString)]
if let c = cookies {
queryItems.append(URLQueryItem(name: "cookies", value: c))
}
var urlComps = URLComponents(string: localurl)!
urlComps.queryItems = queryItems
let p = urlComps.url!
AF.request(p).responseJSON {
(response) in
result("ok")
}
}
func downloadToServer(path: String, url: URL, cookies: String?, result: @escaping (String) -> ()) {
let date = Date()
let format = DateFormatter()

3
kplayer/master/KSettingsView.swift

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

8
kplayer/video/SVideoPlayer.swift

@ -362,7 +362,7 @@ struct SVideoPlayer: View, EditItemDelegate {
player.removeAllItems()
self.player.replaceCurrentItem(with: item)
model.currentURL = model.currentSnapshot.playerURL
print(model.currentURL)
print(model.currentURL!)
// player.removeAllItems()
// player.insert(model.currentPlayerItem(), after: nil)
@ -567,8 +567,12 @@ struct SVideoPlayer: View, EditItemDelegate {
} else {
seekTime(currentSnapshot.time)
}
let height = player.currentItem!.presentationSize.height
let heightSpace = model.proxy!.size.height * 2
var height = heightSpace
if let i = player.currentItem {
height = i.presentationSize.height
}
var f = height / heightSpace
print("h \(height) \(heightSpace) \(f)")

96
kplayer/web/KBrowserView.swift

@ -7,6 +7,7 @@
//
import SwiftUI
import WebKit
struct KBrowserView: View {
@ObservedObject var viewModel = WebViewModel()
@ -20,11 +21,33 @@ struct KBrowserView: View {
@State var cookieString = ""
var item: String
var child = false
var completionHandler: (() -> Void)?
@State var videoModel: SVideoModel?
@State private var showingAlert = false
init(item: String, child: Bool = false, completionHandler: (() -> ())? = nil) {
self.item = item
self.completionHandler = completionHandler
let m = $viewModel.popup
if !child {
viewModel.navigationHandler = { s in
print(s)
m.wrappedValue = false
//
// if s.contains("/scenes/") {
// m.wrappedValue = true
// }
return m.wrappedValue
}
}
}
// For WebView's forward and backward navigation
var webViewNavigationBar: some View {
VStack(spacing: 0) {
@ -76,11 +99,23 @@ struct KBrowserView: View {
VStack(spacing: 0) {
HStack {
Button(action: {
self.viewModel.webViewNavigationPublisher.send(.backward)
}, label: {
Text("back")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
completionHandler!()
}, label: {
Text("cancel")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
toggleFilter()
}, label: {
Text("filter")
}).foregroundColor(viewModel.filter ? Color.yellow : Color.blue)
.buttonStyle(BorderlessButtonStyle())
Spacer()
Text (serverMessage).foregroundColor(Color.blue)
Button(action: {
@ -152,6 +187,11 @@ struct KBrowserView: View {
showVideoView = false
}, model: videoModel!).background(Color.black)
})
// .fullScreenCover(isPresented: $viewModel.popup, content: {
// KBrowserView(item: viewModel.url!.absoluteString, child: false) {
// viewModel.popup = false
// }
// })
}
@ -160,13 +200,16 @@ struct KBrowserView: View {
if let u = URL(string: s) {
name = u.lastPathComponent
if s.contains("720") {
name = name + "720 "
name = name + " 720 "
}
if s.contains("1080") {
name = name + "1080 "
name = name + " 1080 "
}
if s.contains("2160") {
name = name + " 2160 "
}
if s.contains("480") {
name = name + "480 "
name = name + " 480 "
}
}
return name
@ -198,7 +241,7 @@ struct KBrowserView: View {
mitem.externalURL = host + url
}
else {
mitem.externalURL = url
mitem.externalURL = url.replacingOccurrences(of: "//", with: "/")
}
mitem.cookies = cookieString
@ -267,6 +310,49 @@ struct KBrowserView: View {
}
}
func toggleFilter() {
viewModel.filter = !viewModel.filter
if (viewModel.filter) {
let blockRules = """
[
{
"trigger": {
"url-filter": ".*",
"resource-type": ["image"]
},
"action": {
"type": "block"
}
},
{
"trigger": {
"url-filter": ".*",
"resource-type": ["media"]
},
"action": {
"type": "block"
}
}
]
""";
WKContentRuleListStore.default().compileContentRuleList(
forIdentifier: "ContentBlockingRules",
encodedContentRuleList: blockRules) { (contentRuleList, error) in
if let error = error {
print(error)
}
viewModel.userContentController!.add(contentRuleList!)
}
}
else {
viewModel.userContentController!.removeAllContentRuleLists()
}
}
}
struct ContentView_Previews: PreviewProvider {

48
kplayer/web/WebView.swift

@ -49,43 +49,7 @@ struct WebView: UIViewRepresentable, WebViewHandlerDelegate {
configuration.userContentController.add(coordinator, name: "jsError")
configuration.userContentController.add(coordinator, name: "openDocument")
configuration.preferences = preferences
let blockRules = """
[
{
"trigger": {
"url-filter": ".*",
"resource-type": ["image"]
},
"action": {
"type": "block"
}
},
{
"trigger": {
"url-filter": ".*",
"resource-type": ["media"]
},
"action": {
"type": "block"
}
}
]
""";
if LocalManager.sharedInstance.settings.webBlockImages {
WKContentRuleListStore.default().compileContentRuleList(
forIdentifier: "ContentBlockingRules",
encodedContentRuleList: blockRules) { (contentRuleList, error) in
if let error = error {
print(error)
}
configuration.userContentController.add(contentRuleList!)
}
}
viewModel.userContentController = configuration.userContentController
let webView = WKWebView(frame: CGRect.zero, configuration: configuration)
webView.navigationDelegate = context.coordinator
@ -192,6 +156,15 @@ struct WebView: UIViewRepresentable, WebViewHandlerDelegate {
// This function is essential for intercepting every navigation in the webview
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
parent.viewModel.url = navigationAction.request.url
if let nav = parent.viewModel.navigationHandler {
// if nav(nil) {
// decisionHandler(.cancel)
// return
// }
}
// Suppose you don't want your user to go a restricted site
// Here you can get many information about new url from 'navigationAction.request.description'
if let host = navigationAction.request.url?.host {
@ -201,6 +174,7 @@ struct WebView: UIViewRepresentable, WebViewHandlerDelegate {
return
}
}
// This allows the navigation
decisionHandler(.allow)
}

5
kplayer/web/WebViewModel.swift

@ -17,7 +17,12 @@ class WebViewModel: ObservableObject {
var valuePublisher = PassthroughSubject<String, Never>()
var downloadPublisher = PassthroughSubject<[String], Never>()
var httpCookieStore: WKHTTPCookieStore?
var userContentController: WKUserContentController?
var url: URL?
var overview = false
var filter = false
@Published var popup = false
var navigationHandler: ((URL?) -> Bool)?
}
// For identifiying WebView's forward and backward navigation

6
package.json

@ -3,7 +3,9 @@
"version": "1.0.0",
"dependencies": {
"express": "^4.17.3",
"queue" : "^6.0.2",
"multer" : "^1.4.4"
"queue": "^6.0.2",
"multer": "^1.4.4",
"axios": "^0.27.2",
"jsdom": "^19.0.0"
}
}
Loading…
Cancel
Save