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: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ kotlinxAtomicfu = "0.33.0"
kotlinxCollectionsImmutable = "0.4.0"
kotlinxCoroutines = "1.11.0"
kotlinxDatetime = "0.8.0"
kotlinxIOCore = "0.9.1"
kotlinxSerializationJson = "1.11.0"
ksoup = "0.2.6"
ktor = "3.5.0"
Expand Down Expand Up @@ -99,6 +100,7 @@ kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collec
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" }
kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kotlinxIOCore" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" }
ktor-http = { module = "io.ktor:ktor-http", version.ref = "ktor" }
Expand Down
52 changes: 7 additions & 45 deletions library/api/jvm/library.api
Original file line number Diff line number Diff line change
Expand Up @@ -7625,44 +7625,6 @@ public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser {
public final fun parse (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist;
}

public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$C {
public static final field CENC_TYPE_cbc1 Ljava/lang/String;
public static final field CENC_TYPE_cbcs Ljava/lang/String;
public static final field CENC_TYPE_cenc Ljava/lang/String;
public static final field CENC_TYPE_cens Ljava/lang/String;
public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$C;
public static final field ROLE_FLAG_ALTERNATE I
public static final field ROLE_FLAG_CAPTION I
public static final field ROLE_FLAG_COMMENTARY I
public static final field ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND I
public static final field ROLE_FLAG_DESCRIBES_VIDEO I
public static final field ROLE_FLAG_DUB I
public static final field ROLE_FLAG_EASY_TO_READ I
public static final field ROLE_FLAG_EMERGENCY I
public static final field ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY I
public static final field ROLE_FLAG_MAIN I
public static final field ROLE_FLAG_SIGN I
public static final field ROLE_FLAG_SUBTITLE I
public static final field ROLE_FLAG_SUPPLEMENTARY I
public static final field ROLE_FLAG_TRANSCRIBES_DIALOG I
public static final field ROLE_FLAG_TRICK_PLAY I
public static final field SELECTION_FLAG_AUTOSELECT I
public static final field SELECTION_FLAG_DEFAULT I
public static final field SELECTION_FLAG_FORCED I
public static final field TRACK_TYPE_AUDIO I
public static final field TRACK_TYPE_CAMERA_MOTION I
public static final field TRACK_TYPE_DEFAULT I
public static final field TRACK_TYPE_IMAGE I
public static final field TRACK_TYPE_METADATA I
public static final field TRACK_TYPE_NONE I
public static final field TRACK_TYPE_TEXT I
public static final field TRACK_TYPE_UNKNOWN I
public static final field TRACK_TYPE_VIDEO I
public final fun getCLEARKEY_UUID ()Ljava/util/UUID;
public final fun getPLAYREADY_UUID ()Ljava/util/UUID;
public final fun getWIDEVINE_UUID ()Ljava/util/UUID;
}

public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$DrmInitData {
public fun <init> (Ljava/lang/String;[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;)V
public final fun component1 ()Ljava/lang/String;
Expand Down Expand Up @@ -7928,7 +7890,7 @@ public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserExce

public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$PsshAtomUtil {
public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$PsshAtomUtil;
public final fun buildPsshAtom (Ljava/util/UUID;[Ljava/util/UUID;[B)[B
public final fun buildPsshAtom (Lkotlin/uuid/Uuid;[Lkotlin/uuid/Uuid;[B)[B
}

public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition {
Expand All @@ -7949,19 +7911,19 @@ public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition
}

public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData {
public fun <init> (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[B)V
public synthetic fun <init> (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[BILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/util/UUID;
public fun <init> (Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/lang/String;[B)V
public synthetic fun <init> (Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/lang/String;[BILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlin/uuid/Uuid;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()[B
public final fun copy (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[B)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;
public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[BILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;
public final fun copy (Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/lang/String;[B)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;
public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/lang/String;[BILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;
public fun equals (Ljava/lang/Object;)Z
public final fun getData ()[B
public final fun getLicenseServerUrl ()Ljava/lang/String;
public final fun getMimeType ()Ljava/lang/String;
public final fun getUuid ()Ljava/util/UUID;
public final fun getUuid ()Lkotlin/uuid/Uuid;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
Expand Down
1 change: 1 addition & 0 deletions library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ kotlin {
implementation(libs.kotlinx.atomicfu)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.datetime)
implementation(libs.kotlinx.io.core)
implementation(libs.kotlinx.serialization.json) // JSON Parser
implementation(libs.ksoup) // HTML Parser
implementation(libs.ktor.http)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ package com.lagradost.cloudstream3.utils

import com.lagradost.cloudstream3.base64DecodeArray
import io.ktor.http.Url
import java.io.IOException
import java.nio.ByteBuffer
import java.util.UUID
import kotlinx.io.Buffer
import kotlinx.io.IOException
import kotlinx.io.readByteArray
import kotlin.uuid.Uuid

@Suppress("unused")
object HlsPlaylistParser {
Expand Down Expand Up @@ -186,13 +187,13 @@ object HlsPlaylistParser {

data class SchemeData(
/**
* The {@link UUID} of the DRM scheme, or {@link C#UUID_NIL} if the data is universal (i.e.
* The [Uuid] of the DRM scheme, or [C.UUID_NIL] if the data is universal (i.e.
* applies to all schemes).
*/
val uuid: UUID,
val uuid: Uuid,
/** The URL of the server to which license requests should be made. May be null if unknown. */
val licenseServerUrl: String? = null,
/** The mimeType of {@link #data}. */
/** The mimeType of [data]. */
val mimeType: String,
/** The initialization data. May be null for scheme support checks only. */
val data: ByteArray
Expand Down Expand Up @@ -454,14 +455,14 @@ object HlsPlaylistParser {
// "." or "..", remove the appropriate segments of the path.
if (i == segmentStart + 1 && url[segmentStart] == '.') {
// Given "abc/def/./ghi", remove "./" to get "abc/def/ghi".
url.delete(segmentStart, nextSegmentStart)
url.deleteRange(segmentStart, nextSegmentStart)
limit -= nextSegmentStart - segmentStart
i = segmentStart
} else if (i == segmentStart + 2 && url[segmentStart] == '.' && url[segmentStart + 1] == '.') {
// Given "abc/def/../ghi", remove "def/../" to get "abc/ghi".
val prevSegmentStart = url.lastIndexOf("/", segmentStart - 2) + 1
val removeFrom = if (prevSegmentStart > offset) prevSegmentStart else offset
url.delete(removeFrom, nextSegmentStart)
url.deleteRange(removeFrom, nextSegmentStart)
limit -= nextSegmentStart - removeFrom
segmentStart = prevSegmentStart
i = prevSegmentStart
Expand Down Expand Up @@ -532,31 +533,31 @@ object HlsPlaylistParser {
}
}

object C {
private object C {
/**
* 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)


/** "cenc" scheme type name as defined in ISO/IEC 23001-7:2016. */
Expand Down Expand Up @@ -1066,34 +1067,38 @@ object HlsPlaylistParser {

object PsshAtomUtil {
fun buildPsshAtom(
systemId: UUID, keyIds: Array<UUID>?, data: ByteArray?
systemId: Uuid, keyIds: Array<Uuid>?, data: ByteArray?
): ByteArray {
val dataLength = data?.size ?: 0
var psshBoxLength: Int =
Mp4Box.FULL_HEADER_SIZE + 16 /* SystemId */ + 4 /* DataSize */ + dataLength
if (keyIds != null) {
psshBoxLength += 4 /* KID_count */ + (keyIds.size * 16) /* KIDs */
}
val psshBox: ByteBuffer = ByteBuffer.allocate(psshBoxLength)
psshBox.putInt(psshBoxLength)
psshBox.putInt(Mp4Box.TYPE_pssh)
psshBox.putInt(if (keyIds != null) 0x01000000 else 0 /* version=(buildV1Atom ? 1 : 0), flags=0 */)
psshBox.putLong(systemId.mostSignificantBits)
psshBox.putLong(systemId.leastSignificantBits)
val buffer = Buffer()
buffer.writeInt(psshBoxLength)
buffer.writeInt(Mp4Box.TYPE_pssh)
buffer.writeInt(if (keyIds != null) 0x01000000 else 0 /* version=(buildV1Atom ? 1 : 0), flags=0 */)
systemId.toLongs { mostSignificantBits, leastSignificantBits ->
buffer.writeLong(mostSignificantBits)
buffer.writeLong(leastSignificantBits)
}
if (keyIds != null) {
psshBox.putInt(keyIds.size)
buffer.writeInt(keyIds.size)
for (keyId in keyIds) {
psshBox.putLong(keyId.mostSignificantBits)
psshBox.putLong(keyId.leastSignificantBits)
keyId.toLongs { mostSignificantBits, leastSignificantBits ->
buffer.writeLong(mostSignificantBits)
buffer.writeLong(leastSignificantBits)
}
}
}
if (data != null && data.size != 0) {
psshBox.putInt(data.size)
psshBox.put(data)
buffer.writeInt(data.size)
buffer.write(data)
} else {
psshBox.putInt(0)
buffer.writeInt(0)
}
return psshBox.array()
return buffer.readByteArray()
}
}

Expand Down