Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion TPStreamsRNPlayerView.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Pod::Spec.new do |s|
'DEFINES_MODULE' => 'YES',
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES'
}
s.dependency "TPStreamsSDK" , "1.2.16"
s.dependency "TPStreamsSDK" , "1.2.23"


# Ensure the module is not built as a framework to avoid bridging header conflicts
Expand Down
2 changes: 1 addition & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ Tpstreams_minSdkVersion=24
Tpstreams_targetSdkVersion=34
Tpstreams_compileSdkVersion=35
Tpstreams_ndkVersion=27.1.12297006
Tpstreams_tpstreamsAndroidPlayerVersion=1.1.8
Tpstreams_tpstreamsAndroidPlayerVersion=1.1.9
15 changes: 14 additions & 1 deletion android/src/main/java/com/tpstreams/JsonUtils.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.tpstreams

import org.json.JSONException
import org.json.JSONObject

object JsonUtils {
Expand Down Expand Up @@ -43,4 +44,16 @@ object JsonUtils {
}
return map
}
}

fun jsonStringToMap(jsonString: String?): Map<String, String>? {
if (jsonString.isNullOrEmpty()) return null
return try {
val jsonObject = JSONObject(jsonString)
jsonObject.keys()
.asSequence()
.associate { it to jsonObject.getString(it) }
} catch (e: JSONException) {
null
}
}
}
32 changes: 32 additions & 0 deletions android/src/main/java/com/tpstreams/TPStreamsDownloadModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.WritableMap
import com.facebook.react.modules.core.DeviceEventManagerModule
import com.tpstreams.player.download.DownloadClient
Expand All @@ -23,6 +24,37 @@ class TPStreamsDownloadModule(private val reactContext: ReactApplicationContext)
return "TPStreamsDownload"
}

@ReactMethod
fun startDownload(
videoId: String,
accessToken: String,
resolution: String?,
metadata: ReadableMap?,
promise: Promise
) {
try {
val metadataString = metadata?.let { org.json.JSONObject(it.toHashMap()).toString() }
val metadataMap = JsonUtils.jsonStringToMap(metadataString)

val activity = currentActivity ?: run {
promise.reject("DOWNLOAD_START_ERROR", "No current activity available")
return
}

downloadClient.startDownload(
activity,
videoId,
accessToken,
resolution,
metadataMap
)
promise.resolve(null)
} catch (e: Exception) {
Log.e(TAG, "Error starting download: ${e.message}", e)
promise.reject("DOWNLOAD_START_ERROR", e.message, e)
}
}

@ReactMethod
fun addDownloadProgressListener(promise: Promise) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,7 @@ class TPStreamsRNPlayerViewManager : SimpleViewManager<TPStreamsRNPlayerView>(),

@ReactProp(name = "downloadMetadata")
override fun setDownloadMetadata(view: TPStreamsRNPlayerView, metadata: String?) {
val metadataMap = if (!metadata.isNullOrEmpty()) {
try {
val jsonObject = org.json.JSONObject(metadata)
val map = jsonObject.keys()
.asSequence()
.associate { it to jsonObject.getString(it) }
.toMutableMap()
map
} catch (e: org.json.JSONException) {
android.util.Log.w("TPStreamsRN", "Error parsing download metadata: ${e.message}")
null
}
} else null
view.setDownloadMetadata(metadataMap)
view.setDownloadMetadata(JsonUtils.jsonStringToMap(metadata))
}

// Command implementations
Expand Down
7 changes: 7 additions & 0 deletions ios/TPStreamsDownloadModule.mm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ @interface RCT_EXTERN_MODULE(TPStreamsDownload, RCTEventEmitter)
rejecter:(RCTPromiseRejectBlock)reject)

// Download Control Methods
RCT_EXTERN_METHOD(startDownload:(NSString *)videoId
accessToken:(NSString *)accessToken
resolution:(NSString *)resolution
metadata:(NSDictionary *)metadata
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(pauseDownload:(NSString *)videoId
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
Expand Down
14 changes: 14 additions & 0 deletions ios/TPStreamsDownloadModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@ class TPStreamsDownloadModule: RCTEventEmitter, TPStreamsDownloadDelegate {
return true
}

@objc
func startDownload(_ videoId: String, accessToken: String, resolution: String?, metadata: NSDictionary?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }

let metadataDict = metadata as? [String: Any]
let res = (resolution?.isEmpty ?? true) ? nil : resolution
let presentingVC = (res == nil) ? RCTPresentedViewController() : nil

self.downloadManager.startDownload(assetID: videoId, accessToken: accessToken, resolution: res, allowResolutionFallback: true, metadata: metadataDict, presentingViewController: presentingVC, completion: nil)
resolve(nil)
}
}

@objc
func addDownloadProgressListener(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
isListening = true
Expand Down
14 changes: 14 additions & 0 deletions src/TPStreamsDownload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@ export type DownloadStateChangeListener = (

const downloadEventEmitter = new NativeEventEmitter(TPStreamsDownload);

export function startDownload(
videoId: string,
accessToken: string,
resolution: string | null = null,
metadata: Record<string, any> | null = null
): Promise<void> {
return TPStreamsDownload.startDownload(
videoId,
accessToken,
resolution,
metadata
);
}

export function addDownloadProgressListener(): Promise<void> {
return TPStreamsDownload.addDownloadProgressListener();
}
Expand Down
1 change: 1 addition & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export { default as TPStreamsPlayerView } from './TPStreamsPlayer';
export type { TPStreamsPlayerRef } from './TPStreamsPlayer';

export {
startDownload,
pauseDownload,
resumeDownload,
removeDownload,
Expand Down
Loading