Browse Source

https://github.com/nextcloud/ios/issues/693

Signed-off-by: marinofaggiana <ios@nextcloud.com>
marinofaggiana 3 years ago
parent
commit
974793bbbb

+ 1 - 1
Cartfile

@@ -1,3 +1,3 @@
-github "https://github.com/marinofaggiana/KTVHTTPCache" "2.0.2"
+github "https://github.com/marinofaggiana/KTVHTTPCache" "master"
 github "https://github.com/marinofaggiana/TOPasscodeViewController" "master"
 github "krzyzanowskim/OpenSSL"

+ 1 - 1
Cartfile.resolved

@@ -1,3 +1,3 @@
 github "krzyzanowskim/OpenSSL" "1.1.1300"
-github "marinofaggiana/KTVHTTPCache" "2.0.2"
+github "marinofaggiana/KTVHTTPCache" "6683b2e2686d172e087fde9a2552b401e3c1b9f6"
 github "marinofaggiana/TOPasscodeViewController" "a1b9d1058b2648e636525fc368e220a0cfddb42a"

+ 1 - 0
iOSClient/Supporting Files/en.lproj/Localizable.strings

@@ -830,6 +830,7 @@
 "_certificates_"            = "Certificates";
 "_privacy_screen_"          = "Splash screen when app inactive";
 "_saving_"                  = "Saving …";
+"_video_not_streamed_"      = "The server does not allow video streaming, do you want to download it?";
 // Video
 "_video_processing_"        = "Video processing";
 "_video_being_processed_"   = "Video being processed …";

+ 11 - 4
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCKTVHTTPCache.swift

@@ -31,17 +31,17 @@ class NCKTVHTTPCache: NSObject {
         return instance
     }()
 
-    func getVideoURL(metadata: tableMetadata) -> URL? {
+    func getVideoURL(metadata: tableMetadata) -> (url: URL?, isProxy: Bool) {
 
         if CCUtility.fileProviderStorageExists(metadata) {
 
-            return URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))
+            return (URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)), false)
 
         } else {
 
-            guard let stringURL = (metadata.serverUrl + "/" + metadata.fileName).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return nil }
+            guard let stringURL = (metadata.serverUrl + "/" + metadata.fileName).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return (nil, false) }
 
-            return NCKTVHTTPCache.shared.getProxyURL(stringURL: stringURL)
+            return (NCKTVHTTPCache.shared.getProxyURL(stringURL: stringURL), true)
         }
     }
 
@@ -109,6 +109,13 @@ class NCKTVHTTPCache: NSObject {
         }
     }
 
