From 4e8c57239435c926c9d65c2aa247f73e13a0c733 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:06:43 -0600 Subject: [PATCH 01/11] ExtractorAPI: use Kotlin Uuid --- .../cloudstream3/ui/player/CS3IPlayer.kt | 13 +++-- .../cloudstream3/utils/ExtractorApi.kt | 50 +++++++++++++++---- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index aa44b92359b..a62984e376d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -118,6 +118,8 @@ import java.util.concurrent.Executors import javax.net.ssl.HttpsURLConnection import javax.net.ssl.SSLContext import javax.net.ssl.SSLSession +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid const val TAG = "CS3ExoPlayer" const val PREFERRED_AUDIO_LANGUAGE_KEY = "preferred_audio_language" @@ -247,6 +249,11 @@ class CS3IPlayer : IPlayer { } } + @OptIn(ExperimentalUuidApi::class) + private fun Uuid.toJavaUUID(): UUID { + return UUID(mostSignificantBits, leastSignificantBits) + } + fun String.stripTrackId(): String { return this.replace(Regex("""^\d+:"""), "") } @@ -1278,7 +1285,7 @@ class CS3IPlayer : IPlayer { item.drm?.let { drm -> when (drm.uuid) { - CLEARKEY_UUID -> { + CLEARKEY_UUID.toJavaUUID() -> { // Use headers from DrmMetadata for media requests val client = dataSourceFactory ?: throw IllegalArgumentException("Must supply onlineSource") @@ -1299,8 +1306,8 @@ class CS3IPlayer : IPlayer { .createMediaSource(item.mediaItem) } - WIDEVINE_UUID, - PLAYREADY_UUID -> { + WIDEVINE_UUID.toJavaUUID(), + PLAYREADY_UUID.toJavaUUID() -> { // Use headers from DrmMetadata for media requests val client = dataSourceFactory ?: throw IllegalArgumentException("Must supply onlineSource") diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 66055d7def5..82a5d96a9b9 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalUuidApi::class) + package com.lagradost.cloudstream3.utils import com.fasterxml.jackson.annotation.JsonIgnore @@ -316,6 +318,8 @@ import org.jsoup.Jsoup import java.net.URI import java.util.UUID import kotlin.coroutines.cancellation.CancellationException +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid /** * For use in the ConcatenatingMediaSource. @@ -431,29 +435,29 @@ private fun inferTypeFromUrl(url: String): ExtractorLinkType { val INFER_TYPE: ExtractorLinkType? = null /** - * UUID for the ClearKey DRM scheme. + * [Uuid] for the ClearKey DRM scheme. * * * ClearKey is supported on Android devices running Android 5.0 (API Level 21) and up. */ -val CLEARKEY_UUID = UUID(-0x1d8e62a7567a4c37L, 0x781AB030AF78D30EL) +val CLEARKEY_UUID = Uuid.fromLongs(-0x1d8e62a7567a4c37L, 0x781AB030AF78D30EL) /** - * UUID for the Widevine DRM scheme. + * [Uuid] for the Widevine DRM scheme. * * * Widevine is supported on Android devices running Android 4.3 (API Level 18) and up. */ -val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L) +val WIDEVINE_UUID = Uuid.fromLongs(-0x121074568629b532L, -0x5c37d8232ae2de13L) /** - * UUID for the PlayReady DRM scheme. + * [Uuid] for the PlayReady DRM scheme. * * * PlayReady is supported on all AndroidTV devices. Note that most other Android devices do not * provide PlayReady support. */ -val PLAYREADY_UUID = UUID(-0x65fb0f8667bfbd7aL, -0x546d19a41f77a06bL) +val PLAYREADY_UUID = Uuid.fromLongs(-0x65fb0f8667bfbd7aL, -0x546d19a41f77a06bL) suspend fun newExtractorLink( source: String, @@ -476,6 +480,7 @@ suspend fun newExtractorLink( return builder } +// Deprecate suspend fun newDrmExtractorLink( source: String, name: String, @@ -484,7 +489,32 @@ suspend fun newDrmExtractorLink( uuid: UUID, initializer: suspend DrmExtractorLink.() -> Unit = { } ): DrmExtractorLink { + fun UUID.toKotlinUuid(): Uuid { + return Uuid.fromLongs(mostSignificantBits, leastSignificantBits) + } + + @Suppress("DEPRECATION_ERROR") + val builder = + DrmExtractorLink( + source = source, + name = name, + url = url, + uuid = uuid.toKotlinUuid(), + type = type ?: INFER_TYPE + ) + builder.initializer() + return builder +} + +suspend fun newDrmExtractorLink( + source: String, + name: String, + url: String, + type: ExtractorLinkType? = null, + uuid: Uuid, + initializer: suspend DrmExtractorLink.() -> Unit = { } +): DrmExtractorLink { @Suppress("DEPRECATION_ERROR") val builder = DrmExtractorLink( @@ -510,7 +540,7 @@ suspend fun newDrmExtractorLink( * @property type the type of the media, use [INFER_TYPE] if you want to auto infer the type from the url * @property kid Base64 value of The KID element (Key Id) contains the identifier of the key associated with a license. * @property key Base64 value of Key to be used to decrypt the media file. - * @property uuid Drm UUID [WIDEVINE_UUID], [PLAYREADY_UUID], [CLEARKEY_UUID] (by default) .. etc + * @property uuid Drm [Uuid] [WIDEVINE_UUID], [PLAYREADY_UUID], [CLEARKEY_UUID] (by default) .. etc * @property kty Key type "oct" (octet sequence) by default * @property keyRequestParameters Parameters that will used to request the key. * @see newDrmExtractorLink @@ -528,7 +558,7 @@ open class DrmExtractorLink private constructor( override var type: ExtractorLinkType, open var kid: String? = null, open var key: String? = null, - open var uuid: UUID, + open var uuid: Uuid, open var kty: String? = null, open var keyRequestParameters: HashMap, open var licenseUrl: String? = null, @@ -550,7 +580,7 @@ open class DrmExtractorLink private constructor( extractorData: String? = null, kid: String? = null, key: String? = null, - uuid: UUID = CLEARKEY_UUID, + uuid: Uuid = CLEARKEY_UUID, kty: String? = "oct", keyRequestParameters: HashMap = hashMapOf(), licenseUrl: String? = null, @@ -585,7 +615,7 @@ open class DrmExtractorLink private constructor( extractorData: String? = null, kid: String? = null, key: String? = null, - uuid: UUID = CLEARKEY_UUID, + uuid: Uuid = CLEARKEY_UUID, kty: String? = "oct", keyRequestParameters: HashMap = hashMapOf(), licenseUrl: String? = null, From 057b118f97e63d747d5dfe8fc92cfe58fc342911 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:12:42 -0600 Subject: [PATCH 02/11] Fix --- .../com/lagradost/cloudstream3/utils/HlsPlaylistParser.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/HlsPlaylistParser.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/HlsPlaylistParser.kt index 898550b2467..f6da18390b4 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/HlsPlaylistParser.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/HlsPlaylistParser.kt @@ -1179,7 +1179,7 @@ object HlsPlaylistParser { if (KEYFORMAT_WIDEVINE_PSSH_BINARY == keyFormat) { val uriString = parseStringAttr(line, REGEX_URI, variableDefinitions) return SchemeData( - uuid = WIDEVINE_UUID, + uuid = C.WIDEVINE_UUID, mimeType = MimeTypes.VIDEO_MP4, data = Base64.Default.decode(uriString.substring(uriString.indexOf(','))) ) @@ -2078,4 +2078,4 @@ object HlsPlaylistParser { sessionKeyDrmInitData = sessionKeyDrmInitData ) } -} \ No newline at end of file +} From 7e1283b524faab98551ce4074ee0555361f97aec Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:16:58 -0600 Subject: [PATCH 03/11] Update --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index a62984e376d..6273608d756 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1,3 +1,4 @@ +@file:OptIn(ExperimentalUuidApi::class) @file:Suppress("DEPRECATION") package com.lagradost.cloudstream3.ui.player @@ -249,7 +250,6 @@ class CS3IPlayer : IPlayer { } } - @OptIn(ExperimentalUuidApi::class) private fun Uuid.toJavaUUID(): UUID { return UUID(mostSignificantBits, leastSignificantBits) } From 96a134e34edbca2f57ac975c8b1a1722d026ab75 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:21:18 -0600 Subject: [PATCH 04/11] Add deprecation --- .../kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 82a5d96a9b9..c4af9fb7681 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -480,7 +480,11 @@ suspend fun newExtractorLink( return builder } -// Deprecate +// Deprecate after next stable +/* @Deprecated( + message = "Use Kotlin Uuid (kotlin.uuid.Uuid) instead of Java UUID.", + level = DeprecationLevel.WARNING, +) */ suspend fun newDrmExtractorLink( source: String, name: String, From 9fa919ca5c1c501a8e11e01195c959a69a79d0aa Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:22:40 -0600 Subject: [PATCH 05/11] Add --- .../kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt index c4af9fb7681..53e82afaacd 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -5,6 +5,7 @@ package com.lagradost.cloudstream3.utils import com.fasterxml.jackson.annotation.JsonIgnore import com.lagradost.cloudstream3.AudioFile import com.lagradost.cloudstream3.IDownloadableMinimum +import com.lagradost.cloudstream3.Prerelease import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.USER_AGENT import com.lagradost.cloudstream3.app @@ -511,6 +512,7 @@ suspend fun newDrmExtractorLink( return builder } +@Prerelease suspend fun newDrmExtractorLink( source: String, name: String, From cb2bfc97faa8df8dd41aa1e2ad7f5807a886748c Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:26:26 -0600 Subject: [PATCH 06/11] Update --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 6273608d756..7934498cd71 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1,4 +1,4 @@ -@file:OptIn(ExperimentalUuidApi::class) +@file:OptIn(kotlin.uuid.ExperimentalUuidApi::class) @file:Suppress("DEPRECATION") package com.lagradost.cloudstream3.ui.player From 92eefbb13e6c653a24b50f2f7f1d5220dee5790c Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:28:29 -0600 Subject: [PATCH 07/11] Update --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 7934498cd71..c9110ebbb1b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1921,7 +1921,7 @@ class CS3IPlayer : IPlayer { drm = DrmMetadata( kid = link.kid, key = link.key, - uuid = link.uuid, + uuid = link.uuid.toJavaUUID(), kty = link.kty, licenseUrl = link.licenseUrl, keyRequestParameters = link.keyRequestParameters, From 7634d2969f91f8f0e7be150df049404449dbd764 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:30:51 -0600 Subject: [PATCH 08/11] Order --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index c9110ebbb1b..af5040b9ea9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1,5 +1,5 @@ -@file:OptIn(kotlin.uuid.ExperimentalUuidApi::class) @file:Suppress("DEPRECATION") +@file:OptIn(kotlin.uuid.ExperimentalUuidApi::class) package com.lagradost.cloudstream3.ui.player From fd5189cb5afc537ba7cd892fcfba5c7f2e1f63e6 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:33:30 -0600 Subject: [PATCH 09/11] Update --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index af5040b9ea9..9b4a9912861 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -251,7 +251,7 @@ class CS3IPlayer : IPlayer { } private fun Uuid.toJavaUUID(): UUID { - return UUID(mostSignificantBits, leastSignificantBits) + return UUID.fromString(this.toString()) } fun String.stripTrackId(): String { From 934f1b013b69c02d04b8dc9214c2331f86fec523 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:37:52 -0600 Subject: [PATCH 10/11] Add --- app/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 05b25237a87..6c784f3ef8d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -317,6 +317,7 @@ tasks.withType { optIn.addAll( "com.lagradost.cloudstream3.InternalAPI", "com.lagradost.cloudstream3.Prerelease", + "kotlin.uuid.ExperimentalUuidApi", ) } } From 251179d9df016345c5784c6717d359f31406a93b Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 30 May 2026 11:38:58 -0600 Subject: [PATCH 11/11] - --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 9b4a9912861..20953ae529a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1,5 +1,4 @@ @file:Suppress("DEPRECATION") -@file:OptIn(kotlin.uuid.ExperimentalUuidApi::class) package com.lagradost.cloudstream3.ui.player @@ -119,7 +118,6 @@ import java.util.concurrent.Executors import javax.net.ssl.HttpsURLConnection import javax.net.ssl.SSLContext import javax.net.ssl.SSLSession -import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid const val TAG = "CS3ExoPlayer"