Эх сурвалжийг харах

Merge pull request #1972 from nextcloud/ImprovedVideo

Improved video (FIX)
Marino Faggiana 3 жил өмнө
parent
commit
7a61792ed7

+ 1 - 1
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -808,7 +808,7 @@ extension NCManageDatabase {
         return getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account, serverUrl, fileNameConflict))
     }
 
-    func getSubtitles(account: String, serverUrl: String, fileName: String) -> (all:[tableMetadata], exists:[tableMetadata]) {
+    func getSubtitles(account: String, serverUrl: String, fileName: String) -> (all:[tableMetadata], existing:[tableMetadata]) {
 
         let realm = try! Realm()
         let nameOnly = (fileName as NSString).deletingPathExtension + "."

+ 2 - 2
iOSClient/Menu/NCViewer+Menu.swift

@@ -102,7 +102,7 @@ extension NCViewer {
         //
         // CONVERSION VIDEO TO MPEG4 (MFFF Lib)
         //
-        #if MFFFLIB
+#if MFFFLIB
         if metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue {
             
             actions.append(
@@ -117,7 +117,7 @@ extension NCViewer {
                 )
             )
         }
-        #endif
+#endif
         
         //
         // SAVE IMAGE / VIDEO

+ 35 - 30
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift

@@ -46,12 +46,12 @@ class NCPlayer: NSObject {
     private weak var detailView: NCViewerMediaDetailView?
     private var observerAVPlayerItemDidPlayToEndTime: Any?
     private var observerAVPlayertTime: Any?
-    private var observerAVPlayertStatus: Any?
 
-    public var player: AVPlayer?
-    public var durationTime: CMTime = .zero
-    public var metadata: tableMetadata
-    public var videoLayer: AVPlayerLayer?
+    var kvoPlayerObserver: NSKeyValueObservation?
+    var player: AVPlayer?
+    var durationTime: CMTime = .zero
+    var metadata: tableMetadata
+    var videoLayer: AVPlayerLayer?
 
     // MARK: - View Life Cycle
 
@@ -104,7 +104,9 @@ class NCPlayer: NSObject {
         // Check already started
         if isStartPlayer {
             if !isStartObserver {
+                print("Play already started - URL: \(self.url)")
                 activateObserver()
+                playerToolBar?.show()
             }
             return
         }
@@ -113,7 +115,9 @@ class NCPlayer: NSObject {
         player = AVPlayer(url: self.url)
         playerToolBar?.show()
         playerToolBar?.setMetadata(self.metadata)
+#if MFFFLIB
         setUpForSubtitle()
+#endif
 
         if metadata.livePhoto {
             player?.isMuted = false
@@ -126,25 +130,27 @@ class NCPlayer: NSObject {
             }
         }
 
-        observerAVPlayertStatus = player?.currentItem?.addObserver(self, forKeyPath: "status", options: [.new, .initial], context: nil)
-    }
+        let observerAVPlayertStatus = self.player?.currentItem?.observe(\.status, options: [.new,.initial]) { player, change in
 
-    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
-        switch keyPath {
-        case "status":
-            if let playerItem = self.player?.currentItem,
-                let object = object as? AVPlayerItem,
-                playerItem === object{
+            if let player = self.player,
+               let playerItem = player.currentItem,
+               let object = player.currentItem,
+               playerItem === object {
+
+                if self.isStartPlayer {
+                    return
+                }
                 if (playerItem.status == .readyToPlay || playerItem.status == .failed) {
-                    print("player ready")
+                    print("Player ready")
                     self.startPlayer()
                 } else {
-                    print("player not ready")
+                    print("Player not ready")
                 }
             }
-            break
-        default:
-            break
+        }
+
+        if let observerAVPlayertStatus = observerAVPlayertStatus{
+            kvoPlayerObserver = observerAVPlayertStatus
         }
     }
 
@@ -222,8 +228,8 @@ class NCPlayer: NSObject {
     }
 
     func activateObserver() {
+        print("activating Observer ocId \(metadata.ocId)")
 
-        // At end go back to start & show toolbar
         observerAVPlayerItemDidPlayToEndTime = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem, queue: .main) {  [weak self] notification in
 
             guard let self = self else {
@@ -272,27 +278,26 @@ class NCPlayer: NSObject {
 
     func deactivateObserver() {
 
-        print("deactivating Observer")
+        print("deactivating Observer ocId \(metadata.ocId)")
 
         if isPlay() {
             playerPause()
         }
+        
+        self.kvoPlayerObserver?.invalidate()
+        self.kvoPlayerObserver = nil
 
         if let observerAVPlayerItemDidPlayToEndTime = self.observerAVPlayerItemDidPlayToEndTime {
             NotificationCenter.default.removeObserver(observerAVPlayerItemDidPlayToEndTime)
         }
         observerAVPlayerItemDidPlayToEndTime = nil
 
-        if let observerAVPlayertTime = self.observerAVPlayertTime {
-            player?.removeTimeObserver(observerAVPlayertTime)
+        if let observerAVPlayertTime = self.observerAVPlayertTime,
+           let player = player {
+            player.removeTimeObserver(observerAVPlayertTime)
         }
         observerAVPlayertTime = nil
 
-        if observerAVPlayertStatus != nil {
-            player?.currentItem?.removeObserver(self, forKeyPath: "status")
-        }
-        observerAVPlayertStatus = nil
-
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationWillResignActive), object: nil)
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidEnterBackground), object: nil)
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidBecomeActive), object: nil)
@@ -301,7 +306,7 @@ class NCPlayer: NSObject {
 
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterPauseMedia), object: nil)
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterPlayMedia), object: nil)
-
+        
         isStartObserver = false
     }
 
@@ -441,9 +446,9 @@ class NCPlayer: NSObject {
                     self.url = url
                     self.isProxy = urlVideo.isProxy
                     if requiredConvert {
-                        #if MFFFLIB
+#if MFFFLIB
                         self.convertVideo(withAlert: false)
-                        #endif
+#endif
                     } else {
                         self.openAVPlayer()
                     }

+ 2 - 2
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift

@@ -286,12 +286,12 @@ class NCPlayerToolBar: UIView {
         guard let metadata = self.metadata, ncplayer != nil, !metadata.livePhoto else { return }
         if metadata.classFile != NCCommunicationCommon.typeClassFile.video.rawValue && metadata.classFile != NCCommunicationCommon.typeClassFile.audio.rawValue { return }
 
-        #if MFFFLIB
+#if MFFFLIB
         if MFFF.shared.existsMFFFSession(url: URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView))) {
             self.hide()
             return
         }
-        #endif
+#endif
 
         timerAutoHide?.invalidate()
         if enableTimerAutoHide {

+ 4 - 4
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCSubtitle/NCSubtitlePlayer.swift

@@ -126,14 +126,14 @@ extension NCPlayer {
                 }
             }
         }
