Browse Source

Downloads

master
marcoschmickler 4 years ago
parent
commit
13b7e8f400
  1. 6
      download.js
  2. 8
      kplayer.xcodeproj/project.pbxproj
  3. 2
      kplayer/AppDelegate.swift
  4. 22
      kplayer/core/KSettings.swift
  5. 11
      kplayer/core/KSettingsModel.swift
  6. 1
      kplayer/core/MediaItem.swift
  7. 37
      kplayer/core/NetworkManager.swift
  8. 34
      kplayer/detail/BrowserController.swift
  9. 9
      kplayer/detail/DetailViewController.swift
  10. 15
      kplayer/detail/VideoController.swift
  11. 17
      kplayer/master/KSettingsView.swift
  12. 4
      kplayer/server/kplayer.js
  13. 5
      kplayer/video/BMPlayer.swift

6
download.js

@ -7,7 +7,11 @@
var linkname = "href" var linkname = "href"
window.kplayerUrls = [] window.kplayerUrls = []
if (window.location.hostname.endsWith("hegre.com")) {
if (window.location.hostname.endsWith("doorway.com")) {
links = document.querySelectorAll('a[title="Right click the link below and select save as to download:"]')
linkname = "href"
}
else if (window.location.hostname.endsWith("hegre.com")) {
links = document.querySelectorAll('a[class="members-only"], a[class="image-download"]') links = document.querySelectorAll('a[class="members-only"], a[class="image-download"]')
linkname = "href" linkname = "href"
} }

8
kplayer.xcodeproj/project.pbxproj

