From 04c5a3c4a044f8a965d7d3107b2039c2bdd6146b Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 2 Feb 2024 11:20:22 +0530 Subject: [PATCH 1/2] add progress listener --- Example/AppDownloadManager.swift | 17 +++++++++++++---- Source/Database/TPStreamsDownloadManager.swift | 12 ++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Example/AppDownloadManager.swift b/Example/AppDownloadManager.swift index 129a818..9da7b47 100644 --- a/Example/AppDownloadManager.swift +++ b/Example/AppDownloadManager.swift @@ -24,11 +24,11 @@ class AppDownloadManager: TPStreamsDownloadDelegate, ObservableObject { } func onComplete(offlineAsset: OfflineAsset) { - getOfflineAssets() print("Download Complete", offlineAsset) } func onStart(offlineAsset: OfflineAsset) { + offlineAssets.append(offlineAsset) print("Download Start", offlineAsset.assetId) } @@ -45,9 +45,18 @@ class AppDownloadManager: TPStreamsDownloadDelegate, ObservableObject { print("Offline Assets Updated") } - func onStateChange(offlineAsset: OfflineAsset) { - print("Downloads State Change") - getOfflineAssets() + func onStateChange(status: Status, offlineAsset: OfflineAsset) { + updateOfflineAsset(offlineAsset) + } + + func onProgressChange(assetId: String, percentage: Double) { + print("Downloads Progress Change") + } + + func updateOfflineAsset(_ offlineAsset: OfflineAsset) { + if let index = offlineAssets.firstIndex(where: { $0.assetId == offlineAsset.assetId }) { + offlineAssets[index] = offlineAsset + } } deinit { diff --git a/Source/Database/TPStreamsDownloadManager.swift b/Source/Database/TPStreamsDownloadManager.swift index d600b88..6fb231d 100644 --- a/Source/Database/TPStreamsDownloadManager.swift +++ b/Source/Database/TPStreamsDownloadManager.swift @@ -65,6 +65,7 @@ public final class TPStreamsDownloadManager { task.suspend() OfflineAssetEntity.manager.update(object: offlineAssetEntity, with: ["status": Status.paused.rawValue]) tpStreamsDownloadDelegate?.onPause(offlineAsset: offlineAssetEntity.asOfflineAsset()) + tpStreamsDownloadDelegate?.onStateChange(status: .paused, offlineAsset: offlineAssetEntity.asOfflineAsset()) } } @@ -75,6 +76,7 @@ public final class TPStreamsDownloadManager { task.resume() OfflineAssetEntity.manager.update(object: offlineAssetEntity, with: ["status": Status.inProgress.rawValue]) tpStreamsDownloadDelegate?.onResume(offlineAsset: offlineAssetEntity.asOfflineAsset()) + tpStreamsDownloadDelegate?.onStateChange(status: .inProgress, offlineAsset: offlineAssetEntity.asOfflineAsset()) } } } @@ -95,13 +97,11 @@ internal class AssetDownloadDelegate: NSObject, AVAssetDownloadDelegate { guard let offlineAssetEntity = activeDownloadsMap[assetDownloadTask] else { return } updateDownloadCompleteStatus(error, offlineAssetEntity) activeDownloadsMap.removeValue(forKey: assetDownloadTask) - tpStreamsDownloadDelegate?.onComplete(offlineAsset: offlineAssetEntity.asOfflineAsset()) } func urlSession(_ session: URLSession, aggregateAssetDownloadTask: AVAggregateAssetDownloadTask, willDownloadTo location: URL) { guard let offlineAssetEntity = activeDownloadsMap[aggregateAssetDownloadTask] else { return } OfflineAssetEntity.manager.update(object: offlineAssetEntity, with: ["downloadedPath": String(location.relativePath)]) - tpStreamsDownloadDelegate?.onStateChange(offlineAsset: offlineAssetEntity.asOfflineAsset()) } func urlSession(_ session: URLSession, @@ -115,13 +115,16 @@ internal class AssetDownloadDelegate: NSObject, AVAssetDownloadDelegate { let percentageComplete = calculateDownloadPercentage(loadedTimeRanges, timeRangeExpectedToLoad) OfflineAssetEntity.manager.update(object: offlineAssetEntity, with: ["status": Status.inProgress.rawValue, "percentageCompleted": percentageComplete]) - tpStreamsDownloadDelegate?.onStateChange(offlineAsset: offlineAssetEntity.asOfflineAsset()) + tpStreamsDownloadDelegate?.onProgressChange(assetId: offlineAssetEntity.assetId, percentage: percentageComplete) + tpStreamsDownloadDelegate?.onStateChange(status: .inProgress, offlineAsset: offlineAssetEntity.asOfflineAsset()) } private func updateDownloadCompleteStatus(_ error: Error?,_ offlineAssetEntity: OfflineAssetEntity) { let status: Status = (error == nil) ? .finished : .failed let updateValues: [String: Any] = ["status": status.rawValue, "downloadedAt": Date()] OfflineAssetEntity.manager.update(object: offlineAssetEntity, with: updateValues) + tpStreamsDownloadDelegate?.onComplete(offlineAsset: offlineAssetEntity.asOfflineAsset()) + tpStreamsDownloadDelegate?.onStateChange(status: status, offlineAsset: offlineAssetEntity.asOfflineAsset()) } private func calculateDownloadPercentage(_ loadedTimeRanges: [NSValue], _ timeRangeExpectedToLoad: CMTimeRange) -> Double { @@ -139,5 +142,6 @@ public protocol TPStreamsDownloadDelegate { func onStart(offlineAsset: OfflineAsset) func onPause(offlineAsset: OfflineAsset) func onResume(offlineAsset: OfflineAsset) - func onStateChange(offlineAsset: OfflineAsset) + func onStateChange(status: Status, offlineAsset: OfflineAsset) + func onProgressChange(assetId: String, percentage: Double) } From c8421848b457fec17bd3c088b4d20e6d0b82ad0d Mon Sep 17 00:00:00 2001 From: PruthiviRaj27 Date: Fri, 2 Feb 2024 11:32:42 +0530 Subject: [PATCH 2/2] refcator --- Source/Database/TPStreamsDownloadManager.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Database/TPStreamsDownloadManager.swift b/Source/Database/TPStreamsDownloadManager.swift index 6fb231d..a983ad1 100644 --- a/Source/Database/TPStreamsDownloadManager.swift +++ b/Source/Database/TPStreamsDownloadManager.swift @@ -57,6 +57,7 @@ public final class TPStreamsDownloadManager { assetDownloadDelegate.activeDownloadsMap[task] = offlineAssetEntity task.resume() tpStreamsDownloadDelegate?.onStart(offlineAsset: offlineAssetEntity.asOfflineAsset()) + tpStreamsDownloadDelegate?.onStateChange(status: .inProgress, offlineAsset: offlineAssetEntity.asOfflineAsset()) } public func pauseDownload(_ offlineAsset: OfflineAsset) {