+    func getDownloadStatusCode(metadata: tableMetadata) -> Int {
+
+        let stringURL = (metadata.serverUrl + "/" + metadata.fileName)//.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return 0 }
+        let url = URL(string: stringURL)
+        return KTVHTTPCache.downloadStatusCode(url)
+    }
+
     private func setupHTTPCache() {
 
         KTVHTTPCache.cacheSetMaxCacheLength(NCGlobal.shared.maxHTTPCache)

+ 73 - 6
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift

@@ -26,6 +26,8 @@ import NCCommunication
 import UIKit
 import AVFoundation
 import MediaPlayer
+import JGProgressHUD
+import Alamofire
 
 class NCPlayer: NSObject {
    
@@ -33,6 +35,8 @@ class NCPlayer: NSObject {
     internal var url: URL
     internal var playerToolBar: NCPlayerToolBar?
     internal var viewController: UIViewController
+    internal var autoPlay: Bool
+    internal var isProxy: Bool
 
     private var imageVideoContainer: imageVideoContainerView
     private var detailView: NCViewerMediaDetailView?
@@ -46,9 +50,11 @@ class NCPlayer: NSObject {
 
     // MARK: - View Life Cycle
 
-    init(url: URL, autoPlay: Bool, imageVideoContainer: imageVideoContainerView, playerToolBar: NCPlayerToolBar?, metadata: tableMetadata, detailView: NCViewerMediaDetailView?, viewController: UIViewController) {
+    init(url: URL, autoPlay: Bool, isProxy: Bool, imageVideoContainer: imageVideoContainerView, playerToolBar: NCPlayerToolBar?, metadata: tableMetadata, detailView: NCViewerMediaDetailView?, viewController: UIViewController) {
         
         self.url = url
+        self.autoPlay = autoPlay
+        self.isProxy = isProxy
         self.imageVideoContainer = imageVideoContainer
         self.playerToolBar = playerToolBar
         self.metadata = metadata
@@ -65,6 +71,11 @@ class NCPlayer: NSObject {
             print(error)
         }
         
+        startSession()
+    }
+    
+    internal func startSession() {
+        
         #if MFFFLIB
         if CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: NCGlobal.shared.fileNameVideoEncoded) {
             self.url = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: NCGlobal.shared.fileNameVideoEncoded))
@@ -75,23 +86,43 @@ class NCPlayer: NSObject {
             MFFF.shared.dismissMessage()
         }
         #endif
-              
+        
         openAVPlayer() { status, error in
             
             switch status {
             case .loaded:
-                if autoPlay {
+                if self.autoPlay {
                     self.player?.play()
                 }
                 break
             case .failed:
+                let proxyStatusCode = NCKTVHTTPCache.shared.getDownloadStatusCode(metadata: self.metadata)
                 #if MFFFLIB
                 self.convertVideo(error: error)
                 #else
-                if let title = error?.localizedDescription, let description = error?.localizedFailureReason {
-                    NCContentPresenter.shared.messageNotification(title, description: description, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max)
+                if self.isProxy && proxyStatusCode == 200 && error?.code != AVError.Code.fileFormatNotRecognized.rawValue {
+                    let alertController = UIAlertController(title: NSLocalizedString("_error_", value: "Error", comment: ""), message: NSLocalizedString("_video_not_streamed_", comment: ""), preferredStyle: .alert)
+                    alertController.addAction(UIAlertAction(title: NSLocalizedString("_yes_", value: "Yes", comment: ""), style: .default, handler: { action in
+                        self.downloadVideo(metadata: self.metadata, view: self.viewController.view) { error in
+                            let urlVideo = NCKTVHTTPCache.shared.getVideoURL(metadata: self.metadata)
+                            if error == nil, let url = urlVideo.url {
+                                self.url = url
+                                self.isProxy = urlVideo.isProxy
+                                self.startSession()
+                            }
+                        }
+                    }))
+                    alertController.addAction(UIAlertAction(title: NSLocalizedString("_no_", value: "No", comment: ""), style: .default, handler: { action in
+                        // nothing
+                    }))
+                    self.viewController.present(alertController, animated: true)
+                    self.playerToolBar?.hide()
                 } else {
-                    NCContentPresenter.shared.messageNotification("_error_", description: "_error_something_wrong_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max)
+                    if let title = error?.localizedDescription, let description = error?.localizedFailureReason {
+                        NCContentPresenter.shared.messageNotification(title, description: description, delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max)
+                    } else {
+                        NCContentPresenter.shared.messageNotification("_error_", description: "_error_something_wrong_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.error, errorCode: NCGlobal.shared.errorGeneric, priority: .max)
+                    }
                 }
                 #endif
                 break
@@ -155,6 +186,42 @@ class NCPlayer: NSObject {
             }
         })
     }
+    
+    internal func downloadVideo(metadata: tableMetadata, view: UIView, completion: @escaping (_ error: AFError?)->()) {
+        
+        let serverUrlFileName = metadata.serverUrl + "/" + metadata.fileName
+        let fileNameLocalPath = CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView)!
+        let hud = JGProgressHUD()
+        var downloadRequest: DownloadRequest?
+        
+        
+        hud.indicatorView = JGProgressHUDRingIndicatorView()
+        if let indicatorView = hud.indicatorView as? JGProgressHUDRingIndicatorView {
+            indicatorView.ringWidth = 1.5
+        }
+        hud.show(in: view)
+        hud.textLabel.text = NSLocalizedString(metadata.fileNameView, comment: "")
+        hud.detailTextLabel.text = NSLocalizedString("_tap_to_cancel_", comment: "")
+        hud.tapOnHUDViewBlock = { hud in
+            downloadRequest?.cancel()
+            hud.dismiss()
+        }
+        
+        NCCommunication.shared.download(serverUrlFileName: serverUrlFileName, fileNameLocalPath: fileNameLocalPath) { request in
+            downloadRequest = request
+        } taskHandler: { task in
+            // task
+        } progressHandler: { progress in
+            hud.progress = Float(progress.fractionCompleted)
+        } completionHandler: { account, etag, date, lenght, allHeaderFields, error, errorCode, _ in
+            if error == nil {
+                NCManageDatabase.shared.addLocalFile(metadata: metadata)
+                CCUtility.setExif(metadata) { _, _, _, _, _ in }
+            }
+            hud.dismiss()
+            completion(error)
+        }
+    }
 
     deinit {
         print("deinit NCPlayer")

+ 3 - 2
iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift

@@ -160,9 +160,10 @@ class NCViewerMedia: UIViewController {
         if metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue {
 
             NCKTVHTTPCache.shared.restartProxy(user: appDelegate.user, password: appDelegate.password)
+            let urlVideo = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata)
 
-            if ncplayer == nil, let url = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata) {
-                self.ncplayer = NCPlayer.init(url: url, autoPlay: self.autoPlay, imageVideoContainer: self.imageVideoContainer, playerToolBar: self.playerToolBar, metadata: self.metadata, detailView: self.detailView, viewController: self)
+            if ncplayer == nil, let url = urlVideo.url {
+                self.ncplayer = NCPlayer.init(url: url, autoPlay: self.autoPlay, isProxy: urlVideo.isProxy, imageVideoContainer: self.imageVideoContainer, playerToolBar: self.playerToolBar, metadata: self.metadata, detailView: self.detailView, viewController: self)
             } else {
                 self.ncplayer?.activateObserver(playerToolBar: self.playerToolBar)
                 if detailView.isShow() == false && ncplayer?.isPlay() == false {

+ 4 - 2
iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift

@@ -587,8 +587,10 @@ extension NCViewerMediaPage: UIGestureRecognizerDelegate {
 
                 AudioServicesPlaySystemSound(1519) // peek feedback
 
-                if let url = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata) {
-                    self.ncplayerLivePhoto = NCPlayer.init(url: url, autoPlay: true, imageVideoContainer: self.currentViewController.imageVideoContainer, playerToolBar: nil, metadata: metadata, detailView: nil, viewController: self)
+                let urlVideo = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata)
+                
+                if let url = urlVideo.url {
+                    self.ncplayerLivePhoto = NCPlayer.init(url: url, autoPlay: true, isProxy: urlVideo.isProxy, imageVideoContainer: self.currentViewController.imageVideoContainer, playerToolBar: nil, metadata: metadata, detailView: nil, viewController: self)
                 }
             }