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