From 9105f9aef8f1fda471735fe26eee96e1191ad0ca Mon Sep 17 00:00:00 2001 From: DitFranXX <45893338+DitFranXX@users.noreply.github.com> Date: Sat, 27 Apr 2019 23:40:07 +0900 Subject: [PATCH] Update MSM Extension. (#1061) * Improve Preference-stub * Re-arrange some stubs to correct class. * Add `EditTextPreference`. * Update MSM extension. * Update filter. * Fix image fetch due to site changes (v4 -> v11) * Add BaseUrl Override for site domain changes. - Korean sources are change domain every 1-2 weeks due to internet censorship. * Add missing file `EditTextPreference.java` * Fix tags. --- .../v7/preference/DialogPreference.java | 18 +++- .../v7/preference/EditTextPreference.java | 17 ++++ .../support/v7/preference/ListPreference.java | 23 ----- .../support/v7/preference/Preference.java | 32 ++++++ src/ko/mangashowme/build.gradle | 7 +- .../extension/ko/mangashowme/MSMFilters.kt | 65 ++++++------ .../extension/ko/mangashowme/MangaShowMe.kt | 98 +++++++++++++++---- 7 files changed, 186 insertions(+), 74 deletions(-) create mode 100644 lib/preference-stub/src/main/java/android/support/v7/preference/EditTextPreference.java diff --git a/lib/preference-stub/src/main/java/android/support/v7/preference/DialogPreference.java b/lib/preference-stub/src/main/java/android/support/v7/preference/DialogPreference.java index e7a7f280e..d74c0c71d 100644 --- a/lib/preference-stub/src/main/java/android/support/v7/preference/DialogPreference.java +++ b/lib/preference-stub/src/main/java/android/support/v7/preference/DialogPreference.java @@ -4,4 +4,20 @@ package android.support.v7.preference; * Created by Carlos on 5/9/2018. */ -public abstract class DialogPreference extends Preference {} +public abstract class DialogPreference extends Preference { + public CharSequence getDialogTitle() { + throw new RuntimeException("Stub!"); + } + + public void setDialogTitle(CharSequence dialogTitle) { + throw new RuntimeException("Stub!"); + } + + public CharSequence getDialogMessage() { + throw new RuntimeException("Stub!"); + } + + public void setDialogMessage(CharSequence dialogMessage) { + throw new RuntimeException("Stub!"); + } +} diff --git a/lib/preference-stub/src/main/java/android/support/v7/preference/EditTextPreference.java b/lib/preference-stub/src/main/java/android/support/v7/preference/EditTextPreference.java new file mode 100644 index 000000000..2071573df --- /dev/null +++ b/lib/preference-stub/src/main/java/android/support/v7/preference/EditTextPreference.java @@ -0,0 +1,17 @@ +package android.support.v7.preference; + +import android.content.Context; + +public class EditTextPreference extends DialogPreference { + public EditTextPreference(Context context) { + throw new RuntimeException("Stub!"); + } + + public String getText() { + throw new RuntimeException("Stub!"); + } + + public void setText(String text) { + throw new RuntimeException("Stub!"); + } +} \ No newline at end of file diff --git a/lib/preference-stub/src/main/java/android/support/v7/preference/ListPreference.java b/lib/preference-stub/src/main/java/android/support/v7/preference/ListPreference.java index 1359b6b26..6099c5b86 100644 --- a/lib/preference-stub/src/main/java/android/support/v7/preference/ListPreference.java +++ b/lib/preference-stub/src/main/java/android/support/v7/preference/ListPreference.java @@ -12,27 +12,12 @@ public class ListPreference extends Preference { throw new RuntimeException("Stub!"); } - public CharSequence getTitle() { - throw new RuntimeException("Stub!"); - - } - - public void setTitle(CharSequence title) { - throw new RuntimeException("Stub!"); - } - public void setEntries(CharSequence[] entries) { throw new RuntimeException("Stub!"); } public CharSequence[] getEntries() { throw new RuntimeException("Stub!"); - - } - - public void setOnPreferenceChangeListener(OnPreferenceChangeListener onPreferenceChangeListener) { - throw new RuntimeException("Stub!"); - } public int findIndexOfValue(String value) { @@ -58,12 +43,4 @@ public class ListPreference extends Preference { public void setValue(String value) { throw new RuntimeException("Stub!"); } - - public void setSummary(CharSequence summary) { - throw new RuntimeException("Stub!"); - } - - public CharSequence getSummary() { - throw new RuntimeException("Stub!"); - } } diff --git a/lib/preference-stub/src/main/java/android/support/v7/preference/Preference.java b/lib/preference-stub/src/main/java/android/support/v7/preference/Preference.java index 9baf39539..a6c27095d 100644 --- a/lib/preference-stub/src/main/java/android/support/v7/preference/Preference.java +++ b/lib/preference-stub/src/main/java/android/support/v7/preference/Preference.java @@ -9,6 +9,26 @@ public class Preference { boolean onPreferenceChange(Preference preference, Object newValue); } + public void setOnPreferenceChangeListener(OnPreferenceChangeListener onPreferenceChangeListener) { + throw new RuntimeException("Stub!"); + } + + public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) { + throw new RuntimeException("Stub!"); + } + + public CharSequence getTitle() { + throw new RuntimeException("Stub!"); + } + + public void setTitle(CharSequence title) { + throw new RuntimeException("Stub!"); + } + + public CharSequence getSummary() { + throw new RuntimeException("Stub!"); + } + public void setKey(String key) { throw new RuntimeException("Stub!"); } @@ -16,4 +36,16 @@ public class Preference { public String getKey() { throw new RuntimeException("Stub!"); } + + public void setSummary(CharSequence summary) { + throw new RuntimeException("Stub!"); + } + + public void setDefaultValue(Object defaultValue) { + throw new RuntimeException("Stub!"); + } + + public interface OnPreferenceClickListener { + boolean onPreferenceClick(Preference preference); + } } diff --git a/src/ko/mangashowme/build.gradle b/src/ko/mangashowme/build.gradle index e7b3356ba..8c680cd67 100644 --- a/src/ko/mangashowme/build.gradle +++ b/src/ko/mangashowme/build.gradle @@ -5,8 +5,13 @@ ext { appName = 'Tachiyomi: MangaShow.Me (ManaMoa)' pkgNameSuffix = 'ko.mangashowme' extClass = '.MangaShowMe' - extVersionCode = 10 + extVersionCode = 11 libVersion = '1.2' } +dependencies { + compileOnly project(':preference-stub') + compileOnly 'com.github.inorichi.injekt:injekt-core:65b0440' +} + apply from: "$rootDir/common.gradle" diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt index 62e2004bb..ec4d51e69 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt @@ -9,13 +9,15 @@ import okhttp3.Request // TODO: Completely Implement/Update Filters(Genre/Artist). private class TextField(name: String, val key: String) : Filter.Text(name) -private class SearchCheckBox(val id: Int, name: String) : Filter.CheckBox(name) + +private class SearchCheckBox(name: String, val id: String = name) : Filter.CheckBox(name) private class SearchMatch : Filter.Select("Match", arrayOf("AND", "OR")) private class SearchGenresList(genres: List) : Filter.Group("Genres", genres) private class SearchNamingList : Filter.Select("Naming", searchNaming()) private class SearchStatusList : Filter.Select("Status", searchStatus()) +// [`"Not Set"`, ...[...document.querySelectorAll(".categories ul[data-type='1'] li")].map((el, i) => `"${el.innerText.trim()}"`)].join(',\n') private fun searchNaming() = arrayOf( "Not Set", "ㄱ", @@ -41,6 +43,7 @@ private fun searchNaming() = arrayOf( "0-9" ) +// [`"Not Set"`, ...[...document.querySelectorAll(".categories ul[data-type='2'] li")].map((el, i) => `"${el.innerText.trim()}"`)].join(',\n') private fun searchStatus() = arrayOf( "Not Set", "주간", @@ -52,36 +55,36 @@ private fun searchStatus() = arrayOf( "완결" ) +// [...document.querySelectorAll(".categories ul[data-type='3'] li")].map((el, i) => `SearchCheckBox("${el.innerText.trim()}")`).join(',\n') private fun searchGenres() = listOf( - SearchCheckBox(0, "17"), - SearchCheckBox(0, "BL"), - SearchCheckBox(0, "SF"), - SearchCheckBox(0, "TS"), - SearchCheckBox(0, "개그"), - SearchCheckBox(0, "게임"), - SearchCheckBox(0, "공포"), - SearchCheckBox(0, "도박"), - SearchCheckBox(0, "드라마"), - SearchCheckBox(0, "라노벨"), - SearchCheckBox(0, "러브코미디"), - SearchCheckBox(0, "먹방"), - SearchCheckBox(0, "백합"), - SearchCheckBox(0, "붕탁"), - SearchCheckBox(0, "순정"), - SearchCheckBox(0, "스릴러"), - SearchCheckBox(0, "스포츠"), - SearchCheckBox(0, "시대"), - SearchCheckBox(0, "애니화"), - SearchCheckBox(0, "액션"), - SearchCheckBox(0, "역사"), - SearchCheckBox(0, "음악"), - SearchCheckBox(0, "이세계"), - SearchCheckBox(0, "일상"), - SearchCheckBox(0, "전생"), - SearchCheckBox(0, "추리"), - SearchCheckBox(0, "판타지"), - SearchCheckBox(0, "학원"), - SearchCheckBox(0, "호러") + SearchCheckBox("17"), + SearchCheckBox("BL"), + SearchCheckBox("SF"), + SearchCheckBox("TS"), + SearchCheckBox("개그"), + SearchCheckBox("게임"), + SearchCheckBox("공포"), + SearchCheckBox("도박"), + SearchCheckBox("드라마"), + SearchCheckBox("라노벨"), + SearchCheckBox("러브코미디"), + SearchCheckBox("먹방"), + SearchCheckBox("백합"), + SearchCheckBox("붕탁"), + SearchCheckBox("순정"), + SearchCheckBox("스릴러"), + SearchCheckBox("스포츠"), + SearchCheckBox("시대"), + SearchCheckBox("애니화"), + SearchCheckBox("액션"), + SearchCheckBox("음악"), + SearchCheckBox("이세계"), + SearchCheckBox("일상"), + SearchCheckBox("전생"), + SearchCheckBox("추리"), + SearchCheckBox("판타지"), + SearchCheckBox("학원"), + SearchCheckBox("호러") ) fun getFilters() = FilterList( @@ -136,7 +139,7 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St is SearchGenresList -> { filter.state.forEach { if (it.state) { - genresFilter.add(it.name) + genresFilter.add(it.id) } } } diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt index 726fb873a..5cf804b03 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt @@ -1,7 +1,14 @@ package eu.kanade.tachiyomi.extension.ko.mangashowme import android.annotation.SuppressLint +import android.app.Application +import android.content.SharedPreferences +import android.support.v7.preference.EditTextPreference +import android.support.v7.preference.PreferenceScreen +import android.widget.Toast +import eu.kanade.tachiyomi.extension.BuildConfig import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup @@ -12,6 +19,8 @@ import org.json.JSONArray import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.jsoup.select.Elements +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.TimeUnit @@ -22,9 +31,10 @@ import java.util.concurrent.TimeUnit * PS. There's no Popular section. It's just a list of manga. Also not latest updates. * `manga_list` returns latest 'added' manga. not a chapter updates. **/ -class MangaShowMe : ParsedHttpSource() { +class MangaShowMe : ConfigurableSource, ParsedHttpSource() { override val name = "MangaShow.Me" - override val baseUrl = "https://manamoa2.net" + private val defaultBaseUrl = "https://manamoa3.net" + override val baseUrl by lazy { getPrefBaseUrl() } override val lang: String = "ko" // Latest updates currently returns duplicate manga as it separates manga into chapters @@ -37,15 +47,23 @@ class MangaShowMe : ParsedHttpSource() { val req = chain.request() // only for image Request - if (!req.url().host().contains("filecdn.xyz")) return@addInterceptor chain.proceed(req) + val isFileCdn = !req.url().host().contains(".filecdn.xyz") + if (!req.url().toString().endsWith("?quick")) return@addInterceptor chain.proceed(req) val secondUrl = req.header("SecondUrlToRequest") fun get(flag: Int = 0): Request { - val url = when (flag) { - 1 -> req.url().toString().replace("img.", "s3.") - 2 -> secondUrl!! - else -> req.url().toString() + val url = if (isFileCdn) { + when (flag) { + 1 -> req.url().toString().replace("img.", "s3.") + else -> req.url().toString() + } + } else { + when (flag) { + 1 -> secondUrl!! + 2 -> secondUrl!!.replace("img.", "s3.") + else -> req.url().toString().substringBefore("?quick") + } } return req.newBuilder()!!.url(url) @@ -55,13 +73,21 @@ class MangaShowMe : ParsedHttpSource() { } val res = chain.proceed(get()) - val length = res.header("content-length") - if (length == null || length.toInt() < 50000) { - val s3res = chain.proceed(get(1)) // s3 - if (!s3res.isSuccessful && secondUrl != null) { - chain.proceed(get(2)) // secondUrl - } else s3res - } else res + + if (isFileCdn) { + val length = res.header("content-length") + if (length == null || length.toInt() < 50000) { + chain.proceed(get(1)) // s3 + } else res + } else { + if (!res.isSuccessful && secondUrl != null) { + val fallbackRes = chain.proceed(get(1)) // img filecdn + val fallbackLength = fallbackRes.header("content-length") + if (fallbackLength == null || fallbackLength.toInt() < 50000) { + chain.proceed(get(2)) // s3 + } else fallbackRes + } else res + } } .build()!! @@ -116,7 +142,7 @@ class MangaShowMe : ParsedHttpSource() { val mangaChaptersLike = mangaElementsSum(document.select(".title i.fa.fa-thumbs-up > span")) val mangaComments = mangaElementsSum(document.select(".title i.fa.fa-comment > span")) val genres = mutableListOf() - document.select("div.left-info > .manga-tags > a.tag").forEach { + document.select("div.left-info div.information > .manga-tags > a.tag").forEach { genres.add(it.text()) } @@ -223,10 +249,10 @@ class MangaShowMe : ParsedHttpSource() { .map { imageUrls.getString(it) } .forEach { pages.add(Page(pages.size, decoder.request(it), "${it.substringBefore("!!")}?quick")) } } else { - (0 until imageUrls.length()) + (0 until imageUrls1.length()) .map { - imageUrls.getString(it) + try { - "!!${imageUrls1.getString(it)}" + imageUrls1.getString(it) + try { + "!!${imageUrls.getString(it)}?quick" } catch (_: Exception) { "" } @@ -287,9 +313,45 @@ class MangaShowMe : ParsedHttpSource() { url[1].replace("&", "%26").replace("#", "%23") } + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val baseUrlPref = EditTextPreference(screen.context).apply { + key = BASE_URL_PREF_TITLE + title = BASE_URL_PREF_TITLE + summary = BASE_URL_PREF_SUMMARY + this.setDefaultValue(defaultBaseUrl) + dialogTitle = BASE_URL_PREF_TITLE + dialogMessage = "Default: $defaultBaseUrl" + + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(BASE_URL_PREF, newValue as String).commit() + Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + } + + screen.addPreference(baseUrlPref) + } + + private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl) + override fun getFilterList() = getFilters() companion object { + private const val BASE_URL_PREF_TITLE = "Override BaseUrl" + private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_NAME}" + private const val BASE_URL_PREF_SUMMARY = "For temporary uses. Update extension will erase this setting." + private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." + internal const val V1_CX = 5 internal const val V1_CY = 5 }