Skip to content
Open
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
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ tasks.withType<KotlinJvmCompile> {
optIn.addAll(
"com.lagradost.cloudstream3.InternalAPI",
"com.lagradost.cloudstream3.Prerelease",
"kotlin.uuid.ExperimentalUuidApi",
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,17 +96,17 @@ import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.applyStyle
import com.lagradost.cloudstream3.utils.AppContextUtils.isUsingMobileData
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
import com.lagradost.cloudstream3.utils.CLEARKEY_UUID
import com.lagradost.cloudstream3.utils.CLEARKEY_DRM_UUID
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
import com.lagradost.cloudstream3.utils.DrmExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLinkPlayList
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.PLAYREADY_UUID
import com.lagradost.cloudstream3.utils.PLAYREADY_DRM_UUID
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTagToLanguageName
import com.lagradost.cloudstream3.utils.WIDEVINE_UUID
import com.lagradost.cloudstream3.utils.WIDEVINE_DRM_UUID
import com.lagradost.cloudstream3.utils.videoskip.VideoSkipStamp
import kotlinx.coroutines.delay
import okhttp3.Interceptor
Expand All @@ -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.toJavaUuid

const val TAG = "CS3ExoPlayer"
const val PREFERRED_AUDIO_LANGUAGE_KEY = "preferred_audio_language"
Expand Down Expand Up @@ -1278,7 +1279,7 @@ class CS3IPlayer : IPlayer {

item.drm?.let { drm ->
when (drm.uuid) {
CLEARKEY_UUID -> {
CLEARKEY_DRM_UUID.toJavaUuid() -> {
// Use headers from DrmMetadata for media requests
val client = dataSourceFactory
?: throw IllegalArgumentException("Must supply onlineSource")
Expand All @@ -1299,8 +1300,8 @@ class CS3IPlayer : IPlayer {
.createMediaSource(item.mediaItem)
}

WIDEVINE_UUID,
PLAYREADY_UUID -> {
WIDEVINE_DRM_UUID.toJavaUuid(),
PLAYREADY_DRM_UUID.toJavaUuid() -> {
// Use headers from DrmMetadata for media requests
val client = dataSourceFactory
?: throw IllegalArgumentException("Must supply onlineSource")
Expand Down Expand Up @@ -1914,7 +1915,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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -314,8 +317,11 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
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
import kotlin.uuid.toJavaUuid
import kotlin.uuid.toKotlinUuid

/**
* For use in the ConcatenatingMediaSource.
Expand Down Expand Up @@ -431,29 +437,43 @@ 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)
@Prerelease
val CLEARKEY_DRM_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)
@Prerelease
val WIDEVINE_DRM_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)
@Prerelease
val PLAYREADY_DRM_UUID = Uuid.fromLongs(-0x65fb0f8667bfbd7aL, -0x546d19a41f77a06bL)

// Deprecate after next stable

// @Deprecated("Use CLEARKEY_DRM_UUID", ReplaceWith("CLEARKEY_DRM_UUID"), level = DeprecationLevel.WARNING)
val CLEARKEY_UUID = CLEARKEY_DRM_UUID.toJavaUuid()

// @Deprecated("Use WIDEVINE_DRM_UUID", ReplaceWith("WIDEVINE_DRM_UUID"), level = DeprecationLevel.WARNING)
val WIDEVINE_UUID = WIDEVINE_DRM_UUID.toJavaUuid()

// @Deprecated("Use PLAYREADY_DRM_UUID", ReplaceWith("PLAYREADY_DRM_UUID"), level = DeprecationLevel.WARNING)
val PLAYREADY_UUID = PLAYREADY_DRM_UUID.toJavaUuid()

suspend fun newExtractorLink(
source: String,
Expand All @@ -476,15 +496,42 @@ 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,
url: String,
type: ExtractorLinkType? = null,
uuid: UUID,
uuid: java.util.UUID,
initializer: suspend DrmExtractorLink.() -> Unit = { }
): DrmExtractorLink {
@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(
Expand All @@ -510,7 +557,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_DRM_UUID], [PLAYREADY_DRM_UUID], [CLEARKEY_DRM_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
Expand All @@ -528,7 +575,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<String, String>,
open var licenseUrl: String? = null,
Expand All @@ -550,7 +597,7 @@ open class DrmExtractorLink private constructor(
extractorData: String? = null,
kid: String? = null,
key: String? = null,
uuid: UUID = CLEARKEY_UUID,
uuid: Uuid = CLEARKEY_DRM_UUID,
kty: String? = "oct",
keyRequestParameters: HashMap<String, String> = hashMapOf(),
licenseUrl: String? = null,
Expand Down Expand Up @@ -585,7 +632,7 @@ open class DrmExtractorLink private constructor(
extractorData: String? = null,
kid: String? = null,
key: String? = null,
uuid: UUID = CLEARKEY_UUID,
uuid: Uuid = CLEARKEY_DRM_UUID,
kty: String? = "oct",
keyRequestParameters: HashMap<String, String> = hashMapOf(),
licenseUrl: String? = null,
Expand All @@ -605,6 +652,14 @@ open class DrmExtractorLink private constructor(
kty = kty,
licenseUrl = licenseUrl,
)

@Deprecated(message = "Use Kotlin Uuid", level = DeprecationLevel.HIDDEN)
fun setUuid(uuid: java.util.UUID) {
this.uuid = uuid.toKotlinUuid()
}

@Deprecated(message = "Use Kotlin Uuid", level = DeprecationLevel.HIDDEN)
fun getUuid(): java.util.UUID = this.uuid.toJavaUuid()
}

/** Class holds extracted media info to be passed to the player.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this exoplayer widevine constant or CS constant?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's from the same file. It was inconsistent and it seemed like the wrong one was just that the wrong one was used.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got you 👍

mimeType = MimeTypes.VIDEO_MP4,
data = Base64.Default.decode(uriString.substring(uriString.indexOf(',')))
)
Expand Down Expand Up @@ -2078,4 +2078,4 @@ object HlsPlaylistParser {
sessionKeyDrmInitData = sessionKeyDrmInitData
)
}
}
}