Ver Fonte

rollback

marinofaggiana há 3 anos atrás
pai
commit
19ef1c2bbc

+ 1 - 0
Cartfile

@@ -5,6 +5,7 @@ github "FabrizioBrancati/Queuer"
 github "xmartlabs/XLForm" ~> 4.1
 github "AssistoLab/DropDown" "v2.3.13"
 
+github "https://github.com/marinofaggiana/KTVHTTPCache" "2.0.2"
 github "https://github.com/marinofaggiana/TOPasscodeViewController" "0.0.10"
 github "https://github.com/marinofaggiana/OpenSSL" "master"
 github "https://github.com/marinofaggiana/ChromaColorPicker" "master"

+ 12 - 0
Nextcloud.xcodeproj/project.pbxproj

@@ -93,6 +93,11 @@
 		F7148059262ED52200693E51 /* NCSectionHeaderMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD57219048040088454D /* NCSectionHeaderMenu.xib */; };
 		F714805E262ED52900693E51 /* NCSectionFooter.xib in Resources */ = {isa = PBXBuildFile; fileRef = F78ACD53219047D40088454D /* NCSectionFooter.xib */; };
 		F7148063262ED66200693E51 /* NCEmptyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F7239876253D86D300257F49 /* NCEmptyView.xib */; };
+		F716B75A26F0995200D37EFC /* KTVHTTPCache.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; };
+		F716B75B26F0995200D37EFC /* KTVHTTPCache.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B86792642CF5300ED5349 /* KTVHTTPCache.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		F716B75C26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; };
+		F716B75D26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F70B867E2642CF5400ED5349 /* KTVCocoaHTTPServer.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		F716B75F26F09DF600D37EFC /* NCKTVHTTPCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */; };
 		F717402D24F699A5000C87D5 /* NCFavorite.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F717402B24F699A5000C87D5 /* NCFavorite.storyboard */; };
 		F717402E24F699A5000C87D5 /* NCFavorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = F717402C24F699A5000C87D5 /* NCFavorite.swift */; };
 		F718C24E254D507B00C5C256 /* NCViewerImageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F718C24D254D507B00C5C256 /* NCViewerImageDetailView.swift */; };
@@ -367,10 +372,12 @@
 			dstPath = "";
 			dstSubfolderSpec = 10;
 			files = (
+				F716B75B26F0995200D37EFC /* KTVHTTPCache.xcframework in Embed Frameworks */,
 				F70B869A2642CF5800ED5349 /* FSCalendar.xcframework in Embed Frameworks */,
 				F70B868E2642CF5600ED5349 /* UICKeyChainStore.xcframework in Embed Frameworks */,
 				F70B86982642CF5700ED5349 /* TOPasscodeViewController.xcframework in Embed Frameworks */,
 				F70B86942642CF5700ED5349 /* OpenSSL.xcframework in Embed Frameworks */,
+				F716B75D26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Embed Frameworks */,
 				F70B868C2642CF5600ED5349 /* Queuer.xcframework in Embed Frameworks */,
 				F70B868A2642CF5600ED5349 /* XLForm.xcframework in Embed Frameworks */,
 				F70B869C2642CF5800ED5349 /* DropDown.xcframework in Embed Frameworks */,
@@ -480,6 +487,7 @@
 		F7151A811D477A4B00E6AF45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A301EE59BB70086BD69 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7169A4C1EE59C640086BD69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
+		F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCKTVHTTPCache.swift; sourceTree = "<group>"; };
 		F716FE7723795E5000FABE50 /* NCCommunication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NCCommunication.framework; path = Carthage/Build/iOS/NCCommunication.framework; sourceTree = "<group>"; };
 		F717402B24F699A5000C87D5 /* NCFavorite.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NCFavorite.storyboard; sourceTree = "<group>"; };
 		F717402C24F699A5000C87D5 /* NCFavorite.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCFavorite.swift; sourceTree = "<group>"; };
@@ -809,7 +817,9 @@
 				F770768E263A8C3400A1BA94 /* FloatingPanel in Frameworks */,
 				F786D58D253454BF00E3DD7B /* NCCommunication in Frameworks */,
 				F70B868B2642CF5600ED5349 /* Queuer.xcframework in Frameworks */,
