From 876106c2531056549c37a98b1abf2ab48f83d21a Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 15:32:52 +0530 Subject: [PATCH 01/16] add database --- Source/Database/ObjectManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Database/ObjectManager.swift b/Source/Database/ObjectManager.swift index 4d98d03..2ae93c7 100644 --- a/Source/Database/ObjectManager.swift +++ b/Source/Database/ObjectManager.swift @@ -28,7 +28,7 @@ public class ObjectManager { } } } - + func exists(id: Any) -> Bool { let object = realm.object(ofType: T.self, forPrimaryKey: id) return object != nil From a2ddd2ce19a024b057e21b651eb6bdb5adb2af4e Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 15:58:30 +0530 Subject: [PATCH 02/16] Added non-drm video download support --- Source/Database/TPStreamsDownloadManager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Database/TPStreamsDownloadManager.swift b/Source/Database/TPStreamsDownloadManager.swift index 2e47678..52c6c75 100644 --- a/Source/Database/TPStreamsDownloadManager.swift +++ b/Source/Database/TPStreamsDownloadManager.swift @@ -82,7 +82,7 @@ internal class AssetDownloadDelegate: NSObject, AVAssetDownloadDelegate { let percentageComplete = calculateDownloadPercentage(loadedTimeRanges, timeRangeExpectedToLoad) OfflineAsset.manager.update(object: offlineAsset, with: ["status": Status.inProgress.rawValue, "percentageCompleted": percentageComplete]) } - + private func updateDownloadCompleteStatus(_ error: Error?,_ offlineAsset: OfflineAsset) { let status: Status = (error == nil) ? .finished : .failed let updateValues: [String: Any] = ["status": status.rawValue, "downloadedAt": Date()] From 92be68537f41d3364be747832ba9b6fc7ab79d2e Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 15:58:30 +0530 Subject: [PATCH 03/16] Added non-drm video download support --- Example/ContentView.swift | 4 ++-- Source/Database/Model/OfflineAsset.swift | 7 +++++++ Source/Database/ObjectManager.swift | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Example/ContentView.swift b/Example/ContentView.swift index d1f6869..ade59d4 100644 --- a/Example/ContentView.swift +++ b/Example/ContentView.swift @@ -12,8 +12,8 @@ import AVKit struct ContentView: View { var body: some View { VStack { - let player = TPAVPlayer(assetID: "peBmzxeQ7Mf", - accessToken: "d7ebb4b2-8dee-4dff-bb00-e833195b0756") + let player = TPAVPlayer(assetID: "5X3sT3UXyNY", + accessToken: "06d4191c-f470-476a-a0ef-58de2c9c2245") TPStreamPlayerView(player: player) .frame(height: 240) Spacer() diff --git a/Source/Database/Model/OfflineAsset.swift b/Source/Database/Model/OfflineAsset.swift index effefed..e9a90d8 100644 --- a/Source/Database/Model/OfflineAsset.swift +++ b/Source/Database/Model/OfflineAsset.swift @@ -44,6 +44,13 @@ extension OfflineAsset { offlineAsset.size = (bitRate * duration) return offlineAsset } + + internal static func create(assetId: String, srcURL: String) -> OfflineAsset { + let offlineAsset = OfflineAsset() + offlineAsset.assetId = assetId + offlineAsset.srcURL = srcURL + return offlineAsset + } } enum Status: String { diff --git a/Source/Database/ObjectManager.swift b/Source/Database/ObjectManager.swift index 2ae93c7..42b8c1a 100644 --- a/Source/Database/ObjectManager.swift +++ b/Source/Database/ObjectManager.swift @@ -33,4 +33,9 @@ public class ObjectManager { let object = realm.object(ofType: T.self, forPrimaryKey: id) return object != nil } + + func isExist(assetId: Any) -> Bool { + let object = realm.object(ofType: T.self, forPrimaryKey: assetId) + return object != nil + } } From d0d9c295f3ffd151e947158dffffae4d19d82cba Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 11 Jan 2024 15:17:59 +0530 Subject: [PATCH 04/16] refcator --- Source/Database/Model/OfflineAsset.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Source/Database/Model/OfflineAsset.swift b/Source/Database/Model/OfflineAsset.swift index e9a90d8..03cc768 100644 --- a/Source/Database/Model/OfflineAsset.swift +++ b/Source/Database/Model/OfflineAsset.swift @@ -45,10 +45,21 @@ extension OfflineAsset { return offlineAsset } - internal static func create(assetId: String, srcURL: String) -> OfflineAsset { + static func create( + assetId: String, + srcURL: String, + title: String, + resolution: String, + duration:Double, + bitRate: Double + ) -> OfflineAsset { let offlineAsset = OfflineAsset() offlineAsset.assetId = assetId offlineAsset.srcURL = srcURL + offlineAsset.title = title + offlineAsset.resolution = resolution + offlineAsset.duration = duration + offlineAsset.bitRate = bitRate return offlineAsset } } From 312eeef03e051e93aa6e8ae1299585c9d1371a79 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 11 Jan 2024 16:52:42 +0530 Subject: [PATCH 05/16] refcator --- Example/ContentView.swift | 4 ++-- Source/Database/Model/OfflineAsset.swift | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Example/ContentView.swift b/Example/ContentView.swift index ade59d4..32fe973 100644 --- a/Example/ContentView.swift +++ b/Example/ContentView.swift @@ -12,8 +12,8 @@ import AVKit struct ContentView: View { var body: some View { VStack { - let player = TPAVPlayer(assetID: "5X3sT3UXyNY", - accessToken: "06d4191c-f470-476a-a0ef-58de2c9c2245") + let player = TPAVPlayer(assetID: "8eaHZjXt6km", + accessToken: "16b608ba-9979-45a0-94fb-b27c1a86b3c1") TPStreamPlayerView(player: player) .frame(height: 240) Spacer() diff --git a/Source/Database/Model/OfflineAsset.swift b/Source/Database/Model/OfflineAsset.swift index 03cc768..4571095 100644 --- a/Source/Database/Model/OfflineAsset.swift +++ b/Source/Database/Model/OfflineAsset.swift @@ -60,6 +60,7 @@ extension OfflineAsset { offlineAsset.resolution = resolution offlineAsset.duration = duration offlineAsset.bitRate = bitRate + offlineAsset.size = (bitRate * duration) return offlineAsset } } From f18a66bcc95b182c736ae3b691d0d1b406f79115 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 16:16:46 +0530 Subject: [PATCH 06/16] added button in Swift UI --- Example/ContentView.swift | 1 + Source/Managers/TPStreamPlayer.swift | 3 ++ Source/TPStreamPlayerView.swift | 12 ++++- Source/Views/SwiftUI/PlayerControlsView.swift | 9 ++-- .../Views/SwiftUI/PlayerSettingsButton.swift | 44 ++++++++++++++++++- 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/Example/ContentView.swift b/Example/ContentView.swift index 32fe973..86f2a49 100644 --- a/Example/ContentView.swift +++ b/Example/ContentView.swift @@ -15,6 +15,7 @@ struct ContentView: View { let player = TPAVPlayer(assetID: "8eaHZjXt6km", accessToken: "16b608ba-9979-45a0-94fb-b27c1a86b3c1") TPStreamPlayerView(player: player) + .enableDownload(true) .frame(height: 240) Spacer() } diff --git a/Source/Managers/TPStreamPlayer.swift b/Source/Managers/TPStreamPlayer.swift index 701d528..c3297c2 100644 --- a/Source/Managers/TPStreamPlayer.swift +++ b/Source/Managers/TPStreamPlayer.swift @@ -26,6 +26,9 @@ class TPStreamPlayer: NSObject { var currentVideoQuality: VideoQuality? { return self.player.availableVideoQualities.first( where: {$0.bitrate == self.player.currentItem?.preferredPeakBitRate }) } + var asset: Asset? { + return self.player.asset + } init(player: TPAVPlayer){ self.player = player diff --git a/Source/TPStreamPlayerView.swift b/Source/TPStreamPlayerView.swift index 4f10725..0513d7b 100644 --- a/Source/TPStreamPlayerView.swift +++ b/Source/TPStreamPlayerView.swift @@ -10,6 +10,7 @@ import SwiftUI @available(iOS 14.0, *) public struct TPStreamPlayerView: View { @State private var isFullScreen = false + private var enableDownload: Bool = false var player: TPAVPlayer @@ -21,7 +22,7 @@ public struct TPStreamPlayerView: View { GeometryReader { geometry in ZStack { AVPlayerBridge(player: player) - PlayerControlsView(player: player, isFullscreen: $isFullScreen) + PlayerControlsView(player: player, isFullscreen: $isFullScreen, enableDownload: enableDownload) } .padding(.horizontal, isFullScreen ? 48 : 0) .frame(width: isFullScreen ? UIScreen.main.fixedCoordinateSpace.bounds.height : geometry.size.width, @@ -51,3 +52,12 @@ public struct TPStreamPlayerView: View { } } } + +@available(iOS 14.0, *) +extension TPStreamPlayerView { + public func enableDownload(_ enable: Bool = false) -> TPStreamPlayerView { + var modifiedView = self + modifiedView.enableDownload = enable + return modifiedView + } +} diff --git a/Source/Views/SwiftUI/PlayerControlsView.swift b/Source/Views/SwiftUI/PlayerControlsView.swift index fa4a803..900cc68 100644 --- a/Source/Views/SwiftUI/PlayerControlsView.swift +++ b/Source/Views/SwiftUI/PlayerControlsView.swift @@ -6,16 +6,18 @@ struct PlayerControlsView: View { @State private var showControls = false @State private var controlsHideTimer: Timer? @Binding private var isFullscreen: Bool + private var enableDownload: Bool = false - init(player: TPAVPlayer, isFullscreen: Binding){ + init(player: TPAVPlayer, isFullscreen: Binding, enableDownload: Bool){ _player = StateObject(wrappedValue: TPStreamPlayerObservable(player: player)) _isFullscreen = isFullscreen + self.enableDownload = enableDownload } var body: some View { VStack{ if showControls { - PlayerSettingsButton() + PlayerSettingsButton(enableDownload: enableDownload) Spacer() MediaControlsView() Spacer() @@ -63,7 +65,8 @@ struct TPVideoPlayerControls_Previews: PreviewProvider { assetID: "dummy", accessToken: "dummy" ), - isFullscreen: .constant(true) + isFullscreen: .constant(true), + enableDownload: true ).background(Color.black) } } diff --git a/Source/Views/SwiftUI/PlayerSettingsButton.swift b/Source/Views/SwiftUI/PlayerSettingsButton.swift index 3210e53..9b061eb 100644 --- a/Source/Views/SwiftUI/PlayerSettingsButton.swift +++ b/Source/Views/SwiftUI/PlayerSettingsButton.swift @@ -4,9 +4,14 @@ import SwiftUI struct PlayerSettingsButton: View { @State private var showOptions = false @State private var currentMenu: SettingsMenu = .main + private var enableDownload: Bool = false @EnvironmentObject var player: TPStreamPlayerObservable + init(enableDownload: Bool) { + self.enableDownload = enableDownload + } + var body: some View { HStack { Spacer() @@ -29,7 +34,7 @@ struct PlayerSettingsButton: View { return ActionSheet( title: Text("Settings"), message: nil, - buttons: [playbackSpeedButton(), videoQualityButton(), .cancel()] + buttons: getButtons() ) case .playbackSpeed: return ActionSheet( @@ -43,9 +48,24 @@ struct PlayerSettingsButton: View { message: nil, buttons: videoQualityOptions() + [.cancel()] ) + case .downloadQuality: + return ActionSheet( + title: Text("Download Quality"), + message: nil, + buttons: downloadQualityOptions() + [.cancel()] + ) } } + private func getButtons() -> [ActionSheet.Button] { + var buttons = [playbackSpeedButton(), videoQualityButton()] + if enableDownload { + buttons.append(downloadQualityButton()) + } + buttons.append(.cancel()) + return buttons + } + private func playbackSpeedButton() -> ActionSheet.Button { return .default(Text("Playback Speed - \(player.currentPlaybackSpeed.label)")) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { @@ -64,6 +84,15 @@ struct PlayerSettingsButton: View { } } + private func downloadQualityButton() -> ActionSheet.Button { + return .default(Text("Download")) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.showOptions = true + self.currentMenu = .downloadQuality + } + } + } + private func playbackSpeedOptions() -> [ActionSheet.Button] { let playbackSpeeds = PlaybackSpeed.allCases return playbackSpeeds.map { speed in @@ -80,6 +109,17 @@ struct PlayerSettingsButton: View { } } } + + private func downloadQualityOptions() -> [ActionSheet.Button] { + var availableVideoQualities = player.availableVideoQualities + // Remove Auto Quality from the Array + availableVideoQualities.remove(at: 0) + return availableVideoQualities.map { downloadQuality in + .default(Text(downloadQuality.resolution)) { + TPStreamsDownloadManager.shared.startDownload(asset: player.asset!, bitRate: downloadQuality.bitrate) + } + } + } } -enum SettingsMenu { case main, playbackSpeed, videoQuality } +enum SettingsMenu { case main, playbackSpeed, videoQuality, downloadQuality } From e776262eeeb3a287284f9f4aa7382909f81adae3 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 16:34:10 +0530 Subject: [PATCH 07/16] added download button in story board --- Source/TPStreamPlayerConfiguration.swift | 6 +++ Source/Views/UIKit/PlayerControlsUIView.swift | 41 ++++++++++++++++--- StoryboardExample/ViewController.swift | 3 +- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Source/TPStreamPlayerConfiguration.swift b/Source/TPStreamPlayerConfiguration.swift index 93639d2..ea5ac3f 100644 --- a/Source/TPStreamPlayerConfiguration.swift +++ b/Source/TPStreamPlayerConfiguration.swift @@ -13,6 +13,7 @@ public struct TPStreamPlayerConfiguration { public var preferredRewindDuration: TimeInterval = 10.0 public var watchedProgressTrackColor: UIColor = .red public var progressBarThumbColor: UIColor = .red + public var enableDownload: Bool = false } @@ -43,6 +44,11 @@ public class TPStreamPlayerConfigurationBuilder { return self } + public func enableDownload(_ enable: Bool) -> Self { + configuration.enableDownload = enable + return self + } + public func build() -> TPStreamPlayerConfiguration { return configuration } diff --git a/Source/Views/UIKit/PlayerControlsUIView.swift b/Source/Views/UIKit/PlayerControlsUIView.swift index 4c932ba..e6dcfa6 100644 --- a/Source/Views/UIKit/PlayerControlsUIView.swift +++ b/Source/Views/UIKit/PlayerControlsUIView.swift @@ -119,9 +119,12 @@ class PlayerControlsUIView: UIView { optionsMenu.addAction(UIAlertAction(title: "Playback Speed", style: .default) { _ in self.showPlaybackSpeedMenu()}) optionsMenu.addAction(UIAlertAction(title: "Video Quality", style: .default, handler: { action in self.showVideoQualityMenu()})) optionsMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) + if playerConfig.enableDownload { + optionsMenu.addAction(UIAlertAction(title: "Download", style: .default, handler: { action in self.showDownloadQualityMenu()})) + } parentViewController?.present(optionsMenu, animated: true, completion: nil) } - + func showPlaybackSpeedMenu(){ let playbackSpeedMenu = createPlaybackSpeedMenu() parentViewController?.present(playbackSpeedMenu, animated: true, completion: nil) @@ -132,14 +135,19 @@ class PlayerControlsUIView: UIView { parentViewController?.present(videoQualityMenu, animated: true, completion: nil) } + func showDownloadQualityMenu(){ + let downloadQualityMenu = createDownloadQualityMenu() + parentViewController?.present(downloadQualityMenu, animated: true, completion: nil) + } + func createPlaybackSpeedMenu() -> UIAlertController { let playbackSpeedMenu = UIAlertController(title: "Playback Speed", message: nil, preferredStyle: ACTION_SHEET_PREFERRED_STYLE) - + for playbackSpeed in PlaybackSpeed.allCases { let action = createActionForPlaybackSpeed(playbackSpeed) playbackSpeedMenu.addAction(action) } - + playbackSpeedMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) return playbackSpeedMenu } @@ -153,12 +161,25 @@ class PlayerControlsUIView: UIView { qualityMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) return qualityMenu } - + + func createDownloadQualityMenu() -> UIAlertController { + let qualityMenu = UIAlertController(title: "Available resolutions", message: nil, preferredStyle: ACTION_SHEET_PREFERRED_STYLE) + var availableVideoQualities = player.availableVideoQualities + // Remove Auto Quality from the Array + availableVideoQualities.remove(at: 0) + for quality in availableVideoQualities { + let action = createActionForDownloadQuality(quality) + qualityMenu.addAction(action) + } + qualityMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) + return qualityMenu + } + func createActionForPlaybackSpeed(_ playbackSpeed: PlaybackSpeed) -> UIAlertAction { let action = UIAlertAction(title: playbackSpeed.label, style: .default) { [weak self] _ in self?.player.changePlaybackSpeed(playbackSpeed) } - + if playbackSpeed == .normal && self.player.currentPlaybackSpeed.rawValue == 0.0 || (playbackSpeed.rawValue == self.player.currentPlaybackSpeed.rawValue) { action.setValue(UIImage(named: "checkmark", in: bundle, compatibleWith: nil), forKey: "image") } @@ -176,7 +197,15 @@ class PlayerControlsUIView: UIView { return action } - + + func createActionForDownloadQuality(_ quality: VideoQuality) -> UIAlertAction { + let action = UIAlertAction(title: quality.resolution, style: .default, handler: { (_) in + TPStreamsDownloadManager.shared.startDownload(asset: self.player.asset!, bitRate: quality.bitrate) + }) + + return action + } + @IBAction func toggleFullScreen(_ sender: Any) { if isFullScreen { fullScreenToggleDelegate?.exitFullScreen() diff --git a/StoryboardExample/ViewController.swift b/StoryboardExample/ViewController.swift index 3fc7097..fd8f971 100644 --- a/StoryboardExample/ViewController.swift +++ b/StoryboardExample/ViewController.swift @@ -22,7 +22,7 @@ class ViewController: UIViewController { } func setupPlayerView(){ - player = TPAVPlayer(assetID: "8r65J7EY6NP", accessToken: "c4936043-816a-4404-b165-d7336672e7a7"){ error in + player = TPAVPlayer(assetID: "5X3sT3UXyNY", accessToken: "06d4191c-f470-476a-a0ef-58de2c9c2245"){ error in guard error == nil else { print("Setup error: \(error!.localizedDescription)") return @@ -40,6 +40,7 @@ class ViewController: UIViewController { .setPreferredRewindDuration(5) .setprogressBarThumbColor(.systemBlue) .setwatchedProgressTrackColor(.systemBlue) + .enableDownload(true) .build() playerViewController?.config = config From eb3dab0f1d61be9a9272c6066b718e6e4b997d97 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Wed, 10 Jan 2024 18:21:02 +0530 Subject: [PATCH 08/16] refcator --- Source/Views/UIKit/PlayerControlsUIView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Views/UIKit/PlayerControlsUIView.swift b/Source/Views/UIKit/PlayerControlsUIView.swift index e6dcfa6..7010ddf 100644 --- a/Source/Views/UIKit/PlayerControlsUIView.swift +++ b/Source/Views/UIKit/PlayerControlsUIView.swift @@ -168,7 +168,7 @@ class PlayerControlsUIView: UIView { // Remove Auto Quality from the Array availableVideoQualities.remove(at: 0) for quality in availableVideoQualities { - let action = createActionForDownloadQuality(quality) + let action = createActionForDownload(quality) qualityMenu.addAction(action) } qualityMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) @@ -198,7 +198,7 @@ class PlayerControlsUIView: UIView { return action } - func createActionForDownloadQuality(_ quality: VideoQuality) -> UIAlertAction { + func createActionForDownload(_ quality: VideoQuality) -> UIAlertAction { let action = UIAlertAction(title: quality.resolution, style: .default, handler: { (_) in TPStreamsDownloadManager.shared.startDownload(asset: self.player.asset!, bitRate: quality.bitrate) }) From 403cf35a4e3905a2bbebfba382971e066839fe9b Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 11 Jan 2024 16:57:21 +0530 Subject: [PATCH 09/16] refcator --- StoryboardExample/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoryboardExample/ViewController.swift b/StoryboardExample/ViewController.swift index fd8f971..7d2f4d3 100644 --- a/StoryboardExample/ViewController.swift +++ b/StoryboardExample/ViewController.swift @@ -22,7 +22,7 @@ class ViewController: UIViewController { } func setupPlayerView(){ - player = TPAVPlayer(assetID: "5X3sT3UXyNY", accessToken: "06d4191c-f470-476a-a0ef-58de2c9c2245"){ error in + player = TPAVPlayer(assetID: "8r65J7EY6NP", accessToken: "c4936043-816a-4404-b165-d7336672e7a7"){ error in guard error == nil else { print("Setup error: \(error!.localizedDescription)") return From c055a13203fad08e6dae51444cf74871364b84d5 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 11 Jan 2024 17:00:34 +0530 Subject: [PATCH 10/16] fix --- Source/Views/SwiftUI/PlayerSettingsButton.swift | 2 +- Source/Views/UIKit/PlayerControlsUIView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Views/SwiftUI/PlayerSettingsButton.swift b/Source/Views/SwiftUI/PlayerSettingsButton.swift index 9b061eb..f1e3dfa 100644 --- a/Source/Views/SwiftUI/PlayerSettingsButton.swift +++ b/Source/Views/SwiftUI/PlayerSettingsButton.swift @@ -116,7 +116,7 @@ struct PlayerSettingsButton: View { availableVideoQualities.remove(at: 0) return availableVideoQualities.map { downloadQuality in .default(Text(downloadQuality.resolution)) { - TPStreamsDownloadManager.shared.startDownload(asset: player.asset!, bitRate: downloadQuality.bitrate) + TPStreamsDownloadManager.shared.startDownload(asset: player.asset!, videoQuality: downloadQuality) } } } diff --git a/Source/Views/UIKit/PlayerControlsUIView.swift b/Source/Views/UIKit/PlayerControlsUIView.swift index 7010ddf..e84fe7e 100644 --- a/Source/Views/UIKit/PlayerControlsUIView.swift +++ b/Source/Views/UIKit/PlayerControlsUIView.swift @@ -200,7 +200,7 @@ class PlayerControlsUIView: UIView { func createActionForDownload(_ quality: VideoQuality) -> UIAlertAction { let action = UIAlertAction(title: quality.resolution, style: .default, handler: { (_) in - TPStreamsDownloadManager.shared.startDownload(asset: self.player.asset!, bitRate: quality.bitrate) + TPStreamsDownloadManager.shared.startDownload(asset: self.player.asset!, videoQuality: quality) }) return action From f5bebe829be0ed89fc094846291b34812a0562fc Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 12 Jan 2024 11:55:48 +0530 Subject: [PATCH 11/16] refcator --- Source/TPStreamPlayerView.swift | 12 +----------- Source/Views/SwiftUI/PlayerControlsView.swift | 9 +++------ Source/Views/SwiftUI/PlayerSettingsButton.swift | 16 +--------------- 3 files changed, 5 insertions(+), 32 deletions(-) diff --git a/Source/TPStreamPlayerView.swift b/Source/TPStreamPlayerView.swift index 0513d7b..4f10725 100644 --- a/Source/TPStreamPlayerView.swift +++ b/Source/TPStreamPlayerView.swift @@ -10,7 +10,6 @@ import SwiftUI @available(iOS 14.0, *) public struct TPStreamPlayerView: View { @State private var isFullScreen = false - private var enableDownload: Bool = false var player: TPAVPlayer @@ -22,7 +21,7 @@ public struct TPStreamPlayerView: View { GeometryReader { geometry in ZStack { AVPlayerBridge(player: player) - PlayerControlsView(player: player, isFullscreen: $isFullScreen, enableDownload: enableDownload) + PlayerControlsView(player: player, isFullscreen: $isFullScreen) } .padding(.horizontal, isFullScreen ? 48 : 0) .frame(width: isFullScreen ? UIScreen.main.fixedCoordinateSpace.bounds.height : geometry.size.width, @@ -52,12 +51,3 @@ public struct TPStreamPlayerView: View { } } } - -@available(iOS 14.0, *) -extension TPStreamPlayerView { - public func enableDownload(_ enable: Bool = false) -> TPStreamPlayerView { - var modifiedView = self - modifiedView.enableDownload = enable - return modifiedView - } -} diff --git a/Source/Views/SwiftUI/PlayerControlsView.swift b/Source/Views/SwiftUI/PlayerControlsView.swift index 900cc68..fa4a803 100644 --- a/Source/Views/SwiftUI/PlayerControlsView.swift +++ b/Source/Views/SwiftUI/PlayerControlsView.swift @@ -6,18 +6,16 @@ struct PlayerControlsView: View { @State private var showControls = false @State private var controlsHideTimer: Timer? @Binding private var isFullscreen: Bool - private var enableDownload: Bool = false - init(player: TPAVPlayer, isFullscreen: Binding, enableDownload: Bool){ + init(player: TPAVPlayer, isFullscreen: Binding){ _player = StateObject(wrappedValue: TPStreamPlayerObservable(player: player)) _isFullscreen = isFullscreen - self.enableDownload = enableDownload } var body: some View { VStack{ if showControls { - PlayerSettingsButton(enableDownload: enableDownload) + PlayerSettingsButton() Spacer() MediaControlsView() Spacer() @@ -65,8 +63,7 @@ struct TPVideoPlayerControls_Previews: PreviewProvider { assetID: "dummy", accessToken: "dummy" ), - isFullscreen: .constant(true), - enableDownload: true + isFullscreen: .constant(true) ).background(Color.black) } } diff --git a/Source/Views/SwiftUI/PlayerSettingsButton.swift b/Source/Views/SwiftUI/PlayerSettingsButton.swift index f1e3dfa..2d247a3 100644 --- a/Source/Views/SwiftUI/PlayerSettingsButton.swift +++ b/Source/Views/SwiftUI/PlayerSettingsButton.swift @@ -4,14 +4,9 @@ import SwiftUI struct PlayerSettingsButton: View { @State private var showOptions = false @State private var currentMenu: SettingsMenu = .main - private var enableDownload: Bool = false @EnvironmentObject var player: TPStreamPlayerObservable - init(enableDownload: Bool) { - self.enableDownload = enableDownload - } - var body: some View { HStack { Spacer() @@ -34,7 +29,7 @@ struct PlayerSettingsButton: View { return ActionSheet( title: Text("Settings"), message: nil, - buttons: getButtons() + buttons: [playbackSpeedButton(), videoQualityButton(), downloadQualityButton(), .cancel()] ) case .playbackSpeed: return ActionSheet( @@ -57,15 +52,6 @@ struct PlayerSettingsButton: View { } } - private func getButtons() -> [ActionSheet.Button] { - var buttons = [playbackSpeedButton(), videoQualityButton()] - if enableDownload { - buttons.append(downloadQualityButton()) - } - buttons.append(.cancel()) - return buttons - } - private func playbackSpeedButton() -> ActionSheet.Button { return .default(Text("Playback Speed - \(player.currentPlaybackSpeed.label)")) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { From 9fb45be0785c7cab4cd96f8f91040ae991b9e52d Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 12 Jan 2024 11:56:52 +0530 Subject: [PATCH 12/16] refcator --- Example/ContentView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Example/ContentView.swift b/Example/ContentView.swift index 86f2a49..32fe973 100644 --- a/Example/ContentView.swift +++ b/Example/ContentView.swift @@ -15,7 +15,6 @@ struct ContentView: View { let player = TPAVPlayer(assetID: "8eaHZjXt6km", accessToken: "16b608ba-9979-45a0-94fb-b27c1a86b3c1") TPStreamPlayerView(player: player) - .enableDownload(true) .frame(height: 240) Spacer() } From 595704f0a16337472e0fe710239dd63c02979ae6 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 12 Jan 2024 12:22:46 +0530 Subject: [PATCH 13/16] refcator --- Source/TPStreamPlayerConfiguration.swift | 6 +++--- Source/Views/UIKit/PlayerControlsUIView.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/TPStreamPlayerConfiguration.swift b/Source/TPStreamPlayerConfiguration.swift index ea5ac3f..99f510b 100644 --- a/Source/TPStreamPlayerConfiguration.swift +++ b/Source/TPStreamPlayerConfiguration.swift @@ -13,7 +13,7 @@ public struct TPStreamPlayerConfiguration { public var preferredRewindDuration: TimeInterval = 10.0 public var watchedProgressTrackColor: UIColor = .red public var progressBarThumbColor: UIColor = .red - public var enableDownload: Bool = false + public var showDownloadOption: Bool = false } @@ -44,8 +44,8 @@ public class TPStreamPlayerConfigurationBuilder { return self } - public func enableDownload(_ enable: Bool) -> Self { - configuration.enableDownload = enable + public func showDownloadOption() -> Self { + configuration.showDownloadOption = true return self } diff --git a/Source/Views/UIKit/PlayerControlsUIView.swift b/Source/Views/UIKit/PlayerControlsUIView.swift index e84fe7e..618f6ca 100644 --- a/Source/Views/UIKit/PlayerControlsUIView.swift +++ b/Source/Views/UIKit/PlayerControlsUIView.swift @@ -119,7 +119,7 @@ class PlayerControlsUIView: UIView { optionsMenu.addAction(UIAlertAction(title: "Playback Speed", style: .default) { _ in self.showPlaybackSpeedMenu()}) optionsMenu.addAction(UIAlertAction(title: "Video Quality", style: .default, handler: { action in self.showVideoQualityMenu()})) optionsMenu.addAction(UIAlertAction(title: "Cancel", style: .cancel)) - if playerConfig.enableDownload { + if playerConfig.showDownloadOption { optionsMenu.addAction(UIAlertAction(title: "Download", style: .default, handler: { action in self.showDownloadQualityMenu()})) } parentViewController?.present(optionsMenu, animated: true, completion: nil) From 2a6f298813f9735bc836bc618e9d14bab8cbaa15 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 12 Jan 2024 12:31:48 +0530 Subject: [PATCH 14/16] refcator --- StoryboardExample/ViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoryboardExample/ViewController.swift b/StoryboardExample/ViewController.swift index 7d2f4d3..b39c451 100644 --- a/StoryboardExample/ViewController.swift +++ b/StoryboardExample/ViewController.swift @@ -40,7 +40,7 @@ class ViewController: UIViewController { .setPreferredRewindDuration(5) .setprogressBarThumbColor(.systemBlue) .setwatchedProgressTrackColor(.systemBlue) - .enableDownload(true) + .showDownloadOption() .build() playerViewController?.config = config From 5cdccf599c9746a2ccb0d586a5b3e390b21bd17a Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 18 Jan 2024 19:11:29 +0530 Subject: [PATCH 15/16] refcator --- Source/Database/Model/OfflineAsset.swift | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/Source/Database/Model/OfflineAsset.swift b/Source/Database/Model/OfflineAsset.swift index 4571095..effefed 100644 --- a/Source/Database/Model/OfflineAsset.swift +++ b/Source/Database/Model/OfflineAsset.swift @@ -44,25 +44,6 @@ extension OfflineAsset { offlineAsset.size = (bitRate * duration) return offlineAsset } - - static func create( - assetId: String, - srcURL: String, - title: String, - resolution: String, - duration:Double, - bitRate: Double - ) -> OfflineAsset { - let offlineAsset = OfflineAsset() - offlineAsset.assetId = assetId - offlineAsset.srcURL = srcURL - offlineAsset.title = title - offlineAsset.resolution = resolution - offlineAsset.duration = duration - offlineAsset.bitRate = bitRate - offlineAsset.size = (bitRate * duration) - return offlineAsset - } } enum Status: String { From 8acee86282e375bf9e4f52518eb2791f47c9a212 Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Thu, 18 Jan 2024 19:15:20 +0530 Subject: [PATCH 16/16] refactor --- Source/Database/ObjectManager.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Source/Database/ObjectManager.swift b/Source/Database/ObjectManager.swift index 42b8c1a..2ae93c7 100644 --- a/Source/Database/ObjectManager.swift +++ b/Source/Database/ObjectManager.swift @@ -33,9 +33,4 @@ public class ObjectManager { let object = realm.object(ofType: T.self, forPrimaryKey: id) return object != nil } - - func isExist(assetId: Any) -> Bool { - let object = realm.object(ofType: T.self, forPrimaryKey: assetId) - return object != nil - } }