diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
index 7569e976e..8f3b86905 100644
--- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
@@ -13,11 +13,11 @@ import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import org.koin.dsl.module
import org.koitharu.kotatsu.core.db.MangaDatabase
+import org.koitharu.kotatsu.core.local.CbzFetcher
+import org.koitharu.kotatsu.core.local.PagesCache
import org.koitharu.kotatsu.core.local.cookies.PersistentCookieJar
import org.koitharu.kotatsu.core.local.cookies.cache.SetCookieCache
import org.koitharu.kotatsu.core.local.cookies.persistence.SharedPrefsCookiePersistor
-import org.koitharu.kotatsu.core.local.CbzFetcher
-import org.koitharu.kotatsu.core.local.PagesCache
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.domain.MangaLoaderContext
import org.koitharu.kotatsu.utils.CacheUtils
@@ -40,27 +40,25 @@ class KotatsuApp : Application() {
startKoin {
androidLogger()
androidContext(applicationContext)
- modules(listOf(
- module {
- factory {
- okHttp()
- .cache(CacheUtils.createHttpCache(applicationContext))
- .build()
- }
- single {
- mangaDb().build()
- }
- single {
- MangaLoaderContext()
- }
- factory {
- AppSettings(applicationContext)
- }
- single {
- PagesCache(applicationContext)
- }
+ module {
+ factory {
+ okHttp()
+ .cache(CacheUtils.createHttpCache(applicationContext))
+ .build()
+ }
+ single {
+ mangaDb().build()
}
- ))
+ single {
+ MangaLoaderContext()
+ }
+ factory {
+ AppSettings(applicationContext)
+ }
+ single {
+ PagesCache(applicationContext)
+ }
+ }
}
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt
index 59a14b695..b80510409 100644
--- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/GroupleRepository.kt
@@ -26,7 +26,7 @@ abstract class GroupleRepository : RemoteMangaRepository() {
val doc = when {
!query.isNullOrEmpty() -> loaderContext.httpPost(
"https://$domain/search",
- mapOf("q" to query)
+ mapOf("q" to query, "offset" to offset.toString())
)
tag == null -> loaderContext.httpGet("https://$domain/list?sortType=${getSortKey(sortOrder)}&offset=$offset")
else -> loaderContext.httpGet(
@@ -40,7 +40,7 @@ abstract class GroupleRepository : RemoteMangaRepository() {
return root.select("div.tile").mapNotNull { node ->
val imgDiv = node.selectFirst("div.img") ?: return@mapNotNull null
val descDiv = node.selectFirst("div.desc") ?: return@mapNotNull null
- if (descDiv.getElementsByAttributeValue("data-type", "author").isNotEmpty()) {
+ if (descDiv.selectFirst("i.fa-user") != null) {
return@mapNotNull null //skip author
}
val href = imgDiv.selectFirst("a").attr("href")?.withDomain(domain)
@@ -87,7 +87,7 @@ abstract class GroupleRepository : RemoteMangaRepository() {
val doc = loaderContext.httpGet(manga.url).parseHtml()
val root = doc.body().getElementById("mangaBox") ?: throw ParseException("Cannot find root")
return manga.copy(
- description = root.selectFirst("div.manga-description").firstChild()?.html(),
+ description = root.selectFirst("div.manga-description")?.html(),
largeCoverUrl = root.selectFirst("div.subject-cower")?.selectFirst("img")?.attr(
"data-full"
),
diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt
index 81a47fe19..3673d616b 100644
--- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/HenChanRepository.kt
@@ -1,9 +1,39 @@
package org.koitharu.kotatsu.core.parser.site
+import org.koitharu.kotatsu.core.exceptions.ParseException
+import org.koitharu.kotatsu.core.model.Manga
+import org.koitharu.kotatsu.core.model.MangaChapter
import org.koitharu.kotatsu.core.model.MangaSource
+import org.koitharu.kotatsu.utils.ext.longHashCode
+import org.koitharu.kotatsu.utils.ext.parseHtml
+import org.koitharu.kotatsu.utils.ext.withDomain
class HenChanRepository : ChanRepository() {
override val defaultDomain = "h-chan.me"
override val source = MangaSource.HENCHAN
+
+ override suspend fun getDetails(manga: Manga): Manga {
+ val domain = conf.getDomain(defaultDomain)
+ val doc = loaderContext.httpGet(manga.url).parseHtml()
+ val root =
+ doc.body().getElementById("dle-content") ?: throw ParseException("Cannot find root")
+ return manga.copy(
+ description = root.getElementById("description")?.html()?.substringBeforeLast("
+ table.select("div.manga2")
+ }.mapNotNull { it.selectFirst("a") }.reversed().mapIndexedNotNull { i, a ->
+ val href = a.attr("href")
+ ?.withDomain(domain) ?: return@mapIndexedNotNull null
+ MangaChapter(
+ id = href.longHashCode(),
+ name = a.text().trim(),
+ number = i + 1,
+ url = href,
+ source = source
+ )
+ }
+ )
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt
index 5987a9d6a..32a906d93 100644
--- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/SourceConfig.kt
@@ -10,6 +10,8 @@ class SourceConfig(context: Context, source: MangaSource) {
private val keyDomain = context.getString(R.string.key_parser_domain)
- fun getDomain(defaultValue: String) = prefs.getString(keyDomain, defaultValue) ?: defaultValue
+ fun getDomain(defaultValue: String) = prefs.getString(keyDomain, defaultValue)
+ ?.takeUnless(String::isBlank)
+ ?: defaultValue
}
\ No newline at end of file
diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt
index cf5e4bb89..b2f71eca1 100644
--- a/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt
+++ b/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt
@@ -16,17 +16,14 @@ abstract class RepositoryTestEnvironment {
@BeforeClass
fun initialize(source: MangaSource) {
startKoin {
- modules(listOf(
- module {
- factory {
- OkHttpClient()
- }
- }, module {
- single {
- MangaLoaderContext()
- }
+ module {
+ factory {
+ OkHttpClient()
}
- ))
+ single {
+ MangaLoaderContext()
+ }
+ }
}
val constructor = source.cls.getConstructor(MangaLoaderContext::class.java)
repository = constructor.newInstance(MangaLoaderContext())
diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/MintMangaTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/MintMangaTest.kt
index 3d435b85d..bf0376dbd 100644
--- a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/MintMangaTest.kt
+++ b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/MintMangaTest.kt
@@ -8,7 +8,7 @@ import org.junit.runner.RunWith
import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.parsers.MangaParserTest
import org.koitharu.kotatsu.parsers.RepositoryTestEnvironment
-import org.koitharu.kotatsu.utils.TestUtil
+import org.koitharu.kotatsu.utils.AssertX
import org.mockito.junit.MockitoJUnitRunner
@RunWith(MockitoJUnitRunner::class)
@@ -21,8 +21,8 @@ class MintMangaTest : MangaParserTest {
val item = list[40]
Assert.assertTrue(item.title.isNotEmpty())
Assert.assertTrue(item.rating in 0f..1f)
- TestUtil.assertValidUrl(item.url)
- TestUtil.assertValidUrl(item.coverUrl)
+ AssertX.assertValidUrl(item.url)
+ AssertX.assertValidUrl(item.coverUrl)
Assert.assertEquals(item.source, MangaSource.MINTMANGA)
}
@@ -30,11 +30,11 @@ class MintMangaTest : MangaParserTest {
override fun testMangaDetails() {
val manga = getMangaItem()
Assert.assertNotNull(manga.largeCoverUrl)
- TestUtil.assertValidUrl(manga.largeCoverUrl!!)
+ AssertX.assertValidUrl(manga.largeCoverUrl!!)
Assert.assertNotNull(manga.chapters)
val chapter = manga.chapters!!.last()
Assert.assertEquals(chapter.source, MangaSource.MINTMANGA)
- TestUtil.assertValidUrl(chapter.url)
+ AssertX.assertValidUrl(chapter.url)
}
@Test
@@ -43,8 +43,8 @@ class MintMangaTest : MangaParserTest {
val pages = runBlocking { repository.getPages(chapter) }
Assert.assertFalse(pages.isEmpty())
Assert.assertEquals(pages.first().source, MangaSource.MINTMANGA)
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
}
@Test
@@ -54,7 +54,7 @@ class MintMangaTest : MangaParserTest {
val tag = tags.first()
Assert.assertFalse(tag.title.isBlank())
Assert.assertEquals(tag.source, MangaSource.MINTMANGA)
- TestUtil.assertValidUrl("https://mintmanga.live/list/genre/${tag.key}")
+ AssertX.assertValidUrl("https://mintmanga.live/list/genre/${tag.key}")
}
companion object : RepositoryTestEnvironment() {
diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt
index 3839e4548..0fdb7f0a9 100644
--- a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt
+++ b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt
@@ -8,7 +8,7 @@ import org.junit.runner.RunWith
import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.parsers.MangaParserTest
import org.koitharu.kotatsu.parsers.RepositoryTestEnvironment
-import org.koitharu.kotatsu.utils.TestUtil
+import org.koitharu.kotatsu.utils.AssertX
import org.mockito.junit.MockitoJUnitRunner
@RunWith(MockitoJUnitRunner::class)
@@ -21,8 +21,8 @@ class ReadmangaRuTest : MangaParserTest {
val item = list[40]
Assert.assertTrue(item.title.isNotEmpty())
Assert.assertTrue(item.rating in 0f..1f)
- TestUtil.assertValidUrl(item.url)
- TestUtil.assertValidUrl(item.coverUrl)
+ AssertX.assertValidUrl(item.url)
+ AssertX.assertValidUrl(item.coverUrl)
Assert.assertEquals(item.source, MangaSource.READMANGA_RU)
}
@@ -30,11 +30,11 @@ class ReadmangaRuTest : MangaParserTest {
override fun testMangaDetails() {
val manga = getMangaItem()
Assert.assertNotNull(manga.largeCoverUrl)
- TestUtil.assertValidUrl(manga.largeCoverUrl!!)
+ AssertX.assertValidUrl(manga.largeCoverUrl!!)
Assert.assertNotNull(manga.chapters)
val chapter = manga.chapters!!.last()
Assert.assertEquals(chapter.source, MangaSource.READMANGA_RU)
- TestUtil.assertValidUrl(chapter.url)
+ AssertX.assertValidUrl(chapter.url)
}
@Test
@@ -43,8 +43,8 @@ class ReadmangaRuTest : MangaParserTest {
val pages = runBlocking { repository.getPages(chapter) }
Assert.assertFalse(pages.isEmpty())
Assert.assertEquals(pages.first().source, MangaSource.READMANGA_RU)
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
}
@Test
@@ -54,7 +54,7 @@ class ReadmangaRuTest : MangaParserTest {
val tag = tags.first()
Assert.assertFalse(tag.title.isBlank())
Assert.assertEquals(tag.source, MangaSource.READMANGA_RU)
- TestUtil.assertValidUrl("https://readmanga.me/list/genre/${tag.key}")
+ AssertX.assertValidUrl("https://readmanga.me/list/genre/${tag.key}")
}
companion object : RepositoryTestEnvironment() {
diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/SelfMangaTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/SelfMangaTest.kt
index d9d55beeb..6a528053f 100644
--- a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/SelfMangaTest.kt
+++ b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/SelfMangaTest.kt
@@ -8,7 +8,7 @@ import org.junit.runner.RunWith
import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.parsers.MangaParserTest
import org.koitharu.kotatsu.parsers.RepositoryTestEnvironment
-import org.koitharu.kotatsu.utils.TestUtil
+import org.koitharu.kotatsu.utils.AssertX
import org.mockito.junit.MockitoJUnitRunner
@RunWith(MockitoJUnitRunner::class)
@@ -21,8 +21,8 @@ class SelfMangaTest : MangaParserTest {
val item = list[40]
Assert.assertTrue(item.title.isNotEmpty())
Assert.assertTrue(item.rating in 0f..1f)
- TestUtil.assertValidUrl(item.url)
- TestUtil.assertValidUrl(item.coverUrl)
+ AssertX.assertValidUrl(item.url)
+ AssertX.assertValidUrl(item.coverUrl)
Assert.assertEquals(item.source, MangaSource.SELFMANGA)
}
@@ -30,11 +30,11 @@ class SelfMangaTest : MangaParserTest {
override fun testMangaDetails() {
val manga = getMangaItem()
Assert.assertNotNull(manga.largeCoverUrl)
- TestUtil.assertValidUrl(manga.largeCoverUrl!!)
+ AssertX.assertValidUrl(manga.largeCoverUrl!!)
Assert.assertNotNull(manga.chapters)
val chapter = manga.chapters!!.last()
Assert.assertEquals(chapter.source, MangaSource.SELFMANGA)
- TestUtil.assertValidUrl(chapter.url)
+ AssertX.assertValidUrl(chapter.url)
}
@Test
@@ -43,8 +43,8 @@ class SelfMangaTest : MangaParserTest {
val pages = runBlocking { repository.getPages(chapter) }
Assert.assertFalse(pages.isEmpty())
Assert.assertEquals(pages.first().source, MangaSource.SELFMANGA)
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
- TestUtil.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.first()) })
+ AssertX.assertValidUrl(runBlocking { repository.getPageFullUrl(pages.last()) })
}
@Test
@@ -54,7 +54,7 @@ class SelfMangaTest : MangaParserTest {
val tag = tags.first()
Assert.assertFalse(tag.title.isBlank())
Assert.assertEquals(tag.source, MangaSource.SELFMANGA)
- TestUtil.assertValidUrl("https://selfmanga.ru/list/genre/${tag.key}")
+ AssertX.assertValidUrl("https://selfmanga.ru/list/genre/${tag.key}")
}
companion object : RepositoryTestEnvironment() {
diff --git a/app/src/test/java/org/koitharu/kotatsu/utils/TestUtil.kt b/app/src/test/java/org/koitharu/kotatsu/utils/AssertX.kt
similarity index 96%
rename from app/src/test/java/org/koitharu/kotatsu/utils/TestUtil.kt
rename to app/src/test/java/org/koitharu/kotatsu/utils/AssertX.kt
index d2a0ea453..10f597b29 100644
--- a/app/src/test/java/org/koitharu/kotatsu/utils/TestUtil.kt
+++ b/app/src/test/java/org/koitharu/kotatsu/utils/AssertX.kt
@@ -4,7 +4,7 @@ import org.junit.Assert
import java.net.HttpURLConnection
import java.net.URL
-object TestUtil {
+object AssertX {
private val VALID_RESPONSE_CODES = arrayOf(
HttpURLConnection.HTTP_OK,