From 01c63f194f1c94f9f751e05807f9ed8e474fe899 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Thu, 27 Apr 2023 16:11:00 +0200 Subject: [PATCH] subTitle --- Brand/Database.swift | 2 +- iOSClient/Data/NCManageDatabase+Video.swift | 45 +++++----------- .../captions.bubble.imageset/Contents.json | 15 ------ .../subtitles-outline.svg | 1 - .../NCViewerMedia/NCPlayer/NCPlayer.swift | 14 ++--- .../NCPlayer/NCPlayerToolBar.swift | 54 ++++++++++++++++++- .../NCPlayer/NCPlayerToolBar.xib | 20 +++++-- .../NCViewerMedia/NCViewerMediaPage.swift | 2 +- 8 files changed, 93 insertions(+), 60 deletions(-) delete mode 100644 iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json delete mode 100644 iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg diff --git a/Brand/Database.swift b/Brand/Database.swift index 50dd27da3f..315f47fabb 100644 --- a/Brand/Database.swift +++ b/Brand/Database.swift @@ -26,4 +26,4 @@ import Foundation // Database Realm // let databaseName = "nextcloud.realm" -let databaseSchemaVersion: UInt64 = 292 +let databaseSchemaVersion: UInt64 = 294 diff --git a/iOSClient/Data/NCManageDatabase+Video.swift b/iOSClient/Data/NCManageDatabase+Video.swift index 65755a89bc..4d56d47302 100644 --- a/iOSClient/Data/NCManageDatabase+Video.swift +++ b/iOSClient/Data/NCManageDatabase+Video.swift @@ -28,22 +28,18 @@ import NextcloudKit typealias tableVideo = tableVideoV2 class tableVideoV2: Object { - @objc dynamic var account = "" - @objc dynamic var ocId = "" - @objc dynamic var position: Float = 0 - @objc dynamic var width: Int = 0 - @objc dynamic var height: Int = 0 - @objc dynamic var length: Int = 0 - @objc dynamic var codecNameVideo: String? - @objc dynamic var codecNameAudio: String? - @objc dynamic var codecAudioChannelLayout: String? - @objc dynamic var codecAudioLanguage: String? - @objc dynamic var codecMaxCompatibility: Bool = false - @objc dynamic var codecQuality: String? - - override static func primaryKey() -> String { - return "ocId" - } + @Persisted var account = "" + @Persisted(primaryKey: true) var ocId = "" + @Persisted var position: Float? + @Persisted var width: Int? + @Persisted var height: Int? + @Persisted var length: Int? + @Persisted var codecNameVideo: String? + @Persisted var codecNameAudio: String? + @Persisted var codecAudioChannelLayout: String? + @Persisted var codecAudioLanguage: String? + @Persisted var codecMaxCompatibility: Bool = false + @Persisted var codecQuality: String? } extension NCManageDatabase { @@ -91,7 +87,7 @@ extension NCManageDatabase { if let length = length { result.length = length } - + realm.add(result, update: .all) } } @@ -142,20 +138,7 @@ extension NCManageDatabase { return tableVideo.init(value: result) } - - func getVideoPosition(metadata: tableMetadata) -> Float? { - - if metadata.livePhoto { return nil } - let realm = try! Realm() - - guard let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first else { - return nil - } - - if result.position == 0 { return nil } - return result.position - } - + func deleteVideo(metadata: tableMetadata) { let realm = try! Realm() diff --git a/iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json b/iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json deleted file mode 100644 index dd2f90e0bd..0000000000 --- a/iOSClient/Images.xcassets/captions.bubble.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "subtitles-outline.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg b/iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg deleted file mode 100644 index 69a07d483c..0000000000 --- a/iOSClient/Images.xcassets/captions.bubble.imageset/subtitles-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift index 9a47a9e997..0cc14a63fc 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift @@ -69,7 +69,7 @@ class NCPlayer: NSObject { func openAVPlayer(url: URL) { let userAgent = CCUtility.getUserAgent()! - var position: Float = 0 + var positionSliderToolBar: Float = 0 self.url = url self.singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSingleTapWith(gestureRecognizer:))) @@ -82,9 +82,9 @@ class NCPlayer: NSObject { // player?.media?.addOption("--network-caching=500") player?.media?.addOption(":http-user-agent=\(userAgent)") - if let result = NCManageDatabase.shared.getVideoPosition(metadata: metadata) { - position = result - player?.position = position + if let result = NCManageDatabase.shared.getVideo(metadata: metadata), let position = result.position { + positionSliderToolBar = position + player?.position = positionSliderToolBar } player?.drawable = imageVideoContainer @@ -93,7 +93,7 @@ class NCPlayer: NSObject { view.addGestureRecognizer(singleTapGestureRecognizer) } - playerToolBar?.setBarPlayer(ncplayer: self, position: position, metadata: metadata, viewerMediaPage: viewerMediaPage) + playerToolBar?.setBarPlayer(ncplayer: self, position: positionSliderToolBar, metadata: metadata, viewerMediaPage: viewerMediaPage) if let media = player?.media { thumbnailer = VLCMediaThumbnailer(media: media, andDelegate: self) @@ -133,8 +133,8 @@ class NCPlayer: NSObject { playerToolBar?.playbackSliderEvent = .began player?.play() playerToolBar?.playButtonPause() - - if let position = NCManageDatabase.shared.getVideoPosition(metadata: metadata) { + + if let result = NCManageDatabase.shared.getVideo(metadata: metadata), let position = result.position { player?.position = position playerToolBar?.playbackSliderEvent = .moved } diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift index f379a50f52..b72a2cdd19 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift @@ -28,6 +28,7 @@ import UIKit import AVKit import MediaPlayer import MobileVLCKit +import FloatingPanel class NCPlayerToolBar: UIView { @@ -35,6 +36,7 @@ class NCPlayerToolBar: UIView { @IBOutlet weak var playerToolBarView: UIView! @IBOutlet weak var muteButton: UIButton! @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var subtitleButton: UIButton! @IBOutlet weak var forwardButton: UIButton! @IBOutlet weak var backButton: UIButton! @IBOutlet weak var playbackSlider: UISlider! @@ -50,8 +52,9 @@ class NCPlayerToolBar: UIView { private var ncplayer: NCPlayer? private var metadata: tableMetadata? - private var wasInPlay: Bool = false + private var subTitleIndex: Int32? + private weak var viewerMediaPage: NCViewerMediaPage? // MARK: - View Life Cycle @@ -88,6 +91,8 @@ class NCPlayerToolBar: UIView { playButton.setImage(NCUtility.shared.loadImage(named: "play.fill", color: .white, symbolConfiguration: UIImage.SymbolConfiguration(pointSize: 30)), for: .normal) + subtitleButton.setImage(NCUtility.shared.loadImage(named: "captions.bubble", color: .white), for: .normal) + backButton.setImage(NCUtility.shared.loadImage(named: "gobackward.10", color: .white), for: .normal) forwardButton.setImage(NCUtility.shared.loadImage(named: "goforward.10", color: .white), for: .normal) @@ -250,6 +255,19 @@ class NCPlayerToolBar: UIView { self.viewerMediaPage?.startTimerAutoHide() } + @IBAction func tapSubTitle(_ sender: Any) { + + guard let player = ncplayer?.player else { return } + + let spuTracks = player.videoSubTitlesNames + let spuTrackIndexes = player.videoSubTitlesIndexes + let count = spuTracks.count + + if count > 1 { + toggleMenuSubTitle(spuTracks: spuTracks, spuTrackIndexes: spuTrackIndexes) + } + } + @IBAction func tapForward(_ sender: Any) { guard let ncplayer = ncplayer else { return } @@ -268,3 +286,37 @@ class NCPlayerToolBar: UIView { self.viewerMediaPage?.startTimerAutoHide() } } + +extension NCPlayerToolBar { + + func toggleMenuSubTitle(spuTracks: [Any], spuTrackIndexes: [Any]) { + + var actions = [NCMenuAction]() + let tableVideo = NCManageDatabase.shared.getVideo(metadata: metadata) + + if self.subTitleIndex == nil, let idx = ncplayer?.player?.currentVideoSubTitleIndex { + self.subTitleIndex = idx + } + + for index in 0...spuTracks.count - 1 { + + guard let title = spuTracks[index] as? String, let idx = spuTrackIndexes[index] as? Int32 else { return } + + actions.append( + NCMenuAction( + title: title, + icon: UIImage(), + onTitle: title, + onIcon: UIImage(), + selected: (self.subTitleIndex ?? -9999) == idx, + on: (self.subTitleIndex ?? -9999) == idx, + action: { _ in + self.ncplayer?.player?.currentVideoSubTitleIndex = idx + } + ) + ) + } + + viewerMediaPage?.presentMenu(with: actions) + } +} diff --git a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib index dcde6cae62..af86e0435e 100644 --- a/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib +++ b/iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.xib @@ -15,11 +15,23 @@ - - + + - +