From a033696dcb14018008cc9be8bbdc653c3bae6c09 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:16:49 -0600 Subject: [PATCH 1/7] Add jvmCommonMain source set --- library/build.gradle.kts | 19 ++-- .../extractors/YoutubeExtractor.jvmCommon.kt} | 0 .../extractors/YoutubeExtractor.jvm.kt | 105 ------------------ 3 files changed, 12 insertions(+), 112 deletions(-) rename library/src/{androidMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.android.kt => jvmCommonMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvmCommon.kt} (100%) delete mode 100644 library/src/jvmMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvm.kt diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 1652970a617..9474c40705c 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -46,6 +46,16 @@ kotlin { } sourceSets { + applyDefaultHierarchyTemplate { + common { + withCompilations { true } + group("jvmCommon") { + withAndroid() + withJvm() + } + } + } + all { languageSettings { optIn("com.lagradost.cloudstream3.InternalAPI") @@ -73,13 +83,8 @@ kotlin { implementation(libs.kotlin.test) } - // We will eventually add a new jvmCommonMain source set - // for things shared between Android and JVM. - androidMain.dependencies { - implementation(libs.newpipeextractor) - } - - jvmMain.dependencies { + val jvmCommonMain by getting + jvmCommonMain.dependencies { implementation(libs.newpipeextractor) } } diff --git a/library/src/androidMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.android.kt b/library/src/jvmCommonMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvmCommon.kt similarity index 100% rename from library/src/androidMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.android.kt rename to library/src/jvmCommonMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvmCommon.kt diff --git a/library/src/jvmMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvm.kt b/library/src/jvmMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvm.kt deleted file mode 100644 index 345aa7185f0..00000000000 --- a/library/src/jvmMain/kotlin/com/lagradost/cloudstream3/extractors/YoutubeExtractor.jvm.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.lagradost.cloudstream3.extractors - -import com.lagradost.cloudstream3.SubtitleFile -import com.lagradost.cloudstream3.newAudioFile -import com.lagradost.cloudstream3.newSubtitleFile -import com.lagradost.cloudstream3.utils.ExtractorApi -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.ExtractorLinkType -import com.lagradost.cloudstream3.utils.newExtractorLink -import org.schabi.newpipe.extractor.stream.StreamInfo -import org.schabi.newpipe.extractor.stream.StreamType - -actual open class YoutubeExtractor actual constructor() : ExtractorApi() { - - actual override val mainUrl = "https://www.youtube.com" - actual override val name = "YouTube" - actual override val requiresReferer = false - - actual override suspend fun getUrl( - url: String, - referer: String?, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit, - ) { - val videoId = extractYouTubeId(url) - val watchUrl = "$mainUrl/watch?v=$videoId" - - val info = StreamInfo.getInfo(watchUrl) - val isLive = info.streamType == StreamType.LIVE_STREAM - || info.streamType == StreamType.AUDIO_LIVE_STREAM - || info.streamType == StreamType.POST_LIVE_STREAM - || info.streamType == StreamType.POST_LIVE_AUDIO_STREAM - - if (isLive && info.hlsUrl != null) { - callback( - newExtractorLink( - source = name, - name = "YouTube Live", - url = info.hlsUrl - ) { - type = ExtractorLinkType.M3U8 - } - ) - } else { - processVideo(info, subtitleCallback, callback) - } - } - - private suspend fun processVideo( - info: StreamInfo, - subtitleCallback: (SubtitleFile) -> Unit, - callback: (ExtractorLink) -> Unit, - ): Boolean { - val videoStreams = info.videoOnlyStreams.orEmpty() - if (videoStreams.isEmpty()) return false - - val audioStreams = info.audioStreams.orEmpty() - videoStreams.forEach { video -> - callback( - newExtractorLink( - source = name, - name = "YouTube ${normalizeCodec(video.codec)}", - url = video.content - ) { - quality = video.height - audioTracks = audioStreams.map { newAudioFile(it.content) } - } - ) - } - - info.subtitles.forEach { subtitle -> - subtitleCallback( - newSubtitleFile( - lang = subtitle.displayLanguageName - ?: subtitle.languageTag - ?: "Unknown", - url = subtitle.content - ) - ) - } - - return true - } - - private fun extractYouTubeId(url: String): String { - val regex = Regex( - "(?:youtu\\.be/|youtube(?:-nocookie)?\\.com/(?:.*v=|v/|u/\\w/|embed/|shorts/|live/))([\\w-]{11})" - ) - - return regex.find(url)?.groupValues?.get(1) - ?: throw IllegalArgumentException("Invalid YouTube URL: $url") - } - - private fun normalizeCodec(codec: String?): String { - if (codec.isNullOrBlank()) return "" - val c = codec.lowercase() - return when { - c.startsWith("av01") -> "AV1" - c.startsWith("vp9") -> "VP9" - c.startsWith("avc1") || c.startsWith("h264") -> "H264" - c.startsWith("hev1") || c.startsWith("hvc1") || c.startsWith("hevc") -> "H265" - else -> codec.substringBefore('.').uppercase() - } - } -} From 77db577457fa5d948af3c84bc7485a7634311762 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:24:39 -0600 Subject: [PATCH 2/7] Update --- library/build.gradle.kts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 9474c40705c..de8a6bc38b9 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -45,17 +45,17 @@ kotlin { ) } - sourceSets { - applyDefaultHierarchyTemplate { - common { - withCompilations { true } - group("jvmCommon") { - withAndroid() - withJvm() - } + applyDefaultHierarchyTemplate { + common { + withCompilations { true } + group("jvmCommon") { + withAndroid() + withJvm() } } + } + sourceSets { all { languageSettings { optIn("com.lagradost.cloudstream3.InternalAPI") From 48dad42be27dca520d53384b2fa99e994c6458cf Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:28:20 -0600 Subject: [PATCH 3/7] Update --- library/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index de8a6bc38b9..db89a4c8638 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -1,7 +1,9 @@ +import com.android.build.api.withAndroid import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.codingfeline.buildkonfig.compiler.FieldSpec import org.jetbrains.dokka.gradle.engine.parameters.KotlinPlatform import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile @@ -45,6 +47,7 @@ kotlin { ) } + @OptIn(ExperimentalKotlinGradlePluginApi::class) applyDefaultHierarchyTemplate { common { withCompilations { true } From e2cee361ba2cb6766466cc5a4e921944e554a621 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:35:50 -0600 Subject: [PATCH 4/7] Try without using experimental stuff --- library/build.gradle.kts | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index db89a4c8638..bd94da3e003 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -1,9 +1,7 @@ -import com.android.build.api.withAndroid import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.codingfeline.buildkonfig.compiler.FieldSpec import org.jetbrains.dokka.gradle.engine.parameters.KotlinPlatform import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile @@ -47,17 +45,6 @@ kotlin { ) } - @OptIn(ExperimentalKotlinGradlePluginApi::class) - applyDefaultHierarchyTemplate { - common { - withCompilations { true } - group("jvmCommon") { - withAndroid() - withJvm() - } - } - } - sourceSets { all { languageSettings { @@ -86,10 +73,15 @@ kotlin { implementation(libs.kotlin.test) } - val jvmCommonMain by getting - jvmCommonMain.dependencies { - implementation(libs.newpipeextractor) + val jvmCommonMain by creating { + dependsOn(commonMain.get()) + dependencies { + implementation(libs.newpipeextractor) + } } + + androidMain.dependsOn(jvmCommonMain) + jvmMain.dependsOn(jvmCommonMain) } } From e708f20cb408742d82752c34e311281c2c51ad75 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:38:02 -0600 Subject: [PATCH 5/7] Fix? --- library/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index bd94da3e003..0ff379c8985 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -80,8 +80,8 @@ kotlin { } } - androidMain.dependsOn(jvmCommonMain) - jvmMain.dependsOn(jvmCommonMain) + androidMain { dependsOn(jvmCommonMain) } + jvmMain { dependsOn(jvmCommonMain) } } } From 2b0af34787171271eb85cba82af3a9ab2c0915f9 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:40:41 -0600 Subject: [PATCH 6/7] template again --- library/build.gradle.kts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 0ff379c8985..db89a4c8638 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -1,7 +1,9 @@ +import com.android.build.api.withAndroid import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.codingfeline.buildkonfig.compiler.FieldSpec import org.jetbrains.dokka.gradle.engine.parameters.KotlinPlatform import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile @@ -45,6 +47,17 @@ kotlin { ) } + @OptIn(ExperimentalKotlinGradlePluginApi::class) + applyDefaultHierarchyTemplate { + common { + withCompilations { true } + group("jvmCommon") { + withAndroid() + withJvm() + } + } + } + sourceSets { all { languageSettings { @@ -73,15 +86,10 @@ kotlin { implementation(libs.kotlin.test) } - val jvmCommonMain by creating { - dependsOn(commonMain.get()) - dependencies { - implementation(libs.newpipeextractor) - } + val jvmCommonMain by getting + jvmCommonMain.dependencies { + implementation(libs.newpipeextractor) } - - androidMain { dependsOn(jvmCommonMain) } - jvmMain { dependsOn(jvmCommonMain) } } } From 028793551649351b585f7be0d5bf5ce0640486a2 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:46:23 -0600 Subject: [PATCH 7/7] No experimental again --- library/build.gradle.kts | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index db89a4c8638..4eeb9318343 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -1,9 +1,7 @@ -import com.android.build.api.withAndroid import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.codingfeline.buildkonfig.compiler.FieldSpec import org.jetbrains.dokka.gradle.engine.parameters.KotlinPlatform import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier -import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile @@ -22,6 +20,8 @@ val javaTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) kotlin { version = "1.0.1" + applyDefaultHierarchyTemplate() + android { // If this is the same com.lagradost.cloudstream3.R stops working namespace = "com.lagradost.api" @@ -47,17 +47,6 @@ kotlin { ) } - @OptIn(ExperimentalKotlinGradlePluginApi::class) - applyDefaultHierarchyTemplate { - common { - withCompilations { true } - group("jvmCommon") { - withAndroid() - withJvm() - } - } - } - sourceSets { all { languageSettings { @@ -86,10 +75,15 @@ kotlin { implementation(libs.kotlin.test) } - val jvmCommonMain by getting - jvmCommonMain.dependencies { - implementation(libs.newpipeextractor) + val jvmCommonMain by creating { + dependsOn(commonMain.get()) + dependencies { + implementation(libs.newpipeextractor) + } } + + androidMain { dependsOn(jvmCommonMain) } + jvmMain { dependsOn(jvmCommonMain) } } }