MangaDex: Readme update, Add Latin, and Search sort (#12144)
* Arrange code as used in FilterList just to improve readability also kept related things together (like OriginalLanguage related methods) * Match default Sort with what frontend uses Searching on the website uses /manga?order[relevance]=desc This commit matches to that * Arrange lang sources alphabetically atleast makes it a bit easy to see if a language exists * Remove MangaDex (Other) its been throwing HTTP Forbidden Error since locale checks were added for translatedLanguages. There are no plans to actually support them in the future nor are there users using it (since there were no reports) * Add MangaDex (Latin) newly created chapter language has only two (April Fools) translated chapters for now * Add a section on Manga Status in MangaDex Readme * Increment mangadex.extVersionCode
This commit is contained in:
parent
6e8bb6e505
commit
a07efca470
@ -20,6 +20,19 @@ JSON backups are now unusable due to the ID change. You will have to manually re
|
||||
|
||||
## Guides
|
||||
|
||||
### What does the Status of a Manga in Tachiyomi mean?
|
||||
|
||||
Please refer to the following table
|
||||
|
||||
| Status in Tachiyomi | in MangaDex | Remarks |
|
||||
|---------------------|------------------------|---------|
|
||||
| Ongoing | Publication: Ongoing | |
|
||||
| Cancelled | Publication: Cancelled | This title was abruptly stopped and will not resume |
|
||||
| Publishing Finished | Publication: Completed | The title is finished in its original language. However, Translations remain |
|
||||
| On_Hiatus | Publication: Hiatus | The title is not currently receiving any new chapters |
|
||||
| Completed | Completed/Cancelled | All chapters are translated and available |
|
||||
| Unknown | Unknown | There is no info about the Status of this Entry |
|
||||
|
||||
### How can I block particular Scanlator Groups?
|
||||
|
||||
The **MangaDex** extension allows blocking **Scanlator Groups**. Chapters uploaded by a **Blocked Scanlator Group** will not show up in **Latest** or in **Manga feed** (chapters list). For now, you can only block Groups by entering their UUIDs manually.
|
||||
|
@ -6,7 +6,7 @@ ext {
|
||||
extName = 'MangaDex'
|
||||
pkgNameSuffix = 'all.mangadex'
|
||||
extClass = '.MangaDexFactory'
|
||||
extVersionCode = 163
|
||||
extVersionCode = 164
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
|
@ -6,91 +6,91 @@ import eu.kanade.tachiyomi.source.SourceFactory
|
||||
class MangaDexFactory : SourceFactory {
|
||||
override fun createSources(): List<Source> = listOf(
|
||||
MangaDexEnglish(),
|
||||
MangaDexJapanese(),
|
||||
MangaDexPolish(),
|
||||
MangaDexSerboCroatian(),
|
||||
MangaDexDutch(),
|
||||
MangaDexItalian(),
|
||||
MangaDexRussian(),
|
||||
MangaDexGerman(),
|
||||
MangaDexHungarian(),
|
||||
MangaDexFrench(),
|
||||
MangaDexFinnish(),
|
||||
MangaDexVietnamese(),
|
||||
MangaDexGreek(),
|
||||
MangaDexBulgarian(),
|
||||
MangaDexSpanishSpain(),
|
||||
MangaDexPortugueseBrazil(),
|
||||
MangaDexPortuguesePortugal(),
|
||||
MangaDexSwedish(),
|
||||
MangaDexArabic(),
|
||||
MangaDexDanish(),
|
||||
MangaDexChineseSimp(),
|
||||
MangaDexBengali(),
|
||||
MangaDexRomanian(),
|
||||
MangaDexCzech(),
|
||||
MangaDexMongolian(),
|
||||
MangaDexTurkish(),
|
||||
MangaDexIndonesian(),
|
||||
MangaDexKorean(),
|
||||
MangaDexSpanishLTAM(),
|
||||
MangaDexPersian(),
|
||||
MangaDexMalay(),
|
||||
MangaDexThai(),
|
||||
MangaDexCatalan(),
|
||||
MangaDexFilipino(),
|
||||
MangaDexChineseTrad(),
|
||||
MangaDexUkrainian(),
|
||||
MangaDexBulgarian(),
|
||||
MangaDexBurmese(),
|
||||
MangaDexLithuanian(),
|
||||
MangaDexCatalan(),
|
||||
MangaDexChineseSimp(),
|
||||
MangaDexChineseTrad(),
|
||||
MangaDexCzech(),
|
||||
MangaDexDanish(),
|
||||
MangaDexDutch(),
|
||||
MangaDexFilipino(),
|
||||
MangaDexFinnish(),
|
||||
MangaDexFrench(),
|
||||
MangaDexGerman(),
|
||||
MangaDexGreek(),
|
||||
MangaDexHebrew(),
|
||||
MangaDexHindi(),
|
||||
MangaDexNorwegian(),
|
||||
MangaDexHungarian(),
|
||||
MangaDexIndonesian(),
|
||||
MangaDexItalian(),
|
||||
MangaDexJapanese(),
|
||||
MangaDexKorean(),
|
||||
MangaDexLatin(),
|
||||
MangaDexLithuanian(),
|
||||
MangaDexMalay(),
|
||||
MangaDexMongolian(),
|
||||
MangaDexNepali(),
|
||||
Other()
|
||||
MangaDexNorwegian(),
|
||||
MangaDexPersian(),
|
||||
MangaDexPolish(),
|
||||
MangaDexPortugueseBrazil(),
|
||||
MangaDexPortuguesePortugal(),
|
||||
MangaDexRomanian(),
|
||||
MangaDexRussian(),
|
||||
MangaDexSerboCroatian(),
|
||||
MangaDexSpanishLTAM(),
|
||||
MangaDexSpanishSpain(),
|
||||
MangaDexSwedish(),
|
||||
MangaDexThai(),
|
||||
MangaDexTurkish(),
|
||||
MangaDexUkrainian(),
|
||||
MangaDexVietnamese()
|
||||
)
|
||||
}
|
||||
|
||||
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", "tl")
|
||||
class MangaDexChineseTrad : MangaDex("zh-Hant", "zh-hk")
|
||||
class MangaDexUkrainian : MangaDex("uk", "uk")
|
||||
class MangaDexBulgarian : MangaDex("bg", "bg")
|
||||
class MangaDexBurmese : MangaDex("my", "my")
|
||||
class MangaDexLithuanian : MangaDex("lt", "lt")
|
||||
class MangaDexCatalan : MangaDex("ca", "ca")
|
||||
class MangaDexChineseSimp : MangaDex("zh-Hans", "zh")
|
||||
class MangaDexChineseTrad : MangaDex("zh-Hant", "zh-hk")
|
||||
class MangaDexCzech : MangaDex("cs", "cs")
|
||||
class MangaDexDanish : MangaDex("da", "da")
|
||||
class MangaDexDutch : MangaDex("nl", "nl")
|
||||
class MangaDexEnglish : MangaDex("en", "en")
|
||||
class MangaDexFilipino : MangaDex("fil", "tl")
|
||||
class MangaDexFinnish : MangaDex("fi", "fi")
|
||||
class MangaDexFrench : MangaDex("fr", "fr")
|
||||
class MangaDexGerman : MangaDex("de", "de")
|
||||
class MangaDexGreek : MangaDex("el", "el")
|
||||
class MangaDexHebrew : MangaDex("he", "he")
|
||||
class MangaDexHindi : MangaDex("hi", "hi")
|
||||
class MangaDexNorwegian : MangaDex("no", "no")
|
||||
class MangaDexHungarian : MangaDex("hu", "hu")
|
||||
class MangaDexIndonesian : MangaDex("id", "id")
|
||||
class MangaDexItalian : MangaDex("it", "it")
|
||||
class MangaDexJapanese : MangaDex("ja", "ja")
|
||||
class MangaDexKorean : MangaDex("ko", "ko")
|
||||
class MangaDexLatin : MangaDex("la", "la")
|
||||
class MangaDexLithuanian : MangaDex("lt", "lt")
|
||||
class MangaDexMalay : MangaDex("ms", "ms")
|
||||
class MangaDexMongolian : MangaDex("mn", "mn")
|
||||
class MangaDexNepali : MangaDex("ne", "ne")
|
||||
class Other : MangaDex("other", "NULL")
|
||||
class MangaDexNorwegian : MangaDex("no", "no")
|
||||
class MangaDexPersian : MangaDex("fa", "fa")
|
||||
class MangaDexPolish : MangaDex("pl", "pl")
|
||||
class MangaDexPortugueseBrazil : MangaDex("pt-BR", "pt-br")
|
||||
class MangaDexPortuguesePortugal : MangaDex("pt", "pt")
|
||||
class MangaDexRomanian : MangaDex("ro", "ro")
|
||||
class MangaDexRussian : MangaDex("ru", "ru")
|
||||
class MangaDexSerboCroatian : MangaDex("sh", "sh")
|
||||
class MangaDexSpanishLTAM : MangaDex("es-419", "es-la")
|
||||
class MangaDexSpanishSpain : MangaDex("es", "es")
|
||||
class MangaDexSwedish : MangaDex("sv", "sv")
|
||||
class MangaDexThai : MangaDex("th", "th")
|
||||
class MangaDexTurkish : MangaDex("tr", "tr")
|
||||
class MangaDexUkrainian : MangaDex("uk", "uk")
|
||||
class MangaDexVietnamese : MangaDex("vi", "vi")
|
||||
|
@ -27,6 +27,70 @@ class MangaDexFilters {
|
||||
fun addQueryParameter(url: HttpUrl.Builder, dexLang: String)
|
||||
}
|
||||
|
||||
private class HasAvailableChaptersFilter(intl: MangaDexIntl) :
|
||||
Filter.CheckBox(intl.hasAvailableChapters),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
if (state) {
|
||||
url.addQueryParameter("hasAvailableChapters", "true")
|
||||
url.addQueryParameter("availableTranslatedLanguage[]", dexLang)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class OriginalLanguage(name: String, val isoCode: String) : Filter.CheckBox(name)
|
||||
private class OriginalLanguageList(intl: MangaDexIntl, originalLanguage: List<OriginalLanguage>) :
|
||||
Filter.Group<OriginalLanguage>(intl.originalLanguage, originalLanguage),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
state.forEach { lang ->
|
||||
if (lang.state) {
|
||||
// dex has zh and zh-hk for chinese manhua
|
||||
if (lang.isoCode == MDConstants.originalLanguagePrefValChinese) {
|
||||
url.addQueryParameter(
|
||||
"originalLanguage[]",
|
||||
MDConstants.originalLanguagePrefValChineseHk
|
||||
)
|
||||
}
|
||||
|
||||
url.addQueryParameter("originalLanguage[]", lang.isoCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getOriginalLanguage(preferences: SharedPreferences, dexLang: String, intl: MangaDexIntl): List<OriginalLanguage> {
|
||||
val originalLanguages = preferences.getStringSet(
|
||||
MDConstants.getOriginalLanguagePrefKey(dexLang),
|
||||
setOf()
|
||||
)!!
|
||||
|
||||
return listOf(
|
||||
OriginalLanguage(intl.originalLanguageFilterJapanese, MDConstants.originalLanguagePrefValJapanese)
|
||||
.apply { state = MDConstants.originalLanguagePrefValJapanese in originalLanguages },
|
||||
OriginalLanguage(intl.originalLanguageFilterChinese, MDConstants.originalLanguagePrefValChinese)
|
||||
.apply { state = MDConstants.originalLanguagePrefValChinese in originalLanguages },
|
||||
OriginalLanguage(intl.originalLanguageFilterKorean, MDConstants.originalLanguagePrefValKorean)
|
||||
.apply { state = MDConstants.originalLanguagePrefValKorean in originalLanguages },
|
||||
)
|
||||
}
|
||||
|
||||
private class ContentRating(name: String, val value: String) : Filter.CheckBox(name)
|
||||
private class ContentRatingList(intl: MangaDexIntl, contentRating: List<ContentRating>) :
|
||||
Filter.Group<ContentRating>(intl.contentRating, contentRating),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
state.forEach { rating ->
|
||||
if (rating.state) {
|
||||
url.addQueryParameter("contentRating[]", rating.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getContentRating(preferences: SharedPreferences, dexLang: String, intl: MangaDexIntl): List<ContentRating> {
|
||||
val contentRatings = preferences.getStringSet(
|
||||
MDConstants.getContentRatingPrefKey(dexLang),
|
||||
@ -95,58 +159,41 @@ class MangaDexFilters {
|
||||
Status(intl.statusCancelled, "cancelled"),
|
||||
)
|
||||
|
||||
private class ContentRating(name: String, val value: String) : Filter.CheckBox(name)
|
||||
private class ContentRatingList(intl: MangaDexIntl, contentRating: List<ContentRating>) :
|
||||
Filter.Group<ContentRating>(intl.contentRating, contentRating),
|
||||
data class Sortable(val title: String, val value: String) {
|
||||
override fun toString(): String = title
|
||||
}
|
||||
|
||||
private fun getSortables(intl: MangaDexIntl) = arrayOf(
|
||||
Sortable(intl.sortAlphabetic, "title"),
|
||||
Sortable(intl.sortChapterUploadedAt, "latestUploadedChapter"),
|
||||
Sortable(intl.sortNumberOfFollows, "followedCount"),
|
||||
Sortable(intl.sortContentCreatedAt, "createdAt"),
|
||||
Sortable(intl.sortContentInfoUpdatedAt, "updatedAt"),
|
||||
Sortable(intl.sortRelevance, "relevance"),
|
||||
Sortable(intl.sortYear, "year")
|
||||
)
|
||||
|
||||
class SortFilter(intl: MangaDexIntl, private val sortables: Array<Sortable>) :
|
||||
Filter.Sort(
|
||||
intl.sort,
|
||||
sortables.map(Sortable::title).toTypedArray(),
|
||||
Selection(5, false)
|
||||
),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
state.forEach { rating ->
|
||||
if (rating.state) {
|
||||
url.addQueryParameter("contentRating[]", rating.value)
|
||||
if (state != null) {
|
||||
val query = sortables[state!!.index].value
|
||||
val value = when (state!!.ascending) {
|
||||
true -> "asc"
|
||||
false -> "desc"
|
||||
}
|
||||
|
||||
url.addQueryParameter("order[$query]", value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class OriginalLanguage(name: String, val isoCode: String) : Filter.CheckBox(name)
|
||||
private class OriginalLanguageList(intl: MangaDexIntl, originalLanguage: List<OriginalLanguage>) :
|
||||
Filter.Group<OriginalLanguage>(intl.originalLanguage, originalLanguage),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
state.forEach { lang ->
|
||||
if (lang.state) {
|
||||
// dex has zh and zh-hk for chinese manhua
|
||||
if (lang.isoCode == MDConstants.originalLanguagePrefValChinese) {
|
||||
url.addQueryParameter(
|
||||
"originalLanguage[]",
|
||||
MDConstants.originalLanguagePrefValChineseHk
|
||||
)
|
||||
}
|
||||
|
||||
url.addQueryParameter("originalLanguage[]", lang.isoCode)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getOriginalLanguage(preferences: SharedPreferences, dexLang: String, intl: MangaDexIntl): List<OriginalLanguage> {
|
||||
val originalLanguages = preferences.getStringSet(
|
||||
MDConstants.getOriginalLanguagePrefKey(dexLang),
|
||||
setOf()
|
||||
)!!
|
||||
|
||||
return listOf(
|
||||
OriginalLanguage(intl.originalLanguageFilterJapanese, MDConstants.originalLanguagePrefValJapanese)
|
||||
.apply { state = MDConstants.originalLanguagePrefValJapanese in originalLanguages },
|
||||
OriginalLanguage(intl.originalLanguageFilterChinese, MDConstants.originalLanguagePrefValChinese)
|
||||
.apply { state = MDConstants.originalLanguagePrefValChinese in originalLanguages },
|
||||
OriginalLanguage(intl.originalLanguageFilterKorean, MDConstants.originalLanguagePrefValKorean)
|
||||
.apply { state = MDConstants.originalLanguagePrefValKorean in originalLanguages },
|
||||
)
|
||||
}
|
||||
|
||||
internal class Tag(val id: String, name: String) : Filter.TriState(name)
|
||||
|
||||
private class TagList(collection: String, tags: List<Tag>) :
|
||||
@ -223,7 +270,6 @@ class MangaDexFilters {
|
||||
return tags.sortIfTranslated(intl)
|
||||
}
|
||||
|
||||
// to get all tags from dex https://api.mangadex.org/manga/tag
|
||||
internal fun getThemes(intl: MangaDexIntl): List<Tag> {
|
||||
val tags = listOf(
|
||||
Tag("e64f6742-c834-471d-8d72-dd51fc02b835", intl.themeAliens),
|
||||
@ -269,6 +315,7 @@ class MangaDexFilters {
|
||||
return tags.sortIfTranslated(intl)
|
||||
}
|
||||
|
||||
// to get all tags from dex https://api.mangadex.org/manga/tag
|
||||
internal fun getTags(intl: MangaDexIntl): List<Tag> {
|
||||
return getContents(intl) + getFormats(intl) + getGenres(intl) + getThemes(intl)
|
||||
}
|
||||
@ -300,53 +347,6 @@ class MangaDexFilters {
|
||||
}
|
||||
}
|
||||
|
||||
data class Sortable(val title: String, val value: String) {
|
||||
override fun toString(): String = title
|
||||
}
|
||||
|
||||
private fun getSortables(intl: MangaDexIntl) = arrayOf(
|
||||
Sortable(intl.sortAlphabetic, "title"),
|
||||
Sortable(intl.sortChapterUploadedAt, "latestUploadedChapter"),
|
||||
Sortable(intl.sortNumberOfFollows, "followedCount"),
|
||||
Sortable(intl.sortContentCreatedAt, "createdAt"),
|
||||
Sortable(intl.sortContentInfoUpdatedAt, "updatedAt"),
|
||||
Sortable(intl.sortRelevance, "relevance"),
|
||||
Sortable(intl.sortYear, "year")
|
||||
)
|
||||
|
||||
class SortFilter(intl: MangaDexIntl, private val sortables: Array<Sortable>) :
|
||||
Filter.Sort(
|
||||
intl.sort,
|
||||
sortables.map(Sortable::title).toTypedArray(),
|
||||
Selection(2, false)
|
||||
),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
if (state != null) {
|
||||
val query = sortables[state!!.index].value
|
||||
val value = when (state!!.ascending) {
|
||||
true -> "asc"
|
||||
false -> "desc"
|
||||
}
|
||||
|
||||
url.addQueryParameter("order[$query]", value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class HasAvailableChaptersFilter(intl: MangaDexIntl) :
|
||||
Filter.CheckBox(intl.hasAvailableChapters),
|
||||
UrlQueryFilter {
|
||||
|
||||
override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) {
|
||||
if (state) {
|
||||
url.addQueryParameter("hasAvailableChapters", "true")
|
||||
url.addQueryParameter("availableTranslatedLanguage[]", dexLang)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class TagsFilter(intl: MangaDexIntl, innerFilters: FilterList) :
|
||||
Filter.Group<Filter<*>>(intl.tags, innerFilters),
|
||||
UrlQueryFilter {
|
||||
|
Loading…
x
Reference in New Issue
Block a user