mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Reader fixes and minor changes
This commit is contained in:
		@@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.data.source.model.MangasPage
 | 
			
		||||
import eu.kanade.tachiyomi.data.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.data.source.online.LoginSource
 | 
			
		||||
import eu.kanade.tachiyomi.data.source.online.ParsedOnlineSource
 | 
			
		||||
import eu.kanade.tachiyomi.util.selectText
 | 
			
		||||
import okhttp3.FormBody
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
@@ -51,30 +52,13 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
 | 
			
		||||
    override fun headersBuilder() = super.headersBuilder()
 | 
			
		||||
            .add("Cookie", "lang_option=English")
 | 
			
		||||
 | 
			
		||||
    private val pageHeaders = super.headersBuilder()
 | 
			
		||||
            .add("Referer", "http://bato.to/reader")
 | 
			
		||||
            .build()
 | 
			
		||||
 | 
			
		||||
    override fun popularMangaInitialUrl() = "$baseUrl/search_ajax?order_cond=views&order=desc&p=1"
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaInitialUrl(query: String) = "$baseUrl/search_ajax?name=${Uri.encode(query)}&p=1"
 | 
			
		||||
 | 
			
		||||
    override fun mangaDetailsRequest(manga: Manga): Request {
 | 
			
		||||
        val mangaId = manga.url.substringAfterLast("r")
 | 
			
		||||
        return GET("$baseUrl/comic_pop?id=$mangaId", headers)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun pageListRequest(chapter: Chapter): Request {
 | 
			
		||||
        val id = chapter.url.substringAfterLast("#")
 | 
			
		||||
        return GET("$baseUrl/areader?id=$id&p=1", headers)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun imageUrlRequest(page: Page): Request {
 | 
			
		||||
        val pageUrl = page.url
 | 
			
		||||
        val start = pageUrl.indexOf("#") + 1
 | 
			
		||||
        val end = pageUrl.indexOf("_", start)
 | 
			
		||||
        val id = pageUrl.substring(start, end)
 | 
			
		||||
        return GET("$baseUrl/areader?id=$id&p=${pageUrl.substring(end+1)}", headers)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun popularMangaParse(response: Response, page: MangasPage) {
 | 
			
		||||
        val document = Jsoup.parse(response.body().string())
 | 
			
		||||
        for (element in document.select(popularMangaSelector())) {
 | 
			
		||||
@@ -101,6 +85,8 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
 | 
			
		||||
    override fun popularMangaNextPageSelector() = "#show_more_row"
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaInitialUrl(query: String) = "$baseUrl/search_ajax?name=${Uri.encode(query)}&p=1"
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaParse(response: Response, page: MangasPage, query: String) {
 | 
			
		||||
        val document = Jsoup.parse(response.body().string())
 | 
			
		||||
        for (element in document.select(searchMangaSelector())) {
 | 
			
		||||
@@ -124,15 +110,20 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
 | 
			
		||||
    override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
 | 
			
		||||
 | 
			
		||||
    override fun mangaDetailsRequest(manga: Manga): Request {
 | 
			
		||||
        val mangaId = manga.url.substringAfterLast("r")
 | 
			
		||||
        return GET("$baseUrl/comic_pop?id=$mangaId", headers)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun mangaDetailsParse(document: Document, manga: Manga) {
 | 
			
		||||
        val tbody = document.select("tbody").first()
 | 
			
		||||
        val artistElement = tbody.select("tr:contains(Author/Artist:)").first()
 | 
			
		||||
 | 
			
		||||
        manga.author = artistElement.select("td:eq(1)").first()?.text()
 | 
			
		||||
        manga.artist = artistElement.select("td:eq(2)").first()?.text() ?: manga.author
 | 
			
		||||
        manga.description = tbody.select("tr:contains(Description:) > td:eq(1)").first()?.text()
 | 
			
		||||
        manga.author = artistElement.selectText("td:eq(1)")
 | 
			
		||||
        manga.artist = artistElement.selectText("td:eq(2)") ?: manga.author
 | 
			
		||||
        manga.description = tbody.selectText("tr:contains(Description:) > td:eq(1)")
 | 
			
		||||
        manga.thumbnail_url = document.select("img[src^=http://img.bato.to/forums/uploads/]").first()?.attr("src")
 | 
			
		||||
        manga.status = parseStatus(document.select("tr:contains(Status:) > td:eq(1)").first()?.text())
 | 
			
		||||
        manga.status = parseStatus(document.selectText("tr:contains(Status:) > td:eq(1)"))
 | 
			
		||||
        manga.genre = tbody.select("tr:contains(Genres:) img").map { it.attr("alt") }.joinToString(", ")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -147,7 +138,7 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
        val matcher = staffNotice.matcher(body)
 | 
			
		||||
        if (matcher.find()) {
 | 
			
		||||
            val notice = Html.fromHtml(matcher.group(1)).toString().trim()
 | 
			
		||||
            throw RuntimeException(notice)
 | 
			
		||||
            throw Exception(notice)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val document = Jsoup.parse(body)
 | 
			
		||||
@@ -197,6 +188,11 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
        return date.time
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun pageListRequest(chapter: Chapter): Request {
 | 
			
		||||
        val id = chapter.url.substringAfterLast("#")
 | 
			
		||||
        return GET("$baseUrl/areader?id=$id&p=1", pageHeaders)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun pageListParse(document: Document, pages: MutableList<Page>) {
 | 
			
		||||
        val selectElement = document.select("#page_select").first()
 | 
			
		||||
        if (selectElement != null) {
 | 
			
		||||
@@ -212,6 +208,14 @@ class Batoto(context: Context, override val id: Int) : ParsedOnlineSource(contex
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun imageUrlRequest(page: Page): Request {
 | 
			
		||||
        val pageUrl = page.url
 | 
			
		||||
        val start = pageUrl.indexOf("#") + 1
 | 
			
		||||
        val end = pageUrl.indexOf("_", start)
 | 
			
		||||
        val id = pageUrl.substring(start, end)
 | 
			
		||||
        return GET("$baseUrl/areader?id=$id&p=${pageUrl.substring(end+1)}", pageHeaders)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun imageUrlParse(document: Document): String {
 | 
			
		||||
        return document.select("#comic_page").first().attr("src")
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -226,19 +226,24 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
 | 
			
		||||
        // Ignore
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onChapterReady(manga: Manga, chapter: Chapter, currentPage: Page?) {
 | 
			
		||||
        val activePage = currentPage ?: chapter.pages.last()
 | 
			
		||||
 | 
			
		||||
    fun onMangaOpen(manga: Manga) {
 | 
			
		||||
        if (viewer == null) {
 | 
			
		||||
            viewer = getOrCreateViewer(manga)
 | 
			
		||||
        }
 | 
			
		||||
        viewer?.onPageListReady(chapter, activePage)
 | 
			
		||||
 | 
			
		||||
        if (viewer is RightToLeftReader && page_seekbar.rotation != 180f) {
 | 
			
		||||
            // Invert the seekbar for the right to left reader
 | 
			
		||||
            page_seekbar.rotation = 180f
 | 
			
		||||
        }
 | 
			
		||||
        setToolbarTitle(manga.title)
 | 
			
		||||
        please_wait.visibility = View.VISIBLE
 | 
			
		||||
        please_wait.startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in_long))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onChapterReady(manga: Manga, chapter: Chapter, currentPage: Page?) {
 | 
			
		||||
        please_wait.visibility = View.GONE
 | 
			
		||||
        val activePage = currentPage ?: chapter.pages.last()
 | 
			
		||||
 | 
			
		||||
        viewer?.onPageListReady(chapter, activePage)
 | 
			
		||||
        setActiveChapter(chapter, activePage.pageNumber)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,10 +57,11 @@ class ReaderPresenter : BasePresenter<ReaderActivity>() {
 | 
			
		||||
 | 
			
		||||
    private var appenderSubscription: Subscription? = null
 | 
			
		||||
 | 
			
		||||
    private val GET_PAGE_LIST = 1
 | 
			
		||||
    private val GET_ADJACENT_CHAPTERS = 2
 | 
			
		||||
    private val GET_MANGA_SYNC = 3
 | 
			
		||||
    private val PRELOAD_NEXT_CHAPTER = 4
 | 
			
		||||
    private val PREPARE_READER = 1
 | 
			
		||||
    private val GET_PAGE_LIST = 2
 | 
			
		||||
    private val GET_ADJACENT_CHAPTERS = 3
 | 
			
		||||
    private val GET_MANGA_SYNC = 4
 | 
			
		||||
    private val PRELOAD_NEXT_CHAPTER = 5
 | 
			
		||||
 | 
			
		||||
    private val MANGA_KEY = "manga_key"
 | 
			
		||||
    private val CHAPTER_KEY = "chapter_key"
 | 
			
		||||
@@ -83,6 +84,10 @@ class ReaderPresenter : BasePresenter<ReaderActivity>() {
 | 
			
		||||
 | 
			
		||||
        initializeSubjects()
 | 
			
		||||
 | 
			
		||||
        restartableLatestCache(PREPARE_READER,
 | 
			
		||||
                { Observable.just(manga) },
 | 
			
		||||
                { view, manga -> view.onMangaOpen(manga) })
 | 
			
		||||
 | 
			
		||||
        startableLatestCache(GET_ADJACENT_CHAPTERS,
 | 
			
		||||
                { getAdjacentChaptersObservable() },
 | 
			
		||||
                { view, pair -> view.onAdjacentChapters(pair.first, pair.second) })
 | 
			
		||||
@@ -102,6 +107,7 @@ class ReaderPresenter : BasePresenter<ReaderActivity>() {
 | 
			
		||||
                { view, error -> view.onChapterError(error) })
 | 
			
		||||
 | 
			
		||||
        if (savedState == null) {
 | 
			
		||||
            start(PREPARE_READER)
 | 
			
		||||
            loadChapter(chapter)
 | 
			
		||||
            if (prefs.autoUpdateMangaSync()) {
 | 
			
		||||
                start(GET_MANGA_SYNC)
 | 
			
		||||
 
 | 
			
		||||
@@ -98,7 +98,11 @@ class WebtoonReader : BaseReader() {
 | 
			
		||||
                .doOnNext { setDecoderClass(it) }
 | 
			
		||||
                .skip(1)
 | 
			
		||||
                .distinctUntilChanged()
 | 
			
		||||
                .subscribe { recycler.adapter = adapter })
 | 
			
		||||
                .subscribe {
 | 
			
		||||
                    val activePage = layoutManager.findFirstVisibleItemPosition()
 | 
			
		||||
                    recycler.adapter = adapter
 | 
			
		||||
                    setActivePage(activePage)
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
        setPagesOnAdapter()
 | 
			
		||||
        return recycler
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								app/src/main/res/anim/fade_in_long.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/src/main/res/anim/fade_in_long.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <alpha
 | 
			
		||||
        android:fromAlpha="0.0"
 | 
			
		||||
        android:toAlpha="1.0"
 | 
			
		||||
        android:interpolator="@android:anim/accelerate_interpolator"
 | 
			
		||||
        android:duration="2000"
 | 
			
		||||
        android:fillAfter="true"/>
 | 
			
		||||
</set>
 | 
			
		||||
@@ -9,6 +9,13 @@
 | 
			
		||||
        android:layout_height="match_parent">
 | 
			
		||||
    </FrameLayout>
 | 
			
		||||
 | 
			
		||||
    <ProgressBar
 | 
			
		||||
        android:id="@+id/please_wait"
 | 
			
		||||
        style="?android:attr/progressBarStyleLarge"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_gravity="center"/>
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/page_number"
 | 
			
		||||
        style="@style/TextAppearance.Regular.Caption"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user