Browse Source

Merge pull request #2410 from nextcloud/VLC

Vlc
Marino Faggiana 1 year ago
parent
commit
d7af5fcd3a

+ 36 - 29
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift

@@ -30,13 +30,14 @@ class NCPlayer: NSObject {
 
     internal let appDelegate = UIApplication.shared.delegate as! AppDelegate
     internal var url: URL?
-    internal var player: VLCMediaPlayer?
+    internal var player = VLCMediaPlayer()
     internal var metadata: tableMetadata
     internal var singleTapGestureRecognizer: UITapGestureRecognizer!
     internal var width: Int?
     internal var height: Int?
     internal var length: Int?
     internal let fileNamePreviewLocalPath: String
+    internal let userAgent = CCUtility.getUserAgent()!
 
     internal weak var playerToolBar: NCPlayerToolBar?
     internal weak var viewerMediaPage: NCViewerMediaPage?
@@ -67,37 +68,37 @@ class NCPlayer: NSObject {
 
     func openAVPlayer(url: URL, autoplay: Bool = false) {
 
-        let userAgent = CCUtility.getUserAgent()!
-        var positionSliderToolBar: Float = 0
-
+        var position: Float = 0
         self.url = url
         self.singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSingleTapWith(gestureRecognizer:)))
 
         print("Play URL: \(url)")
-        player = VLCMediaPlayer()
-        player?.media = VLCMedia(url: url)
-        player?.delegate = self
+        player.media = VLCMedia(url: url)
+        player.delegate = self
 
         // player?.media?.addOption("--network-caching=500")
-        player?.media?.addOption(":http-user-agent=\(userAgent)")
+        player.media?.addOption(":http-user-agent=\(userAgent)")
 
-        if let result = NCManageDatabase.shared.getVideo(metadata: metadata), let position = result.position {
-            positionSliderToolBar = position
-            player?.position = positionSliderToolBar
+        if let result = NCManageDatabase.shared.getVideo(metadata: metadata),
+            let resultPosition = result.position {
+            position = resultPosition
+            player.position = position
         }
 
-        player?.drawable = imageVideoContainer
-        if let view = player?.drawable as? UIView {
+        player.drawable = imageVideoContainer
+        if let view = player.drawable as? UIView {
             view.isUserInteractionEnabled = true
             view.addGestureRecognizer(singleTapGestureRecognizer)
         }
 
-        playerToolBar?.setBarPlayer(ncplayer: self, position: positionSliderToolBar, metadata: metadata, viewerMediaPage: viewerMediaPage)
+        playerToolBar?.setBarPlayer(position: position, ncplayer: self, metadata: metadata, viewerMediaPage: viewerMediaPage)
 
-        player?.play()
+        self.player.play()
         if !autoplay {
-            player?.pause()
-            player?.position = 0
+            self.player.pause()
+            if position == 0 {
+                self.player.position = 0
+            }
         }
 
         NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidEnterBackground), object: nil)
@@ -123,17 +124,17 @@ class NCPlayer: NSObject {
 
     func isPlay() -> Bool {
 
-        return player?.isPlaying ?? false
+        return player.isPlaying
     }
 
     func playerPlay() {
 
         playerToolBar?.playbackSliderEvent = .began
-        player?.play()
+        player.play()
         playerToolBar?.playButtonPause()
 
         if let result = NCManageDatabase.shared.getVideo(metadata: metadata), let position = result.position {
-            player?.position = position
+            player.position = position
             playerToolBar?.playbackSliderEvent = .moved
         }
 
@@ -145,44 +146,43 @@ class NCPlayer: NSObject {
     @objc func playerStop() {
 
         savePosition()
-        player?.stop()
+        player.stop()
         playerToolBar?.playButtonPlay()
     }
 
     @objc func playerPause() {
 
         savePosition()
-        player?.pause()
+        player.pause()
         playerToolBar?.playButtonPlay()
     }
 
     func playerPosition(_ position: Float) {
 
         NCManageDatabase.shared.addVideo(metadata: metadata, position: position)
-        player?.position = position
+        player.position = position
     }
 
     func savePosition() {
 
-        guard let position = player?.position, metadata.isVideo, isPlay() else { return }
-        NCManageDatabase.shared.addVideo(metadata: metadata, position: position)
+        guard metadata.isVideo, isPlay() else { return }
+        NCManageDatabase.shared.addVideo(metadata: metadata, position: player.position)
     }
 
     func jumpForward(_ seconds: Int32) {
 
-        player?.jumpForward(seconds)
+        player.jumpForward(seconds)
     }
 
     func jumpBackward(_ seconds: Int32) {
 
-        player?.jumpBackward(seconds)
+        player.jumpBackward(seconds)
     }
 }
 
 extension NCPlayer: VLCMediaPlayerDelegate {
 
     func mediaPlayerStateChanged(_ aNotification: Notification) {
-        guard let player = self.player else { return }
 
         switch player.state {
         case .stopped:
@@ -197,7 +197,14 @@ extension NCPlayer: VLCMediaPlayerDelegate {
         case .ended:
             if let url = self.url {
                 NCManageDatabase.shared.addVideo(metadata: metadata, position: 0)
-                self.openAVPlayer(url: url)
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+                    self.player.media = VLCMedia(url: url)
+                    self.player.position = 0
+                    self.playerToolBar?.setBarPlayer(position: 0)
+                    self.player.play()
+                    self.player.pause()
+                    self.player.position = 0
+                }
             }
             print("Played mode: ENDED")
             break

+ 21 - 14
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift

@@ -118,19 +118,25 @@ class NCPlayerToolBar: UIView {
 
     // MARK: -
 
-    func setBarPlayer(ncplayer: NCPlayer, position: Float, metadata: tableMetadata, viewerMediaPage: NCViewerMediaPage?) {
+    func setBarPlayer(position: Float, ncplayer: NCPlayer? = nil, metadata: tableMetadata? = nil, viewerMediaPage: NCViewerMediaPage? = nil) {
 
-        self.ncplayer = ncplayer
-        self.metadata = metadata
-        self.viewerMediaPage = viewerMediaPage
+        if let ncplayer = ncplayer {
+            self.ncplayer = ncplayer
+        }
+        if let metadata = metadata {
+            self.metadata = metadata
+        }
+        if let viewerMediaPage = viewerMediaPage {
+            self.viewerMediaPage = viewerMediaPage
+        }
 
         playButton.setImage(NCUtility.shared.loadImage(named: "play.fill", color: .white, symbolConfiguration: UIImage.SymbolConfiguration(pointSize: 30)), for: .normal)
         MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = 0
 
         playbackSlider.value = position
 
-        labelCurrentTime.text = ncplayer.player?.time.stringValue
-        labelLeftTime.text = ncplayer.player?.remainingTime?.stringValue
+        labelCurrentTime.text = "--:--"
+        labelLeftTime.text = "--:--"
 
         if viewerMediaScreenMode == .normal {
             show()
@@ -142,17 +148,18 @@ class NCPlayerToolBar: UIView {
     public func update() {
 
         guard let ncplayer = self.ncplayer,
-              let length = ncplayer.player?.media?.length.intValue,
-              let position = ncplayer.player?.position
+              let length = ncplayer.player.media?.length.intValue
         else { return }
+
+        let position = ncplayer.player.position
         let positionInSecond = position * Float(length / 1000)
 
         // SLIDER & TIME
         if playbackSliderEvent == .ended {
             playbackSlider.value = position
         }
-        labelCurrentTime.text = ncplayer.player?.time.stringValue
-        labelLeftTime.text = ncplayer.player?.remainingTime?.stringValue
+        labelCurrentTime.text = ncplayer.player.time.stringValue
+        labelLeftTime.text = ncplayer.player.remainingTime?.stringValue
         MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPMediaItemPropertyPlaybackDuration] = length / 1000
         MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = positionInSecond
     }
@@ -292,7 +299,7 @@ extension NCPlayerToolBar {
 
         var actions = [NCMenuAction]()
 
-        if self.subTitleIndex == nil, let idx = ncplayer?.player?.currentVideoSubTitleIndex {
+        if self.subTitleIndex == nil, let idx = ncplayer?.player.currentVideoSubTitleIndex {
             self.subTitleIndex = idx
         }
 
@@ -309,7 +316,7 @@ extension NCPlayerToolBar {
                     selected: (self.subTitleIndex ?? -9999) == idx,
                     on: (self.subTitleIndex ?? -9999) == idx,
                     action: { _ in
-                        self.ncplayer?.player?.currentVideoSubTitleIndex = idx
+                        self.ncplayer?.player.currentVideoSubTitleIndex = idx
                         self.subTitleIndex = idx
                     }
                 )
@@ -323,7 +330,7 @@ extension NCPlayerToolBar {
 
         var actions = [NCMenuAction]()
 
-        if self.audioIndex == nil, let idx = ncplayer?.player?.currentAudioTrackIndex {
+        if self.audioIndex == nil, let idx = ncplayer?.player.currentAudioTrackIndex {
             self.audioIndex = idx
         }
 
@@ -340,7 +347,7 @@ extension NCPlayerToolBar {
                     selected: (self.audioIndex ?? -9999) == idx,
                     on: (self.audioIndex ?? -9999) == idx,
                     action: { _ in
-                        self.ncplayer?.player?.currentAudioTrackIndex = idx
+                        self.ncplayer?.player.currentAudioTrackIndex = idx
                         self.audioIndex = idx
                     }
                 )

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

@@ -125,7 +125,9 @@ class NCViewerMedia: UIViewController {
         self.image = nil
         self.imageVideoContainer.image = nil
 
-        loadImage()
+        if metadata.isImage || metadata.isAudio {
+            loadImage()
+        }
     }
 
     override func viewWillAppear(_ animated: Bool) {

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

@@ -69,7 +69,7 @@ class NCViewerMediaPage: UIViewController {
     var timerAutoHideSeconds: Double {
         get {
             if NCUtility.shared.isSimulator() {
-                return 4
+                return 40
             } else {
                 return 4
             }
@@ -441,7 +441,7 @@ class NCViewerMediaPage: UIViewController {
             skipForwardCommand = MPRemoteCommandCenter.shared().skipForwardCommand.addTarget { event in
 
                 let seconds = Int32((event as! MPSkipIntervalCommandEvent).interval)
-                ncplayer.player?.jumpForward(seconds)
+                ncplayer.player.jumpForward(seconds)
                 return.success
             }
 
@@ -449,7 +449,7 @@ class NCViewerMediaPage: UIViewController {
             skipBackwardCommand = MPRemoteCommandCenter.shared().skipBackwardCommand.addTarget { event in
 
                 let seconds = Int32((event as! MPSkipIntervalCommandEvent).interval)
-                ncplayer.player?.jumpBackward(seconds)
+                ncplayer.player.jumpBackward(seconds)
                 return.success
             }
         }