-        let results = NCManageDatabase.shared.getSubtitles(account: metadata.account, serverUrl: metadata.serverUrl, fileName: metadata.fileName)
-        if !results.exists.isEmpty {
-            for subtitle in results.exists {
+        let (all, existing) = NCManageDatabase.shared.getSubtitles(account: metadata.account, serverUrl: metadata.serverUrl, fileName: metadata.fileName)
+        if !existing.isEmpty {
+            for subtitle in existing {
                 let subtitleUrl = URL(fileURLWithPath: CCUtility.getDirectoryProviderStorageOcId(subtitle.ocId, fileNameView: subtitle.fileName))
                 self.subtitleUrls.append(subtitleUrl)
             }
         }
-        if results.all.count != results.exists.count {
+        if all.count != existing.count {
             NCContentPresenter.shared.messageNotification("_info_", description: "_subtitle_not_dowloaded_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.info, errorCode: NCGlobal.shared.errorNoError)
         }
         self.setSubtitleToolbarIcon(subtitleUrls: subtitleUrls)

+ 3 - 8
iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift

@@ -108,7 +108,8 @@ class NCViewerMediaPage: UIViewController {
     }
 
     deinit {
-        print("#deinit NCViewerMediaPage")
+        
+        print("deinit NCViewerMediaPage")
     }
 
     override func viewDidDisappear(_ animated: Bool) {
@@ -469,16 +470,12 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
             direction = .reverse
         }
 
-        currentViewController.ncplayer?.deactivateObserver()
-        
         let viewerMedia = getViewerMedia(index: currentIndex, metadata: metadatas[currentIndex])
         pageViewController.setViewControllers([viewerMedia], direction: direction, animated: true, completion: nil)
     }
     
     func reloadCurrentPage() {
-        
-        currentViewController.ncplayer?.deactivateObserver()
-        
+
         let viewerMedia = getViewerMedia(index: currentIndex, metadata: metadatas[currentIndex])
         viewerMedia.autoPlay = false
         pageViewController.setViewControllers([viewerMedia], direction: .forward, animated: false, completion: nil)
@@ -488,8 +485,6 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
 
         currentIndex = index
 
-        currentViewController.ncplayer?.deactivateObserver()
-
         let viewerMedia = getViewerMedia(index: currentIndex, metadata: metadatas[currentIndex])
         viewerMedia.autoPlay = autoPlay
         pageViewController.setViewControllers([viewerMedia], direction: direction, animated: true, completion: nil)