From be6bcb37ae79bbd3175daae743aaf320cd6b1d24 Mon Sep 17 00:00:00 2001 From: Kai Date: Mon, 10 Feb 2025 13:54:04 -0600 Subject: [PATCH] move widevine code to JSSource Changelog: changed --- .../sources/IAudioUrlWidevineSource.kt | 2 +- .../sources/IDashManifestWidevineSource.kt | 2 +- .../sources/IVideoUrlWidevineSource.kt | 2 +- .../models/streams/sources/IWidevineSource.kt | 9 -------- .../sources/JSAudioUrlWidevineSource.kt | 20 ---------------- .../sources/JSDashManifestRawAudioSource.kt | 23 +------------------ .../sources/JSDashManifestWidevineSource.kt | 20 ---------------- .../platforms/js/models/sources/JSSource.kt | 23 ++++++++++++++++--- .../sources/JSVideoUrlWidevineSource.kt | 20 ---------------- .../platformplayer/helpers/VideoHelper.kt | 6 ++--- .../views/video/FutoVideoPlayerBase.kt | 7 +++--- 11 files changed, 30 insertions(+), 104 deletions(-) delete mode 100644 app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IWidevineSource.kt diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IAudioUrlWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IAudioUrlWidevineSource.kt index 33d4fa54..7e2908aa 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IAudioUrlWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IAudioUrlWidevineSource.kt @@ -1,3 +1,3 @@ package com.futo.platformplayer.api.media.models.streams.sources -interface IAudioUrlWidevineSource : IAudioUrlSource, IWidevineSource +interface IAudioUrlWidevineSource : IAudioUrlSource diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IDashManifestWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IDashManifestWidevineSource.kt index c1b5ea35..9b0e3f8f 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IDashManifestWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IDashManifestWidevineSource.kt @@ -1,5 +1,5 @@ package com.futo.platformplayer.api.media.models.streams.sources -interface IDashManifestWidevineSource : IWidevineSource { +interface IDashManifestWidevineSource { val url: String } diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IVideoUrlWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IVideoUrlWidevineSource.kt index 073af50a..3ea27f5c 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IVideoUrlWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IVideoUrlWidevineSource.kt @@ -1,3 +1,3 @@ package com.futo.platformplayer.api.media.models.streams.sources -interface IVideoUrlWidevineSource : IVideoUrlSource, IWidevineSource +interface IVideoUrlWidevineSource : IVideoUrlSource diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IWidevineSource.kt deleted file mode 100644 index 05927e27..00000000 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/streams/sources/IWidevineSource.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.futo.platformplayer.api.media.models.streams.sources - -import com.futo.platformplayer.api.media.platforms.js.models.JSRequestExecutor - -interface IWidevineSource { - val drmLicenseUri: String? - val hasLicenseRequestExecutor: Boolean - fun getLicenseRequestExecutor(): JSRequestExecutor? -} \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSAudioUrlWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSAudioUrlWidevineSource.kt index c83ec563..ad75125b 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSAudioUrlWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSAudioUrlWidevineSource.kt @@ -8,30 +8,10 @@ import com.futo.platformplayer.engine.V8Plugin import com.futo.platformplayer.getOrThrow class JSAudioUrlWidevineSource : JSAudioUrlSource, IAudioUrlWidevineSource { - override val drmLicenseUri: String - override val hasLicenseRequestExecutor: Boolean - @Suppress("ConvertSecondaryConstructorToPrimary") constructor(plugin: JSClient, obj: V8ValueObject) : super(plugin, obj) { val contextName = "JSAudioUrlWidevineSource" val config = plugin.config - - drmLicenseUri = _obj.getOrThrow(config, "drmLicenseUri", contextName) - hasLicenseRequestExecutor = obj.has("getLicenseRequestExecutor") - } - - override fun getLicenseRequestExecutor(): JSRequestExecutor? { - if (!hasLicenseRequestExecutor || _obj.isClosed) - return null - - val result = V8Plugin.catchScriptErrors(_config, "[${_config.name}] JSAudioUrlWidevineSource", "obj.getLicenseRequestExecutor()") { - _obj.invoke("getLicenseRequestExecutor", arrayOf()) - } - - if (result !is V8ValueObject) - return null - - return JSRequestExecutor(_plugin, result) } override fun toString(): String { diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt index e678b0b5..048fee9a 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestRawAudioSource.kt @@ -2,7 +2,6 @@ package com.futo.platformplayer.api.media.platforms.js.models.sources import com.caoccao.javet.values.reference.V8ValueObject import com.futo.platformplayer.api.media.models.streams.sources.IAudioSource -import com.futo.platformplayer.api.media.models.streams.sources.IWidevineSource import com.futo.platformplayer.api.media.platforms.js.DevJSClient import com.futo.platformplayer.api.media.platforms.js.JSClient import com.futo.platformplayer.api.media.platforms.js.models.JSRequestExecutor @@ -12,7 +11,7 @@ import com.futo.platformplayer.getOrThrow import com.futo.platformplayer.others.Language import com.futo.platformplayer.states.StateDeveloper -class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawSource, IWidevineSource { +class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawSource { override val container : String = "application/dash+xml"; override val name : String; override val codec: String; @@ -27,9 +26,6 @@ class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawS override val hasGenerate: Boolean; - override val drmLicenseUri: String? - override val hasLicenseRequestExecutor: Boolean - constructor(plugin: JSClient, obj: V8ValueObject) : super(TYPE_DASH_RAW, plugin, obj) { val contextName = "DashRawSource"; val config = plugin.config; @@ -42,23 +38,6 @@ class JSDashManifestRawAudioSource : JSSource, IAudioSource, IJSDashManifestRawS priority = _obj.getOrDefault(config, "priority", contextName, false) ?: false; language = _obj.getOrDefault(config, "language", contextName, Language.UNKNOWN) ?: Language.UNKNOWN; hasGenerate = _obj.has("generate"); - - drmLicenseUri = _obj.getOrThrow(config, "drmLicenseUri", contextName) - hasLicenseRequestExecutor = obj.has("getLicenseRequestExecutor") - } - - override fun getLicenseRequestExecutor(): JSRequestExecutor? { - if (!hasLicenseRequestExecutor || _obj.isClosed) - return null - - val result = V8Plugin.catchScriptErrors(_config, "[${_config.name}] JSDashManifestRawAudioSource", "obj.getLicenseRequestExecutor()") { - _obj.invoke("getLicenseRequestExecutor", arrayOf()) - } - - if (result !is V8ValueObject) - return null - - return JSRequestExecutor(_plugin, result) } override fun generate(): String? { diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestWidevineSource.kt index e7b0dc21..b205d574 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSDashManifestWidevineSource.kt @@ -23,9 +23,6 @@ class JSDashManifestWidevineSource : IVideoUrlSource, IDashManifestSource, override var priority: Boolean = false - override val drmLicenseUri: String - override val hasLicenseRequestExecutor: Boolean - @Suppress("ConvertSecondaryConstructorToPrimary") constructor(plugin: JSClient, obj: V8ValueObject) : super(TYPE_DASH, plugin, obj) { val contextName = "DashWidevineSource" @@ -35,23 +32,6 @@ class JSDashManifestWidevineSource : IVideoUrlSource, IDashManifestSource, duration = _obj.getOrThrow(config, "duration", contextName) priority = obj.getOrNull(config, "priority", contextName) ?: false - - drmLicenseUri = _obj.getOrThrow(config, "drmLicenseUri", contextName) - hasLicenseRequestExecutor = obj.has("getLicenseRequestExecutor") - } - - override fun getLicenseRequestExecutor(): JSRequestExecutor? { - if (!hasLicenseRequestExecutor || _obj.isClosed) - return null - - val result = V8Plugin.catchScriptErrors(_config, "[${_config.name}] JSDashManifestWidevineSource", "obj.getLicenseRequestExecutor()") { - _obj.invoke("getLicenseRequestExecutor", arrayOf()) - } - - if (result !is V8ValueObject) - return null - - return JSRequestExecutor(_plugin, result) } override fun getVideoUrl(): String { diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSSource.kt index 3c76e23d..830c6125 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSSource.kt @@ -1,7 +1,5 @@ package com.futo.platformplayer.api.media.platforms.js.models.sources -import androidx.media3.datasource.DefaultHttpDataSource -import androidx.media3.datasource.HttpDataSource import com.caoccao.javet.values.V8Value import com.caoccao.javet.values.reference.V8ValueObject import com.futo.platformplayer.api.media.models.modifier.AdhocRequestModifier @@ -15,9 +13,9 @@ import com.futo.platformplayer.api.media.platforms.js.models.JSRequestModifier import com.futo.platformplayer.engine.IV8PluginConfig import com.futo.platformplayer.engine.V8Plugin import com.futo.platformplayer.getOrDefault +import com.futo.platformplayer.getOrThrow import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.orNull -import com.futo.platformplayer.views.video.datasources.JSHttpDataSource abstract class JSSource { protected val _plugin: JSClient; @@ -30,6 +28,9 @@ abstract class JSSource { val hasRequestExecutor: Boolean; private val _requestExecutor: JSRequest?; + val drmLicenseUri: String? + val hasLicenseRequestExecutor: Boolean + val requiresCustomDatasource: Boolean get() { return hasRequestModifier || hasRequestExecutor; } @@ -51,6 +52,9 @@ abstract class JSSource { JSRequest(plugin, it, null, null, true); } hasRequestExecutor = _requestExecutor != null || obj.has("getRequestExecutor"); + + drmLicenseUri = _obj.getOrThrow(_config, "drmLicenseUri", "JSSource.drmLicenseUri") + hasLicenseRequestExecutor = obj.has("getLicenseRequestExecutor") } fun getRequestModifier(): IRequestModifier? { @@ -84,6 +88,19 @@ abstract class JSSource { return JSRequestExecutor(_plugin, result) } + fun getLicenseRequestExecutor(): JSRequestExecutor? { + if (!hasLicenseRequestExecutor || _obj.isClosed) + return null + + val result = V8Plugin.catchScriptErrors(_config, "[${_config.name}] JSSource", "obj.getLicenseRequestExecutor()") { + _obj.invoke("getLicenseRequestExecutor", arrayOf()) + } + + if (result !is V8ValueObject) + return null + + return JSRequestExecutor(_plugin, result) + } fun getUnderlyingPlugin(): JSClient? { return _plugin; diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSVideoUrlWidevineSource.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSVideoUrlWidevineSource.kt index 6f78c14d..9d374ee6 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSVideoUrlWidevineSource.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/sources/JSVideoUrlWidevineSource.kt @@ -8,30 +8,10 @@ import com.futo.platformplayer.engine.V8Plugin import com.futo.platformplayer.getOrThrow class JSVideoUrlWidevineSource : JSVideoUrlSource, IVideoUrlWidevineSource { - override val drmLicenseUri: String - override val hasLicenseRequestExecutor: Boolean - @Suppress("ConvertSecondaryConstructorToPrimary") constructor(plugin: JSClient, obj: V8ValueObject) : super(plugin, obj) { val contextName = "JSAudioUrlWidevineSource" val config = plugin.config - - drmLicenseUri = _obj.getOrThrow(config, "drmLicenseUri", contextName) - hasLicenseRequestExecutor = obj.has("getLicenseRequestExecutor") - } - - override fun getLicenseRequestExecutor(): JSRequestExecutor? { - if (!hasLicenseRequestExecutor || _obj.isClosed) - return null - - val result = V8Plugin.catchScriptErrors(_config, "[${_config.name}] JSAudioUrlWidevineSource", "obj.getLicenseRequestExecutor()") { - _obj.invoke("getLicenseRequestExecutor", arrayOf()) - } - - if (result !is V8ValueObject) - return null - - return JSRequestExecutor(_plugin, result) } override fun toString(): String { diff --git a/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt b/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt index 58cb73c8..eeda2e8f 100644 --- a/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt +++ b/app/src/main/java/com/futo/platformplayer/helpers/VideoHelper.kt @@ -17,11 +17,11 @@ import com.futo.platformplayer.api.media.models.streams.sources.IHLSManifestAudi import com.futo.platformplayer.api.media.models.streams.sources.IHLSManifestSource import com.futo.platformplayer.api.media.models.streams.sources.IVideoSource import com.futo.platformplayer.api.media.models.streams.sources.IVideoUrlSource -import com.futo.platformplayer.api.media.models.streams.sources.IWidevineSource import com.futo.platformplayer.api.media.models.video.IPlatformVideoDetails import com.futo.platformplayer.api.media.platforms.js.models.sources.JSAudioUrlRangeSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSDashManifestRawAudioSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSDashManifestRawSource +import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSVideoUrlRangeSource import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.others.Language @@ -45,8 +45,8 @@ class VideoHelper { return false } - fun isDownloadable(source: IVideoSource) = (source is IVideoUrlSource || source is IHLSManifestSource || source is JSDashManifestRawSource) && source !is IWidevineSource - fun isDownloadable(source: IAudioSource) = (source is IAudioUrlSource || source is IHLSManifestAudioSource || source is JSDashManifestRawAudioSource) && source !is IWidevineSource && !(source is JSDashManifestRawAudioSource && source.drmLicenseUri != null) + fun isDownloadable(source: IVideoSource) = (source is IVideoUrlSource || source is IHLSManifestSource || source is JSDashManifestRawSource) && !(source is JSSource && source.drmLicenseUri != null) + fun isDownloadable(source: IAudioSource) = (source is IAudioUrlSource || source is IHLSManifestAudioSource || source is JSDashManifestRawAudioSource) && !(source is JSSource && source.drmLicenseUri != null) fun selectBestVideoSource(desc: IVideoSourceDescriptor, desiredPixelCount : Int, prefContainers : Array) : IVideoSource? = selectBestVideoSource(desc.videoSources.toList(), desiredPixelCount, prefContainers); fun selectBestVideoSource(sources: Iterable, desiredPixelCount : Int, prefContainers : Array) : IVideoSource? { val targetVideo = if(desiredPixelCount > 0) { diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index 9c9cd328..a6694394 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -494,7 +494,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { else DefaultHttpDataSource.Factory().setUserAgent(DEFAULT_USER_AGENT) - val baseCallback = HttpMediaDrmCallback(videoSource.drmLicenseUri, dataSource) + val baseCallback = HttpMediaDrmCallback((videoSource as JSSource).drmLicenseUri, dataSource) val callback = if (videoSource.hasLicenseRequestExecutor) { PluginMediaDrmCallback(baseCallback, videoSource.getLicenseRequestExecutor()!!, videoSource.drmLicenseUri!!) @@ -534,7 +534,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { if (videoSource is JSSource && (videoSource.requiresCustomDatasource)) videoSource.getHttpDataSourceFactory() else DefaultHttpDataSource.Factory().setUserAgent(DEFAULT_USER_AGENT) - val baseCallback = HttpMediaDrmCallback(videoSource.drmLicenseUri, dataSource) + val baseCallback = HttpMediaDrmCallback((videoSource as JSSource).drmLicenseUri, dataSource) val callback = if (videoSource.hasLicenseRequestExecutor) { PluginMediaDrmCallback(baseCallback, videoSource.getLicenseRequestExecutor()!!, videoSource.drmLicenseUri!!) @@ -741,7 +741,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { else DefaultHttpDataSource.Factory().setUserAgent(DEFAULT_USER_AGENT) - val baseCallback = HttpMediaDrmCallback(audioSource.drmLicenseUri, dataSource) + val baseCallback = HttpMediaDrmCallback((audioSource as JSSource).drmLicenseUri, dataSource) val callback = if (audioSource.hasLicenseRequestExecutor) { PluginMediaDrmCallback(baseCallback, audioSource.getLicenseRequestExecutor()!!, audioSource.drmLicenseUri!!) @@ -760,7 +760,6 @@ abstract class FutoVideoPlayerBase : RelativeLayout { ) } - //Prefered source selection fun getPreferredVideoSource(video: IPlatformVideoDetails, targetPixels: Int = -1): IVideoSource? { val usePreview = false;