More Dex Updates (#6900)
* MangaDex: remove empty tag, fix genre typo - remove empty tag caused by null/empty publicationDemographic/other from nonGenres if its null/empty - fix typo genre uuid * better method removing empty tag Co-Authored-By: Carlos <2092019+CarlosEsco@users.noreply.github.com> * revert pt-br changes Changing it to pt-br instead of pt-BR changed the id of the source and made the Mangadex in Brazilian Portuguese to be separed from the other Brazilian extensions (that uses pt-BR as lang) Co-Authored-By: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com> * Update build.gradle * String updates to support standard HTTPS in MD@H node selection * Code updates to only use nodes with standard HTTPS in MD@H node selection * Update build.grade to indicate new version * fix preferences and langs * low md@home to refresh host sooner * add content rating by default preferences(defaults to safe and suggestive) * throw error for page list parsing instead of trying to continue * clean up string Co-authored-by: Riztard <riyanluqman@gmail.com> Co-authored-by: Alessandro Jean <14254807+alessandrojean@users.noreply.github.com> Co-authored-by: fourquestionmarksokay <83817943+fourquestionmarksokay@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									077b90b80e
								
							
						
					
					
						commit
						deec443983
					
				@ -5,7 +5,7 @@ ext {
 | 
			
		||||
    extName = 'MangaDex'
 | 
			
		||||
    pkgNameSuffix = 'all.mangadex'
 | 
			
		||||
    extClass = '.MangaDexFactory'
 | 
			
		||||
    extVersionCode = 107
 | 
			
		||||
    extVersionCode = 108
 | 
			
		||||
    libVersion = '1.2'
 | 
			
		||||
    containsNsfw = true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,8 @@ object MDConstants {
 | 
			
		||||
 | 
			
		||||
    val tempCover = "https://i.imgur.com/6TrIues.jpg"
 | 
			
		||||
 | 
			
		||||
    const val mdAtHomeTokenLifespan = 5 * 60 * 1000
 | 
			
		||||
 | 
			
		||||
    val dateFormatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+SSS", Locale.US)
 | 
			
		||||
        .apply { timeZone = TimeZone.getTimeZone("UTC") }
 | 
			
		||||
 | 
			
		||||
@ -26,5 +28,46 @@ object MDConstants {
 | 
			
		||||
    const val dataSaverPrefSummary = "Enables smaller more compressed images"
 | 
			
		||||
    const val dataSaverPref = "dataSaverV5"
 | 
			
		||||
 | 
			
		||||
    const val mdAtHomeTokenLifespan = 10 * 60 * 1000
 | 
			
		||||
    fun getDataSaverPreferenceKey(dexLang: String): String {
 | 
			
		||||
        return "${dataSaverPref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const val standardHttpsPortTitle = "Use HTTPS port 443 only"
 | 
			
		||||
    const val standardHttpsPortSummary =
 | 
			
		||||
        "Enable to only request image servers that use port 443. This allows users with stricter firewall restrictions to access MangaDex images"
 | 
			
		||||
    private const val standardHttpsPortPref = "usePort443"
 | 
			
		||||
 | 
			
		||||
    fun getStandardHttpsPreferenceKey(dexLang: String): String {
 | 
			
		||||
        return "${standardHttpsPortPref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const val showByDefaultPrefTitle = "Show only by default"
 | 
			
		||||
 | 
			
		||||
    const val contentRatingSafePrefSummary = "Content Rating: Safe"
 | 
			
		||||
    private const val contentRatingSafePref = "contentRatingSafe"
 | 
			
		||||
 | 
			
		||||
    fun getContentRatingSafePrefKey(dexLang: String): String {
 | 
			
		||||
        return "${contentRatingSafePref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const val contentRatingSuggestivePrefSummary = "Content Rating: Suggestive"
 | 
			
		||||
    private const val contentRatingSuggestivePref = "contentRatingSuggestive"
 | 
			
		||||
 | 
			
		||||
    fun getContentRatingSuggestivePrefKey(dexLang: String): String {
 | 
			
		||||
        return "${contentRatingSuggestivePref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const val contentRatingEroticaPrefSummary = "Content Rating: Erotica"
 | 
			
		||||
    private const val contentRatingEroticaPref = "contentRatingErotica"
 | 
			
		||||
 | 
			
		||||
    fun getContentRatingEroticaPrefKey(dexLang: String): String {
 | 
			
		||||
        return "${contentRatingEroticaPref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const val contentRatingPornographicPrefSummary = "Content Rating: Pornographic"
 | 
			
		||||
    private const val contentRatingPornographicPref = "contentRatingPornographic"
 | 
			
		||||
 | 
			
		||||
    fun getContentRatingPornographicPrefKey(dexLang: String): String {
 | 
			
		||||
        return "${contentRatingPornographicPref}_$dexLang"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -31,19 +31,20 @@ import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import java.util.Date
 | 
			
		||||
 | 
			
		||||
abstract class MangaDex(override val lang: String) : ConfigurableSource, HttpSource() {
 | 
			
		||||
abstract class MangaDex(override val lang: String, val dexLang: String) : ConfigurableSource,
 | 
			
		||||
    HttpSource() {
 | 
			
		||||
    override val name = "MangaDex"
 | 
			
		||||
    override val baseUrl = "https://www.mangadex.org"
 | 
			
		||||
 | 
			
		||||
    // after mvp comes out make current popular becomes latest (mvp doesnt have a browse page)
 | 
			
		||||
    override val supportsLatest = false
 | 
			
		||||
 | 
			
		||||
    private val helper = MangaDexHelper()
 | 
			
		||||
 | 
			
		||||
    private val preferences: SharedPreferences by lazy {
 | 
			
		||||
        Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private val helper = MangaDexHelper()
 | 
			
		||||
 | 
			
		||||
    override fun headersBuilder() = Headers.Builder().apply {
 | 
			
		||||
        add("User-Agent", "Tachiyomi " + System.getProperty("http.agent"))
 | 
			
		||||
    }
 | 
			
		||||
@ -57,12 +58,35 @@ abstract class MangaDex(override val lang: String) : ConfigurableSource, HttpSou
 | 
			
		||||
    // POPULAR Manga Section
 | 
			
		||||
 | 
			
		||||
    override fun popularMangaRequest(page: Int): Request {
 | 
			
		||||
        val url = MDConstants.apiMangaUrl.toHttpUrl().newBuilder()
 | 
			
		||||
            .addQueryParameter("order[updatedAt]", "desc")
 | 
			
		||||
            .addQueryParameter("limit", MDConstants.mangaLimit.toString())
 | 
			
		||||
            .addQueryParameter("offset", helper.getMangaListOffset(page))
 | 
			
		||||
            .build().toUrl().toString()
 | 
			
		||||
 | 
			
		||||
        val url = MDConstants.apiMangaUrl.toHttpUrl().newBuilder().apply {
 | 
			
		||||
            addQueryParameter("order[updatedAt]", "desc")
 | 
			
		||||
            addQueryParameter("limit", MDConstants.mangaLimit.toString())
 | 
			
		||||
            addQueryParameter("offset", helper.getMangaListOffset(page))
 | 
			
		||||
            if (preferences.getBoolean(MDConstants.getContentRatingSafePrefKey(dexLang), false)) {
 | 
			
		||||
                addQueryParameter("contentRating[]", "safe")
 | 
			
		||||
            }
 | 
			
		||||
            if (preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingEroticaPrefKey(dexLang),
 | 
			
		||||
                    false
 | 
			
		||||
                )
 | 
			
		||||
            ) {
 | 
			
		||||
                addQueryParameter("contentRating[]", "suggestive")
 | 
			
		||||
            }
 | 
			
		||||
            if (preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingSuggestivePrefKey(dexLang),
 | 
			
		||||
                    false
 | 
			
		||||
                )
 | 
			
		||||
            ) {
 | 
			
		||||
                addQueryParameter("contentRating[]", "erotica")
 | 
			
		||||
            }
 | 
			
		||||
            if (preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingPornographicPrefKey(dexLang),
 | 
			
		||||
                    false
 | 
			
		||||
                )
 | 
			
		||||
            ) {
 | 
			
		||||
                addQueryParameter("contentRating[]", "pornographic")
 | 
			
		||||
            }
 | 
			
		||||
        }.build().toUrl().toString()
 | 
			
		||||
        return GET(
 | 
			
		||||
            url = url,
 | 
			
		||||
            headers = headers,
 | 
			
		||||
@ -165,7 +189,7 @@ abstract class MangaDex(override val lang: String) : ConfigurableSource, HttpSou
 | 
			
		||||
     */
 | 
			
		||||
    private fun actualChapterListRequest(mangaId: String, offset: Int) =
 | 
			
		||||
        GET(
 | 
			
		||||
            url = helper.getChapterEndpoint(mangaId, offset, lang),
 | 
			
		||||
            url = helper.getChapterEndpoint(mangaId, offset, dexLang),
 | 
			
		||||
            headers = headers,
 | 
			
		||||
            cache = CacheControl.FORCE_NETWORK
 | 
			
		||||
        )
 | 
			
		||||
@ -224,13 +248,27 @@ abstract class MangaDex(override val lang: String) : ConfigurableSource, HttpSou
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun pageListParse(response: Response): List<Page> {
 | 
			
		||||
        if (response.isSuccessful.not()) {
 | 
			
		||||
            throw Exception("HTTP ${response.code}")
 | 
			
		||||
        }
 | 
			
		||||
        if (response.code == 204) {
 | 
			
		||||
            return emptyList()
 | 
			
		||||
        }
 | 
			
		||||
        val chapterJson = JsonParser.parseString(response.body!!.string()).obj["data"]
 | 
			
		||||
        val atHomeRequestUrl = "${MDConstants.apiUrl}/at-home/server/${chapterJson["id"].string}"
 | 
			
		||||
        val usingStandardHTTPS =
 | 
			
		||||
            preferences.getBoolean(MDConstants.getStandardHttpsPreferenceKey(dexLang), false)
 | 
			
		||||
 | 
			
		||||
        val atHomeRequestUrl = if (usingStandardHTTPS) {
 | 
			
		||||
            "${MDConstants.apiUrl}/at-home/server/${chapterJson["id"].string}?ssl=true"
 | 
			
		||||
        } else {
 | 
			
		||||
            "${MDConstants.apiUrl}/at-home/server/${chapterJson["id"].string}"
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val host =
 | 
			
		||||
            helper.getMdAtHomeUrl(atHomeRequestUrl, client, headers, CacheControl.FORCE_NETWORK)
 | 
			
		||||
 | 
			
		||||
        val usingDataSaver = preferences.getBoolean("${MDConstants.dataSaverPref}_$lang", false)
 | 
			
		||||
        val usingDataSaver =
 | 
			
		||||
            preferences.getBoolean(MDConstants.getDataSaverPreferenceKey(dexLang), false)
 | 
			
		||||
 | 
			
		||||
        // have to add the time, and url to the page because pages timeout within 30mins now
 | 
			
		||||
        val now = Date().time
 | 
			
		||||
@ -257,19 +295,99 @@ abstract class MangaDex(override val lang: String) : ConfigurableSource, HttpSou
 | 
			
		||||
    override fun setupPreferenceScreen(screen: PreferenceScreen) {
 | 
			
		||||
 | 
			
		||||
        val dataSaverPref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = "${MDConstants.dataSaverPref}_$lang"
 | 
			
		||||
            key = MDConstants.getDataSaverPreferenceKey(dexLang)
 | 
			
		||||
            title = MDConstants.dataSaverPrefTitle
 | 
			
		||||
            summary = MDConstants.dataSaverPrefSummary
 | 
			
		||||
            setDefaultValue(false)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit().putBoolean("${MDConstants.dataSaverPref}_$lang", checkValue)
 | 
			
		||||
                preferences.edit()
 | 
			
		||||
                    .putBoolean(MDConstants.getDataSaverPreferenceKey(dexLang), checkValue)
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val standardHTTPSPref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = MDConstants.getStandardHttpsPreferenceKey(dexLang)
 | 
			
		||||
            title = MDConstants.standardHttpsPortTitle
 | 
			
		||||
            summary = MDConstants.standardHttpsPortSummary
 | 
			
		||||
            setDefaultValue(false)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit()
 | 
			
		||||
                    .putBoolean(MDConstants.getStandardHttpsPreferenceKey(dexLang), checkValue)
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val contentRatingSafePref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = MDConstants.getContentRatingSafePrefKey(dexLang)
 | 
			
		||||
            title = MDConstants.showByDefaultPrefTitle
 | 
			
		||||
            summary = MDConstants.contentRatingSafePrefSummary
 | 
			
		||||
            setDefaultValue(true)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit()
 | 
			
		||||
                    .putBoolean(MDConstants.getContentRatingSafePrefKey(dexLang), checkValue)
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val contentRatingSuggestivePref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = MDConstants.getContentRatingSuggestivePrefKey(dexLang)
 | 
			
		||||
            title = MDConstants.showByDefaultPrefTitle
 | 
			
		||||
            summary = MDConstants.contentRatingSuggestivePrefSummary
 | 
			
		||||
            setDefaultValue(true)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit()
 | 
			
		||||
                    .putBoolean(MDConstants.getContentRatingSuggestivePrefKey(dexLang), checkValue)
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val contentRatingEroticaPref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = MDConstants.getContentRatingEroticaPrefKey(dexLang)
 | 
			
		||||
            title = MDConstants.showByDefaultPrefTitle
 | 
			
		||||
            summary = MDConstants.contentRatingEroticaPrefSummary
 | 
			
		||||
            setDefaultValue(false)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit()
 | 
			
		||||
                    .putBoolean(MDConstants.getContentRatingEroticaPrefKey(dexLang), checkValue)
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val contentRatingPornographicPref = CheckBoxPreference(screen.context).apply {
 | 
			
		||||
            key = MDConstants.getContentRatingPornographicPrefKey(dexLang)
 | 
			
		||||
            title = MDConstants.showByDefaultPrefTitle
 | 
			
		||||
            summary = MDConstants.contentRatingPornographicPrefSummary
 | 
			
		||||
            setDefaultValue(false)
 | 
			
		||||
 | 
			
		||||
            setOnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                val checkValue = newValue as Boolean
 | 
			
		||||
                preferences.edit().putBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingPornographicPrefKey(dexLang),
 | 
			
		||||
                    checkValue
 | 
			
		||||
                )
 | 
			
		||||
                    .commit()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        screen.addPreference(dataSaverPref)
 | 
			
		||||
        screen.addPreference(standardHTTPSPref)
 | 
			
		||||
        screen.addPreference(contentRatingSafePref)
 | 
			
		||||
        screen.addPreference(contentRatingSuggestivePref)
 | 
			
		||||
        screen.addPreference(contentRatingEroticaPref)
 | 
			
		||||
        screen.addPreference(contentRatingPornographicPref)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getFilterList(): FilterList = helper.mdFilters.getMDFilterList()
 | 
			
		||||
    override fun getFilterList(): FilterList =
 | 
			
		||||
        helper.mdFilters.getMDFilterList(preferences, dexLang)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -51,44 +51,45 @@ class MangaDexFactory : SourceFactory {
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class MangaDexEnglish : MangaDex("en")
 | 
			
		||||
class MangaDexJapanese : MangaDex("ja")
 | 
			
		||||
class MangaDexPolish : MangaDex("pl")
 | 
			
		||||
class MangaDexSerboCroatian : MangaDex("sh")
 | 
			
		||||
class MangaDexDutch : MangaDex("nl")
 | 
			
		||||
class MangaDexItalian : MangaDex("it")
 | 
			
		||||
class MangaDexRussian : MangaDex("ru")
 | 
			
		||||
class MangaDexGerman : MangaDex("de")
 | 
			
		||||
class MangaDexHungarian : MangaDex("hu")
 | 
			
		||||
class MangaDexFrench : MangaDex("fr")
 | 
			
		||||
class MangaDexFinnish : MangaDex("fi")
 | 
			
		||||
class MangaDexVietnamese : MangaDex("vi")
 | 
			
		||||
class MangaDexGreek : MangaDex("el")
 | 
			
		||||
class MangaDexBulgarian : MangaDex("bg")
 | 
			
		||||
class MangaDexSpanishSpain : MangaDex("es")
 | 
			
		||||
class MangaDexPortugueseBrazil : MangaDex("pt-br")
 | 
			
		||||
class MangaDexPortuguesePortugal : MangaDex("pt")
 | 
			
		||||
class MangaDexSwedish : MangaDex("sv")
 | 
			
		||||
class MangaDexArabic : MangaDex("ar")
 | 
			
		||||
class MangaDexDanish : MangaDex("da")
 | 
			
		||||
class MangaDexChineseSimp : MangaDex("zh")
 | 
			
		||||
class MangaDexBengali : MangaDex("bn")
 | 
			
		||||
class MangaDexRomanian : MangaDex("ro")
 | 
			
		||||
class MangaDexCzech : MangaDex("cs")
 | 
			
		||||
class MangaDexMongolian : MangaDex("mn")
 | 
			
		||||
class MangaDexTurkish : MangaDex("tr")
 | 
			
		||||
class MangaDexIndonesian : MangaDex("id")
 | 
			
		||||
class MangaDexKorean : MangaDex("ko")
 | 
			
		||||
class MangaDexSpanishLTAM : MangaDex("es-la")
 | 
			
		||||
class MangaDexPersian : MangaDex("fa")
 | 
			
		||||
class MangaDexMalay : MangaDex("ms")
 | 
			
		||||
class MangaDexThai : MangaDex("th")
 | 
			
		||||
class MangaDexCatalan : MangaDex("ca")
 | 
			
		||||
class MangaDexFilipino : MangaDex("fi")
 | 
			
		||||
class MangaDexChineseTrad : MangaDex("zh-hk")
 | 
			
		||||
class MangaDexUkrainian : MangaDex("uk")
 | 
			
		||||
class MangaDexBurmese : MangaDex("my")
 | 
			
		||||
class MangaDexLithuanian : MangaDex("lt")
 | 
			
		||||
class MangaDexHebrew : MangaDex("he")
 | 
			
		||||
class MangaDexHindi : MangaDex("hi")
 | 
			
		||||
class MangaDexNorwegian : MangaDex("no")
 | 
			
		||||
class MangaDexEnglish : MangaDex("en", "en")
 | 
			
		||||
class MangaDexJapanese : MangaDex("ja", "ja")
 | 
			
		||||
class MangaDexPolish : MangaDex("pl", "pl")
 | 
			
		||||
class MangaDexSerboCroatian : MangaDex("sh", "sh")
 | 
			
		||||
class MangaDexDutch : MangaDex("nl", "nl")
 | 
			
		||||
class MangaDexItalian : MangaDex("it", "it")
 | 
			
		||||
class MangaDexRussian : MangaDex("ru", "ru")
 | 
			
		||||
class MangaDexGerman : MangaDex("de", "de")
 | 
			
		||||
class MangaDexHungarian : MangaDex("hu", "hu")
 | 
			
		||||
class MangaDexFrench : MangaDex("fr", "fr")
 | 
			
		||||
class MangaDexFinnish : MangaDex("fi", "fi")
 | 
			
		||||
class MangaDexVietnamese : MangaDex("vi", "vi")
 | 
			
		||||
class MangaDexGreek : MangaDex("el", "el")
 | 
			
		||||
class MangaDexBulgarian : MangaDex("bg", "bg")
 | 
			
		||||
class MangaDexSpanishSpain : MangaDex("es", "es")
 | 
			
		||||
class MangaDexPortugueseBrazil : MangaDex("pt-BR", "pt-br")
 | 
			
		||||
class MangaDexPortuguesePortugal : MangaDex("pt", "pt")
 | 
			
		||||
class MangaDexSwedish : MangaDex("sv", "sv")
 | 
			
		||||
class MangaDexArabic : MangaDex("ar", "ar")
 | 
			
		||||
class MangaDexDanish : MangaDex("da", "da")
 | 
			
		||||
class MangaDexChineseSimp : MangaDex("zh-Hans", "zh")
 | 
			
		||||
class MangaDexBengali : MangaDex("bn", "bn")
 | 
			
		||||
class MangaDexRomanian : MangaDex("ro", "ro")
 | 
			
		||||
class MangaDexCzech : MangaDex("cs", "cs")
 | 
			
		||||
class MangaDexMongolian : MangaDex("mn", "mn")
 | 
			
		||||
class MangaDexTurkish : MangaDex("tr", "tr")
 | 
			
		||||
class MangaDexIndonesian : MangaDex("id", "id")
 | 
			
		||||
class MangaDexKorean : MangaDex("ko", "ko")
 | 
			
		||||
class MangaDexSpanishLTAM : MangaDex("es-419", "es-la")
 | 
			
		||||
class MangaDexPersian : MangaDex("fa", "fa")
 | 
			
		||||
class MangaDexMalay : MangaDex("ms", "ms")
 | 
			
		||||
class MangaDexThai : MangaDex("th", "th")
 | 
			
		||||
class MangaDexCatalan : MangaDex("ca", "ca")
 | 
			
		||||
class MangaDexFilipino : MangaDex("fil", "fi")
 | 
			
		||||
class MangaDexChineseTrad : MangaDex("zh-Hant", "zh-hk")
 | 
			
		||||
class MangaDexUkrainian : MangaDex("uk", "uk")
 | 
			
		||||
class MangaDexBurmese : MangaDex("my", "my")
 | 
			
		||||
class MangaDexLithuanian : MangaDex("lt", "lt")
 | 
			
		||||
class MangaDexHebrew : MangaDex("he", "he")
 | 
			
		||||
class MangaDexHindi : MangaDex("hi", "hi")
 | 
			
		||||
class MangaDexNorwegian : MangaDex("no", "no")
 | 
			
		||||
class Other : MangaDex("other", "NULL")
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.extension.all.mangadex
 | 
			
		||||
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.FilterList
 | 
			
		||||
import okhttp3.HttpUrl
 | 
			
		||||
@ -7,16 +8,43 @@ import java.util.Locale
 | 
			
		||||
 | 
			
		||||
class MangaDexFilters {
 | 
			
		||||
 | 
			
		||||
    internal fun getMDFilterList() = FilterList(
 | 
			
		||||
        OriginalLanguageList(getOriginalLanguage()),
 | 
			
		||||
        ContentRatingList(getContentRating()),
 | 
			
		||||
        DemographicList(getDemographics()),
 | 
			
		||||
        StatusList(getStatus()),
 | 
			
		||||
        SortFilter(sortableList.map { it.first }.toTypedArray()),
 | 
			
		||||
        TagList(getTags()),
 | 
			
		||||
        TagInclusionMode(),
 | 
			
		||||
        TagExclusionMode(),
 | 
			
		||||
    )
 | 
			
		||||
    internal fun getMDFilterList(preferences: SharedPreferences, dexLang: String): FilterList {
 | 
			
		||||
        val contentRatings = listOf(
 | 
			
		||||
            ContentRating("Safe").apply {
 | 
			
		||||
                state =
 | 
			
		||||
                    preferences.getBoolean(MDConstants.getContentRatingSafePrefKey(dexLang), true)
 | 
			
		||||
            },
 | 
			
		||||
            ContentRating("Suggestive").apply {
 | 
			
		||||
                state = preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingSuggestivePrefKey(dexLang),
 | 
			
		||||
                    true
 | 
			
		||||
                )
 | 
			
		||||
            },
 | 
			
		||||
            ContentRating("Erotica").apply {
 | 
			
		||||
                state = preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingEroticaPrefKey(dexLang),
 | 
			
		||||
                    false
 | 
			
		||||
                )
 | 
			
		||||
            },
 | 
			
		||||
            ContentRating("Pornographic").apply {
 | 
			
		||||
                state = preferences.getBoolean(
 | 
			
		||||
                    MDConstants.getContentRatingPornographicPrefKey(dexLang),
 | 
			
		||||
                    false
 | 
			
		||||
                )
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        return FilterList(
 | 
			
		||||
            OriginalLanguageList(getOriginalLanguage()),
 | 
			
		||||
            ContentRatingList(contentRatings),
 | 
			
		||||
            DemographicList(getDemographics()),
 | 
			
		||||
            StatusList(getStatus()),
 | 
			
		||||
            SortFilter(sortableList.map { it.first }.toTypedArray()),
 | 
			
		||||
            TagList(getTags()),
 | 
			
		||||
            TagInclusionMode(),
 | 
			
		||||
            TagExclusionMode(),
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class Demographic(name: String) : Filter.CheckBox(name)
 | 
			
		||||
    private class DemographicList(demographics: List<Demographic>) :
 | 
			
		||||
@ -45,13 +73,6 @@ class MangaDexFilters {
 | 
			
		||||
    private class ContentRatingList(contentRating: List<ContentRating>) :
 | 
			
		||||
        Filter.Group<ContentRating>("Content Rating", contentRating)
 | 
			
		||||
 | 
			
		||||
    private fun getContentRating() = listOf(
 | 
			
		||||
        ContentRating("Safe"),
 | 
			
		||||
        ContentRating("Suggestive"),
 | 
			
		||||
        ContentRating("Erotica"),
 | 
			
		||||
        ContentRating("Pornographic")
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    private class OriginalLanguage(name: String, val isoCode: String) : Filter.CheckBox(name)
 | 
			
		||||
    private class OriginalLanguageList(originalLanguage: List<OriginalLanguage>) :
 | 
			
		||||
        Filter.Group<OriginalLanguage>("Original language", originalLanguage)
 | 
			
		||||
@ -108,7 +129,7 @@ class MangaDexFilters {
 | 
			
		||||
        Tag("c8cbe35b-1b2b-4a3f-9c37-db84c4514856", "Medical"),
 | 
			
		||||
        Tag("ac72833b-c4e9-4878-b9db-6c8a4a99444a", "Military"),
 | 
			
		||||
        Tag("dd1f77c5-dea9-4e2b-97ae-224af09caf99", "Monster Girls"),
 | 
			
		||||
        Tag("t36fd93ea-e8b8-445e-b836-358f02b3d33d", "Monsters"),
 | 
			
		||||
        Tag("36fd93ea-e8b8-445e-b836-358f02b3d33d", "Monsters"),
 | 
			
		||||
        Tag("f42fbf9e-188a-447b-9fdc-f19dc1e4d685", "Music"),
 | 
			
		||||
        Tag("ee968100-4191-4968-93d3-f82d72be7e46", "Mystery"),
 | 
			
		||||
        Tag("489dd859-9b61-4c37-af75-5b18e88daafc", "Ninja"),
 | 
			
		||||
 | 
			
		||||
@ -147,7 +147,12 @@ class MangaDexHelper() {
 | 
			
		||||
            // things that will go with the genre tags but aren't actually genre
 | 
			
		||||
            val nonGenres = listOf(
 | 
			
		||||
                (attr["publicationDemographic"]?.nullString ?: "").capitalize(Locale.US),
 | 
			
		||||
                ("Content rating: " + (attr["contentRating"].nullString ?: "").capitalize(Locale.US)),
 | 
			
		||||
                (
 | 
			
		||||
                    "Content rating: " + (
 | 
			
		||||
                        attr["contentRating"].nullString
 | 
			
		||||
                            ?: ""
 | 
			
		||||
                        ).capitalize(Locale.US)
 | 
			
		||||
                    ),
 | 
			
		||||
                Locale(attr["originalLanguage"].nullString ?: "").displayLanguage
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
@ -162,12 +167,13 @@ class MangaDexHelper() {
 | 
			
		||||
                .distinct()
 | 
			
		||||
 | 
			
		||||
            val authorMap = runCatching {
 | 
			
		||||
                val ids = listOf(authorIds, artistIds).flatten().distinct().joinToString("&ids[]=", "?ids[]=")
 | 
			
		||||
                val ids = listOf(authorIds, artistIds).flatten().distinct()
 | 
			
		||||
                    .joinToString("&ids[]=", "?ids[]=")
 | 
			
		||||
                val response = client.newCall(GET("${MDConstants.apiUrl}/author$ids")).execute()
 | 
			
		||||
                val json = JsonParser.parseString(response.body!!.string())
 | 
			
		||||
                json.obj["results"].array.map { result ->
 | 
			
		||||
                    result["data"]["attributes"]["id"].string to
 | 
			
		||||
                    cleanString(result["data"]["attributes"]["name"].string)
 | 
			
		||||
                        cleanString(result["data"]["attributes"]["name"].string)
 | 
			
		||||
                }.toMap()
 | 
			
		||||
            }.getOrNull() ?: emptyMap()
 | 
			
		||||
 | 
			
		||||
@ -183,7 +189,7 @@ class MangaDexHelper() {
 | 
			
		||||
                    }.map { it?.name } +
 | 
			
		||||
                    nonGenres
 | 
			
		||||
                )
 | 
			
		||||
                .filterNotNull()
 | 
			
		||||
                .filter { it.isNullOrBlank().not() }
 | 
			
		||||
 | 
			
		||||
            return SManga.create().apply {
 | 
			
		||||
                url = "/manga/$dexId"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user