From 02751233f867ab203ff3d4f2281678dd888ffa21 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sat, 18 Dec 2021 14:57:25 +0900 Subject: [PATCH] Manatoki --- .idea/deploymentTargetDropDown.xml | 17 +++ .../java/xyz/quaver/pupil/sources/Common.kt | 6 +- .../quaver/pupil/sources/manatoki/Manatoki.kt | 101 ++++++++++++++++++ .../pupil/ui/viewmodel/ReaderViewModel.kt | 3 - app/src/main/res/drawable/manatoki.png | Bin 0 -> 3430 bytes 5 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/java/xyz/quaver/pupil/sources/manatoki/Manatoki.kt create mode 100644 app/src/main/res/drawable/manatoki.png diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 00000000..45c52bb6 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/sources/Common.kt b/app/src/main/java/xyz/quaver/pupil/sources/Common.kt index 620693cf..f8d9b5a9 100644 --- a/app/src/main/java/xyz/quaver/pupil/sources/Common.kt +++ b/app/src/main/java/xyz/quaver/pupil/sources/Common.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Composable import io.ktor.http.* import kotlinx.coroutines.channels.Channel import org.kodein.di.* +import xyz.quaver.pupil.sources.manatoki.Manatoki interface ItemInfo : Parcelable { val source: String @@ -61,9 +62,10 @@ val sourceModule = DI.Module(name = "source") { listOf<(Application) -> (Source)>( { Hitomi(it) }, - { Hiyobi_io(it) } + { Hiyobi_io(it) }, + { Manatoki(it) } ).forEach { source -> - inSet { singleton { source.invoke(instance()).let { it.name to it } } } + inSet { singleton { source(instance()).let { it.name to it } } } } bind { singleton { History(di) } } diff --git a/app/src/main/java/xyz/quaver/pupil/sources/manatoki/Manatoki.kt b/app/src/main/java/xyz/quaver/pupil/sources/manatoki/Manatoki.kt new file mode 100644 index 00000000..72473d7e --- /dev/null +++ b/app/src/main/java/xyz/quaver/pupil/sources/manatoki/Manatoki.kt @@ -0,0 +1,101 @@ +/* + * Pupil, Hitomi.la viewer for Android + * Copyright (C) 2021 tom5079 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package xyz.quaver.pupil.sources.manatoki + +import android.app.Application +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import org.jsoup.Jsoup +import org.kodein.di.DIAware +import org.kodein.di.android.closestDI +import org.kodein.log.LoggerFactory +import org.kodein.log.newLogger +import xyz.quaver.pupil.R +import xyz.quaver.pupil.sources.ItemInfo +import xyz.quaver.pupil.sources.Source + +@Parcelize +class ManatokiItemInfo( + override val itemID: String, + override val title: String +) : ItemInfo { + override val source: String = "manatoki.net" +} + +class Manatoki(app: Application) : Source(), DIAware { + override val di by closestDI(app) + + private val logger = newLogger(LoggerFactory.default) + + override val name = "manatoki.net" + override val availableSortMode: List = emptyList() + override val iconResID: Int = R.drawable.manatoki + + override suspend fun search( + query: String, + range: IntRange, + sortMode: Int + ): Pair, Int> { + TODO("Not yet implemented") + } + + override suspend fun images(itemID: String): List = coroutineScope { + val jsoup = withContext(Dispatchers.IO) { + Jsoup.connect("https://manatoki116.net/comic/$itemID").get() + } + + val htmlData = jsoup + .selectFirst(".view-padding > script")!! + .data() + .splitToSequence('\n') + .fold(StringBuilder()) { sb, line -> + if (!line.startsWith("html_data")) return@fold sb + + line.drop(12).dropLast(2).split('.').forEach { + if (it.isNotBlank()) sb.appendCodePoint(it.toInt(16)) + } + sb + }.toString() + + Jsoup.parse(htmlData) + .select("img[^data-]:not([style])") + .map { + it.attributes() + .first { it.key.startsWith("data-") } + .value + } + } + + override suspend fun info(itemID: String): ItemInfo = coroutineScope { + val jsoup = withContext(Dispatchers.IO) { + Jsoup.connect("https://manatoki116.net/comic/$itemID").get() + } + + val title = jsoup.selectFirst(".toon-title")!!.ownText() + + ManatokiItemInfo( + itemID, + title + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt index a80c3622..a6fe92e5 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/viewmodel/ReaderViewModel.kt @@ -33,17 +33,14 @@ import org.kodein.di.DIAware import org.kodein.di.android.x.closestDI import org.kodein.di.direct import org.kodein.di.instance -import org.kodein.di.instanceOrNull import org.kodein.log.LoggerFactory import org.kodein.log.newLogger import xyz.quaver.pupil.db.AppDatabase -import xyz.quaver.pupil.db.Bookmark import xyz.quaver.pupil.db.History import xyz.quaver.pupil.sources.ItemInfo import xyz.quaver.pupil.sources.Source import xyz.quaver.pupil.util.NetworkCache import xyz.quaver.pupil.util.source -import java.nio.file.Files.delete @Suppress("UNCHECKED_CAST") class ReaderViewModel(app: Application) : AndroidViewModel(app), DIAware { diff --git a/app/src/main/res/drawable/manatoki.png b/app/src/main/res/drawable/manatoki.png new file mode 100644 index 0000000000000000000000000000000000000000..dc48e430285030a1479c0ef02345822269e70b35 GIT binary patch literal 3430 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 IM6N<$f{*cX3jhEB literal 0 HcmV?d00001