diff --git a/multisrc/overrides/foolslide/ajianoscantrad/src/AjiaNoScantrad.kt b/multisrc/overrides/foolslide/ajianoscantrad/src/AjiaNoScantrad.kt new file mode 100644 index 000000000..0a32b24d0 --- /dev/null +++ b/multisrc/overrides/foolslide/ajianoscantrad/src/AjiaNoScantrad.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.fr.ajianoscantrad + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class AjiaNoScantrad : FoolSlide("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", "/reader") diff --git a/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt b/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt new file mode 100644 index 000000000..c18e9a96b --- /dev/null +++ b/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.anatanomotokare + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class AnataNoMotokare : FoolSlide("Anata no Motokare", "https://motokare.xyz", "en", "/reader") diff --git a/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt b/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt new file mode 100644 index 000000000..1b80c01f4 --- /dev/null +++ b/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt @@ -0,0 +1,19 @@ +package eu.kanade.tachiyomi.extension.pt.baixarhentai + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.annotations.Nsfw +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document + +@Nsfw +class BaixarHentai : FoolSlide("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR") { + // Hardcode the id because the language wasn't specific. + override val id: Long = 8908032188831949972 + + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + title = document.select("h1.title").text() + thumbnail_url = getDetailsThumbnail(document, "div.title a") + } + } +} diff --git a/src/all/foolslide/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from src/all/foolslide/res/mipmap-hdpi/ic_launcher.png rename to multisrc/overrides/foolslide/default/res/mipmap-hdpi/ic_launcher.png diff --git a/src/all/foolslide/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from src/all/foolslide/res/mipmap-mdpi/ic_launcher.png rename to multisrc/overrides/foolslide/default/res/mipmap-mdpi/ic_launcher.png diff --git a/src/all/foolslide/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from src/all/foolslide/res/mipmap-xhdpi/ic_launcher.png rename to multisrc/overrides/foolslide/default/res/mipmap-xhdpi/ic_launcher.png diff --git a/src/all/foolslide/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from src/all/foolslide/res/mipmap-xxhdpi/ic_launcher.png rename to multisrc/overrides/foolslide/default/res/mipmap-xxhdpi/ic_launcher.png diff --git a/src/all/foolslide/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from src/all/foolslide/res/mipmap-xxxhdpi/ic_launcher.png rename to multisrc/overrides/foolslide/default/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/src/all/foolslide/res/web_hi_res_512.png b/multisrc/overrides/foolslide/default/res/web_hi_res_512.png similarity index 100% rename from src/all/foolslide/res/web_hi_res_512.png rename to multisrc/overrides/foolslide/default/res/web_hi_res_512.png diff --git a/multisrc/overrides/foolslide/fallenworldorder/src/FallenWorldOrder.kt b/multisrc/overrides/foolslide/fallenworldorder/src/FallenWorldOrder.kt new file mode 100644 index 000000000..5d7a24700 --- /dev/null +++ b/multisrc/overrides/foolslide/fallenworldorder/src/FallenWorldOrder.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.fallenworldorder + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class FallenWorldOrder : FoolSlide("Fall World Reader", "https://faworeader.altervista.org", "it", "/slide") diff --git a/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt b/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt new file mode 100644 index 000000000..f566c8341 --- /dev/null +++ b/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt @@ -0,0 +1,89 @@ +package eu.kanade.tachiyomi.extension.all.foolslidecustomizable + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory +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.source.ConfigurableSource +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class FoolSlideCustomizableFactory : SourceFactory { + override fun createSources(): List<Source> = listOf( + FoolSlideCustomizable(), + ) +} +class FoolSlideCustomizable : ConfigurableSource, FoolSlide("FoolSlide Customizable", "", "other") { + override val baseUrl: String by lazy { getPrefBaseUrl() } + + private val preferences: SharedPreferences by lazy { + Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) + } + + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { + key = BASE_URL_PREF_TITLE + title = BASE_URL_PREF_TITLE + summary = BASE_URL_PREF_SUMMARY + this.setDefaultValue(DEFAULT_BASEURL) + dialogTitle = BASE_URL_PREF_TITLE + dialogMessage = "Default: $DEFAULT_BASEURL" + + 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) + } + + 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(DEFAULT_BASEURL) + dialogTitle = BASE_URL_PREF_TITLE + dialogMessage = "Default: $DEFAULT_BASEURL" + + 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) + } + + /** + * Tell the user to include /directory/ in the URL even though we remove it + * To increase the chance they input a usable URL + */ + private fun getPrefBaseUrl() = preferences.getString(BASE_URL_PREF, DEFAULT_BASEURL)!!.substringBefore("/directory") + + companion object { + private const val DEFAULT_BASEURL = "https://127.0.0.1" + private const val BASE_URL_PREF_TITLE = "Example URL: https://domain.com/path_to/directory/" + private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_NAME}" + private const val BASE_URL_PREF_SUMMARY = "Connect to a designated FoolSlide server" + private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." + } +} diff --git a/multisrc/overrides/foolslide/gto/src/GTO.kt b/multisrc/overrides/foolslide/gto/src/GTO.kt new file mode 100644 index 000000000..34992686c --- /dev/null +++ b/multisrc/overrides/foolslide/gto/src/GTO.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.gto + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class GTO : FoolSlide("GTO The Great Site", "https://www.gtothegreatsite.net", "it", "/reader") diff --git a/multisrc/overrides/foolslide/helveticascans/src/HelveticaScans.kt b/multisrc/overrides/foolslide/helveticascans/src/HelveticaScans.kt new file mode 100644 index 000000000..1f3344ec5 --- /dev/null +++ b/multisrc/overrides/foolslide/helveticascans/src/HelveticaScans.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.helveticascans + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class HelveticaScans : FoolSlide("Helvetica Scans", "https://helveticascans.com", "en", "/r") diff --git a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt b/multisrc/overrides/foolslide/hentaicafe/src/HentaiCafe.kt similarity index 99% rename from src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt rename to multisrc/overrides/foolslide/hentaicafe/src/HentaiCafe.kt index 7c1490769..d67d6046c 100644 --- a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/HentaiCafe.kt +++ b/multisrc/overrides/foolslide/hentaicafe/src/HentaiCafe.kt @@ -1,18 +1,19 @@ -package eu.kanade.tachiyomi.extension.all.foolslide +package eu.kanade.tachiyomi.extension.en.hentaicafe +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservable -import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.util.asJsoup import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import eu.kanade.tachiyomi.network.asObservable +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.util.asJsoup import rx.Observable import java.net.URLEncoder diff --git a/multisrc/overrides/foolslide/hniscantrad/src/HNIScantrad.kt b/multisrc/overrides/foolslide/hniscantrad/src/HNIScantrad.kt new file mode 100644 index 000000000..91d837a10 --- /dev/null +++ b/multisrc/overrides/foolslide/hniscantrad/src/HNIScantrad.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.fr.hniscantrad + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class HNIScantrad : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "fr", "/lel") diff --git a/multisrc/overrides/foolslide/hniscantraden/src/HNIScantradEN.kt b/multisrc/overrides/foolslide/hniscantraden/src/HNIScantradEN.kt new file mode 100644 index 000000000..7e3a90c29 --- /dev/null +++ b/multisrc/overrides/foolslide/hniscantraden/src/HNIScantradEN.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.extension.en.hniscantraden + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Element + +class HNIScantradEN : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "en", "/eng/lel") { + override val supportsLatest = false + override fun popularMangaRequest(page: Int) = GET(baseUrl + urlModifier, headers) + override fun popularMangaSelector() = "div.listed" + override fun popularMangaFromElement(element: Element): SManga { + return SManga.create().apply { + element.select("a:has(h3)").let { + title = it.text() + setUrlWithoutDomain(it.attr("abs:href")) + } + thumbnail_url = element.select("img").attr("abs:src") + } + } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl$urlModifier/?manga=${query.replace(" ", "+")}") + override fun searchMangaSelector(): String = popularMangaSelector() + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + override fun chapterListSelector() = "div.theList > a" + override fun chapterFromElement(element: Element): SChapter { + return SChapter.create().apply { + name = element.select("div.chapter b").text() + setUrlWithoutDomain(element.attr("abs:href")) + } + } + override fun pageListParse(response: Response): List<Page> { + return Regex("""imageArray\[\d+]='(.*)'""").findAll(response.body()!!.string()).toList().mapIndexed { i, mr -> + Page(i, "", "$baseUrl$urlModifier/${mr.groupValues[1]}") + } + } +} diff --git a/multisrc/overrides/foolslide/iskultripscans/src/IskultripScans.kt b/multisrc/overrides/foolslide/iskultripscans/src/IskultripScans.kt new file mode 100644 index 000000000..095f49232 --- /dev/null +++ b/multisrc/overrides/foolslide/iskultripscans/src/IskultripScans.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.iskultripscans + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class IskultripScans : FoolSlide("Iskultrip Scans", "https://maryfaye.net", "en", "/reader") diff --git a/multisrc/overrides/foolslide/kireicake/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/kireicake/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..37c663f91 Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/kireicake/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/kireicake/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..3eb93ed01 Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/kireicake/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/kireicake/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6383596f0 Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/kireicake/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/kireicake/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..636b4e7bb Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/kireicake/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/kireicake/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0f8fcfc44 Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/kireicake/res/web_hi_res_512.png b/multisrc/overrides/foolslide/kireicake/res/web_hi_res_512.png new file mode 100644 index 000000000..b3a3f8577 Binary files /dev/null and b/multisrc/overrides/foolslide/kireicake/res/web_hi_res_512.png differ diff --git a/multisrc/overrides/foolslide/kireicake/src/KireiCake.kt b/multisrc/overrides/foolslide/kireicake/src/KireiCake.kt new file mode 100644 index 000000000..3ec78715b --- /dev/null +++ b/multisrc/overrides/foolslide/kireicake/src/KireiCake.kt @@ -0,0 +1,15 @@ +package eu.kanade.tachiyomi.extension.en.kireicake + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document + +class KireiCake : FoolSlide("Kirei Cake", "https://reader.kireicake.com", "en") { + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + description = document.select("$mangaDetailsInfoSelector li:has(b:contains(description))") + .first()?.ownText()?.substringAfter(":") + thumbnail_url = getDetailsThumbnail(document) + } + } +} diff --git a/multisrc/overrides/foolslide/kirishimafansub/src/KirishimaFansub.kt b/multisrc/overrides/foolslide/kirishimafansub/src/KirishimaFansub.kt new file mode 100644 index 000000000..c4730d3ef --- /dev/null +++ b/multisrc/overrides/foolslide/kirishimafansub/src/KirishimaFansub.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.es.kirishimafansub + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class KirishimaFansub : FoolSlide("Kirishima Fansub", "https://www.kirishimafansub.net", "es", "/lector") diff --git a/multisrc/overrides/foolslide/lupiteam/src/LupiTeam.kt b/multisrc/overrides/foolslide/lupiteam/src/LupiTeam.kt new file mode 100644 index 000000000..ed725efc8 --- /dev/null +++ b/multisrc/overrides/foolslide/lupiteam/src/LupiTeam.kt @@ -0,0 +1,26 @@ +package eu.kanade.tachiyomi.extension.it.lupiteam + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document + +class LupiTeam : FoolSlide("LupiTeam", "https://lupiteam.net", "it", "/reader") { + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select(mangaDetailsInfoSelector).first().text() + + val manga = SManga.create() + manga.author = infoElement.substringAfter("Autore: ").substringBefore("Artista: ") + manga.artist = infoElement.substringAfter("Artista: ").substringBefore("Target: ") + val stato = infoElement.substringAfter("Stato: ").substringBefore("Trama: ").substring(0, 8) + manga.status = when (stato) { + "In corso" -> SManga.ONGOING + "Completa" -> SManga.COMPLETED + "Licenzia" -> SManga.LICENSED + else -> SManga.UNKNOWN + } + manga.description = infoElement.substringAfter("Trama: ") + manga.thumbnail_url = getDetailsThumbnail(document) + + return manga + } +} diff --git a/multisrc/overrides/foolslide/mabushimajo/src/Mabushimajo.kt b/multisrc/overrides/foolslide/mabushimajo/src/Mabushimajo.kt new file mode 100644 index 000000000..8cb3be22e --- /dev/null +++ b/multisrc/overrides/foolslide/mabushimajo/src/Mabushimajo.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.tr.mabushimajo + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class Mabushimajo : FoolSlide("Mabushimajo", "http://mabushimajo.com", "tr", "/onlineokuma") diff --git a/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt b/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt new file mode 100644 index 000000000..f19f5d991 --- /dev/null +++ b/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.en.mangatellers + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class Mangatellers : FoolSlide("Mangatellers", "http://www.mangatellers.gr", "en", "/reader/reader") { + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl$urlModifier/list/$page/", headers) + } +} diff --git a/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt b/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt new file mode 100644 index 000000000..a59f52339 --- /dev/null +++ b/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.es.menudofansub + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class MenudoFansub : FoolSlide("Menudo-Fansub", "http://www.menudo-fansub.com", "es", "/slide") diff --git a/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt b/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt new file mode 100644 index 000000000..a6e9d67cb --- /dev/null +++ b/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.nifteam + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class NIFTeam : FoolSlide("NIFTeam", "http://read-nifteam.info", "it", "/slide") diff --git a/multisrc/overrides/foolslide/phoenixscans/src/PhoenixScans.kt b/multisrc/overrides/foolslide/phoenixscans/src/PhoenixScans.kt new file mode 100644 index 000000000..8d8dfb693 --- /dev/null +++ b/multisrc/overrides/foolslide/phoenixscans/src/PhoenixScans.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.phoenixscans + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class PhoenixScans : FoolSlide("The Phoenix Scans", "https://www.phoenixscans.com", "it", "/reader") diff --git a/multisrc/overrides/foolslide/rama/src/Rama.kt b/multisrc/overrides/foolslide/rama/src/Rama.kt new file mode 100644 index 000000000..505204490 --- /dev/null +++ b/multisrc/overrides/foolslide/rama/src/Rama.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.rama + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class Rama : FoolSlide("Rama", "https://www.ramareader.it", "it", "/read") diff --git a/multisrc/overrides/foolslide/sensescans/src/SenseScans.kt b/multisrc/overrides/foolslide/sensescans/src/SenseScans.kt new file mode 100644 index 000000000..0ce9ec62c --- /dev/null +++ b/multisrc/overrides/foolslide/sensescans/src/SenseScans.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.sensescans + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class SenseScans : FoolSlide("Sense-Scans", "http://sensescans.com", "en", "/reader") diff --git a/multisrc/overrides/foolslide/storminheaven/src/StormInHeaven.kt b/multisrc/overrides/foolslide/storminheaven/src/StormInHeaven.kt new file mode 100644 index 000000000..2072fc19a --- /dev/null +++ b/multisrc/overrides/foolslide/storminheaven/src/StormInHeaven.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.storminheaven + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class StormInHeaven : FoolSlide("Storm in Heaven", "https://www.storm-in-heaven.net", "it", "/reader-sih") diff --git a/multisrc/overrides/foolslide/tortugaceviri/src/TortugaCeviri.kt b/multisrc/overrides/foolslide/tortugaceviri/src/TortugaCeviri.kt new file mode 100644 index 000000000..edf42cc80 --- /dev/null +++ b/multisrc/overrides/foolslide/tortugaceviri/src/TortugaCeviri.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.tr.tortugaceviri + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class TortugaCeviri : FoolSlide("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr", "/okuma") diff --git a/multisrc/overrides/foolslide/tuttoanimemanga/src/TuttoAnimeManga.kt b/multisrc/overrides/foolslide/tuttoanimemanga/src/TuttoAnimeManga.kt new file mode 100644 index 000000000..5397ae6da --- /dev/null +++ b/multisrc/overrides/foolslide/tuttoanimemanga/src/TuttoAnimeManga.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.tuttoanimemanga + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class TuttoAnimeManga : FoolSlide("TuttoAnimeManga", "https://tuttoanimemanga.net", "it", "/slide") diff --git a/multisrc/overrides/foolslide/yuriism/src/YuriIsm.kt b/multisrc/overrides/foolslide/yuriism/src/YuriIsm.kt new file mode 100644 index 000000000..844c10517 --- /dev/null +++ b/multisrc/overrides/foolslide/yuriism/src/YuriIsm.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.yuriism + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class YuriIsm : FoolSlide("Yuri-ism", "https://www.yuri-ism.net", "en", "/slide") diff --git a/multisrc/overrides/foolslide/zandynofansub/src/ZandynoFansub.kt b/multisrc/overrides/foolslide/zandynofansub/src/ZandynoFansub.kt new file mode 100644 index 000000000..2f39d916b --- /dev/null +++ b/multisrc/overrides/foolslide/zandynofansub/src/ZandynoFansub.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.zandynofansub + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class ZandynoFansub : FoolSlide("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en", "/reader") diff --git a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlide.kt similarity index 99% rename from src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt rename to multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlide.kt index 7c6a26351..d68dbe457 100644 --- a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlide.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlide.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.all.foolslide +package eu.kanade.tachiyomi.multisrc.foolslide import com.github.salomonbrys.kotson.get import com.google.gson.JsonParser diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlideGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlideGenerator.kt new file mode 100644 index 000000000..2fd1f819f --- /dev/null +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/foolslide/FoolSlideGenerator.kt @@ -0,0 +1,59 @@ +package eu.kanade.tachiyomi.multisrc.foolslide + +import eu.kanade.tachiyomi.multisrc.ThemeSourceData.SingleLang +import eu.kanade.tachiyomi.multisrc.ThemeSourceData.MultiLang +import eu.kanade.tachiyomi.multisrc.ThemeSourceGenerator + +class FoolSlideGenerator : ThemeSourceGenerator { + + override val themePkg = "foolslide" + + override val themeClass = "FoolSlide" + + override val baseVersionCode: Int = 1 + + override val sources = listOf( + SingleLang("The Cat Scans", "https://reader2.thecatscans.com/", "en"), + SingleLang("Silent Sky", "https://reader.silentsky-scans.net", "en"), + SingleLang("Death Toll Scans", "https://reader.deathtollscans.net", "en"), + SingleLang("One Time Scans", "https://reader.otscans.com", "en"), + SingleLang("MangaScouts", "http://onlinereader.mangascouts.org", "de"), + SingleLang("Lilyreader", "https://manga.smuglo.li", "en"), + SingleLang("Evil Flowers", "https://reader.evilflowers.com", "en"), + SingleLang("Русификация", "https://rusmanga.ru", "ru", className = "Russification"), + SingleLang("PowerManga", "https://reader.powermanga.org", "it", className = "PowerMangaIT"), + MultiLang("FoolSlide Customizable", "", listOf("other")), + SingleLang("Menudo-Fansub", "http://www.menudo-fansub.com", "es", className = "MenudoFansub"), + SingleLang("Sense-Scans", "http://sensescans.com", "en", className = "SenseScans"), + SingleLang("Kirei Cake", "https://reader.kireicake.com", "en"), + SingleLang("Mangatellers", "http://www.mangatellers.gr", "en"), + SingleLang("Iskultrip Scans", "https://maryfaye.net", "en"), + SingleLang("Anata no Motokare", "https://motokare.xyz", "en", className = "AnataNoMotokare"), + SingleLang("Yuri-ism", "https://www.yuri-ism.net", "en", className = "YuriIsm"), + SingleLang("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", className = "AjiaNoScantrad"), + SingleLang("Storm in Heaven", "https://www.storm-in-heaven.net", "it", className = "StormInHeaven"), + SingleLang("LupiTeam", "https://lupiteam.net", "it"), + SingleLang("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en"), + SingleLang("Helvetica Scans", "https://helveticascans.com", "en"), + SingleLang("Kirishima Fansub", "https://www.kirishimafansub.net", "es"), + SingleLang("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR", isNsfw = true), + SingleLang("HNI-Scantrad", "https://hni-scantrad.com", "fr", className = "HNIScantrad"), + SingleLang("HNI-Scantrad", "https://hni-scantrad.com", "en", className = "HNIScantradEN"), + SingleLang("The Phoenix Scans", "https://www.phoenixscans.com", "it", className = "PhoenixScans"), + SingleLang("GTO The Great Site", "https://www.gtothegreatsite.net", "it", className = "GTO"), + SingleLang("Fall World Reader", "https://faworeader.altervista.org", "it", className = "FallenWorldOrder"), + SingleLang("NIFTeam", "http://read-nifteam.info", "it"), + SingleLang("TuttoAnimeManga", "https://tuttoanimemanga.net", "it"), + SingleLang("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr"), + SingleLang("Rama", "https://www.ramareader.it", "it"), + SingleLang("Mabushimajo", "http://mabushimajo.com", "tr"), + SingleLang("Hentai Cafe", "https://hentai.cafe", "en", isNsfw = true), + ) + + companion object { + @JvmStatic + fun main(args: Array<String>) { + FoolSlideGenerator().createAll() + } + } +} diff --git a/src/all/foolslide/AndroidManifest.xml b/src/all/foolslide/AndroidManifest.xml deleted file mode 100644 index 30deb7f79..000000000 --- a/src/all/foolslide/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest package="eu.kanade.tachiyomi.extension" /> diff --git a/src/all/foolslide/build.gradle b/src/all/foolslide/build.gradle deleted file mode 100644 index 612b49ec1..000000000 --- a/src/all/foolslide/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' - -ext { - extName = 'FoolSlide (multiple sources)' - pkgNameSuffix = 'all.foolslide' - extClass = '.FoolSlideFactory' - extVersionCode = 59 - libVersion = '1.2' - containsNsfw = true -} - -apply from: "$rootDir/common.gradle" diff --git a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlideFactory.kt b/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlideFactory.kt deleted file mode 100644 index 352508b59..000000000 --- a/src/all/foolslide/src/eu/kanade/tachiyomi/extension/all/foolslide/FoolSlideFactory.kt +++ /dev/null @@ -1,270 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.foolslide - -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 com.github.salomonbrys.kotson.get -import eu.kanade.tachiyomi.annotations.Nsfw -import eu.kanade.tachiyomi.extension.BuildConfig -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceFactory -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import okhttp3.Request -import okhttp3.Response -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get - -class FoolSlideFactory : SourceFactory { - override fun createSources(): List<Source> = listOf( - SenseScans(), - KireiCake(), - SilentSky(), - Mangatellers(), - IskultripScans(), - AnataNoMotokare(), - DeathTollScans(), - YuriIsm(), - AjiaNoScantrad(), - OneTimeScans(), - MangaScouts(), - StormInHeaven(), - Lilyreader(), - Russification(), - EvilFlowers(), - LupiTeam(), - HentaiCafe(), - TheCatScans(), - ZandynoFansub(), - HelveticaScans(), - KirishimaFansub(), - PowerMangaIT(), - BaixarHentai(), - HNIScantrad(), - HNIScantradEN(), - PhoenixScans(), - GTO(), - FallenWorldOrder(), - NIFTeam(), - TuttoAnimeManga(), - Customizable(), - TortugaCeviri(), - Rama(), - Mabushimajo(), - MenudoFansub() - ) -} - -class MenudoFansub : FoolSlide("Menudo-Fansub", "http://www.menudo-fansub.com", "es", "/slide") - -class TheCatScans : FoolSlide("The Cat Scans", "https://reader2.thecatscans.com/", "en") - -class SenseScans : FoolSlide("Sense-Scans", "http://sensescans.com", "en", "/reader") - -class KireiCake : FoolSlide("Kirei Cake", "https://reader.kireicake.com", "en") { - override fun mangaDetailsParse(document: Document): SManga { - return SManga.create().apply { - description = document.select("$mangaDetailsInfoSelector li:has(b:contains(description))") - .first()?.ownText()?.substringAfter(":") - thumbnail_url = getDetailsThumbnail(document) - } - } -} - -class SilentSky : FoolSlide("Silent Sky", "https://reader.silentsky-scans.net", "en") - -class Mangatellers : FoolSlide("Mangatellers", "http://www.mangatellers.gr", "en", "/reader/reader") { - override fun popularMangaRequest(page: Int): Request { - return GET("$baseUrl$urlModifier/list/$page/", headers) - } -} - -class IskultripScans : FoolSlide("Iskultrip Scans", "https://maryfaye.net", "en", "/reader") - -class AnataNoMotokare : FoolSlide("Anata no Motokare", "https://motokare.xyz", "en", "/reader") - -class DeathTollScans : FoolSlide("Death Toll Scans", "https://reader.deathtollscans.net", "en") - -class YuriIsm : FoolSlide("Yuri-ism", "https://www.yuri-ism.net", "en", "/slide") - -class AjiaNoScantrad : FoolSlide("Ajia no Scantrad", "https://www.ajianoscantrad.fr", "fr", "/reader") - -class OneTimeScans : FoolSlide("One Time Scans", "https://reader.otscans.com", "en") - -class MangaScouts : FoolSlide("MangaScouts", "http://onlinereader.mangascouts.org", "de") - -class StormInHeaven : FoolSlide("Storm in Heaven", "https://www.storm-in-heaven.net", "it", "/reader-sih") - -class Lilyreader : FoolSlide("Lilyreader", "https://manga.smuglo.li", "en") - -class Russification : FoolSlide("Русификация", "https://rusmanga.ru", "ru") - -class EvilFlowers : FoolSlide("Evil Flowers", "https://reader.evilflowers.com", "en") - -class LupiTeam : FoolSlide("LupiTeam", "https://lupiteam.net", "it", "/reader") { - override fun mangaDetailsParse(document: Document): SManga { - val infoElement = document.select(mangaDetailsInfoSelector).first().text() - - val manga = SManga.create() - manga.author = infoElement.substringAfter("Autore: ").substringBefore("Artista: ") - manga.artist = infoElement.substringAfter("Artista: ").substringBefore("Target: ") - val stato = infoElement.substringAfter("Stato: ").substringBefore("Trama: ").substring(0, 8) - manga.status = when (stato) { - "In corso" -> SManga.ONGOING - "Completa" -> SManga.COMPLETED - "Licenzia" -> SManga.LICENSED - else -> SManga.UNKNOWN - } - manga.description = infoElement.substringAfter("Trama: ") - manga.thumbnail_url = getDetailsThumbnail(document) - - return manga - } -} - -class ZandynoFansub : FoolSlide("Zandy no Fansub", "https://zandynofansub.aishiteru.org", "en", "/reader") - -class HelveticaScans : FoolSlide("Helvetica Scans", "https://helveticascans.com", "en", "/r") - -class KirishimaFansub : FoolSlide("Kirishima Fansub", "https://www.kirishimafansub.net", "es", "/lector") - -class PowerMangaIT : FoolSlide("PowerManga", "https://reader.powermanga.org", "it", "") - -@Nsfw -class BaixarHentai : FoolSlide("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR") { - // Hardcode the id because the language wasn't specific. - override val id: Long = 8908032188831949972 - - override fun mangaDetailsParse(document: Document): SManga { - return SManga.create().apply { - title = document.select("h1.title").text() - thumbnail_url = getDetailsThumbnail(document, "div.title a") - } - } -} - -class HNIScantrad : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "fr", "/lel") - -class HNIScantradEN : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "en", "/eng/lel") { - override val supportsLatest = false - override fun popularMangaRequest(page: Int) = GET(baseUrl + urlModifier, headers) - override fun popularMangaSelector() = "div.listed" - override fun popularMangaFromElement(element: Element): SManga { - return SManga.create().apply { - element.select("a:has(h3)").let { - title = it.text() - setUrlWithoutDomain(it.attr("abs:href")) - } - thumbnail_url = element.select("img").attr("abs:src") - } - } - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl$urlModifier/?manga=${query.replace(" ", "+")}") - override fun searchMangaSelector(): String = popularMangaSelector() - override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) - override fun chapterListSelector() = "div.theList > a" - override fun chapterFromElement(element: Element): SChapter { - return SChapter.create().apply { - name = element.select("div.chapter b").text() - setUrlWithoutDomain(element.attr("abs:href")) - } - } - override fun pageListParse(response: Response): List<Page> { - return Regex("""imageArray\[\d+]='(.*)'""").findAll(response.body()!!.string()).toList().mapIndexed { i, mr -> - Page(i, "", "$baseUrl$urlModifier/${mr.groupValues[1]}") - } - } -} - -class PhoenixScans : FoolSlide("The Phoenix Scans", "https://www.phoenixscans.com", "it", "/reader") - -class GTO : FoolSlide("GTO The Great Site", "https://www.gtothegreatsite.net", "it", "/reader") - -class FallenWorldOrder : FoolSlide("Fall World Reader", "https://faworeader.altervista.org", "it", "/slide") - -class NIFTeam : FoolSlide("NIFTeam", "http://read-nifteam.info", "it", "/slide") - -class TuttoAnimeManga : FoolSlide("TuttoAnimeManga", "https://tuttoanimemanga.net", "it", "/slide") - -class Customizable : ConfigurableSource, FoolSlide("Customizable", "", "other") { - override val baseUrl: String by lazy { getPrefBaseUrl() } - - private val preferences: SharedPreferences by lazy { - Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) - } - - override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { - val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply { - key = BASE_URL_PREF_TITLE - title = BASE_URL_PREF_TITLE - summary = BASE_URL_PREF_SUMMARY - this.setDefaultValue(DEFAULT_BASEURL) - dialogTitle = BASE_URL_PREF_TITLE - dialogMessage = "Default: $DEFAULT_BASEURL" - - 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) - } - - 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(DEFAULT_BASEURL) - dialogTitle = BASE_URL_PREF_TITLE - dialogMessage = "Default: $DEFAULT_BASEURL" - - 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) - } - - /** - * Tell the user to include /directory/ in the URL even though we remove it - * To increase the chance they input a usable URL - */ - private fun getPrefBaseUrl() = preferences.getString(BASE_URL_PREF, DEFAULT_BASEURL)!!.substringBefore("/directory") - - companion object { - private const val DEFAULT_BASEURL = "https://127.0.0.1" - private const val BASE_URL_PREF_TITLE = "Example URL: https://domain.com/path_to/directory/" - private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_NAME}" - private const val BASE_URL_PREF_SUMMARY = "Connect to a designated FoolSlide server" - private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." - } -} - -class TortugaCeviri : FoolSlide("Tortuga Ceviri", "http://tortuga-ceviri.com", "tr", "/okuma") - -class Rama : FoolSlide("Rama", "https://www.ramareader.it", "it", "/read") - -class Mabushimajo : FoolSlide("Mabushimajo", "http://mabushimajo.com", "tr", "/onlineokuma")