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 00000000..dc48e430 Binary files /dev/null and b/app/src/main/res/drawable/manatoki.png differ