From 5d9c817461f9bb2be871bc4b2c4763fcc31619d1 Mon Sep 17 00:00:00 2001 From: Naji Astier Date: Mon, 23 May 2016 16:09:17 -0700 Subject: [PATCH] Implement ReadMangaToday with the new source --- .../tachiyomi/data/source/SourceManager.kt | 10 +- .../source/online/english/Readmangatoday.kt | 127 ++++++++++++++++++ 2 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/source/online/english/Readmangatoday.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt index 1d243d7dde..6802c72ef5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt @@ -6,13 +6,8 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.source.base.OnlineSource import eu.kanade.tachiyomi.data.source.base.Source import eu.kanade.tachiyomi.data.source.base.YamlOnlineSource -import eu.kanade.tachiyomi.data.source.online.english.Batoto -import eu.kanade.tachiyomi.data.source.online.english.Kissmanga -import eu.kanade.tachiyomi.data.source.online.english.Mangafox -import eu.kanade.tachiyomi.data.source.online.english.Mangahere -import eu.kanade.tachiyomi.data.source.online.russian.Mangachan -import eu.kanade.tachiyomi.data.source.online.russian.Mintmanga -import eu.kanade.tachiyomi.data.source.online.russian.Readmanga +import eu.kanade.tachiyomi.data.source.online.english.* +import eu.kanade.tachiyomi.data.source.online.russian.* import org.yaml.snakeyaml.Yaml import timber.log.Timber import java.io.File @@ -46,6 +41,7 @@ open class SourceManager(private val context: Context) { READMANGA -> Readmanga(context, id) MINTMANGA -> Mintmanga(context, id) MANGACHAN -> Mangachan(context, id) + READMANGATODAY -> Readmangatoday(context, id) else -> null } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/english/Readmangatoday.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/english/Readmangatoday.kt new file mode 100644 index 0000000000..b278b1c140 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/english/Readmangatoday.kt @@ -0,0 +1,127 @@ +package eu.kanade.tachiyomi.data.source.online.english + +import android.content.Context +import eu.kanade.tachiyomi.data.database.models.Chapter +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.network.post +import eu.kanade.tachiyomi.data.source.EN +import eu.kanade.tachiyomi.data.source.Language +import eu.kanade.tachiyomi.data.source.base.ParsedOnlineSource +import eu.kanade.tachiyomi.data.source.model.MangasPage +import eu.kanade.tachiyomi.data.source.model.Page +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.util.* + +class Readmangatoday(context: Context, override val id: Int) : ParsedOnlineSource(context) { + + override val name = "ReadMangaToday" + + override val baseUrl = "http://www.readmanga.today" + + override val lang: Language get() = EN + + override fun popularMangaInitialUrl() = "$baseUrl/hot-manga/" + + override fun popularMangaSelector() = "div.hot-manga > div.style-list > div.box" + + override fun popularMangaFromElement(element: Element, manga: Manga) { + element.select("div.title > h2 > a").first().let { + manga.setUrl(it.attr("href")) + manga.title = it.attr("title") + } + } + + override fun popularMangaNextPageSelector() = "div.hot-manga > ul.pagination > li > a:contains(ยป)" + + override fun searchMangaInitialUrl(query: String) = + "$baseUrl/search" + + + override fun searchMangaRequest(page: MangasPage, query: String): Request { + if (page.page == 1) { + page.url = searchMangaInitialUrl(query) + } + + var builder = okhttp3.FormBody.Builder() + builder.add("query", query) + + return post(page.url, headers, builder.build()) + } + + override fun searchMangaSelector() = "div.content-list > div.style-list > div.box" + + override fun searchMangaFromElement(element: Element, manga: Manga) { + element.select("div.title > h2 > a").first().let { + manga.setUrl(it.attr("href")) + manga.title = it.attr("title") + } + } + + override fun searchMangaNextPageSelector() = "div.next-page > a.next" + + override fun mangaDetailsParse(document: Document, manga: Manga) { + val detailElement = document.select("div.movie-meta").first() + + manga.author = document.select("ul.cast-list li.director > ul a").first()?.text() + manga.artist = document.select("ul.cast-list li:not(.director) > ul a").first()?.text() + manga.genre = detailElement.select("dl.dl-horizontal > dd:eq(5)").first()?.text() + manga.description = detailElement.select("li.movie-detail").first()?.text() + manga.status = detailElement.select("dl.dl-horizontal > dd:eq(3)").first()?.text().orEmpty().let { parseStatus(it) } + manga.thumbnail_url = detailElement.select("img.img-responsive").first()?.attr("src") + } + + private fun parseStatus(status: String) = when { + status.contains("Ongoing") -> Manga.ONGOING + status.contains("Completed") -> Manga.COMPLETED + else -> Manga.UNKNOWN + } + + override fun chapterListSelector() = "ul.chp_lst > li" + + override fun chapterFromElement(element: Element, chapter: Chapter) { + val urlElement = element.select("a").first() + + chapter.setUrl(urlElement.attr("href")) + chapter.name = urlElement.select("span.val").text() + chapter.date_upload = element.select("span.dte").first()?.text()?.let { parseChapterDate(it) } ?: 0 + } + + private fun parseChapterDate(date: String): Long { + val dateWords : List = date.split(" ") + + if (dateWords.size == 3) { + val timeAgo = Integer.parseInt(dateWords[0]) + var date : Calendar = Calendar.getInstance() + + if (dateWords[1].contains("Minute")) { + date.add(Calendar.MINUTE, - timeAgo) + } else if (dateWords[1].contains("Hour")) { + date.add(Calendar.HOUR_OF_DAY, - timeAgo) + } else if (dateWords[1].contains("Day")) { + date.add(Calendar.DAY_OF_YEAR, -timeAgo) + } else if (dateWords[1].contains("Week")) { + date.add(Calendar.WEEK_OF_YEAR, -timeAgo) + } else if (dateWords[1].contains("Month")) { + date.add(Calendar.MONTH, -timeAgo) + } else if (dateWords[1].contains("Year")) { + date.add(Calendar.YEAR, -timeAgo) + } + + return date.getTimeInMillis() + } + + return 0L + } + + override fun pageListParse(document: Document, pages: MutableList) { + document.select("ul.list-switcher-2 > li > select.jump-menu").first().getElementsByTag("option").forEach { + pages.add(Page(pages.size, it.attr("value"))) + } + pages.getOrNull(0)?.imageUrl = imageUrlParse(document) + } + + override fun imageUrlParse(document: Document) = document.select("img.img-responsive-2").first().attr("src") + +} \ No newline at end of file