>()
- ?: emptyList()
-
- val imageRequest = request.newBuilder()
- .url(url)
- .build()
-
- // Load the fonts before opening the connection to load the image,
- // so there aren't two open connections inside the interceptor.
- if (!language.disableFontSettings) {
- loadAllFont(chain)
- }
-
- val response = chain.proceed(imageRequest)
-
- if (response.isSuccessful.not()) {
- return response
- }
-
- val bitmap = BitmapFactory.decodeStream(response.body.byteStream())!!
- .copy(Bitmap.Config.ARGB_8888, true)
-
- val canvas = Canvas(bitmap)
-
- dialogues.forEach { dialog ->
- val textPaint = createTextPaint(selectFontFamily(dialog.type))
- val dialogBox = createDialogBox(dialog, textPaint)
- val y = getYAxis(textPaint, dialog, dialogBox)
- canvas.draw(textPaint, dialogBox, dialog, dialog.x1, y)
- }
-
- val output = ByteArrayOutputStream()
-
- val ext = url.substringBefore("#")
- .substringAfterLast(".")
- .lowercase()
- val format = when (ext) {
- "png" -> Bitmap.CompressFormat.PNG
- "jpeg", "jpg" -> Bitmap.CompressFormat.JPEG
- else -> Bitmap.CompressFormat.WEBP
- }
-
- bitmap.compress(format, 100, output)
-
- val responseBody = output.toByteArray().toResponseBody(mediaType)
-
- return response.newBuilder()
- .body(responseBody)
- .build()
- }
-
- private fun createTextPaint(font: Typeface?): TextPaint {
- val defaultTextSize = language.fontSize.pt
- return TextPaint().apply {
- color = Color.BLACK
- textSize = defaultTextSize
- font?.let {
- typeface = it
- }
- isAntiAlias = true
- }
- }
-
- private fun selectFontFamily(type: String): Typeface? {
- if (language.disableFontSettings) {
- return null
- }
-
- if (type in fontFamily) {
- return fontFamily[type]?.second
- }
-
- return when (type) {
- "inside", "outside" -> fontFamily["sfx"]?.second
- else -> fontFamily["normal"]?.second
- }
- }
-
- private fun loadAllFont(chain: Interceptor.Chain) {
- val fallback = loadFont("coming_soon_regular.ttf")
- fontFamily.keys.forEach { key ->
- val font = fontFamily[key] ?: return@forEach
- if (font.second != null) {
- return@forEach
- }
- if (language.fontName.isNotBlank()) {
- fontFamily[key] = key to loadFont("${language.fontName}.ttf")
- return@forEach
- }
-
- fontFamily[key] = key to (loadRemoteFont(font.first, chain) ?: fallback)
- }
- }
-
- /**
- * Loads font from the `assets/fonts` directory within the APK
- *
- * @param fontName The name of the font to load.
- * @return A `Typeface` instance of the loaded font or `null` if an error occurs.
- *
- * Example usage:
- * {@code
- * val typeface: TypeFace? = loadFont("filename.ttf")
- * }
- */
- private fun loadFont(fontName: String): Typeface? {
- return try {
- this::class.java.classLoader!!
- .getResourceAsStream("assets/fonts/$fontName")
- .toTypeface(fontName)
- } catch (e: Exception) {
- null
- }
- }
-
- /**
- * Loads a remote font and converts it into a usable font object.
- *
- * This function makes an HTTP request to download a font from a specified remote URL.
- * It then converts the response into a usable font object.
- */
- private fun loadRemoteFont(fontUrl: String, chain: Interceptor.Chain): Typeface? {
- return try {
- val request = GET(fontUrl, chain.request().headers)
- val response = chain.proceed(request)
-
- if (response.isSuccessful.not()) {
- response.close()
- return null
- }
-
- val fontName = request.url.pathSegments.last()
- response.body.use {
- it.byteStream().toTypeface(fontName)
- }
- } catch (e: Exception) {
- null
- }
- }
-
- private fun InputStream.toTypeface(fontName: String): Typeface? {
- val fontFile = File.createTempFile(fontName, fontName.substringAfter("."))
- this.copyTo(FileOutputStream(fontFile))
- return Typeface.createFromFile(fontFile)
- }
-
- /**
- * Adjust the text to the center of the dialog box when feasible.
- */
- private fun getYAxis(textPaint: TextPaint, dialog: Dialog, dialogBox: StaticLayout): Float {
- val fontHeight = textPaint.fontMetrics.let { it.bottom - it.top }
-
- val dialogBoxLineCount = dialog.height / fontHeight
-
- /**
- * Centers text in y for dialogues smaller than the dialog box
- */
- return when {
- dialogBox.lineCount < dialogBoxLineCount -> dialog.centerY - dialogBox.lineCount / 2f * fontHeight
- else -> dialog.y1
- }
- }
-
- private fun createDialogBox(dialog: Dialog, textPaint: TextPaint): StaticLayout {
- var dialogBox = createBoxLayout(dialog, textPaint)
-
- /**
- * The best way I've found to adjust the text in the dialog box (Especially in long dialogues)
- */
- while (dialogBox.height > dialog.height) {
- textPaint.textSize -= 0.5f
- dialogBox = createBoxLayout(dialog, textPaint)
- }
-
- textPaint.color = Color.BLACK
- textPaint.bgColor = Color.WHITE
-
- return dialogBox
- }
-
- private fun createBoxLayout(dialog: Dialog, textPaint: TextPaint): StaticLayout {
- val text = dialog.getTextBy(language)
-
- return StaticLayout.Builder.obtain(text, 0, text.length, textPaint, dialog.width.toInt()).apply {
- setAlignment(Layout.Alignment.ALIGN_CENTER)
- setIncludePad(language.disableFontSettings)
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- if (language.disableWordBreak) {
- setBreakStrategy(LineBreaker.BREAK_STRATEGY_SIMPLE)
- setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- return@apply
- }
- setBreakStrategy(LineBreaker.BREAK_STRATEGY_BALANCED)
- setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL)
- }
- }.build()
- }
-
- private fun Canvas.draw(textPaint: TextPaint, layout: StaticLayout, dialog: Dialog, x: Float, y: Float) {
- save()
- translate(x, y)
- rotate(dialog.angle)
- drawTextOutline(textPaint, layout)
- drawText(textPaint, layout)
- restore()
- }
-
- private fun Canvas.drawText(textPaint: TextPaint, layout: StaticLayout) {
- textPaint.style = Paint.Style.FILL
- layout.draw(this)
- }
-
- private fun Canvas.drawTextOutline(textPaint: TextPaint, layout: StaticLayout) {
- val foregroundColor = textPaint.color
- val style = textPaint.style
-
- textPaint.strokeWidth = 5F
- textPaint.color = textPaint.bgColor
- textPaint.style = Paint.Style.FILL_AND_STROKE
-
- layout.draw(this)
-
- textPaint.color = foregroundColor
- textPaint.style = style
- }
-
- // https://pixelsconverter.com/pt-to-px
- private val Int.pt: Float get() = this / SCALED_DENSITY
-
- companion object {
- // w3: Absolute Lengths [...](https://www.w3.org/TR/css3-values/#absolute-lengths)
- const val SCALED_DENSITY = 0.75f // 1px = 0.75pt
- val mediaType = "image/png".toMediaType()
- }
-}
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/TranslationInterceptor.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/TranslationInterceptor.kt
deleted file mode 100644
index 4603a1a8a..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/TranslationInterceptor.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.interceptors
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Dialog
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
-import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX
-import eu.kanade.tachiyomi.multisrc.machinetranslations.translator.TranslatorEngine
-import keiyoushi.utils.parseAs
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.awaitAll
-import kotlinx.coroutines.runBlocking
-import kotlinx.serialization.encodeToString
-import kotlinx.serialization.json.Json
-import okhttp3.Interceptor
-import okhttp3.Response
-import uy.kohesive.injekt.injectLazy
-
-@RequiresApi(Build.VERSION_CODES.O)
-class TranslationInterceptor(
- val language: Language,
- private val translator: TranslatorEngine,
-) : Interceptor {
-
- private val json: Json by injectLazy()
-
- override fun intercept(chain: Interceptor.Chain): Response {
- val request = chain.request()
- val url = request.url.toString()
-
- if (PAGE_REGEX.containsMatchIn(url).not() || language.target == language.origin) {
- return chain.proceed(request)
- }
-
- val dialogues = request.url.fragment?.parseAs>()
- ?: return chain.proceed(request)
-
- val translated = runBlocking(Dispatchers.IO) {
- dialogues.map { dialog ->
- async {
- dialog.replaceText(
- translator.translate(language.origin, language.target, dialog.text),
- )
- }
- }.awaitAll()
- }
-
- val newRequest = request.newBuilder()
- .url("${url.substringBeforeLast("#")}#${json.encodeToString(translated)}")
- .build()
-
- return chain.proceed(newRequest)
- }
-
- private fun Dialog.replaceText(value: String) = this.copy(
- textByLanguage = mutableMapOf(
- "text" to value,
- ),
- )
-}
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/TranslatorEngine.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/TranslatorEngine.kt
deleted file mode 100644
index d8a420361..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/TranslatorEngine.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.translator
-
-interface TranslatorEngine {
- val capacity: Int
- fun translate(from: String, to: String, text: String): String
-}
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslator.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslator.kt
deleted file mode 100644
index 8ad067bb2..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslator.kt
+++ /dev/null
@@ -1,115 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.translator.bing
-
-import eu.kanade.tachiyomi.multisrc.machinetranslations.translator.TranslatorEngine
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.decodeFromStream
-import okhttp3.FormBody
-import okhttp3.Headers
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Element
-import uy.kohesive.injekt.injectLazy
-
-class BingTranslator(private val client: OkHttpClient, private val headers: Headers) : TranslatorEngine {
-
- private val baseUrl = "https://www.bing.com"
-
- private val translatorUrl = "$baseUrl/translator"
-
- private val json: Json by injectLazy()
-
- private var tokens: TokenGroup = TokenGroup()
-
- override val capacity: Int = 1000
-
- private val attempts = 3
-
- override fun translate(from: String, to: String, text: String): String {
- if (tokens.isNotValid() && refreshTokens().not()) {
- return text
- }
- val request = translatorRequest(from, to, text)
- repeat(attempts) {
- try {
- return fetchTranslatedText(request)
- } catch (e: Exception) {
- refreshTokens()
- }
- }
- return text
- }
-
- private fun fetchTranslatedText(request: Request): String {
- return client.newCall(request).execute().parseAs>()
- .firstOrNull()!!.text
- }
-
- private fun refreshTokens(): Boolean {
- tokens = loadTokens()
- return tokens.isValid()
- }
-
- private fun translatorRequest(from: String, to: String, text: String): Request {
- val url = "$baseUrl/ttranslatev3".toHttpUrl().newBuilder()
- .addQueryParameter("isVertical", "1")
- .addQueryParameter("", "") // Present in Bing URL
- .addQueryParameter("IG", tokens.ig)
- .addQueryParameter("IID", tokens.iid)
- .build()
-
- val headersApi = headers.newBuilder()
- .set("Accept", "*/*")
- .set("Origin", baseUrl)
- .set("Referer", translatorUrl)
- .set("Alt-Used", baseUrl)
- .build()
-
- val payload = FormBody.Builder()
- .add("fromLang", from)
- .add("to", to)
- .add("text", text)
- .add("tryFetchingGenderDebiasedTranslations", "true")
- .add("token", tokens.token)
- .add("key", tokens.key)
- .build()
-
- return POST(url.toString(), headersApi, payload)
- }
-
- private fun loadTokens(): TokenGroup {
- val document = client.newCall(GET(translatorUrl, headers)).execute().asJsoup()
-
- val scripts = document.select("script")
- .map(Element::data)
-
- val scriptOne: String = scripts.firstOrNull(TOKENS_REGEX::containsMatchIn)
- ?: return TokenGroup()
-
- val scriptTwo: String = scripts.firstOrNull(IG_PARAM_REGEX::containsMatchIn)
- ?: return TokenGroup()
-
- val matchOne = TOKENS_REGEX.find(scriptOne)?.groups
- val matchTwo = IG_PARAM_REGEX.find(scriptTwo)?.groups
-
- return TokenGroup(
- token = matchOne?.get(4)?.value ?: "",
- key = matchOne?.get(3)?.value ?: "",
- ig = matchTwo?.get(1)?.value ?: "",
- iid = document.selectFirst("div[data-iid]:not([class])")?.attr("data-iid") ?: "",
- )
- }
-
- private inline fun Response.parseAs(): T {
- return json.decodeFromStream(body.byteStream())
- }
-
- companion object {
- val TOKENS_REGEX = """params_AbusePreventionHelper(\s+)?=(\s+)?[^\[]\[(\d+),"([^"]+)""".toRegex()
- val IG_PARAM_REGEX = """IG:"([^"]+)""".toRegex()
- }
-}
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslatorDto.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslatorDto.kt
deleted file mode 100644
index 5ce502042..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/bing/BingTranslatorDto.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.translator.bing
-
-import kotlinx.serialization.Serializable
-
-class BingTranslatorDto
-
-class TokenGroup(
- val token: String = "",
- val key: String = "",
- val iid: String = "",
- val ig: String = "",
-) {
- fun isNotValid() = listOf(token, key, iid, ig).any(String::isBlank)
-
- fun isValid() = isNotValid().not()
-}
-
-@Serializable
-class TranslateDto(
- val translations: List,
-) {
- val text = translations.firstOrNull()?.text ?: ""
-}
-
-@Serializable
-class TextTranslated(
- val text: String,
-)
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslator.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslator.kt
deleted file mode 100644
index 1815ac597..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslator.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.translator.google
-
-import eu.kanade.tachiyomi.multisrc.machinetranslations.translator.TranslatorEngine
-import eu.kanade.tachiyomi.network.GET
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.JsonElement
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.Headers
-import okhttp3.HttpUrl
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import uy.kohesive.injekt.injectLazy
-import java.io.IOException
-
-/**
- * This client is an adaptation of the following python repository: https://github.com/ssut/py-googletrans.
- */
-class GoogleTranslator(private val client: OkHttpClient, private val headers: Headers) : TranslatorEngine {
-
- private val baseUrl: String = "https://translate.googleapis.com"
-
- private val webpage: String = "https://translate.google.com"
-
- private val translatorUrl = "$baseUrl/translate_a/single"
-
- override val capacity: Int = 5000
-
- private val json: Json by injectLazy()
-
- override fun translate(from: String, to: String, text: String): String {
- val request = translateRequest(text, from, to)
- return try { fetchTranslatedText(request) } catch (_: Exception) { text }
- }
-
- private fun translateRequest(text: String, from: String, to: String): Request {
- return GET(clientUrlBuilder(text, from, to).build(), headersBuilder().build())
- }
-
- private fun headersBuilder(): Headers.Builder = headers.newBuilder()
- .set("Origin", webpage)
- .set("Alt-Used", webpage.substringAfterLast("/"))
- .set("Referer", "$webpage/")
-
- private fun clientUrlBuilder(text: String, src: String, dest: String, token: String = "xxxx"): HttpUrl.Builder {
- return translatorUrl.toHttpUrl().newBuilder()
- .setQueryParameter("client", "gtx")
- .setQueryParameter("sl", src)
- .setQueryParameter("tl", dest)
- .setQueryParameter("hl", dest)
- .setQueryParameter("ie", Charsets.UTF_8.toString())
- .setQueryParameter("oe", Charsets.UTF_8.toString())
- .setQueryParameter("otf", "1")
- .setQueryParameter("ssel", "0")
- .setQueryParameter("tsel", "0")
- .setQueryParameter("tk", token)
- .setQueryParameter("q", text)
- .apply {
- arrayOf("at", "bd", "ex", "ld", "md", "qca", "rw", "rm", "ss", "t").forEach {
- addQueryParameter("dt", it)
- }
- }
- }
-
- private fun fetchTranslatedText(request: Request): String {
- val response = client.newCall(request).execute()
-
- if (response.isSuccessful.not()) {
- throw IOException("Request failed: ${response.code}")
- }
-
- return response.parseJson().let(::extractTranslatedText)
- }
-
- private fun Response.parseJson(): JsonElement = json.parseToJsonElement(this.body.string())
-
- private fun extractTranslatedText(data: JsonElement): String {
- return data.jsonArray[0].jsonArray.joinToString("") {
- it.jsonArray[0].jsonPrimitive.content
- }
- }
-}
diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslatorDto.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslatorDto.kt
deleted file mode 100644
index a3737bc6b..000000000
--- a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/translator/google/GoogleTranslatorDto.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.machinetranslations.translator.google
-
-import okhttp3.Response
-
-class GoogleTranslatorDto
-
-data class Translated(
- val from: String,
- val to: String,
- val origin: String,
- val text: String,
- val pronunciation: String,
- val extraData: Map,
- val response: Response,
-)
diff --git a/src/all/snowmtl/AndroidManifest.xml b/src/all/snowmtl/AndroidManifest.xml
deleted file mode 100644
index 55eb0f7ae..000000000
--- a/src/all/snowmtl/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/all/snowmtl/build.gradle b/src/all/snowmtl/build.gradle
deleted file mode 100644
index 0c071192c..000000000
--- a/src/all/snowmtl/build.gradle
+++ /dev/null
@@ -1,10 +0,0 @@
-ext {
- extName = 'Snow Machine Translations'
- extClass = '.SnowmtlFactory'
- themePkg = 'machinetranslations'
- baseUrl = 'https://snowmtl.ru'
- overrideVersionCode = 10
- isNsfw = true
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/all/snowmtl/res/mipmap-hdpi/ic_launcher.png b/src/all/snowmtl/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 64521ba05..000000000
Binary files a/src/all/snowmtl/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/all/snowmtl/res/mipmap-mdpi/ic_launcher.png b/src/all/snowmtl/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 9b06993dd..000000000
Binary files a/src/all/snowmtl/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/all/snowmtl/res/mipmap-xhdpi/ic_launcher.png b/src/all/snowmtl/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 81cf1050b..000000000
Binary files a/src/all/snowmtl/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/all/snowmtl/res/mipmap-xxhdpi/ic_launcher.png b/src/all/snowmtl/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a1c31e6fd..000000000
Binary files a/src/all/snowmtl/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/all/snowmtl/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/snowmtl/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d12ad4e83..000000000
Binary files a/src/all/snowmtl/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt
deleted file mode 100644
index 9cb3cb3dd..000000000
--- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.snowmtl
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
-import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations
-
-@RequiresApi(Build.VERSION_CODES.O)
-class Snowmtl(
- language: Language,
-) : MachineTranslations(
- name = "Snow Machine Translations",
- baseUrl = "https://snowmtl.ru",
- language,
-)
diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt
deleted file mode 100644
index a107fbf79..000000000
--- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.snowmtl
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
-import eu.kanade.tachiyomi.source.SourceFactory
-
-@RequiresApi(Build.VERSION_CODES.O)
-class SnowmtlFactory : SourceFactory {
- override fun createSources() = languageList.map(::Snowmtl)
-}
-
-private val languageList = listOf(
- Language("ar", disableFontSettings = true),
- Language("en"),
- Language("es"),
- Language("fr", supportNativeTranslation = true),
- Language("id", supportNativeTranslation = true),
- Language("it"),
- Language("pt-BR", "pt", supportNativeTranslation = true),
-)
diff --git a/src/all/solarmtl/build.gradle b/src/all/solarmtl/build.gradle
deleted file mode 100644
index 26e4a5354..000000000
--- a/src/all/solarmtl/build.gradle
+++ /dev/null
@@ -1,10 +0,0 @@
-ext {
- extName = 'Solar Machine Translations'
- extClass = '.SolarmtlFactory'
- themePkg = 'machinetranslations'
- baseUrl = 'https://solarmtl.com'
- overrideVersionCode = 0
- isNsfw = true
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt
deleted file mode 100644
index 92ad82647..000000000
--- a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.solarmtl
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
-import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations
-
-@RequiresApi(Build.VERSION_CODES.O)
-class Solarmtl(
- language: Language,
-) : MachineTranslations(
- name = "Solar Machine Translations",
- baseUrl = "https://solarmtl.com",
- language,
-)
diff --git a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt
deleted file mode 100644
index 834a56b32..000000000
--- a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.solarmtl
-
-import android.os.Build
-import androidx.annotation.RequiresApi
-import eu.kanade.tachiyomi.multisrc.machinetranslations.Language
-import eu.kanade.tachiyomi.source.SourceFactory
-
-@RequiresApi(Build.VERSION_CODES.O)
-class SolarmtlFactory : SourceFactory {
- override fun createSources() = languageList.map(::Solarmtl)
-}
-
-private val languageList = listOf(
- Language("ar", disableFontSettings = true),
- Language("en"),
- Language("es"),
- Language("fr", supportNativeTranslation = true),
- Language("id", supportNativeTranslation = true),
- Language("it"),
- Language("pt-BR", "pt", supportNativeTranslation = true),
-)