+				F716B75C26F0995200D37EFC /* KTVCocoaHTTPServer.xcframework in Frameworks */,
 				F782A57B25123694007BBABD /* Realm in Frameworks */,
+				F716B75A26F0995200D37EFC /* KTVHTTPCache.xcframework in Frameworks */,
 				F75E57BD25BF0EC1002B72C2 /* SVGKit in Frameworks */,
 				F70B86752642CE3B00ED5349 /* FirebaseCrashlytics in Frameworks */,
 				F70B86992642CF5800ED5349 /* FSCalendar.xcframework in Frameworks */,
@@ -1204,6 +1214,7 @@
 		F79EDA9E26B004980007D134 /* NCViewerVideo */ = {
 			isa = PBXGroup;
 			children = (
+				F716B75E26F09DF600D37EFC /* NCKTVHTTPCache.swift */,
 				F79EDA9F26B004980007D134 /* NCViewerVideoToolBar.swift */,
 				F79EDAA126B004980007D134 /* NCViewerVideo.swift */,
 				F79EDAA226B004980007D134 /* NCViewerAVPlayerViewController.swift */,
@@ -2127,6 +2138,7 @@
 				F78A18B823CDE2B300F681F3 /* NCViewerRichWorkspace.swift in Sources */,
 				F77910AB25DD53C700CEDB9E /* NCSettingsBundleHelper.swift in Sources */,
 				F78A18B623CDD07D00F681F3 /* NCViewerRichWorkspaceWebView.swift in Sources */,
+				F716B75F26F09DF600D37EFC /* NCKTVHTTPCache.swift in Sources */,
 				F75A9EE623796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				F758B460212C56A400515F55 /* ScanCollectionView.swift in Sources */,
 				F78ACD52219046DC0088454D /* NCSectionHeaderFooter.swift in Sources */,

+ 129 - 0
iOSClient/Viewer/NCViewerVideo/NCKTVHTTPCache.swift

@@ -0,0 +1,129 @@
+//
+//  NCKTVHTTPCache.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 28/10/2020.
+//  Copyright © 2020 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import UIKit
+import KTVHTTPCache
+
+class NCKTVHTTPCache: NSObject {
+    @objc static let shared: NCKTVHTTPCache = {
+        let instance = NCKTVHTTPCache()
+        instance.setupHTTPCache()
+        return instance
+    }()
+    
+    func getVideoURL(metadata: tableMetadata) -> URL? {
+        
+        if CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: metadata.fileNameView) {
+            
+            return URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
+            
+        } else {
+            
+            guard let stringURL = (metadata.serverUrl + "/" + metadata.fileName).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return nil }
+            
+            return NCKTVHTTPCache.shared.getProxyURL(stringURL: stringURL)
+        }
+    }
+    
+    func startProxy(user: String, password: String, metadata: tableMetadata) {
+        
+        guard let authData = (user + ":" + password).data(using: .utf8) else { return }
+        
+        let authValue = "Basic " + authData.base64EncodedString(options: [])
+        KTVHTTPCache.downloadSetAdditionalHeaders(["Authorization":authValue, "User-Agent":CCUtility.getUserAgent()])
+        
+        if !KTVHTTPCache.proxyIsRunning() {
+            do {
+                try KTVHTTPCache.proxyStart()
+            } catch let error {
+                print("Proxy Start error : \(error)")
+            }
+        }        
+    }
+    
+    func stopProxy(metadata: tableMetadata) {
+        
+        if KTVHTTPCache.proxyIsRunning() {
+            KTVHTTPCache.proxyStop()
+        }
+        
+        saveCache(metadata: metadata)
+    }
+    
+    func getProxyURL(stringURL: String) -> URL {
+        
+        return KTVHTTPCache.proxyURL(withOriginalURL: URL(string: stringURL))
+    }
+    
+    func getCacheCompleteFileURL(videoURL: URL?) -> URL? {
+        
+        return KTVHTTPCache.cacheCompleteFileURL(with: videoURL)
+    }
+    
+    func deleteCache(videoURL: URL?) {
+        
+        KTVHTTPCache.cacheDelete(with: videoURL)
+    }
+    
+    func saveCache(metadata: tableMetadata) {
+        
+        if !CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView:metadata.fileNameView) {
+            
+            guard let stringURL = (metadata.serverUrl + "/" + metadata.fileName).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return }
+            
+            let videoURL = URL(string: stringURL)
+            guard let url = KTVHTTPCache.cacheCompleteFileURL(with: videoURL) else { return }
+            
+            CCUtility.copyFile(atPath: url.path, toPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
+            NCManageDatabase.shared.addLocalFile(metadata: metadata)
+            KTVHTTPCache.cacheDelete(with: videoURL)
+            
+            NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterReloadDataSource, userInfo: ["ocId":metadata.ocId, "serverUrl":metadata.serverUrl])
+        }
+    }
+    
+    private func setupHTTPCache() {
+        
+        KTVHTTPCache.cacheSetMaxCacheLength(NCGlobal.shared.maxHTTPCache)
+        
+        if ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] != nil {
+            KTVHTTPCache.logSetConsoleLogEnable(true)
+        }
+        
+        do {
+            try KTVHTTPCache.proxyStart()
+        } catch let error {
+            print("Proxy Start error : \(error)")
+        }
+        
+        KTVHTTPCache.encodeSetURLConverter { (url) -> URL? in
+            print("URL Filter reviced URL : " + String(describing: url))
+            return url
+        }
+        
+        KTVHTTPCache.downloadSetUnacceptableContentTypeDisposer { (url, contentType) -> Bool in
+            print("Unsupport Content-Type Filter reviced URL : " + String(describing: url) + " " + String(describing: contentType))
+            return false
+        }
+    }
+}

