diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/OnlineSource.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/OnlineSource.kt index 459859908e..18cc1c17da 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/OnlineSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/OnlineSource.kt @@ -54,7 +54,7 @@ abstract class OnlineSource(context: Context) : Source { abstract val lang: Language /** - * If the Source has Support for Latest Updates + * Whether the source has support for latest updates. */ abstract val supportsLatest : Boolean @@ -101,17 +101,6 @@ abstract class OnlineSource(context: Context) : Source { page } - /** - * Returns an observable containing a page with a list of latest manga. - */ - open fun fetchLatestUpdates(page: MangasPage): Observable = client - .newCall(latestUpdatesRequest(page)) - .asObservable() - .map { response -> - latestUpdatesParse(response, page) - page - } - /** * Returns the request for the popular manga given the page. Override only if it's needed to * send different headers or request method like POST. @@ -125,26 +114,11 @@ abstract class OnlineSource(context: Context) : Source { return GET(page.url, headers) } - /** - * Returns the request for latest manga given the page. - */ - open protected fun latestUpdatesRequest(page: MangasPage): Request { - if (page.page == 1) { - page.url = latestUpdatesInitialUrl() - } - return GET(page.url, headers) - } - /** * Returns the absolute url of the first page to popular manga. */ abstract protected fun popularMangaInitialUrl(): String - /** - * Returns the absolute url of the first page to latest manga. - */ - abstract protected fun latestUpdatesInitialUrl(): String - /** * Parse the response from the site. It should add a list of manga and the absolute url to the * next page (if it has a next one) to [page]. @@ -154,11 +128,6 @@ abstract class OnlineSource(context: Context) : Source { */ abstract protected fun popularMangaParse(response: Response, page: MangasPage) - /** - * Same as [popularMangaParse], but for latest manga. - */ - abstract protected fun latestUpdatesParse(response: Response, page: MangasPage) - /** * Returns an observable containing a page with a list of manga. Normally it's not needed to * override this method. @@ -206,6 +175,37 @@ abstract class OnlineSource(context: Context) : Source { */ abstract protected fun searchMangaParse(response: Response, page: MangasPage, query: String, filters: List) + /** + * Returns an observable containing a page with a list of latest manga. + */ + open fun fetchLatestUpdates(page: MangasPage): Observable = client + .newCall(latestUpdatesRequest(page)) + .asObservable() + .map { response -> + latestUpdatesParse(response, page) + page + } + + /** + * Returns the request for latest manga given the page. + */ + open protected fun latestUpdatesRequest(page: MangasPage): Request { + if (page.page == 1) { + page.url = latestUpdatesInitialUrl() + } + return GET(page.url, headers) + } + + /** + * Returns the absolute url of the first page to latest manga. + */ + abstract protected fun latestUpdatesInitialUrl(): String + + /** + * Same as [popularMangaParse], but for latest manga. + */ + abstract protected fun latestUpdatesParse(response: Response, page: MangasPage) + /** * Returns an observable with the updated details for a manga. Normally it's not needed to * override this method. diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/ParsedOnlineSource.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/ParsedOnlineSource.kt index 5d10d77841..172d7bea41 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/ParsedOnlineSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/ParsedOnlineSource.kt @@ -37,33 +37,11 @@ abstract class ParsedOnlineSource(context: Context) : OnlineSource(context) { } } - /** - * Parse the response from the site for latest updates and fills [page]. - */ - override fun latestUpdatesParse(response: Response, page: MangasPage) { - val document = response.asJsoup() - for (element in document.select(latestUpdatesSelector())) { - Manga.create(id).apply { - latestUpdatesFromElement(element, this) - page.mangas.add(this) - } - } - - latestUpdatesNextPageSelector()?.let { selector -> - page.nextPageUrl = document.select(selector).first()?.absUrl("href") - } - } - /** * Returns the Jsoup selector that returns a list of [Element] corresponding to each manga. */ abstract protected fun popularMangaSelector(): String - /** - * Returns the Jsoup selector similar to [popularMangaSelector], but for latest updates. - */ - abstract protected fun latestUpdatesSelector(): String - /** * Fills [manga] with the given [element]. Most sites only show the title and the url, it's * totally safe to fill only those two values. @@ -73,22 +51,12 @@ abstract class ParsedOnlineSource(context: Context) : OnlineSource(context) { */ abstract protected fun popularMangaFromElement(element: Element, manga: Manga) - /** - * Fills [manga] with the given [element]. For latest updates. - */ - abstract protected fun latestUpdatesFromElement(element: Element, manga: Manga) - /** * Returns the Jsoup selector that returns the tag linking to the next page, or null if * there's no next page. */ abstract protected fun popularMangaNextPageSelector(): String? - /** - * Returns the Jsoup selector that returns the tag, like [popularMangaNextPageSelector]. - */ - abstract protected fun latestUpdatesNextPageSelector(): String? - /** * Parse the response from the site and fills [page]. * @@ -130,6 +98,38 @@ abstract class ParsedOnlineSource(context: Context) : OnlineSource(context) { */ abstract protected fun searchMangaNextPageSelector(): String? + /** + * Parse the response from the site for latest updates and fills [page]. + */ + override fun latestUpdatesParse(response: Response, page: MangasPage) { + val document = response.asJsoup() + for (element in document.select(latestUpdatesSelector())) { + Manga.create(id).apply { + latestUpdatesFromElement(element, this) + page.mangas.add(this) + } + } + + latestUpdatesNextPageSelector()?.let { selector -> + page.nextPageUrl = document.select(selector).first()?.absUrl("href") + } + } + + /** + * Returns the Jsoup selector similar to [popularMangaSelector], but for latest updates. + */ + abstract protected fun latestUpdatesSelector(): String + + /** + * Fills [manga] with the given [element]. For latest updates. + */ + abstract protected fun latestUpdatesFromElement(element: Element, manga: Manga) + + /** + * Returns the Jsoup selector that returns the tag, like [popularMangaNextPageSelector]. + */ + abstract protected fun latestUpdatesNextPageSelector(): String? + /** * Parse the response from the site and fills the details of [manga]. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSource.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSource.kt index 75edc7d8d0..ea4cb7a8d0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSource.kt @@ -5,7 +5,6 @@ import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.network.GET import eu.kanade.tachiyomi.data.network.POST -import eu.kanade.tachiyomi.data.source.Source import eu.kanade.tachiyomi.data.source.getLanguages import eu.kanade.tachiyomi.data.source.model.MangasPage import eu.kanade.tachiyomi.data.source.model.Page @@ -15,7 +14,6 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.Jsoup import org.jsoup.nodes.Element -import rx.Observable import java.text.SimpleDateFormat import java.util.* @@ -34,7 +32,7 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con getLanguages().find { code == it.code }!! } - override val supportsLatest = map.supportsLatest.toBoolean() + override val supportsLatest = map.latestupdates != null override val client = when(map.client) { "cloudflare" -> network.cloudflareClient @@ -55,20 +53,8 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con } } - override fun latestUpdatesRequest(page: MangasPage): Request { - if (page.page == 1) { - page.url = latestUpdatesInitialUrl() - } - return when (map.latestupdates.method?.toLowerCase()) { - "post" -> POST(page.url, headers, map.latestupdates.createForm()) - else -> GET(page.url, headers) - } - } - override fun popularMangaInitialUrl() = map.popular.url - override fun latestUpdatesInitialUrl() = map.latestupdates.url - override fun popularMangaParse(response: Response, page: MangasPage) { val document = response.asJsoup() for (element in document.select(map.popular.manga_css)) { @@ -84,21 +70,6 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con } } - override fun latestUpdatesParse(response: Response, page: MangasPage) { - val document = response.asJsoup() - for (element in document.select(map.latestupdates.manga_css)) { - Manga.create(id).apply { - title = element.text() - setUrlWithoutDomain(element.attr("href")) - page.mangas.add(this) - } - } - - map.popular.next_url_css?.let { selector -> - page.nextPageUrl = document.select(selector).first()?.absUrl("href") - } - } - override fun searchMangaRequest(page: MangasPage, query: String, filters: List): Request { if (page.page == 1) { page.url = searchMangaInitialUrl(query, filters) @@ -126,6 +97,33 @@ class YamlOnlineSource(context: Context, mappings: Map<*, *>) : OnlineSource(con } } + override fun latestUpdatesRequest(page: MangasPage): Request { + if (page.page == 1) { + page.url = latestUpdatesInitialUrl() + } + return when (map.latestupdates!!.method?.toLowerCase()) { + "post" -> POST(page.url, headers, map.latestupdates.createForm()) + else -> GET(page.url, headers) + } + } + + override fun latestUpdatesInitialUrl() = map.latestupdates!!.url + + override fun latestUpdatesParse(response: Response, page: MangasPage) { + val document = response.asJsoup() + for (element in document.select(map.latestupdates!!.manga_css)) { + Manga.create(id).apply { + title = element.text() + setUrlWithoutDomain(element.attr("href")) + page.mangas.add(this) + } + } + + map.latestupdates.next_url_css?.let { selector -> + page.nextPageUrl = document.select(selector).first()?.absUrl("href") + } + } + override fun mangaDetailsParse(response: Response, manga: Manga) { val document = response.asJsoup() with(map.manga) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSourceMappings.kt b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSourceMappings.kt index 689e6180ad..e4b6434818 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSourceMappings.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/source/online/YamlOnlineSourceMappings.kt @@ -25,14 +25,12 @@ class YamlSourceNode(uncheckedMap: Map<*, *>) { val lang: String by map - val supportsLatest: String by map - val client: String? get() = map["client"] as? String val popular = PopularNode(toMap(map["popular"])!!) - val latestupdates = LatestUpdatesNode(toMap(map["latest_updates"])!!) + val latestupdates = toMap(map["latest_updates"])?.let { LatestUpdatesNode(it) } val search = SearchNode(toMap(map["search"])!!) diff --git a/app/src/main/res/drawable-anydpi/ic_watch_later.xml b/app/src/main/res/drawable/ic_watch_later_black_24dp.xml similarity index 97% rename from app/src/main/res/drawable-anydpi/ic_watch_later.xml rename to app/src/main/res/drawable/ic_watch_later_black_24dp.xml index e9f85c873b..6032098bd2 100644 --- a/app/src/main/res/drawable-anydpi/ic_watch_later.xml +++ b/app/src/main/res/drawable/ic_watch_later_black_24dp.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/app/src/main/res/menu/menu_navigation.xml b/app/src/main/res/menu/menu_navigation.xml index 353d51461b..a461a5f36a 100644 --- a/app/src/main/res/menu/menu_navigation.xml +++ b/app/src/main/res/menu/menu_navigation.xml @@ -21,7 +21,7 @@ android:title="@string/label_catalogues" />