diff --git a/src/fr/lirescan/build.gradle b/src/fr/lirescan/build.gradle new file mode 100644 index 000000000..a993b270e --- /dev/null +++ b/src/fr/lirescan/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: LireScan' + pkgNameSuffix = 'fr.lirescan' + extClass = '.LireScan' + extVersionCode = 1 + libVersion = '1.2' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/fr/lirescan/res/mipmap-hdpi/ic_launcher.png b/src/fr/lirescan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..dec26b74d Binary files /dev/null and b/src/fr/lirescan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/fr/lirescan/res/mipmap-mdpi/ic_launcher.png b/src/fr/lirescan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..fd180aa9f Binary files /dev/null and b/src/fr/lirescan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/fr/lirescan/res/mipmap-xhdpi/ic_launcher.png b/src/fr/lirescan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..45cd995a8 Binary files /dev/null and b/src/fr/lirescan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/fr/lirescan/res/mipmap-xxhdpi/ic_launcher.png b/src/fr/lirescan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6d663182e Binary files /dev/null and b/src/fr/lirescan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/fr/lirescan/res/mipmap-xxxhdpi/ic_launcher.png b/src/fr/lirescan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..10ca1630a Binary files /dev/null and b/src/fr/lirescan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/fr/lirescan/res/web_hi_res_512.png b/src/fr/lirescan/res/web_hi_res_512.png new file mode 100644 index 000000000..e3d15553c Binary files /dev/null and b/src/fr/lirescan/res/web_hi_res_512.png differ diff --git a/src/fr/lirescan/src/eu/kanade/tachiyomi/extension/fr/lirescan/LireScan.kt b/src/fr/lirescan/src/eu/kanade/tachiyomi/extension/fr/lirescan/LireScan.kt new file mode 100644 index 000000000..7c4278d85 --- /dev/null +++ b/src/fr/lirescan/src/eu/kanade/tachiyomi/extension/fr/lirescan/LireScan.kt @@ -0,0 +1,126 @@ +package eu.kanade.tachiyomi.extension.fr.lirescan + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.model.* +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class LireScan : ParsedHttpSource() { + + override val name = "LireScan" + + override val baseUrl = "https://www.lirescan.me" + + override val lang = "fr" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient + + // Popular + + // There's no proper directory, get list of manga from dropdown menu available from a manga's page + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl/090-eko-to-issho-lecture-en-ligne/", headers) + } + + override fun popularMangaSelector() = "div.form-group select option" + + override fun popularMangaFromElement(element: Element): SManga { + return SManga.create().apply { + title = element.text() + url = element.attr("value") + } + } + + override fun popularMangaNextPageSelector(): String? = null + + // Latest + + override fun latestUpdatesRequest(page: Int): Request { + return GET(baseUrl, headers) + } + + override fun latestUpdatesSelector() = "ul#releases > h4" + + override fun latestUpdatesFromElement(element: Element): SManga { + return SManga.create().apply { + title = element.text() + url = element.nextElementSibling().select("a").first().attr("href") + .removeSuffix("/").dropLastWhile { it.isDigit() } + } + } + + override fun latestUpdatesNextPageSelector(): String? = null + + // Search + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response, query) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + return popularMangaRequest(1) + } + + private fun searchMangaParse(response: Response, query: String): MangasPage { + val mangas = response.asJsoup().select(popularMangaSelector()).filter { it.text().contains(query, ignoreCase = true) } + .map { searchMangaFromElement(it) } + + return MangasPage(mangas, false) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + + override fun searchMangaNextPageSelector(): String? = null + + // Details + + override fun mangaDetailsParse(document: Document): SManga { + return SManga.create().apply { + thumbnail_url = document.select("a#imglink img").attr("abs:src") + } + } + + // Chapters + + override fun chapterListSelector() = "select#chapitres option" + + override fun chapterFromElement(element: Element): SChapter { + return SChapter.create().apply { + element.text().let { chNum -> + name = "Chapter $chNum" + setUrlWithoutDomain("${element.ownerDocument().location()}$chNum/") + } + } + } + + // Pages + + override fun pageListParse(document: Document): List { + val lastPage = document.select("ul.pagination li.page-item:contains(Suiv)").first() + .previousElementSibling().text().toInt() + + return IntRange(1, lastPage).map { num -> Page(num - 1, document.location() + num) } + } + + override fun imageUrlParse(document: Document): String { + return document.select("a#imglink img").attr("abs:src") + } + + override fun getFilterList() = FilterList() + +}