+ 13 - 2
iOSClient/Viewer/NCViewerVideo/NCViewerAVPlayerViewController.swift

@@ -49,7 +49,9 @@ class NCViewerAVPlayerViewController: AVPlayerViewController {
     
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
-                
+        
+        NCKTVHTTPCache.shared.startProxy(user: appDelegate.user, password: appDelegate.password, metadata: metadata)
+        
         func play(url: URL) {
             
             player = AVPlayer(url: url)
@@ -99,11 +101,19 @@ class NCViewerAVPlayerViewController: AVPlayerViewController {
             
         } else {
             
+            /*
             NCCommunication.shared.getDirectDownload(fileId: metadata.fileId) { account, url, errorCode, errorDescription in
+                
                 if let url = URL(string: url) {
                     play(url: url)
                 }
             }
+            */
+            
+            if let url = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata) {
+                play(url: url)
+            }
+            
         }
     }
     
@@ -122,6 +132,7 @@ class NCViewerAVPlayerViewController: AVPlayerViewController {
             if rateObserverToken != nil {
                 player?.removeObserver(self, forKeyPath: "rate")
                 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
+                NCKTVHTTPCache.shared.stopProxy(metadata: metadata)
                 self.rateObserverToken = nil
             }
         }
@@ -130,7 +141,7 @@ class NCViewerAVPlayerViewController: AVPlayerViewController {
     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
         
         if keyPath != nil && keyPath == "rate" {
-           //NCKTVHTTPCache.shared.saveCache(metadata: metadata)
+           NCKTVHTTPCache.shared.saveCache(metadata: metadata)
         }
     }
 }

+ 29 - 27
iOSClient/Viewer/NCViewerVideo/NCViewerVideo.swift

@@ -24,11 +24,12 @@
 import Foundation
 import NCCommunication
 
