diff --git a/lib/okru-extractor/build.gradle.kts b/lib/okru-extractor/build.gradle.kts
new file mode 100644
index 000000000..114a95458
--- /dev/null
+++ b/lib/okru-extractor/build.gradle.kts
@@ -0,0 +1,25 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ targetSdk = AndroidConfig.targetSdk
+ }
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compileOnly(libs.kotlin.stdlib)
+ compileOnly(libs.okhttp)
+ compileOnly(libs.aniyomi.lib)
+ compileOnly(libs.jsoup)
+}
+// BUMPS: 0
\ No newline at end of file
diff --git a/lib/okru-extractor/src/main/AndroidManifest.xml b/lib/okru-extractor/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..965ed86d0
--- /dev/null
+++ b/lib/okru-extractor/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
diff --git a/lib/okru-extractor/src/main/java/eu/kanade/tachiyomi/lib/okruextractor/OkruExtractor.kt b/lib/okru-extractor/src/main/java/eu/kanade/tachiyomi/lib/okruextractor/OkruExtractor.kt
new file mode 100644
index 000000000..d32d11dde
--- /dev/null
+++ b/lib/okru-extractor/src/main/java/eu/kanade/tachiyomi/lib/okruextractor/OkruExtractor.kt
@@ -0,0 +1,46 @@
+package eu.kanade.tachiyomi.lib.okruextractor
+
+import eu.kanade.tachiyomi.animesource.model.Video
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.OkHttpClient
+
+class OkruExtractor(private val client: OkHttpClient) {
+
+ private fun fixQuality(quality: String): String {
+ val qualities = listOf(
+ Pair("full", "1080p"),
+ Pair("hd", "720p"),
+ Pair("sd", "480p"),
+ Pair("low", "360p"),
+ Pair("lowest", "240p"),
+ Pair("mobile", "144p")
+ )
+ return qualities.find { it.first == quality }?.second ?: quality
+ }
+
+ fun videosFromUrl(url: String, prefix: String = "", fixQualities: Boolean = true): List