@ -20,7 +20,7 @@
1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */; }; 1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */; };
1C73654C9EA6D255CFC039C5 /* NetworkHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73620D01687FB4F1811C5C /* NetworkHelper.swift */; }; 1C73654C9EA6D255CFC039C5 /* NetworkHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73620D01687FB4F1811C5C /* NetworkHelper.swift */; };
1C7365885FAF292F2221ED44 /* PhotoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73673DC671535E3A049F54 /* PhotoController.swift */; }; 1C7365885FAF292F2221ED44 /* PhotoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73673DC671535E3A049F54 /* PhotoController.swift */; };
1C736662E43C6E8FFED11AC4 /* download.js in Sources */ = {isa = PBXBuildFile; fileRef = 1C736C1368E0DE89BAA2DF60 /* download.js */; };
1C73666A07CF2416B1B8D3F0 /* KSettingsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736C94157754DE1C808173 /* KSettingsModel.swift */; };
1C7366A0CFD2B55BF8C3BAF0 /* NetworkDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7364F10BED5DA0F1C0423C /* NetworkDelegate.swift */; }; 1C7366A0CFD2B55BF8C3BAF0 /* NetworkDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7364F10BED5DA0F1C0423C /* NetworkDelegate.swift */; };
1C7366DAC06047DE335EFC37 /* BMPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736927EA28AFBEB25D7487 /* BMPlayer.swift */; }; 1C7366DAC06047DE335EFC37 /* BMPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736927EA28AFBEB25D7487 /* BMPlayer.swift */; };
1C73671FC2CCCACAA2FFC153 /* ThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736EA15A11AF7D57F85824 /* ThumbnailCache.swift */; }; 1C73671FC2CCCACAA2FFC153 /* ThumbnailCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736EA15A11AF7D57F85824 /* ThumbnailCache.swift */; };
@ -108,8 +108,8 @@
1C736B41C6AC33F3FA592C63 /* MediaModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaModel.swift; sourceTree = "<group>"; }; 1C736B41C6AC33F3FA592C63 /* MediaModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaModel.swift; sourceTree = "<group>"; };
1C736B794396F2E50387B8F2 /* stringutil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = stringutil.swift; sourceTree = "<group>"; }; 1C736B794396F2E50387B8F2 /* stringutil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = stringutil.swift; sourceTree = "<group>"; };
1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = "<group>"; }; 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = "<group>"; };
1C736C1368E0DE89BAA2DF60 /* download.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = download.js; sourceTree = "<group>"; };
1C736C7FFBDAC665AE04CB65 /* VideoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoController.swift; sourceTree = "<group>"; }; 1C736C7FFBDAC665AE04CB65 /* VideoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoController.swift; sourceTree = "<group>"; };
1C736C94157754DE1C808173 /* KSettingsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSettingsModel.swift; sourceTree = "<group>"; };
1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = "<group>"; }; 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = "<group>"; };
1C736DBB6986A8B62963FBB3 /* HtmlParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HtmlParser.swift; sourceTree = "<group>"; }; 1C736DBB6986A8B62963FBB3 /* HtmlParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HtmlParser.swift; sourceTree = "<group>"; };
1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; }; 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = "<group>"; };
@ -168,7 +168,6 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
1C73625012D50E457D18A785 /* kplayer.js */, 1C73625012D50E457D18A785 /* kplayer.js */,
1C736C1368E0DE89BAA2DF60 /* download.js */,
1C73615FFA2AA98BD1C56CD4 /* links.html */, 1C73615FFA2AA98BD1C56CD4 /* links.html */,
); );
path = server; path = server;
@ -222,6 +221,7 @@
1C73631C96E6C860833052CA /* ItemType.swift */, 1C73631C96E6C860833052CA /* ItemType.swift */,
1C736DBB6986A8B62963FBB3 /* HtmlParser.swift */, 1C736DBB6986A8B62963FBB3 /* HtmlParser.swift */,
1C736AE5021E3D985FE3402D /* KSettings.swift */, 1C736AE5021E3D985FE3402D /* KSettings.swift */,
1C736C94157754DE1C808173 /* KSettingsModel.swift */,
); );
path = core; path = core;
sourceTree = "<group>"; sourceTree = "<group>";
@ -533,9 +533,9 @@
1C736A06A2AD75B8C14EEBBE /* HtmlParser.swift in Sources */, 1C736A06A2AD75B8C14EEBBE /* HtmlParser.swift in Sources */,
1C736048BFA120F5C7D36874 /* readme.md in Sources */, 1C736048BFA120F5C7D36874 /* readme.md in Sources */,
1C736771C503FB0D52AEB8F7 /* kplayer.js in Sources */, 1C736771C503FB0D52AEB8F7 /* kplayer.js in Sources */,
1C736662E43C6E8FFED11AC4 /* download.js in Sources */,
1C7361B3AF46CEB30D3F4FA0 /* KSettings.swift in Sources */, 1C7361B3AF46CEB30D3F4FA0 /* KSettings.swift in Sources */,
1C73600CB93F16F4F28C116F /* KSettingsView.swift in Sources */, 1C73600CB93F16F4F28C116F /* KSettingsView.swift in Sources */,
1C73666A07CF2416B1B8D3F0 /* KSettingsModel.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

2
kplayer/AppDelegate.swift

@ -26,6 +26,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
let controller = masterNavigationController.topViewController as! MasterViewController let controller = masterNavigationController.topViewController as! MasterViewController
controller.delegate = NetworkDelegate() controller.delegate = NetworkDelegate()
NetworkManager.sharedInstance.loadSettings()
let url = URL(string: NetworkManager.sharedInstance.vidurl)?.appendingPathComponent("ren").appendingPathComponent("kplayer.txt") let url = URL(string: NetworkManager.sharedInstance.vidurl)?.appendingPathComponent("ren").appendingPathComponent("kplayer.txt")
var roots = [MediaItem]() var roots = [MediaItem]()

22
kplayer/core/KSettings.swift

@ -7,5 +7,25 @@ import Foundation
class KSettings: ObservableObject { class KSettings: ObservableObject {
@Published @Published
var scale = 0.5
var scale = Float(0.5)
@Published
var autoloop = false
convenience init(model: KSettingsModel) {
self.init()
scale = model.scale
autoloop = model.autoloop
}
func toModel() -> KSettingsModel {
KSettingsModel(scale: scale, autoloop: autoloop)
}
func toJSON() -> String {
let jsonEncoder = JSONEncoder()
let jsonData = try! jsonEncoder.encode(toModel())
let json = String(data: jsonData, encoding: String.Encoding.utf8)
return json!
}
} }

11
kplayer/core/KSettingsModel.swift

@ -0,0 +1,11 @@
//
// Created by Marco Schmickler on 28.10.21.
// Copyright (c) 2021 Marco Schmickler. All rights reserved.
//
import Foundation
struct KSettingsModel: Codable {
var scale = Float(0.5)
var autoloop = false
}

1
kplayer/core/MediaItem.swift

@ -108,7 +108,6 @@ class MediaItem: CustomDebugStringConvertible {
children = [MediaItem]() children = [MediaItem]()
sortName = computeSortName(name) sortName = computeSortName(name)
length = 5.0 length = 5.0
} }

37
kplayer/core/NetworkManager.swift

@ -13,7 +13,7 @@ class NetworkManager {
let baseurl = "http://linkstation:8080/tomcat/media" let baseurl = "http://linkstation:8080/tomcat/media"
let vidurl = "http://linkstation:8089" let vidurl = "http://linkstation:8089"
let settings = KSettings()
var settings = KSettings()
var authenticated = false var authenticated = false
var offline = false var offline = false
@ -53,6 +53,29 @@ class NetworkManager {
} }
} }
func loadSettings() {
do {
let jsonData = try FileHelper.getData(name: "settings.json")
let model = try JSONDecoder().decode(KSettingsModel.self, from: jsonData)
settings = KSettings(model: model)
} catch {
print(error.localizedDescription)
}
}
func saveSettings() {
let json = settings.toJSON()
let url = FileHelper.getDocumentsDirectory().appendingPathComponent("settings.json")
do {
print (url)
try json.write(to: url, atomically: true, encoding: .utf8)
let input = try String(contentsOf: url)
print(input)
} catch {
print(json)
}
}
func loadFavDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void { func loadFavDirs(_ rootParam: String, completionHandler: @escaping Weiter) -> Void {
var res = [MediaItem]() var res = [MediaItem]()
@ -472,6 +495,14 @@ class NetworkManager {
} }
} }
func dlserverlen(result: @escaping (String) -> ()) {
let p = self.nodeurl + "wgetcount"
print("wgetcount")
AF.request(p).responseString { response in
result(response.value!)
}
}
func favItem(_ item: MediaItem) { func favItem(_ item: MediaItem) {
let url = baseurl + "/service/linkfav" + item.fullPath let url = baseurl + "/service/linkfav" + item.fullPath
@ -583,7 +614,7 @@ class NetworkManager {
} }
} }
func downloadToServer(path: String, url: URL) {
func downloadToServer(path: String, url: URL, result: @escaping (String) -> ()) {
let name = path + "/" + url.lastPathComponent let name = path + "/" + url.lastPathComponent
let queryItems = [URLQueryItem(name: "url", value: url.absoluteString), URLQueryItem(name: "name", value: name)] let queryItems = [URLQueryItem(name: "url", value: url.absoluteString), URLQueryItem(name: "name", value: name)]
@ -600,7 +631,7 @@ class NetworkManager {
let p = urlComps.url! let p = urlComps.url!
print("ffmpeg \(url.lastPathComponent)") print("ffmpeg \(url.lastPathComponent)")
AF.request(p).responseString { response in AF.request(p).responseString { response in
print(response)
result(response.value!)
} }
} }

34
kplayer/detail/BrowserController.swift

@ -16,6 +16,8 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
var web : WebBrowserViewController? var web : WebBrowserViewController?
var dl = false
func setItems(items: [MediaItem]) { func setItems(items: [MediaItem]) {
} }
@ -86,11 +88,13 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
//self.navigationController?.popViewController(animated: true) //self.navigationController?.popViewController(animated: true)
} }
let backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(BrowserController.back(_:))) let backButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(BrowserController.back(_:)))
webBrowserViewController.navigationItem.leftBarButtonItems = [backButton]
let closeButton = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(BrowserController.close(_:)))
webBrowserViewController.navigationItem.leftBarButtonItems = [backButton, closeButton]
let reviewButton = UIBarButtonItem(title:"download", style:UIBarButtonItem.Style.plain, target: self, action: #selector(BrowserController.doDownload(_:))) let reviewButton = UIBarButtonItem(title:"download", style:UIBarButtonItem.Style.plain, target: self, action: #selector(BrowserController.doDownload(_:)))
let dlButton = UIBarButtonItem(title:"server", style:UIBarButtonItem.Style.plain, target: self, action: #selector(BrowserController.doServerDownload(_:)))
webBrowserViewController.navigationItem.rightBarButtonItems = [reviewButton]
webBrowserViewController.navigationItem.rightBarButtonItems = [dlButton, reviewButton]
navigationController?.delegate = self navigationController?.delegate = self
navigationController?.pushViewController(webBrowserViewController, animated: true) navigationController?.pushViewController(webBrowserViewController, animated: true)
@ -98,9 +102,19 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
} }
@objc public func doDownload(_ sender: AnyObject) { @objc public func doDownload(_ sender: AnyObject) {
dl=false
executeDocumentDownloadScript(webView: web!.getWKWebView(), forAbsoluteUrl: "hello")
}
@objc public func doServerDownload(_ sender: AnyObject) {
dl=true
executeDocumentDownloadScript(webView: web!.getWKWebView(), forAbsoluteUrl: "hello") executeDocumentDownloadScript(webView: web!.getWKWebView(), forAbsoluteUrl: "hello")
} }
@IBAction func close(_ sender: AnyObject) {
completionHandler!()
}
@IBAction func back(_ sender: AnyObject) { @IBAction func back(_ sender: AnyObject) {
if (web!.getWKWebView().canGoBack) { if (web!.getWKWebView().canGoBack) {
web!.getWKWebView().goBack() web!.getWKWebView().goBack()
@ -135,6 +149,10 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
let alertController = UIAlertController(title: "Download", message: "Videos found", preferredStyle: .alert) let alertController = UIAlertController(title: "Download", message: "Videos found", preferredStyle: .alert)
NetworkManager.sharedInstance.dlserverlen { c in
alertController.title = "On Server: \(c)";
}
for s in strings { for s in strings {
var name = s var name = s
if let u = URL(string: s) { if let u = URL(string: s) {
@ -178,6 +196,18 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
return return
} }
if (url2.pathExtension == "mp4" && dl) {
NetworkManager.sharedInstance.downloadToServer(path: self.currentItem!.root, url: url2, result: {
(r) in
print(r)
self.showAlert(title: "download ready", message: r)
if (r == "exists") {
}
})
return
}
let name = url2.lastPathComponent let name = url2.lastPathComponent
let vc = VideoController() let vc = VideoController()

9
kplayer/detail/DetailViewController.swift

@ -241,8 +241,10 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
if i.type == ItemType.VIDEO { if i.type == ItemType.VIDEO {
let set = IndexSet(integer: index) let set = IndexSet(integer: index)
if index < detail.children.count { if index < detail.children.count {
if (collectionView != nil) {
collectionView.reloadSections(set) collectionView.reloadSections(set)
} }
}
} else { } else {
if i.parent! !== detail { if i.parent! !== detail {
return return
@ -442,6 +444,13 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
func showWeb(selectedItem: MediaItem) { func showWeb(selectedItem: MediaItem) {
if selectedItem.name.contains("strip") {
let chromeURL = selectedItem.name.replacingOccurrences(of: "https://", with: "googlechrome://")
UIApplication.shared.openURL(URL(string: chromeURL)!)
return
}
let pc = BrowserController() let pc = BrowserController()
pc.setCurrentItem(item: selectedItem) pc.setCurrentItem(item: selectedItem)

15
kplayer/detail/VideoController.swift

@ -142,6 +142,10 @@ class VideoController: UIViewController, ItemController, BMPlayerDelegate {
let inProgress = NetworkManager.sharedInstance.currentDownloads.count let inProgress = NetworkManager.sharedInstance.currentDownloads.count
let alertController = UIAlertController(title: "In Progress: \(inProgress)", message: "Download", preferredStyle: .alert) let alertController = UIAlertController(title: "In Progress: \(inProgress)", message: "Download", preferredStyle: .alert)
NetworkManager.sharedInstance.dlserverlen { c in
alertController.title = "On Server: \(c)";
}
if let c = currentSnapshot { if let c = currentSnapshot {
if (c.loop) { if (c.loop) {
let oneAction = UIAlertAction(title: "One", style: .default) { (action) in let oneAction = UIAlertAction(title: "One", style: .default) { (action) in
@ -173,7 +177,14 @@ class VideoController: UIViewController, ItemController, BMPlayerDelegate {
let serverAction = UIAlertAction(title: "Download to server", style: .default) { (action) in let serverAction = UIAlertAction(title: "Download to server", style: .default) { (action) in
let url = self.currentItem!.playerURL let url = self.currentItem!.playerURL
NetworkManager.sharedInstance.downloadToServer(path: self.currentItem!.root, url: url!)
NetworkManager.sharedInstance.downloadToServer(path: self.currentItem!.root, url: url!, result: {
(r) in
print(r)
self.showAlert(title: "download ready", message: r)
if (r == "exists") {
}
})
} }
alertController.addAction(serverAction) alertController.addAction(serverAction)
@ -414,7 +425,7 @@ print("finish")
if currentItem!.type == ItemType.SNAPSHOT { if currentItem!.type == ItemType.SNAPSHOT {
player.seek(currentItem!.time!) player.seek(currentItem!.time!)
if currentItem!.loop {
if NetworkManager.sharedInstance.settings.autoloop && currentItem!.loop {
loopStart = currentItem!.time! loopStart = currentItem!.time!
loopEnd = currentItem!.time! + currentItem!.length! loopEnd = currentItem!.time! + currentItem!.length!
loopOption = 1 loopOption = 1

17
kplayer/master/KSettingsView.swift

@ -12,23 +12,32 @@ struct KSettingsView: View {
var completionHandler: (() -> Void)? var completionHandler: (() -> Void)?
@State
var scale = 0.5
var body: some View { var body: some View {
Form { Form {
Section(header: Text("K Settings")) { Section(header: Text("K Settings")) {
HStack { HStack {
Text("Size") Text("Size")
Slider(value: $scale, in: 0...1)
Slider(value: $kSettings.scale, in: 0...1)
Toggle(isOn: $kSettings.autoloop, label: {
Text("Autoloop")
})
} }
} }
Button(action: { Button(action: {
NetworkManager.sharedInstance.saveSettings()
self.completionHandler?() self.completionHandler?()
}, label: { }, label: {
Text("ok") Text("ok")
});
Button(action: {
NetworkManager.sharedInstance.loadSettings()
self.completionHandler?()
}, label: {
Text("cancel")
}) })
} }
.onAppear {
}
} }
} }

4
kplayer/server/kplayer.js

@ -1,3 +1,7 @@
// /srv/samba/daten/node
// pm2 list
var express = require('express'); var express = require('express');
var fs = require("fs"); var fs = require("fs");
var path = require("path"); var path = require("path");

5
kplayer/video/BMPlayer.swift

@ -190,8 +190,11 @@ open class BMPlayer: UIView {
let size = asset.avURLAsset.videoSize() let size = asset.avURLAsset.videoSize()
if (size.height < 1500) { if (size.height < 1500) {
zoom = 0.75
zoom = NetworkManager.sharedInstance.settings.scale
if (zoom < 1.0) {
xpos = -100 xpos = -100
}
transformLayer() transformLayer()
} }

Loading…
Cancel
Save