-class NCViewerVideo: NSObject, AVAssetResourceLoaderDelegate {
+class NCViewerVideo: NSObject {
     
     private let appDelegate = UIApplication.shared.delegate as! AppDelegate
     private var progressView: UIProgressView?
 
+    private var videoLayer: AVPlayerLayer?
     private var view: UIView?
     private var timeObserver: Any?
     private var rateObserver: Any?
@@ -36,8 +37,6 @@ class NCViewerVideo: NSObject, AVAssetResourceLoaderDelegate {
     
     public var viewerVideoToolBar: NCViewerVideoToolBar?
     public var player: AVPlayer?
-    public var videoLayer: AVPlayerLayer?
-    public var playerItem: AVPlayerItem?
     public var pictureInPictureOcId: String = ""
     
     init(view: UIView?, progressView: UIProgressView?, viewerVideoToolBar: NCViewerVideoToolBar?) {
@@ -65,22 +64,20 @@ class NCViewerVideo: NSObject, AVAssetResourceLoaderDelegate {
     }
     
     func videoPlay(metadata: tableMetadata) {
-        guard let view = self.view else { return }
         self.metadata = metadata
         
-        NCNetworking.shared.getVideoUrl(metadata: metadata) { url in
-            if let url = url {
-                let urlAsset = AVURLAsset(url: url)
-                urlAsset.resourceLoader.setDelegate(self, queue: .main)
-                
-                self.playerItem = AVPlayerItem(asset: urlAsset)
-                
-                self.player = AVPlayer(playerItem: self.playerItem)
-                self.player?.isMuted = CCUtility.getAudioMute()
-                
-                self.videoLayer = AVPlayerLayer(player: self.player)
-                self.videoLayer?.frame = view.bounds
-                self.videoLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
+        NCKTVHTTPCache.shared.startProxy(user: appDelegate.user, password: appDelegate.password, metadata: metadata)
+        
+        func play(url: URL) {
+            
+            self.player = AVPlayer(url: url)
+            self.player?.isMuted = CCUtility.getAudioMute()
+            self.videoLayer = AVPlayerLayer(player: self.player)
+
+            if let view = view  {
+
+                self.videoLayer!.frame = view.bounds
+                self.videoLayer!.videoGravity = AVLayerVideoGravity.resizeAspectFill
                 view.layer.addSublayer(self.videoLayer!)
                 
                 // At end go back to start
@@ -92,27 +89,31 @@ class NCViewerVideo: NSObject, AVAssetResourceLoaderDelegate {
                         }
                     }
                 }
-                
+                            
                 self.rateObserver = self.player?.addObserver(self, forKeyPath: "rate", options: [], context: nil)
                 
                 if self.pictureInPictureOcId != metadata.ocId {
                     self.player?.play()
                 }
-                
-                // TOOLBAR
-                self.viewerVideoToolBar?.setPlayer(player: self.player)
-                self.viewerVideoToolBar?.setToolBar()
             }
+            
+            // TOOLBAR
+            viewerVideoToolBar?.setPlayer(player: player)
+            viewerVideoToolBar?.setToolBar()
+        }
+        
+        //NCNetworking.shared.getVideoUrl(metadata: metadata) { url in
+        //            if let url = url {
+        //}
+
+        if let url = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata) {
+            play(url: url)
         }
-    }
-    
-    func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForResponseTo authenticationChallenge: URLAuthenticationChallenge) -> Bool {
-        return true
     }
     
     func videoStop() {
         
-       // guard let metadata = self.metadata else { return }
+        guard let metadata = self.metadata else { return }
         
         player?.pause()
         player?.seek(to: CMTime.zero)
@@ -126,6 +127,7 @@ class NCViewerVideo: NSObject, AVAssetResourceLoaderDelegate {
         if rateObserver != nil {
             player?.removeObserver(self, forKeyPath: "rate")
             NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
+            NCKTVHTTPCache.shared.stopProxy(metadata: metadata)
             self.rateObserver = nil
         }