Misc code cleanup
This commit is contained in:
parent
170c382b15
commit
40de8b9723
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: ComiCake'
|
appName = 'Tachiyomi: ComiCake'
|
||||||
pkgNameSuffix = 'all.comicake'
|
pkgNameSuffix = 'all.comicake'
|
||||||
extClass = '.ComiCakeFactory'
|
extClass = '.ComiCakeFactory'
|
||||||
extVersionCode = 6
|
extVersionCode = 7
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.comicake
|
package eu.kanade.tachiyomi.extension.all.comicake
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import eu.kanade.tachiyomi.extension.BuildConfig
|
import eu.kanade.tachiyomi.extensions.BuildConfig
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
@ -12,20 +16,19 @@ import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
|
|
||||||
const val COMICAKE_DEFAULT_API_ENDPOINT = "/api" // Highly unlikely to change
|
abstract class ComiCake(
|
||||||
const val COMICAKE_DEFAULT_READER_ENDPOINT = "/r" // Can change based on CC config
|
override val name: String,
|
||||||
|
|
||||||
open class ComiCake(override val name: String,
|
|
||||||
final override val baseUrl: String,
|
final override val baseUrl: String,
|
||||||
override val lang: String,
|
override val lang: String,
|
||||||
readerEndpoint: String = COMICAKE_DEFAULT_READER_ENDPOINT,
|
readerEndpoint: String = COMICAKE_DEFAULT_READER_ENDPOINT,
|
||||||
apiEndpoint: String = COMICAKE_DEFAULT_API_ENDPOINT) : HttpSource() {
|
apiEndpoint: String = COMICAKE_DEFAULT_API_ENDPOINT
|
||||||
|
) : HttpSource() {
|
||||||
|
|
||||||
override val versionId = 1
|
override val versionId = 1
|
||||||
override val supportsLatest = true
|
override val supportsLatest = true
|
||||||
private val readerBase = baseUrl + readerEndpoint
|
private val readerBase = baseUrl + readerEndpoint
|
||||||
private var apiBase = baseUrl + apiEndpoint
|
private var apiBase = baseUrl + apiEndpoint
|
||||||
|
|
||||||
|
|
||||||
private val userAgent = "Mozilla/5.0 (" +
|
private val userAgent = "Mozilla/5.0 (" +
|
||||||
"Android ${Build.VERSION.RELEASE}; Mobile) " +
|
"Android ${Build.VERSION.RELEASE}; Mobile) " +
|
||||||
"Tachiyomi/${BuildConfig.VERSION_NAME}"
|
"Tachiyomi/${BuildConfig.VERSION_NAME}"
|
||||||
|
@ -69,6 +72,7 @@ open class ComiCake(override val name: String,
|
||||||
mangas.add(parseComicJson(obj))
|
mangas.add(parseComicJson(obj))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MangasPage(mangas, !(response.getString("next").isNullOrEmpty() || response.getString("next") == "null"))
|
return MangasPage(mangas, !(response.getString("next").isNullOrEmpty() || response.getString("next") == "null"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,4 +160,9 @@ open class ComiCake(override val name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!")
|
override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!")
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val COMICAKE_DEFAULT_API_ENDPOINT = "/api" // Highly unlikely to change
|
||||||
|
private const val COMICAKE_DEFAULT_READER_ENDPOINT = "/r" // Can change based on CC config
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,19 +4,13 @@ import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
|
|
||||||
class ComiCakeFactory : SourceFactory {
|
class ComiCakeFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = getAllComiCake()
|
override fun createSources(): List<Source> = listOf(
|
||||||
}
|
LetItGoScans(),
|
||||||
|
|
||||||
fun getAllComiCake(): List<Source> {
|
|
||||||
return listOf(
|
|
||||||
WhimSubs(),
|
|
||||||
PTScans(),
|
PTScans(),
|
||||||
LetItGoScans()
|
WhimSubs()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class WhimSubs : ComiCake("WhimSubs", "https://whimsubs.xyz", "en")
|
|
||||||
|
|
||||||
class PTScans : ComiCake("ProjectTime Scans", "https://read.ptscans.com", "en", "/")
|
|
||||||
|
|
||||||
class LetItGoScans : ComiCake("LetItGo Scans", "https://reader.letitgo.scans.today", "en", "/")
|
class LetItGoScans : ComiCake("LetItGo Scans", "https://reader.letitgo.scans.today", "en", "/")
|
||||||
|
class PTScans : ComiCake("ProjectTime Scans", "https://read.ptscans.com", "en", "/")
|
||||||
|
class WhimSubs : ComiCake("WhimSubs", "https://whimsubs.xyz", "en")
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: FMReader (multiple aggregators)'
|
appName = 'Tachiyomi: FMReader (multiple aggregators)'
|
||||||
pkgNameSuffix = 'all.fmreader'
|
pkgNameSuffix = 'all.fmreader'
|
||||||
extClass = '.FMReaderFactory'
|
extClass = '.FMReaderFactory'
|
||||||
extVersionCode = 2
|
extVersionCode = 3
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,26 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.fmreader
|
package eu.kanade.tachiyomi.extension.all.fmreader
|
||||||
|
|
||||||
// For sites based on the Flat-Manga CMS
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
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.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.Headers
|
||||||
|
import okhttp3.HttpUrl
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import java.util.Calendar
|
||||||
import okhttp3.*
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For sites based on the Flat-Manga CMS
|
||||||
|
*/
|
||||||
abstract class FMReader(
|
abstract class FMReader(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val baseUrl: String,
|
override val baseUrl: String,
|
||||||
|
@ -43,10 +53,8 @@ abstract class FMReader (
|
||||||
}
|
}
|
||||||
is TextField -> url.addQueryParameter(filter.key, filter.state)
|
is TextField -> url.addQueryParameter(filter.key, filter.state)
|
||||||
is GenreList -> {
|
is GenreList -> {
|
||||||
|
|
||||||
var genre = String()
|
var genre = String()
|
||||||
var ungenre = String()
|
var ungenre = String()
|
||||||
|
|
||||||
filter.state.forEach {
|
filter.state.forEach {
|
||||||
if (it.isIncluded()) genre += ",${it.name}"
|
if (it.isIncluded()) genre += ",${it.name}"
|
||||||
if (it.isExcluded()) ungenre += ",${it.name}"
|
if (it.isExcluded()) ungenre += ",${it.name}"
|
||||||
|
|
|
@ -5,9 +5,17 @@ import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.*
|
import okhttp3.FormBody
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
|
@ -40,6 +48,7 @@ class FMReaderFactory : SourceFactory {
|
||||||
* most likely the fix is to override popularMangaNextPageSelector() */
|
* most likely the fix is to override popularMangaNextPageSelector() */
|
||||||
|
|
||||||
class LHTranslation : FMReader("LHTranslation", "https://lhtranslation.net", "en")
|
class LHTranslation : FMReader("LHTranslation", "https://lhtranslation.net", "en")
|
||||||
|
|
||||||
class MangaHato : FMReader("MangaHato", "https://mangahato.com", "ja")
|
class MangaHato : FMReader("MangaHato", "https://mangahato.com", "ja")
|
||||||
class ManhwaScan : FMReader("ManhwaScan", "https://manhwascan.com", "en")
|
class ManhwaScan : FMReader("ManhwaScan", "https://manhwascan.com", "en")
|
||||||
class MangaTiki : FMReader("MangaTiki", "https://mangatiki.com", "ja")
|
class MangaTiki : FMReader("MangaTiki", "https://mangatiki.com", "ja")
|
||||||
|
@ -47,16 +56,20 @@ class MangaBone : FMReader("MangaBone", "https://mangabone.com", "en")
|
||||||
class YoloManga : FMReader("Yolo Manga", "https://yolomanga.ca", "es") {
|
class YoloManga : FMReader("Yolo Manga", "https://yolomanga.ca", "es") {
|
||||||
override fun chapterListSelector() = "div#tab-chapper ~ div#tab-chapper table tr"
|
override fun chapterListSelector() = "div#tab-chapper ~ div#tab-chapper table tr"
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangaLeer : FMReader("MangaLeer", "https://mangaleer.com", "es") {
|
class MangaLeer : FMReader("MangaLeer", "https://mangaleer.com", "es") {
|
||||||
override val dateValueIndex = 1
|
override val dateValueIndex = 1
|
||||||
override val dateWordIndex = 2
|
override val dateWordIndex = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
class AiLoveManga : FMReader("AiLoveManga", "https://ailovemanga.com", "vi") {
|
class AiLoveManga : FMReader("AiLoveManga", "https://ailovemanga.com", "vi") {
|
||||||
override val requestPath = "danh-sach-truyen.html"
|
override val requestPath = "danh-sach-truyen.html"
|
||||||
// TODO: could add a genre search (different URL paths for genres)
|
// TODO: could add a genre search (different URL paths for genres)
|
||||||
override fun getFilterList() = FilterList()
|
override fun getFilterList() = FilterList()
|
||||||
|
|
||||||
// I don't know why, but I have to override searchMangaRequest to make it work for this source
|
// I don't know why, but I have to override searchMangaRequest to make it work for this source
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/$requestPath?name=$query&page=$page")
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/$requestPath?name=$query&page=$page")
|
||||||
|
|
||||||
override fun chapterListSelector() = "div#tab-chapper table tr"
|
override fun chapterListSelector() = "div#tab-chapper table tr"
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
|
@ -72,10 +85,12 @@ class AiLoveManga : FMReader("AiLoveManga", "https://ailovemanga.com", "vi") {
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReadComicOnlineOrg : FMReader("ReadComicOnline.org", "https://readcomiconline.org", "en") {
|
class ReadComicOnlineOrg : FMReader("ReadComicOnline.org", "https://readcomiconline.org", "en") {
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||||
.addInterceptor { requestIntercept(it) }
|
.addInterceptor { requestIntercept(it) }
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
private fun requestIntercept(chain: Interceptor.Chain): Response {
|
private fun requestIntercept(chain: Interceptor.Chain): Response {
|
||||||
val request = chain.request()
|
val request = chain.request()
|
||||||
val response = chain.proceed(request)
|
val response = chain.proceed(request)
|
||||||
|
@ -92,6 +107,7 @@ class ReadComicOnlineOrg : FMReader("ReadComicOnline.org", "https://readcomiconl
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val requestPath = "comic-list.html"
|
override val requestPath = "comic-list.html"
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val pages = mutableListOf<Page>()
|
val pages = mutableListOf<Page>()
|
||||||
|
@ -101,30 +117,38 @@ class ReadComicOnlineOrg : FMReader("ReadComicOnline.org", "https://readcomiconl
|
||||||
}
|
}
|
||||||
return pages.dropLast(1) // last page is a comments page
|
return pages.dropLast(1) // last page is a comments page
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun imageUrlRequest(page: Page): Request = GET(baseUrl + page.url, headers)
|
override fun imageUrlRequest(page: Page): Request = GET(baseUrl + page.url, headers)
|
||||||
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
||||||
override fun getGenreList() = getComicsGenreList()
|
override fun getGenreList() = getComicsGenreList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangaWeek : FMReader("MangaWeek", "https://mangaweek.com", "en")
|
class MangaWeek : FMReader("MangaWeek", "https://mangaweek.com", "en")
|
||||||
class HanaScan : FMReader("HanaScan (RawQQ)", "http://rawqq.com", "ja") {
|
class HanaScan : FMReader("HanaScan (RawQQ)", "http://rawqq.com", "ja") {
|
||||||
override fun popularMangaNextPageSelector() = "div.col-md-8 button"
|
override fun popularMangaNextPageSelector() = "div.col-md-8 button"
|
||||||
}
|
}
|
||||||
|
|
||||||
class RawLH : FMReader("RawLH", "https://lhscan.net", "ja") {
|
class RawLH : FMReader("RawLH", "https://lhscan.net", "ja") {
|
||||||
override fun popularMangaNextPageSelector() = "div.col-md-8 button"
|
override fun popularMangaNextPageSelector() = "div.col-md-8 button"
|
||||||
}
|
}
|
||||||
|
|
||||||
class Manhwa18 : FMReader("Manhwa18", "https://manhwa18.com", "en") {
|
class Manhwa18 : FMReader("Manhwa18", "https://manhwa18.com", "en") {
|
||||||
override fun getGenreList() = getAdultGenreList()
|
override fun getGenreList() = getAdultGenreList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class TruyenTranhLH : FMReader("TruyenTranhLH", "https://truyentranhlh.net", "vi") {
|
class TruyenTranhLH : FMReader("TruyenTranhLH", "https://truyentranhlh.net", "vi") {
|
||||||
override val requestPath = "danh-sach-truyen.html"
|
override val requestPath = "danh-sach-truyen.html"
|
||||||
}
|
}
|
||||||
|
|
||||||
class EighteenLHPlus : FMReader("18LHPlus", "https://18lhplus.com", "en") {
|
class EighteenLHPlus : FMReader("18LHPlus", "https://18lhplus.com", "en") {
|
||||||
override fun getGenreList() = getAdultGenreList()
|
override fun getGenreList() = getAdultGenreList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
override fun popularMangaNextPageSelector() = "div.btn-group:not(div.btn-block) button.btn-info"
|
override fun popularMangaNextPageSelector() = "div.btn-group:not(div.btn-block) button.btn-info"
|
||||||
// TODO: genre search possible but a bit of a pain
|
// TODO: genre search possible but a bit of a pain
|
||||||
override fun getFilterList() = FilterList()
|
override fun getFilterList() = FilterList()
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/arama.html?icerik=$query", headers)
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/arama.html?icerik=$query", headers)
|
||||||
override fun searchMangaParse(response: Response): MangasPage {
|
override fun searchMangaParse(response: Response): MangasPage {
|
||||||
val mangas = mutableListOf<SManga>()
|
val mangas = mutableListOf<SManga>()
|
||||||
|
@ -135,6 +159,7 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
|
|
||||||
return MangasPage(mangas, false)
|
return MangasPage(mangas, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun searchMangaFromElement(element: Element): SManga {
|
override fun searchMangaFromElement(element: Element): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
|
|
||||||
|
@ -143,6 +168,7 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
val infoElement = document.select("div#tab1").first()
|
val infoElement = document.select("div#tab1").first()
|
||||||
|
@ -156,6 +182,7 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListSelector() = "tr.table-bordered"
|
override fun chapterListSelector() = "tr.table-bordered"
|
||||||
override val chapterUrlSelector = "td[align=left] > a"
|
override val chapterUrlSelector = "td[align=left] > a"
|
||||||
override val chapterTimeSelector = "td[align=right]"
|
override val chapterTimeSelector = "td[align=right]"
|
||||||
|
@ -172,6 +199,7 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
Observable.error(Exception("Licensed - No chapters to show"))
|
Observable.error(Exception("Licensed - No chapters to show"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun chapterListParse(response: Response, requestUrl: String): List<SChapter> {
|
private fun chapterListParse(response: Response, requestUrl: String): List<SChapter> {
|
||||||
val chapters = mutableListOf<SChapter>()
|
val chapters = mutableListOf<SChapter>()
|
||||||
var document = response.asJsoup()
|
var document = response.asJsoup()
|
||||||
|
@ -193,6 +221,7 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
}
|
}
|
||||||
return chapters
|
return chapters
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun pageListRequest(chapter: SChapter): Request = GET("$baseUrl/${chapter.url.substringAfter("cek/")}", headers)
|
override fun pageListRequest(chapter: SChapter): Request = GET("$baseUrl/${chapter.url.substringAfter("cek/")}", headers)
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val pages = mutableListOf<Page>()
|
val pages = mutableListOf<Page>()
|
||||||
|
@ -202,12 +231,15 @@ class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") {
|
||||||
}
|
}
|
||||||
return pages.dropLast(1) // last page is a comments page
|
return pages.dropLast(1) // last page is a comments page
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Comicastle : FMReader("Comicastle", "https://www.comicastle.org", "en") {
|
class Comicastle : FMReader("Comicastle", "https://www.comicastle.org", "en") {
|
||||||
override val requestPath = "comic-dir"
|
override val requestPath = "comic-dir"
|
||||||
// this source doesn't have the "page x of y" element
|
// this source doesn't have the "page x of y" element
|
||||||
override fun popularMangaNextPageSelector() = "li:contains(»)"
|
override fun popularMangaNextPageSelector() = "li:contains(»)"
|
||||||
|
|
||||||
override fun popularMangaParse(response: Response) = defaultMangaParse(response)
|
override fun popularMangaParse(response: Response) = defaultMangaParse(response)
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/comic-dir?q=$query", headers)
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/comic-dir?q=$query", headers)
|
||||||
override fun searchMangaParse(response: Response): MangasPage = defaultMangaParse(response)
|
override fun searchMangaParse(response: Response): MangasPage = defaultMangaParse(response)
|
||||||
|
@ -224,6 +256,7 @@ class Comicastle : FMReader("Comicastle", "https://www.comicastle.org", "en") {
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListSelector() = "div.col-md-9 table:last-of-type tr"
|
override fun chapterListSelector() = "div.col-md-9 table:last-of-type tr"
|
||||||
override fun chapterListParse(response: Response): List<SChapter> = super.chapterListParse(response).reversed()
|
override fun chapterListParse(response: Response): List<SChapter> = super.chapterListParse(response).reversed()
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
|
@ -234,29 +267,32 @@ class Comicastle : FMReader("Comicastle", "https://www.comicastle.org", "en") {
|
||||||
}
|
}
|
||||||
return pages
|
return pages
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
override fun imageUrlParse(document: Document): String = document.select("img.chapter-img").attr("abs:src").trim()
|
||||||
override fun getGenreList() = getComicsGenreList()
|
override fun getGenreList() = getComicsGenreList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Manhwa18Net : FMReader("Manhwa18.net", "https://manhwa18.net", "en") {
|
class Manhwa18Net : FMReader("Manhwa18.net", "https://manhwa18.net", "en") {
|
||||||
override fun popularMangaRequest(page: Int): Request =
|
override fun popularMangaRequest(page: Int): Request =
|
||||||
GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=views&sort_type=DESC&ungenre=raw", headers)
|
GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=views&sort_type=DESC&ungenre=raw", headers)
|
||||||
|
|
||||||
override fun latestUpdatesRequest(page: Int): Request =
|
override fun latestUpdatesRequest(page: Int): Request =
|
||||||
GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=last_update&sort_type=DESC&ungenre=raw", headers)
|
GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=last_update&sort_type=DESC&ungenre=raw", headers)
|
||||||
|
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
val noRawsUrl = super.searchMangaRequest(page, query, filters).url().newBuilder().addQueryParameter("ungenre", "raw").toString()
|
val noRawsUrl = super.searchMangaRequest(page, query, filters).url().newBuilder().addQueryParameter("ungenre", "raw").toString()
|
||||||
return GET(noRawsUrl, headers)
|
return GET(noRawsUrl, headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getGenreList() = getAdultGenreList()
|
override fun getGenreList() = getAdultGenreList()
|
||||||
}
|
}
|
||||||
|
|
||||||
class Manhwa18NetRaw : FMReader("Manhwa18.net Raw", "https://manhwa18.net", "ko") {
|
class Manhwa18NetRaw : FMReader("Manhwa18.net Raw", "https://manhwa18.net", "ko") {
|
||||||
override val requestPath = "manga-list-genre-raw.html"
|
override val requestPath = "manga-list-genre-raw.html"
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
val onlyRawsUrl = super.searchMangaRequest(page, query, filters).url().newBuilder().addQueryParameter("genre", "raw").toString()
|
val onlyRawsUrl = super.searchMangaRequest(page, query, filters).url().newBuilder().addQueryParameter("genre", "raw").toString()
|
||||||
return GET(onlyRawsUrl, headers)
|
return GET(onlyRawsUrl, headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilterList() = FilterList(super.getFilterList().filterNot { it == GenreList(getGenreList()) })
|
override fun getFilterList() = FilterList(super.getFilterList().filterNot { it == GenreList(getGenreList()) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: FoolSlide (multiple sources)'
|
appName = 'Tachiyomi: FoolSlide (multiple sources)'
|
||||||
pkgNameSuffix = 'all.foolslide'
|
pkgNameSuffix = 'all.foolslide'
|
||||||
extClass = '.FoolSlideFactory'
|
extClass = '.FoolSlideFactory'
|
||||||
extVersionCode = 28
|
extVersionCode = 29
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,11 @@ import com.github.salomonbrys.kotson.get
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import okhttp3.FormBody
|
import okhttp3.FormBody
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
@ -13,13 +17,17 @@ import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import java.text.ParseException
|
import java.text.ParseException
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Calendar
|
||||||
|
import java.util.Date
|
||||||
|
import java.util.HashSet
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
abstract class FoolSlide(
|
||||||
open class FoolSlide(override val name: String,
|
override val name: String,
|
||||||
override val baseUrl: String,
|
override val baseUrl: String,
|
||||||
override val lang: String,
|
override val lang: String,
|
||||||
val urlModifier: String = "") : ParsedHttpSource() {
|
val urlModifier: String = ""
|
||||||
|
) : ParsedHttpSource() {
|
||||||
|
|
||||||
protected open val dedupeLatestUpdates = true
|
protected open val dedupeLatestUpdates = true
|
||||||
|
|
||||||
|
|
|
@ -12,11 +12,7 @@ import okhttp3.Request
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
|
|
||||||
class FoolSlideFactory : SourceFactory {
|
class FoolSlideFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = getAllFoolSlide()
|
override fun createSources(): List<Source> = listOf(
|
||||||
}
|
|
||||||
|
|
||||||
fun getAllFoolSlide(): List<Source> {
|
|
||||||
return listOf(
|
|
||||||
JaminisBox(),
|
JaminisBox(),
|
||||||
SenseScans(),
|
SenseScans(),
|
||||||
KireiCake(),
|
KireiCake(),
|
||||||
|
@ -46,7 +42,6 @@ fun getAllFoolSlide(): List<Source> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class JaminisBox : FoolSlide("Jaimini's Box", "https://jaiminisbox.com", "en", "/reader") {
|
class JaminisBox : FoolSlide("Jaimini's Box", "https://jaiminisbox.com", "en", "/reader") {
|
||||||
|
|
||||||
override fun pageListParse(document: Document): List<Page> {
|
override fun pageListParse(document: Document): List<Page> {
|
||||||
val doc = document.toString()
|
val doc = document.toString()
|
||||||
var jsonstr = doc.substringAfter("var pages = ").substringBefore(";")
|
var jsonstr = doc.substringAfter("var pages = ").substringBefore(";")
|
||||||
|
@ -132,7 +127,6 @@ class LupiTeam : FoolSlide("LupiTeam", "https://lupiteam.net", "it", "/reader")
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZandynoFansub : FoolSlide("Zandy no Fansub", "http://zandynofansub.aishiteru.org", "en", "/reader")
|
class ZandynoFansub : FoolSlide("Zandy no Fansub", "http://zandynofansub.aishiteru.org", "en", "/reader")
|
||||||
|
|
|
@ -2,7 +2,11 @@ package eu.kanade.tachiyomi.extension.all.foolslide
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.asObservable
|
import eu.kanade.tachiyomi.network.asObservable
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
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 eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: Genkan (multiple sources)'
|
appName = 'Tachiyomi: Genkan (multiple sources)'
|
||||||
pkgNameSuffix = 'all.genkan'
|
pkgNameSuffix = 'all.genkan'
|
||||||
extClass = '.GenkanFactory'
|
extClass = '.GenkanFactory'
|
||||||
extVersionCode = 7
|
extVersionCode = 8
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.genkan
|
package eu.kanade.tachiyomi.extension.all.genkan
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
@ -11,7 +15,8 @@ import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import org.jsoup.select.Elements
|
import org.jsoup.select.Elements
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Calendar
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
abstract class Genkan(
|
abstract class Genkan(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
@ -159,7 +164,7 @@ abstract class Genkan(
|
||||||
.replace(Regex("""["\\]"""), "")
|
.replace(Regex("""["\\]"""), "")
|
||||||
.split(",")
|
.split(",")
|
||||||
|
|
||||||
for (i in 0 until allImages.size) {
|
for (i in allImages.indices) {
|
||||||
pages.add(Page(i, "", allImages[i]))
|
pages.add(Page(i, "", allImages[i]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,4 +243,3 @@ abstract class GenkanOriginal(
|
||||||
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: Madara (multiple sources)'
|
appName = 'Tachiyomi: Madara (multiple sources)'
|
||||||
pkgNameSuffix = "all.madara"
|
pkgNameSuffix = "all.madara"
|
||||||
extClass = '.MadaraFactory'
|
extClass = '.MadaraFactory'
|
||||||
extVersionCode = 22
|
extVersionCode = 23
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,31 +3,43 @@ package eu.kanade.tachiyomi.extension.all.madara
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.network.asObservable
|
import eu.kanade.tachiyomi.network.asObservable
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
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.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import okhttp3.*
|
import okhttp3.CacheControl
|
||||||
import java.text.ParseException
|
import okhttp3.FormBody
|
||||||
import java.text.SimpleDateFormat
|
import okhttp3.HttpUrl
|
||||||
import java.util.*
|
import okhttp3.OkHttpClient
|
||||||
import java.util.concurrent.TimeUnit
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
|
import java.text.ParseException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Calendar
|
||||||
|
import java.util.Date
|
||||||
|
import java.util.Locale
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
open class Madara(
|
abstract class Madara(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val baseUrl: String,
|
override val baseUrl: String,
|
||||||
override val lang: String,
|
override val lang: String,
|
||||||
private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
|
private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US)
|
||||||
) : ParsedHttpSource() {
|
) : ParsedHttpSource() {
|
||||||
|
|
||||||
|
override val supportsLatest = true
|
||||||
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
||||||
.connectTimeout(10, TimeUnit.SECONDS)
|
.connectTimeout(10, TimeUnit.SECONDS)
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
override val supportsLatest = true
|
|
||||||
|
|
||||||
// Popular Manga
|
// Popular Manga
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.page-item-detail"
|
override fun popularMangaSelector() = "div.page-item-detail"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.madara
|
package eu.kanade.tachiyomi.extension.all.madara
|
||||||
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
|
@ -11,10 +10,10 @@ import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.HttpUrl
|
import okhttp3.HttpUrl
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import okhttp3.Response
|
|
||||||
import okhttp3.Request
|
|
||||||
|
|
||||||
class MadaraFactory : SourceFactory {
|
class MadaraFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = listOf(
|
override fun createSources(): List<Source> = listOf(
|
||||||
|
@ -56,11 +55,13 @@ class MadaraFactory : SourceFactory {
|
||||||
class Mangasushi : Madara("Mangasushi", "https://mangasushi.net", "en") {
|
class Mangasushi : Madara("Mangasushi", "https://mangasushi.net", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class NinjaScans : Madara("NinjaScans", "https://ninjascans.com", "en")
|
class NinjaScans : Madara("NinjaScans", "https://ninjascans.com", "en")
|
||||||
class ReadManhua : Madara("ReadManhua", "https://readmanhua.net", "en",
|
class ReadManhua : Madara("ReadManhua", "https://readmanhua.net", "en",
|
||||||
dateFormat = SimpleDateFormat("dd MMM yy", Locale.US)) {
|
dateFormat = SimpleDateFormat("dd MMM yy", Locale.US)) {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZeroScans : Madara("ZeroScans", "https://zeroscans.com", "en")
|
class ZeroScans : Madara("ZeroScans", "https://zeroscans.com", "en")
|
||||||
class IsekaiScanCom : Madara("IsekaiScan.com", "https://isekaiscan.com/", "en")
|
class IsekaiScanCom : Madara("IsekaiScan.com", "https://isekaiscan.com/", "en")
|
||||||
class HappyTeaScans : Madara("Happy Tea Scans", "https://happyteascans.com/", "en")
|
class HappyTeaScans : Madara("Happy Tea Scans", "https://happyteascans.com/", "en")
|
||||||
|
@ -68,6 +69,7 @@ class JustForFun : Madara("Just For Fun", "https://just-for-fun.ru/", "ru",
|
||||||
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/", "en") {
|
class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/", "en") {
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
val chapters = mutableListOf<SChapter>()
|
val chapters = mutableListOf<SChapter>()
|
||||||
|
@ -99,9 +101,11 @@ class AoCTranslations : Madara("Agent of Change Translations", "https://aoc.moe/
|
||||||
return chapters.reversed()
|
return chapters.reversed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class KomikGo : Madara("KomikGo", "https://komikgo.com", "id") {
|
class KomikGo : Madara("KomikGo", "https://komikgo.com", "id") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com/", "en")
|
class LuxyScans : Madara("Luxy Scans", "https://luxyscans.com/", "en")
|
||||||
class TritiniaScans : Madara("Tritinia Scans", "http://ghajik.ml/", "en",
|
class TritiniaScans : Madara("Tritinia Scans", "http://ghajik.ml/", "en",
|
||||||
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
||||||
|
@ -110,25 +114,32 @@ class TritiniaScans : Madara("Tritinia Scans", "http://ghajik.ml/", "en",
|
||||||
override fun latestUpdatesNextPageSelector(): String? = null
|
override fun latestUpdatesNextPageSelector(): String? = null
|
||||||
override fun popularMangaNextPageSelector(): String? = null
|
override fun popularMangaNextPageSelector(): String? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com/",
|
class TsubakiNoScan : Madara("Tsubaki No Scan", "https://tsubakinoscan.com/",
|
||||||
"fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
"fr", dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US))
|
||||||
|
|
||||||
class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr",
|
class YokaiJump : Madara("Yokai Jump", "https://yokaijump.fr/", "fr",
|
||||||
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US)) {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZManga : Madara("ZManga", "https://zmanga.org/", "es") {
|
class ZManga : Madara("ZManga", "https://zmanga.org/", "es") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en")
|
class MangazukiMe : Madara("Mangazuki.me", "https://mangazuki.me/", "en")
|
||||||
class MangazukiOnline : Madara("Mangazuki.online", "https://www.mangazuki.online/", "en") {
|
class MangazukiOnline : Madara("Mangazuki.online", "https://www.mangazuki.online/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club/", "ja") {
|
class MangazukiClubJP : Madara("Mangazuki.club", "https://mangazuki.club/", "ja") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club/", "ko") {
|
class MangazukiClubKO : Madara("Mangazuki.club", "https://mangazuki.club/", "ko") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en") {
|
class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en") {
|
||||||
override val pageListParseSelector = "div.reading-content img"
|
override val pageListParseSelector = "div.reading-content img"
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
|
@ -141,12 +152,15 @@ class FirstKissManga : Madara("1st Kiss", "https://1stkissmanga.com/", "en") {
|
||||||
return if (page.imageUrl!!.contains(cdnUrl)) GET(page.imageUrl!!, cdnHeaders) else GET(page.imageUrl!!, headers)
|
return if (page.imageUrl!!.contains(cdnUrl)) GET(page.imageUrl!!, cdnHeaders) else GET(page.imageUrl!!, headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangaKomi : Madara("MangaKomi", "https://mangakomi.com/", "en") {
|
class MangaKomi : Madara("MangaKomi", "https://mangakomi.com/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en") {
|
class MangaSY : Madara("Manga SY", "https://www.mangasy.com/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ManwhaClub : Madara("Manwha Club", "https://manhwa.club/", "en")
|
class ManwhaClub : Madara("Manwha Club", "https://manhwa.club/", "en")
|
||||||
class WuxiaWorld : Madara("WuxiaWorld", "https://wuxiaworld.site/", "en") {
|
class WuxiaWorld : Madara("WuxiaWorld", "https://wuxiaworld.site/", "en") {
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/tag/webcomic/page/$page/?m_orderby=views", headers)
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/tag/webcomic/page/$page/?m_orderby=views", headers)
|
||||||
|
@ -154,6 +168,7 @@ class WuxiaWorld : Madara("WuxiaWorld", "https://wuxiaworld.site/", "en") {
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = super.searchMangaRequest(page, "$query comics", filters)
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = super.searchMangaRequest(page, "$query comics", filters)
|
||||||
override fun popularMangaNextPageSelector() = "div.nav-previous.float-left"
|
override fun popularMangaNextPageSelector() = "div.nav-previous.float-left"
|
||||||
}
|
}
|
||||||
|
|
||||||
class WordRain : Madara("WordRain Translation", "https://wordrain69.com", "en") {
|
class WordRain : Madara("WordRain Translation", "https://wordrain69.com", "en") {
|
||||||
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga-genre/manga/page/$page/?m_orderby=views", headers)
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga-genre/manga/page/$page/?m_orderby=views", headers)
|
||||||
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga-genre/manga/page/$page/?m_orderby=latest", headers)
|
override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga-genre/manga/page/$page/?m_orderby=latest", headers)
|
||||||
|
@ -167,24 +182,31 @@ class WordRain : Madara("WordRain Translation", "https://wordrain69.com", "en")
|
||||||
return super.searchMangaParse(res)
|
return super.searchMangaParse(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class YoManga : Madara("Yo Manga", "https://yomanga.info/", "en") {
|
class YoManga : Madara("Yo Manga", "https://yomanga.info/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ManyToon : Madara("ManyToon", "https://manytoon.com/", "en") {
|
class ManyToon : Madara("ManyToon", "https://manytoon.com/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ChibiManga : Madara("Chibi Manga", "http://www.cmreader.info/", "en") {
|
class ChibiManga : Madara("Chibi Manga", "http://www.cmreader.info/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZinManga : Madara("Zin Translator", "https://zinmanga.com/", "en") {
|
class ZinManga : Madara("Zin Translator", "https://zinmanga.com/", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ManwahentaiMe : Madara("Manwahentai.me", "https://manhwahentai.me", "en")
|
class ManwahentaiMe : Madara("Manwahentai.me", "https://manhwahentai.me", "en")
|
||||||
|
|
||||||
class Manga3asq : Madara("مانجا العاشق", "https://3asq.org", "ar") {
|
class Manga3asq : Madara("مانجا العاشق", "https://3asq.org", "ar") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class NManhwa : Madara("N Manhwa", "https://nmanhwa.com", "en") {
|
class NManhwa : Madara("N Manhwa", "https://nmanhwa.com", "en") {
|
||||||
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
override fun searchMangaNextPageSelector() = "nav.navigation-ajax"
|
||||||
}
|
}
|
||||||
|
|
||||||
class Indiancomicsonline : Madara("Indian Comics Online", "http://www.indiancomicsonline.com", "hi")
|
class Indiancomicsonline : Madara("Indian Comics Online", "http://www.indiancomicsonline.com", "hi")
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: MangaCards (Valhalla, NANI?)'
|
appName = 'Tachiyomi: MangaCards (Valhalla, NANI?)'
|
||||||
pkgNameSuffix = 'all.mangacards'
|
pkgNameSuffix = 'all.mangacards'
|
||||||
extClass = '.MangaCardsFactory'
|
extClass = '.MangaCardsFactory'
|
||||||
extVersionCode = 4
|
extVersionCode = 5
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,21 @@ package eu.kanade.tachiyomi.extension.all.mangacards
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.jsoup.nodes.Document
|
|
||||||
import org.jsoup.nodes.Element
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.FormBody
|
import okhttp3.FormBody
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
abstract class MangaCards(
|
abstract class MangaCards(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
|
|
|
@ -14,4 +14,3 @@ class MangaCardsFactory : SourceFactory {
|
||||||
class ValhallaScans : MangaCards("Valhalla Scans", "https://valhallascans.com", "en")
|
class ValhallaScans : MangaCards("Valhalla Scans", "https://valhallascans.com", "en")
|
||||||
class NaniScans : MangaCards("NANI? Scans", "https://naniscans.xyz", "en")
|
class NaniScans : MangaCards("NANI? Scans", "https://naniscans.xyz", "en")
|
||||||
class IneptBastards : MangaCards("Inept Bastards", "https://ineptbastards.xyz", "en")
|
class IneptBastards : MangaCards("Inept Bastards", "https://ineptbastards.xyz", "en")
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: MangaDex'
|
appName = 'Tachiyomi: MangaDex'
|
||||||
pkgNameSuffix = 'all.mangadex'
|
pkgNameSuffix = 'all.mangadex'
|
||||||
extClass = '.MangadexFactory'
|
extClass = '.MangadexFactory'
|
||||||
extVersionCode = 68
|
extVersionCode = 69
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,11 @@ import java.util.Date
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.collections.set
|
import kotlin.collections.set
|
||||||
|
|
||||||
open class Mangadex(override val lang: String, private val internalLang: String, private val langCode: Int) : ConfigurableSource, ParsedHttpSource() {
|
abstract class Mangadex(
|
||||||
|
override val lang: String,
|
||||||
|
private val internalLang: String,
|
||||||
|
private val langCode: Int
|
||||||
|
) : ConfigurableSource, ParsedHttpSource() {
|
||||||
|
|
||||||
override val name = "MangaDex"
|
override val name = "MangaDex"
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,83 @@ package eu.kanade.tachiyomi.extension.all.mangadex
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
|
|
||||||
|
|
||||||
class MangadexFactory : SourceFactory {
|
class MangadexFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = getAllMangaDexLanguages()
|
override fun createSources(): List<Source> = listOf(
|
||||||
|
MangaDexEnglish(),
|
||||||
|
MangaDexPolish(),
|
||||||
|
MangaDexItalian(),
|
||||||
|
MangaDexRussian(),
|
||||||
|
MangaDexGerman(),
|
||||||
|
MangaDexFrench(),
|
||||||
|
MangaDexVietnamese(),
|
||||||
|
MangaDexSpanishSpain(),
|
||||||
|
MangaDexSpanishLTAM(),
|
||||||
|
MangaDexCatalan(),
|
||||||
|
MangaDexPortuguesePortugal(),
|
||||||
|
MangaDexPortugueseBrazil(),
|
||||||
|
MangaDexSwedish(),
|
||||||
|
MangaDexTurkish(),
|
||||||
|
MangaDexIndonesian(),
|
||||||
|
MangaDexHungarian(),
|
||||||
|
MangaDexBulgarian(),
|
||||||
|
MangaDexFilipino(),
|
||||||
|
MangaDexDutch(),
|
||||||
|
MangaDexArabic(),
|
||||||
|
MangaDexChineseSimp(),
|
||||||
|
MangaDexChineseTrad(),
|
||||||
|
MangaDexThai(),
|
||||||
|
MangaDexBengali(),
|
||||||
|
MangaDexBurmese(),
|
||||||
|
MangaDexCzech(),
|
||||||
|
MangaDexDanish(),
|
||||||
|
MangaDexFinnish(),
|
||||||
|
MangaDexGreek(),
|
||||||
|
MangaDexJapanese(),
|
||||||
|
MangaDexKorean(),
|
||||||
|
MangaDexLithuanian(),
|
||||||
|
MangaDexMalay(),
|
||||||
|
MangaDexMongolian(),
|
||||||
|
MangaDexPersian(),
|
||||||
|
MangaDexRomanian(),
|
||||||
|
MangaDexSerboCroatian(),
|
||||||
|
MangaDexUkrainian()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MangaDexPolish : Mangadex("pl", "pl", 3)
|
||||||
|
class MangaDexItalian : Mangadex("it", "it", 6)
|
||||||
|
class MangaDexRussian : Mangadex("ru", "ru", 7)
|
||||||
|
class MangaDexGerman : Mangadex("de", "de", 8)
|
||||||
|
class MangaDexFrench : Mangadex("fr", "fr", 10)
|
||||||
|
class MangaDexVietnamese : Mangadex("vi", "vn", 12)
|
||||||
|
class MangaDexSpanishSpain : Mangadex("es", "es", 15)
|
||||||
|
class MangaDexSpanishLTAM : Mangadex("es-419", "mx", 29)
|
||||||
|
class MangaDexCatalan : Mangadex("ca", "ct", 33)
|
||||||
|
class MangaDexPortuguesePortugal : Mangadex("pt", "pt", 17)
|
||||||
|
class MangaDexPortugueseBrazil : Mangadex("pt-BR", "br", 16)
|
||||||
|
class MangaDexSwedish : Mangadex("sv", "se", 18)
|
||||||
|
class MangaDexTurkish : Mangadex("tr", "tr", 26)
|
||||||
|
class MangaDexIndonesian : Mangadex("id", "id", 27)
|
||||||
|
class MangaDexHungarian : Mangadex("hu", "hu", 9)
|
||||||
|
class MangaDexBulgarian : Mangadex("bg", "bg", 14)
|
||||||
|
class MangaDexFilipino : Mangadex("fil", "ph", 34)
|
||||||
|
class MangaDexDutch : Mangadex("nl", "nl", 5)
|
||||||
|
class MangaDexArabic : Mangadex("ar", "sa", 19)
|
||||||
|
class MangaDexChineseSimp : Mangadex("zh-Hans", "cn", 21)
|
||||||
|
class MangaDexChineseTrad : Mangadex("zh-Hant", "hk", 35)
|
||||||
|
class MangaDexThai : Mangadex("th", "th", 32)
|
||||||
|
class MangaDexBengali : Mangadex("bn", "bd", 22)
|
||||||
|
class MangaDexBurmese : Mangadex("my", "mm", 37)
|
||||||
|
class MangaDexCzech : Mangadex("cs", "cz", 24)
|
||||||
|
class MangaDexDanish : Mangadex("da", "dk", 20)
|
||||||
|
class MangaDexFinnish : Mangadex("fi", "fi", 11)
|
||||||
|
class MangaDexGreek : Mangadex("el", "gr", 13)
|
||||||
|
class MangaDexJapanese : Mangadex("ja", "jp", 2)
|
||||||
|
class MangaDexKorean : Mangadex("ko", "kr", 28)
|
||||||
|
class MangaDexLithuanian : Mangadex("lt", "lt", 38)
|
||||||
|
class MangaDexMalay : Mangadex("ms", "my", 31)
|
||||||
|
class MangaDexMongolian : Mangadex("mn", "mn", 25)
|
||||||
|
class MangaDexPersian : Mangadex("fa", "ir", 30)
|
||||||
|
class MangaDexRomanian : Mangadex("ro", "ro", 23)
|
||||||
|
class MangaDexSerboCroatian : Mangadex("sh", "rs", 4)
|
||||||
|
class MangaDexUkrainian : Mangadex("uk", "ua", 36)
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.mangadex
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mangadex languages
|
|
||||||
*/
|
|
||||||
|
|
||||||
class MangaDexPolish : Mangadex("pl", "pl", 3)
|
|
||||||
class MangaDexItalian : Mangadex("it", "it", 6)
|
|
||||||
class MangaDexRussian : Mangadex("ru", "ru", 7)
|
|
||||||
class MangaDexGerman : Mangadex("de", "de", 8)
|
|
||||||
class MangaDexFrench : Mangadex("fr", "fr", 10)
|
|
||||||
class MangaDexVietnamese : Mangadex("vi", "vn", 12)
|
|
||||||
class MangaDexSpanishSpain : Mangadex("es", "es", 15)
|
|
||||||
class MangaDexSpanishLTAM : Mangadex("es-419", "mx", 29)
|
|
||||||
class MangaDexCatalan : Mangadex("ca", "ct", 33)
|
|
||||||
class MangaDexPortuguesePortugal : Mangadex("pt", "pt", 17)
|
|
||||||
class MangaDexPortugueseBrazil : Mangadex("pt-BR", "br", 16)
|
|
||||||
class MangaDexSwedish : Mangadex("sv", "se", 18)
|
|
||||||
class MangaDexTurkish : Mangadex("tr", "tr", 26)
|
|
||||||
class MangaDexIndonesian : Mangadex("id", "id", 27)
|
|
||||||
class MangaDexHungarian : Mangadex("hu", "hu", 9)
|
|
||||||
class MangaDexBulgarian : Mangadex("bg", "bg", 14)
|
|
||||||
class MangaDexFilipino : Mangadex("fil", "ph", 34)
|
|
||||||
class MangaDexDutch : Mangadex("nl", "nl", 5)
|
|
||||||
class MangaDexArabic : Mangadex("ar", "sa", 19)
|
|
||||||
class MangaDexChineseSimp : Mangadex("zh-Hans", "cn", 21)
|
|
||||||
class MangaDexChineseTrad : Mangadex("zh-Hant", "hk", 35)
|
|
||||||
class MangaDexThai : Mangadex("th", "th", 32)
|
|
||||||
class MangaDexBengali : Mangadex("bn", "bd", 22)
|
|
||||||
class MangaDexBurmese : Mangadex("my", "mm", 37)
|
|
||||||
class MangaDexCzech : Mangadex("cs", "cz", 24)
|
|
||||||
class MangaDexDanish : Mangadex("da", "dk", 20)
|
|
||||||
class MangaDexFinnish : Mangadex("fi", "fi", 11)
|
|
||||||
class MangaDexGreek : Mangadex("el", "gr", 13)
|
|
||||||
class MangaDexJapanese : Mangadex("ja", "jp", 2)
|
|
||||||
class MangaDexKorean : Mangadex("ko", "kr", 28)
|
|
||||||
class MangaDexLithuanian : Mangadex("lt", "lt", 38)
|
|
||||||
class MangaDexMalay : Mangadex("ms", "my", 31)
|
|
||||||
class MangaDexMongolian : Mangadex("mn", "mn", 25)
|
|
||||||
class MangaDexPersian : Mangadex("fa", "ir", 30)
|
|
||||||
class MangaDexRomanian : Mangadex("ro", "ro", 23)
|
|
||||||
class MangaDexSerboCroatian : Mangadex("sh", "rs", 4)
|
|
||||||
class MangaDexUkrainian : Mangadex("uk", "ua", 36)
|
|
||||||
|
|
||||||
fun getAllMangaDexLanguages() = listOf(
|
|
||||||
MangaDexEnglish(),
|
|
||||||
MangaDexPolish(),
|
|
||||||
MangaDexItalian(),
|
|
||||||
MangaDexRussian(),
|
|
||||||
MangaDexGerman(),
|
|
||||||
MangaDexFrench(),
|
|
||||||
MangaDexVietnamese(),
|
|
||||||
MangaDexSpanishSpain(),
|
|
||||||
MangaDexSpanishLTAM(),
|
|
||||||
MangaDexCatalan(),
|
|
||||||
MangaDexPortuguesePortugal(),
|
|
||||||
MangaDexPortugueseBrazil(),
|
|
||||||
MangaDexSwedish(),
|
|
||||||
MangaDexTurkish(),
|
|
||||||
MangaDexIndonesian(),
|
|
||||||
MangaDexHungarian(),
|
|
||||||
MangaDexBulgarian(),
|
|
||||||
MangaDexFilipino(),
|
|
||||||
MangaDexDutch(),
|
|
||||||
MangaDexArabic(),
|
|
||||||
MangaDexChineseSimp(),
|
|
||||||
MangaDexChineseTrad(),
|
|
||||||
MangaDexThai(),
|
|
||||||
MangaDexBengali(),
|
|
||||||
MangaDexBurmese(),
|
|
||||||
MangaDexCzech(),
|
|
||||||
MangaDexDanish(),
|
|
||||||
MangaDexFinnish(),
|
|
||||||
MangaDexGreek(),
|
|
||||||
MangaDexJapanese(),
|
|
||||||
MangaDexKorean(),
|
|
||||||
MangaDexLithuanian(),
|
|
||||||
MangaDexMalay(),
|
|
||||||
MangaDexMongolian(),
|
|
||||||
MangaDexPersian(),
|
|
||||||
MangaDexRomanian(),
|
|
||||||
MangaDexSerboCroatian(),
|
|
||||||
MangaDexUkrainian()
|
|
||||||
)
|
|
|
@ -5,6 +5,7 @@ import android.content.ActivityNotFoundException
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Springboard that accepts https://mangadex.com/title/xxx intents and redirects them to
|
* Springboard that accepts https://mangadex.com/title/xxx intents and redirects them to
|
||||||
|
@ -38,7 +39,7 @@ class MangadexUrlActivity : Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
finish()
|
finish()
|
||||||
System.exit(0)
|
exitProcess(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: MangAdventure'
|
appName = 'Tachiyomi: MangAdventure'
|
||||||
pkgNameSuffix = 'all.mangadventure'
|
pkgNameSuffix = 'all.mangadventure'
|
||||||
extClass = '.MangAdventureFactory'
|
extClass = '.MangAdventureFactory'
|
||||||
extVersionCode = 3
|
extVersionCode = 4
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ import java.util.Locale
|
||||||
*
|
*
|
||||||
* @property categories the available manga categories of the site.
|
* @property categories the available manga categories of the site.
|
||||||
*/
|
*/
|
||||||
open class MangAdventure(
|
abstract class MangAdventure(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val baseUrl: String,
|
override val baseUrl: String,
|
||||||
val categories: Array<String> = DEFAULT_CATEGORIES
|
val categories: Array<String> = DEFAULT_CATEGORIES
|
||||||
|
|
|
@ -31,7 +31,7 @@ class MangAdventureActivity : Activity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun logInvalidIntent(intent: Intent) {
|
private fun logInvalidIntent(intent: Intent) {
|
||||||
val msg = "Failed to parse URI from intent"
|
Log.e("MangAdventureActivity", "Failed to parse URI from intent: $intent")
|
||||||
Log.e("MangAdventureActivity", "$msg $intent")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.extension.all.mangadventure
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
|
|
||||||
/** [MangAdventure] source factory. */
|
|
||||||
class MangAdventureFactory : SourceFactory {
|
class MangAdventureFactory : SourceFactory {
|
||||||
override fun createSources() = listOf(
|
override fun createSources() = listOf(
|
||||||
ArcRelight()
|
ArcRelight()
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: Mangatensei'
|
appName = 'Tachiyomi: Mangatensei'
|
||||||
pkgNameSuffix = 'all.mangatensei'
|
pkgNameSuffix = 'all.mangatensei'
|
||||||
extClass = '.MangatenseiFactory'
|
extClass = '.MangatenseiFactory'
|
||||||
extVersionCode = 2
|
extVersionCode = 3
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.mangatensei
|
package eu.kanade.tachiyomi.extension.all.mangatensei
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.*
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
|
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 eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import okhttp3.HttpUrl
|
import okhttp3.HttpUrl
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
@ -9,7 +13,7 @@ import okhttp3.Request
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import java.util.*
|
import java.util.Calendar
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
open class Mangatensei(override val lang: String, private val Mtlang: String) : ParsedHttpSource() {
|
open class Mangatensei(override val lang: String, private val Mtlang: String) : ParsedHttpSource() {
|
||||||
|
|
|
@ -3,7 +3,54 @@ package eu.kanade.tachiyomi.extension.all.mangatensei
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.SourceFactory
|
import eu.kanade.tachiyomi.source.SourceFactory
|
||||||
|
|
||||||
|
|
||||||
class MangatenseiFactory : SourceFactory {
|
class MangatenseiFactory : SourceFactory {
|
||||||
override fun createSources(): List<Source> = getAllMangatenseiLanguages()
|
override fun createSources(): List<Source> = listOf(
|
||||||
|
MangatenseiArabic(),
|
||||||
|
MangatenseiBrazilian(),
|
||||||
|
MangatenseiCzech(),
|
||||||
|
MangatenseiDanish(),
|
||||||
|
MangatenseiDutch(),
|
||||||
|
MangatenseiEnglish(),
|
||||||
|
MangatenseiFilipino(),
|
||||||
|
MangatenseiFrench(),
|
||||||
|
MangatenseiGerman(),
|
||||||
|
MangatenseiGreek(),
|
||||||
|
MangatenseiHebrew(),
|
||||||
|
MangatenseiHungarian(),
|
||||||
|
MangatenseiIndonesian(),
|
||||||
|
MangatenseiItalian(),
|
||||||
|
MangatenseiMalay(),
|
||||||
|
MangatenseiPolish(),
|
||||||
|
MangatenseiPortuguese(),
|
||||||
|
MangatenseiRomanian(),
|
||||||
|
MangatenseiRussian(),
|
||||||
|
MangatenseiSpanish(),
|
||||||
|
MangatenseiThai(),
|
||||||
|
MangatenseiTurkish(),
|
||||||
|
MangatenseiVietnamese()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class MangatenseiArabic : Mangatensei("ar", "arabic")
|
||||||
|
class MangatenseiBrazilian : Mangatensei("pt-BR", "brazilian")
|
||||||
|
class MangatenseiCzech : Mangatensei("cs", "czech")
|
||||||
|
class MangatenseiDanish : Mangatensei("da", "danish")
|
||||||
|
class MangatenseiDutch : Mangatensei("nl", "dutch")
|
||||||
|
class MangatenseiEnglish : Mangatensei("en", "english")
|
||||||
|
class MangatenseiFilipino : Mangatensei("fil", "filipino")
|
||||||
|
class MangatenseiFrench : Mangatensei("fr", "french")
|
||||||
|
class MangatenseiGerman : Mangatensei("de", "german")
|
||||||
|
class MangatenseiGreek : Mangatensei("el", "greek")
|
||||||
|
class MangatenseiHebrew : Mangatensei("iw", "hebrew")
|
||||||
|
class MangatenseiHungarian : Mangatensei("hu", "hungarian")
|
||||||
|
class MangatenseiIndonesian : Mangatensei("id", "indonesian")
|
||||||
|
class MangatenseiItalian : Mangatensei("it", "italian")
|
||||||
|
class MangatenseiMalay : Mangatensei("ms", "malay")
|
||||||
|
class MangatenseiPolish : Mangatensei("pl", "polish")
|
||||||
|
class MangatenseiPortuguese : Mangatensei("pt", "portuguese")
|
||||||
|
class MangatenseiRomanian : Mangatensei("ro", "romanian")
|
||||||
|
class MangatenseiRussian : Mangatensei("ru", "russian")
|
||||||
|
class MangatenseiSpanish : Mangatensei("es", "spanish")
|
||||||
|
class MangatenseiThai : Mangatensei("th", "thai")
|
||||||
|
class MangatenseiTurkish : Mangatensei("tr", "turkish")
|
||||||
|
class MangatenseiVietnamese : Mangatensei("vi", "vietnamese")
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.extension.all.mangatensei
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mangatensei languages
|
|
||||||
*/
|
|
||||||
|
|
||||||
class MangatenseiArabic : Mangatensei("ar", "arabic")
|
|
||||||
class MangatenseiBrazilian : Mangatensei("pt-BR", "brazilian")
|
|
||||||
class MangatenseiCzech : Mangatensei("cs", "czech")
|
|
||||||
class MangatenseiDanish : Mangatensei("da", "danish")
|
|
||||||
class MangatenseiDutch : Mangatensei("nl", "dutch")
|
|
||||||
class MangatenseiEnglish : Mangatensei("en", "english")
|
|
||||||
class MangatenseiFilipino : Mangatensei("fil", "filipino")
|
|
||||||
class MangatenseiFrench : Mangatensei("fr", "french")
|
|
||||||
class MangatenseiGerman : Mangatensei("de", "german")
|
|
||||||
class MangatenseiGreek : Mangatensei("el", "greek")
|
|
||||||
class MangatenseiHebrew : Mangatensei("iw", "hebrew")
|
|
||||||
class MangatenseiHungarian : Mangatensei("hu", "hungarian")
|
|
||||||
class MangatenseiIndonesian : Mangatensei("id", "indonesian")
|
|
||||||
class MangatenseiItalian : Mangatensei("it", "italian")
|
|
||||||
class MangatenseiMalay : Mangatensei("ms", "malay")
|
|
||||||
class MangatenseiPolish : Mangatensei("pl", "polish")
|
|
||||||
class MangatenseiPortuguese : Mangatensei("pt", "portuguese")
|
|
||||||
class MangatenseiRomanian : Mangatensei("ro", "romanian")
|
|
||||||
class MangatenseiRussian : Mangatensei("ru", "russian")
|
|
||||||
class MangatenseiSpanish : Mangatensei("es", "spanish")
|
|
||||||
class MangatenseiThai : Mangatensei("th", "thai")
|
|
||||||
class MangatenseiTurkish : Mangatensei("tr", "turkish")
|
|
||||||
class MangatenseiVietnamese : Mangatensei("vi", "vietnamese")
|
|
||||||
|
|
||||||
fun getAllMangatenseiLanguages() = listOf(
|
|
||||||
MangatenseiArabic(),
|
|
||||||
MangatenseiBrazilian(),
|
|
||||||
MangatenseiCzech(),
|
|
||||||
MangatenseiDanish(),
|
|
||||||
MangatenseiDutch(),
|
|
||||||
MangatenseiEnglish(),
|
|
||||||
MangatenseiFilipino(),
|
|
||||||
MangatenseiFrench(),
|
|
||||||
MangatenseiGerman(),
|
|
||||||
MangatenseiGreek(),
|
|
||||||
MangatenseiHebrew(),
|
|
||||||
MangatenseiHungarian(),
|
|
||||||
MangatenseiIndonesian(),
|
|
||||||
MangatenseiItalian(),
|
|
||||||
MangatenseiMalay(),
|
|
||||||
MangatenseiPolish(),
|
|
||||||
MangatenseiPortuguese(),
|
|
||||||
MangatenseiRomanian(),
|
|
||||||
MangatenseiRussian(),
|
|
||||||
MangatenseiSpanish(),
|
|
||||||
MangatenseiThai(),
|
|
||||||
MangatenseiTurkish(),
|
|
||||||
MangatenseiVietnamese()
|
|
||||||
)
|
|
Loading…
Reference in New Issue