diff --git a/lib/playlist-utils/build.gradle.kts b/lib/playlist-utils/build.gradle.kts new file mode 100644 index 000000000..4eb09c560 --- /dev/null +++ b/lib/playlist-utils/build.gradle.kts @@ -0,0 +1,18 @@ + +plugins { + id("com.android.library") + kotlin("android") +} + +android { + compileSdk = AndroidConfig.compileSdk + namespace = "eu.kanade.tachiyomi.lib.playlistutils" + + defaultConfig { + minSdk = AndroidConfig.minSdk + } +} + +dependencies { + compileOnly(libs.bundles.common) +} diff --git a/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt new file mode 100644 index 000000000..07c3ad18c --- /dev/null +++ b/lib/playlist-utils/src/main/java/eu/kanade/tachiyomi/lib/playlistutils/PlaylistUtils.kt @@ -0,0 +1,323 @@ +package eu.kanade.tachiyomi.lib.playlistutils + +import eu.kanade.tachiyomi.animesource.model.Track +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.internal.commonEmptyHeaders + +class PlaylistUtils(private val client: OkHttpClient, private val headers: Headers = commonEmptyHeaders) { + + // ================================ M3U8 ================================ + + /** + * Extracts videos from a .m3u8 file. + * + * @param playlistUrl the URL of the HLS playlist + * @param referer the referer header value to be sent in the HTTP request (default: "") + * @param masterHeaders header for the master playlist + * @param videoHeaders headers for each video + * @param videoNameGen a function that generates a custom name for each video based on its quality + * - The parameter `quality` represents the quality of the video + * - Returns the custom name for the video (default: identity function) + * @param subtitleList a list of subtitle tracks associated with the HLS playlist, non-empty values will override subtitles present in the m3u8 playlist (default: empty list) + * @param audioList a list of audio tracks associated with the HLS playlist, non-empty values will override audio tracks present in the m3u8 playlist (default: empty list) + * @return a list of Video objects + */ + fun extractFromHls( + playlistUrl: String, + referer: String = "", + masterHeaders: Headers, + videoHeaders: Headers, + videoNameGen: (String) -> String = { quality -> quality }, + subtitleList: List = emptyList(), + audioList: List = emptyList(), + ): List