From d4b7f57beffd246f7f8c486d0af7644d7c3df080 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Sun, 3 Sep 2023 07:40:03 -0300 Subject: [PATCH] feat(lib): Convert DailymotionExtractor to a shared lib (#2129) --- lib/dailymotion-extractor/build.gradle.kts | 19 +++ .../dailymotionextractor/DailymotionDto.kt | 61 ++++++++ .../DailymotionExtractor.kt | 140 ++++++++++++++++++ 3 files changed, 220 insertions(+) create mode 100644 lib/dailymotion-extractor/build.gradle.kts create mode 100644 lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionDto.kt create mode 100644 lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionExtractor.kt diff --git a/lib/dailymotion-extractor/build.gradle.kts b/lib/dailymotion-extractor/build.gradle.kts new file mode 100644 index 000000000..074aabb28 --- /dev/null +++ b/lib/dailymotion-extractor/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("com.android.library") + kotlin("android") + id("kotlinx-serialization") +} + +android { + compileSdk = AndroidConfig.compileSdk + namespace = "eu.kanade.tachiyomi.lib.dailymotionextractor" + + defaultConfig { + minSdk = AndroidConfig.minSdk + } +} + +dependencies { + compileOnly(libs.bundles.common) + implementation(project(":lib-playlist-utils")) +} diff --git a/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionDto.kt b/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionDto.kt new file mode 100644 index 000000000..14bc6db5b --- /dev/null +++ b/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionDto.kt @@ -0,0 +1,61 @@ +package eu.kanade.tachiyomi.lib.dailymotionextractor + +import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonTransformingSerializer + +@Serializable +data class DailyQuality( + val qualities: Auto? = null, + val subtitles: Subtitle? = null, + val error: Error? = null, + val id: String? = null, +) { + @Serializable + data class Error(val type: String) +} + +@Serializable +data class Auto(val auto: List) { + @Serializable + data class Item(val type: String, val url: String) +} + +@Serializable +data class Subtitle( + @Serializable(with = SubtitleListSerializer::class) + val data: List, +) + +@Serializable +data class SubtitleDto(val label: String, val urls: List) + +object SubtitleListSerializer : + JsonTransformingSerializer>(ListSerializer(SubtitleDto.serializer())) { + override fun transformDeserialize(element: JsonElement): JsonElement = + when (element) { + is JsonObject -> JsonArray(element.values.toList()) + else -> JsonArray(emptyList()) + } +} + +@Serializable +data class TokenResponse( + val access_token: String, + val token_type: String, +) + +@Serializable +data class ProtectedResponse(val data: DataObject) { + @Serializable + data class DataObject(val video: VideoObject) { + @Serializable + data class VideoObject( + val id: String, + val xid: String, + ) + } +} diff --git a/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionExtractor.kt b/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionExtractor.kt new file mode 100644 index 000000000..49b179560 --- /dev/null +++ b/lib/dailymotion-extractor/src/main/java/eu/kanade/tachiyomi/lib/dailymotionextractor/DailymotionExtractor.kt @@ -0,0 +1,140 @@ +package eu.kanade.tachiyomi.lib.dailymotionextractor + +import eu.kanade.tachiyomi.animesource.model.Track +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.FormBody +import okhttp3.Headers +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import uy.kohesive.injekt.injectLazy + +class DailymotionExtractor(private val client: OkHttpClient, private val headers: Headers) { + + companion object { + private const val DAILYMOTION_URL = "https://www.dailymotion.com" + private const val GRAPHQL_URL = "https://graphql.api.dailymotion.com" + } + + private fun headersBuilder(block: Headers.Builder.() -> Unit = {}) = headers.newBuilder() + .add("Accept", "*/*") + .set("Referer", "$DAILYMOTION_URL/") + .set("Origin", DAILYMOTION_URL) + .apply { block() } + .build() + + private val json: Json by injectLazy() + + private val playlistUtils by lazy { PlaylistUtils(client, headers) } + + fun videosFromUrl(url: String, prefix: String, baseUrl: String = "", password: String? = null): List