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", ) } } 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..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 @@ -118,6 +118,7 @@ import java.util.concurrent.Executors import javax.net.ssl.HttpsURLConnection import javax.net.ssl.SSLContext import javax.net.ssl.SSLSession +import kotlin.uuid.Uuid const val TAG = "CS3ExoPlayer" const val PREFERRED_AUDIO_LANGUAGE_KEY = "preferred_audio_language" @@ -247,6 +248,10 @@ class CS3IPlayer : IPlayer { } } + private fun Uuid.toJavaUUID(): UUID { + return UUID.fromString(this.toString()) + } + fun String.stripTrackId(): String { return this.replace(Regex("""^\d+:"""), "") } @@ -1278,7 +1283,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 +1304,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") @@ -1914,7 +1919,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, 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..53e82afaacd 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -1,8 +1,11 @@ +@file:OptIn(ExperimentalUuidApi::class) + 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 @@ -316,6 +319,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 +436,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 +481,11 @@ suspend fun newExtractorLink( return builder } +// 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, @@ -484,7 +494,33 @@ 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 +} + +@Prerelease +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 +546,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 +564,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 +586,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 +621,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, 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 +}