diff --git a/README.md b/README.md
index 7b58c75bf..5f2cebcb5 100644
--- a/README.md
+++ b/README.md
@@ -58,11 +58,8 @@ Custom sources:
Additional features for some extensions, features include custom description, opening in app, batch add to library, and a bunch of other things based on the source:
* 8Muses (EroMuse)
* HBrowse
-* HentaiCafe (inside Foolside)
-* Hitomi.la
* Mangadex
* NHentai
-* PervEden (EN and IT)
* Puruin
* Tsumino
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0c42fe71a..fe015625b 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -299,21 +299,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -330,22 +315,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/java/eu/kanade/presentation/library/LibraryState.kt b/app/src/main/java/eu/kanade/presentation/library/LibraryState.kt
index 08cbaa8c4..96c450b12 100644
--- a/app/src/main/java/eu/kanade/presentation/library/LibraryState.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/LibraryState.kt
@@ -9,8 +9,6 @@ import eu.kanade.domain.category.model.Category
import eu.kanade.domain.library.model.LibraryGroup
import eu.kanade.domain.library.model.LibraryManga
import eu.kanade.tachiyomi.ui.library.LibraryPresenter
-import exh.source.PERV_EDEN_EN_SOURCE_ID
-import exh.source.PERV_EDEN_IT_SOURCE_ID
import exh.source.isEhBasedManga
import exh.source.mangaDexSourceIds
import exh.source.nHentaiSourceIds
@@ -56,9 +54,7 @@ class LibraryStateImpl : LibraryState {
override val showCleanTitles: Boolean by derivedStateOf {
selection.any {
it.manga.isEhBasedManga() ||
- it.manga.source in nHentaiSourceIds ||
- it.manga.source == PERV_EDEN_EN_SOURCE_ID ||
- it.manga.source == PERV_EDEN_IT_SOURCE_ID
+ it.manga.source in nHentaiSourceIds
}
}
override val showAddToMangadex: Boolean by derivedStateOf {
diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt
index bfb1d2e7a..e50f045da 100644
--- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt
+++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt
@@ -76,10 +76,8 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.getNameForMangaInfo
import eu.kanade.tachiyomi.source.online.MetadataSource
import eu.kanade.tachiyomi.source.online.all.EHentai
-import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.source.online.all.NHentai
-import eu.kanade.tachiyomi.source.online.all.PervEden
import eu.kanade.tachiyomi.source.online.english.EightMuses
import eu.kanade.tachiyomi.source.online.english.HBrowse
import eu.kanade.tachiyomi.source.online.english.Pururin
@@ -92,10 +90,8 @@ import exh.source.getMainSource
import exh.ui.metadata.adapters.EHentaiDescription
import exh.ui.metadata.adapters.EightMusesDescription
import exh.ui.metadata.adapters.HBrowseDescription
-import exh.ui.metadata.adapters.HitomiDescription
import exh.ui.metadata.adapters.MangaDexDescription
import exh.ui.metadata.adapters.NHentaiDescription
-import exh.ui.metadata.adapters.PervEdenDescription
import exh.ui.metadata.adapters.PururinDescription
import exh.ui.metadata.adapters.TsuminoDescription
@@ -873,18 +869,12 @@ fun metadataDescription(source: Source): MetadataDescriptionComposable? {
is EHentai -> { state, openMetadataViewer, search ->
EHentaiDescription(state, openMetadataViewer, search)
}
- is Hitomi -> { state, openMetadataViewer, _ ->
- HitomiDescription(state, openMetadataViewer)
- }
is MangaDex -> { state, openMetadataViewer, _ ->
MangaDexDescription(state, openMetadataViewer)
}
is NHentai -> { state, openMetadataViewer, _ ->
NHentaiDescription(state, openMetadataViewer)
}
- is PervEden -> { state, openMetadataViewer, _ ->
- PervEdenDescription(state, openMetadataViewer)
- }
is EightMuses -> { state, openMetadataViewer, _ ->
EightMusesDescription(state, openMetadataViewer)
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
index 7414bdb93..ae4f965ec 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
@@ -12,11 +12,9 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.all.EHentai
-import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.source.online.all.NHentai
-import eu.kanade.tachiyomi.source.online.all.PervEden
import eu.kanade.tachiyomi.source.online.english.EightMuses
import eu.kanade.tachiyomi.source.online.english.HBrowse
import eu.kanade.tachiyomi.source.online.english.Pururin
@@ -30,8 +28,6 @@ import exh.source.EXH_SOURCE_ID
import exh.source.EnhancedHttpSource
import exh.source.HBROWSE_SOURCE_ID
import exh.source.MERGED_SOURCE_ID
-import exh.source.PERV_EDEN_EN_SOURCE_ID
-import exh.source.PERV_EDEN_IT_SOURCE_ID
import exh.source.PURURIN_SOURCE_ID
import exh.source.TSUMINO_SOURCE_ID
import exh.source.handleSourceLibrary
@@ -292,25 +288,6 @@ class SourceManager(
"eu.kanade.tachiyomi.extension.en.eightmuses.EightMuses",
EightMuses::class,
),
- DelegatedSource(
- "Hitomi",
- fillInSourceId,
- "eu.kanade.tachiyomi.extension.all.hitomi.Hitomi",
- Hitomi::class,
- true,
- ),
- DelegatedSource(
- "PervEden English",
- PERV_EDEN_EN_SOURCE_ID,
- "eu.kanade.tachiyomi.extension.en.perveden.Perveden",
- PervEden::class,
- ),
- DelegatedSource(
- "PervEden Italian",
- PERV_EDEN_IT_SOURCE_ID,
- "eu.kanade.tachiyomi.extension.it.perveden.Perveden",
- PervEden::class,
- ),
DelegatedSource(
"NHentai",
fillInSourceId,
diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt
deleted file mode 100644
index dae8278a7..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/Hitomi.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-package eu.kanade.tachiyomi.source.online.all
-
-import android.content.Context
-import android.net.Uri
-import android.os.Build
-import eu.kanade.tachiyomi.network.await
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.HttpSource
-import eu.kanade.tachiyomi.source.online.MetadataSource
-import eu.kanade.tachiyomi.source.online.NamespaceSource
-import eu.kanade.tachiyomi.source.online.UrlImportableSource
-import eu.kanade.tachiyomi.util.asJsoup
-import exh.metadata.metadata.HitomiSearchMetadata
-import exh.metadata.metadata.base.RaisedSearchMetadata
-import exh.metadata.metadata.base.RaisedTag
-import exh.source.DelegatedHttpSource
-import exh.util.urlImportFetchSearchManga
-import org.jsoup.nodes.Document
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Hitomi(delegate: HttpSource, val context: Context) :
- DelegatedHttpSource(delegate),
- MetadataSource,
- UrlImportableSource,
- NamespaceSource {
- override val metaClass = HitomiSearchMetadata::class
- override val lang = delegate.lang
-
- // Support direct URL importing
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList) =
- urlImportFetchSearchManga(context, query) {
- super.fetchSearchManga(page, query, filters)
- }
-
- override suspend fun getMangaDetails(manga: SManga): SManga {
- val response = client.newCall(mangaDetailsRequest(manga)).await()
- return parseToManga(manga, response.asJsoup())
- }
-
- override suspend fun parseIntoMetadata(metadata: HitomiSearchMetadata, input: Document) {
- with(metadata) {
- url = input.location()
-
- tags.clear()
-
- thumbnailUrl = "https:" + input.selectFirst(".cover img")!!.attr("src")
-
- val galleryElement = input.selectFirst(".gallery")!!
-
- title = galleryElement.selectFirst("h1")!!.text()
- artists = galleryElement.select("h2 a").map { it.text() }
- tags += artists.map { RaisedTag("artist", it, HitomiSearchMetadata.TAG_TYPE_DEFAULT) }
-
- input.select(".gallery-info tr").forEach { galleryInfoElement ->
- val content = galleryInfoElement.child(1)
- when (galleryInfoElement.child(0).text().lowercase()) {
- "group" -> {
- val group = content.text()
- tags += RaisedTag(
- "group",
- group,
- if (group != "N/A") {
- HitomiSearchMetadata.TAG_TYPE_DEFAULT
- } else {
- RaisedSearchMetadata.TAG_TYPE_VIRTUAL
- },
- )
- }
- "type" -> {
- genre = content.text()
- tags += RaisedTag("genre", genre!!, RaisedSearchMetadata.TAG_TYPE_VIRTUAL)
- }
- "series" -> {
- val series = content.select("a").map { it.text() }
- tags += series.map {
- RaisedTag("series", it, HitomiSearchMetadata.TAG_TYPE_DEFAULT)
- }
- }
- "language" -> {
- language = content.selectFirst("a")?.attr("href")?.split('-')?.get(1)
- language?.let {
- tags += RaisedTag("language", it, RaisedSearchMetadata.TAG_TYPE_VIRTUAL)
- }
- }
- "characters" -> {
- val characters = content.select("a").map { it.text() }
- tags += characters.map {
- RaisedTag(
- "character",
- it,
- HitomiSearchMetadata.TAG_TYPE_DEFAULT,
- )
- }
- }
- "tags" -> {
- tags += content.select("a").map {
- val ns = when {
- it.attr("href").startsWith("/tag/male") -> "male"
- it.attr("href").startsWith("/tag/female") -> "female"
- else -> "misc"
- }
- RaisedTag(
- ns,
- it.text().dropLast(if (ns == "misc") 0 else 2),
- HitomiSearchMetadata.TAG_TYPE_DEFAULT,
- )
- }
- }
- }
- }
-
- uploadDate = try {
- DATE_FORMAT.parse(input.selectFirst(".gallery-info .date")!!.text())!!.time
- } catch (e: Exception) {
- null
- }
- }
- }
-
- override val matchingHosts = listOf(
- "hitomi.la",
- )
-
- override suspend fun mapUrlToMangaUrl(uri: Uri): String? {
- val lcFirstPathSegment = uri.pathSegments.firstOrNull()?.lowercase() ?: return null
-
- if (lcFirstPathSegment != "manga" && lcFirstPathSegment != "reader") {
- return null
- }
-
- return "https://hitomi.la/manga/${uri.pathSegments[1].substringBefore('.')}.html"
- }
-
- companion object {
- const val otherId = 2703068117101782422L
- private val DATE_FORMAT by lazy {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- SimpleDateFormat("yyyy-MM-dd HH:mm:ssX", Locale.US)
- } else {
- SimpleDateFormat("yyyy-MM-dd HH:mm:ss'-05'", Locale.US)
- }
- }
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt
deleted file mode 100644
index 878447a79..000000000
--- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/PervEden.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-package eu.kanade.tachiyomi.source.online.all
-
-import android.content.Context
-import android.net.Uri
-import androidx.core.net.toUri
-import eu.kanade.tachiyomi.network.await
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.HttpSource
-import eu.kanade.tachiyomi.source.online.MetadataSource
-import eu.kanade.tachiyomi.source.online.UrlImportableSource
-import eu.kanade.tachiyomi.util.asJsoup
-import exh.metadata.metadata.PervEdenSearchMetadata
-import exh.metadata.metadata.base.RaisedSearchMetadata
-import exh.metadata.metadata.base.RaisedTag
-import exh.source.DelegatedHttpSource
-import exh.util.urlImportFetchSearchManga
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import org.jsoup.nodes.TextNode
-
-class PervEden(delegate: HttpSource, val context: Context) :
- DelegatedHttpSource(delegate),
- MetadataSource,
- UrlImportableSource {
- override val metaClass = PervEdenSearchMetadata::class
- override val lang = delegate.lang
-
- // Support direct URL importing
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList) =
- urlImportFetchSearchManga(context, query) {
- super.fetchSearchManga(page, query, filters)
- }
-
- override suspend fun getMangaDetails(manga: SManga): SManga {
- val response = client.newCall(mangaDetailsRequest(manga)).await()
- return parseToManga(manga, response.asJsoup())
- }
-
- override suspend fun parseIntoMetadata(metadata: PervEdenSearchMetadata, input: Document) {
- with(metadata) {
- url = input.location().toUri().path
-
- pvId = PervEdenSearchMetadata.pvIdFromUrl(url!!)
-
- lang = this@PervEden.lang
-
- title = input.getElementsByClass("manga-title").first()?.text()
-
- thumbnailUrl = "http:" + input.getElementsByClass("mangaImage2").first()?.child(0)?.attr("src")
-
- val rightBoxElement = input.select(".rightBox:not(.info)").first()
-
- val newAltTitles = mutableListOf()
- tags.clear()
- var inStatus: String? = null
- rightBoxElement!!.childNodes().forEach {
- if (it is Element && it.tagName().lowercase() == "h4") {
- inStatus = it.text().trim()
- } else {
- when (inStatus) {
- "Alternative name(s)" -> {
- if (it is TextNode) {
- val text = it.text().trim()
- if (text.isNotBlank()) {
- newAltTitles += text
- }
- }
- }
- "Artist" -> {
- if (it is Element && it.tagName() == "a") {
- artist = it.text()
- tags += RaisedTag(
- "artist",
- it.text().lowercase(),
- RaisedSearchMetadata.TAG_TYPE_VIRTUAL,
- )
- }
- }
- "Genres" -> {
- if (it is Element && it.tagName() == "a") {
- tags += RaisedTag(
- null,
- it.text().lowercase(),
- PervEdenSearchMetadata.TAG_TYPE_DEFAULT,
- )
- }
- }
- "Type" -> {
- if (it is TextNode) {
- val text = it.text().trim()
- if (text.isNotBlank()) {
- genre = text
- }
- }
- }
- "Status" -> {
- if (it is TextNode) {
- val text = it.text().trim()
- if (text.isNotBlank()) {
- status = text
- }
- }
- }
- }
- }
- }
-
- altTitles = newAltTitles
-
- rating = input.getElementById("rating-score")?.attr("value")?.toFloat()
- }
- }
-
- override val matchingHosts = listOf("www.perveden.com")
-
- override fun matchesUri(uri: Uri): Boolean {
- return super.matchesUri(uri) && uri.pathSegments.firstOrNull()?.lowercase() == when (lang) {
- "en" -> "en-manga"
- "it" -> "it-manga"
- else -> false
- }
- }
-
- override suspend fun mapUrlToMangaUrl(uri: Uri): String {
- val newUri = "http://www.perveden.com/".toUri().buildUpon()
- uri.pathSegments.take(3).forEach {
- newUri.appendPath(it)
- }
- return newUri.toString()
- }
-}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
index d6fe10c29..3ed9f81c2 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
@@ -36,8 +36,6 @@ import eu.kanade.tachiyomi.util.system.toast
import exh.favorites.FavoritesIntroDialog
import exh.favorites.FavoritesSyncStatus
import exh.source.MERGED_SOURCE_ID
-import exh.source.PERV_EDEN_EN_SOURCE_ID
-import exh.source.PERV_EDEN_IT_SOURCE_ID
import exh.source.isEhBasedManga
import exh.source.mangaDexSourceIds
import exh.source.nHentaiSourceIds
@@ -336,9 +334,7 @@ class LibraryController(
private fun cleanTitles() {
val mangas = presenter.selection.filter {
it.manga.isEhBasedManga() ||
- it.manga.source in nHentaiSourceIds ||
- it.manga.source == PERV_EDEN_EN_SOURCE_ID ||
- it.manga.source == PERV_EDEN_IT_SOURCE_ID
+ it.manga.source in nHentaiSourceIds
}
presenter.cleanTitles(mangas)
presenter.clearSelection()
diff --git a/app/src/main/java/exh/EXHMigrations.kt b/app/src/main/java/exh/EXHMigrations.kt
index a053d6763..a4e9b171d 100644
--- a/app/src/main/java/exh/EXHMigrations.kt
+++ b/app/src/main/java/exh/EXHMigrations.kt
@@ -38,7 +38,6 @@ import eu.kanade.tachiyomi.network.NetworkPreferences
import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
-import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.NHentai
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
@@ -54,8 +53,6 @@ import exh.source.BlacklistedSources
import exh.source.EH_SOURCE_ID
import exh.source.HBROWSE_SOURCE_ID
import exh.source.MERGED_SOURCE_ID
-import exh.source.PERV_EDEN_EN_SOURCE_ID
-import exh.source.PERV_EDEN_IT_SOURCE_ID
import exh.source.TSUMINO_SOURCE_ID
import exh.util.nullIfBlank
import exh.util.under
@@ -139,13 +136,7 @@ object EXHMigrations {
updateManga.awaitAll(mangaUpdates)
}
}
- if (oldVersion under 5) {
- // Migrate Hitomi source IDs
- updateSourceId(Hitomi.otherId, 6910)
- }
if (oldVersion under 6) {
- updateSourceId(PERV_EDEN_EN_SOURCE_ID, 6905)
- updateSourceId(PERV_EDEN_IT_SOURCE_ID, 6906)
updateSourceId(NHentai.otherId, 6907)
}
if (oldVersion under 7) {
@@ -518,14 +509,6 @@ object EXHMigrations {
}
fun migrateBackupEntry(manga: Manga) {
- if (manga.source == 6905L) {
- manga.source = PERV_EDEN_EN_SOURCE_ID
- }
-
- if (manga.source == 6906L) {
- manga.source = PERV_EDEN_IT_SOURCE_ID
- }
-
if (manga.source == 6907L) {
// Migrate the old source to the delegated one
manga.source = NHentai.otherId
@@ -538,10 +521,6 @@ object EXHMigrations {
manga.source = TSUMINO_SOURCE_ID
}
- if (manga.source == 6910L) {
- manga.source = Hitomi.otherId
- }
-
if (manga.source == 6912L) {
manga.source = HBROWSE_SOURCE_ID
manga.url = manga.url + "/c00001/"
diff --git a/app/src/main/java/exh/source/SourceHelper.kt b/app/src/main/java/exh/source/SourceHelper.kt
index 9a3802b61..4a03fa9fd 100644
--- a/app/src/main/java/exh/source/SourceHelper.kt
+++ b/app/src/main/java/exh/source/SourceHelper.kt
@@ -3,10 +3,8 @@ package exh.source
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
-import eu.kanade.tachiyomi.source.online.all.Hitomi
import eu.kanade.tachiyomi.source.online.all.MangaDex
import eu.kanade.tachiyomi.source.online.all.NHentai
-import eu.kanade.tachiyomi.source.online.all.PervEden
import eu.kanade.tachiyomi.source.online.english.EightMuses
import eu.kanade.tachiyomi.source.online.english.HBrowse
import eu.kanade.tachiyomi.source.online.english.Pururin
@@ -21,8 +19,6 @@ import eu.kanade.domain.manga.model.Manga as DomainManga
const val LEWD_SOURCE_SERIES = 6900L
const val EH_SOURCE_ID = LEWD_SOURCE_SERIES + 1
const val EXH_SOURCE_ID = LEWD_SOURCE_SERIES + 2
-const val PERV_EDEN_EN_SOURCE_ID = 4673633799850248749
-const val PERV_EDEN_IT_SOURCE_ID = 1433898225963724122
const val PURURIN_SOURCE_ID = 2221515250486218861
const val TSUMINO_SOURCE_ID = 6707338697138388238
const val EIGHTMUSES_SOURCE_ID = 1802675169972965535
@@ -35,8 +31,6 @@ private val DELEGATED_METADATA_SOURCES by lazy {
Tsumino::class,
HBrowse::class,
EightMuses::class,
- Hitomi::class,
- PervEden::class,
NHentai::class,
)
}
@@ -44,8 +38,6 @@ private val DELEGATED_METADATA_SOURCES by lazy {
// Used to speed up isLewdSource
var metadataDelegatedSourceIds: List = emptyList()
-var hitomiSourceIds: List = emptyList()
-
var nHentaiSourceIds: List = emptyList()
var mangaDexSourceIds: List = emptyList()
@@ -64,13 +56,6 @@ fun handleSourceLibrary() {
.map { it.value.sourceId }
.sorted()
- hitomiSourceIds = SourceManager.currentDelegatedSources
- .filter {
- it.value.newSourceClass == Hitomi::class
- }
- .map { it.value.sourceId }
- .sorted()
-
nHentaiSourceIds = SourceManager.currentDelegatedSources
.filter {
it.value.newSourceClass == NHentai::class
@@ -89,7 +74,7 @@ fun handleSourceLibrary() {
EH_SOURCE_ID,
EXH_SOURCE_ID,
PURURIN_SOURCE_ID,
- ) + hitomiSourceIds + nHentaiSourceIds
+ ) + nHentaiSourceIds
}
// This method MUST be fast!
diff --git a/app/src/main/java/exh/ui/metadata/adapters/HitomiDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/HitomiDescriptionAdapter.kt
deleted file mode 100644
index 9cf65f2c4..000000000
--- a/app/src/main/java/exh/ui/metadata/adapters/HitomiDescriptionAdapter.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package exh.ui.metadata.adapters
-
-import android.view.LayoutInflater
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.viewinterop.AndroidView
-import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.databinding.DescriptionAdapterHiBinding
-import eu.kanade.tachiyomi.ui.manga.MangaScreenState
-import eu.kanade.tachiyomi.util.system.copyToClipboard
-import exh.metadata.MetadataUtil
-import exh.metadata.metadata.HitomiSearchMetadata
-import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable
-import java.util.Date
-
-@Composable
-fun HitomiDescription(state: MangaScreenState.Success, openMetadataViewer: () -> Unit) {
- val context = LocalContext.current
- AndroidView(
- modifier = Modifier.fillMaxWidth(),
- factory = { factoryContext ->
- DescriptionAdapterHiBinding.inflate(LayoutInflater.from(factoryContext)).root
- },
- update = {
- val meta = state.meta
- if (meta == null || meta !is HitomiSearchMetadata) return@AndroidView
- val binding = DescriptionAdapterHiBinding.bind(it)
-
- binding.genre.text = meta.genre?.let { MetadataUIUtil.getGenreAndColour(context, it) }?.let {
- binding.genre.setBackgroundColor(it.first)
- it.second
- } ?: meta.genre ?: context.getString(R.string.unknown)
-
- binding.whenPosted.text = MetadataUtil.EX_DATE_FORMAT.format(Date(meta.uploadDate ?: 0))
- binding.language.text = meta.language ?: context.getString(R.string.unknown)
-
- binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
-
- listOf(
- binding.genre,
- binding.language,
- binding.whenPosted,
- ).forEach { textView ->
- textView.setOnLongClickListener {
- context.copyToClipboard(
- textView.text.toString(),
- textView.text.toString(),
- )
- true
- }
- }
-
- binding.moreInfo.setOnClickListener {
- openMetadataViewer()
- }
- },
- )
-}
diff --git a/app/src/main/java/exh/ui/metadata/adapters/PervEdenDescriptionAdapter.kt b/app/src/main/java/exh/ui/metadata/adapters/PervEdenDescriptionAdapter.kt
deleted file mode 100644
index 0a4f5b293..000000000
--- a/app/src/main/java/exh/ui/metadata/adapters/PervEdenDescriptionAdapter.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-package exh.ui.metadata.adapters
-
-import android.annotation.SuppressLint
-import android.view.LayoutInflater
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.viewinterop.AndroidView
-import eu.kanade.tachiyomi.R
-import eu.kanade.tachiyomi.databinding.DescriptionAdapterPeBinding
-import eu.kanade.tachiyomi.ui.manga.MangaScreenState
-import eu.kanade.tachiyomi.util.system.copyToClipboard
-import exh.metadata.metadata.PervEdenSearchMetadata
-import exh.ui.metadata.adapters.MetadataUIUtil.bindDrawable
-import java.util.Locale
-import kotlin.math.round
-
-@Composable
-fun PervEdenDescription(state: MangaScreenState.Success, openMetadataViewer: () -> Unit) {
- val context = LocalContext.current
- AndroidView(
- modifier = Modifier.fillMaxWidth(),
- factory = { factoryContext ->
- DescriptionAdapterPeBinding.inflate(LayoutInflater.from(factoryContext)).root
- },
- update = {
- val meta = state.meta
- if (meta == null || meta !is PervEdenSearchMetadata) return@AndroidView
- val binding = DescriptionAdapterPeBinding.bind(it)
-
- binding.genre.text = meta.genre?.let { MetadataUIUtil.getGenreAndColour(context, it) }?.let {
- binding.genre.setBackgroundColor(it.first)
- it.second
- } ?: meta.genre ?: context.getString(R.string.unknown)
-
- val language = meta.lang
- binding.language.text = if (language != null) {
- val local = Locale(language)
- local.displayName
- } else {
- context.getString(R.string.unknown)
- }
-
- binding.ratingBar.rating = meta.rating ?: 0F
- @SuppressLint("SetTextI18n")
- binding.rating.text = (round((meta.rating ?: 0F) * 100.0) / 100.0).toString() + " - " + MetadataUIUtil.getRatingString(context, meta.rating?.times(2))
-
- binding.moreInfo.bindDrawable(context, R.drawable.ic_info_24dp)
-
- listOf(
- binding.genre,
- binding.language,
- binding.rating,
- ).forEach { textView ->
- textView.setOnLongClickListener {
- context.copyToClipboard(
- textView.text.toString(),
- textView.text.toString(),
- )
- true
- }
- }
-
- binding.moreInfo.setOnClickListener {
- openMetadataViewer()
- }
- },
- )
-}
diff --git a/app/src/main/java/exh/util/LewdMangaChecker.kt b/app/src/main/java/exh/util/LewdMangaChecker.kt
index 5b9eceb3c..ce5ff955c 100644
--- a/app/src/main/java/exh/util/LewdMangaChecker.kt
+++ b/app/src/main/java/exh/util/LewdMangaChecker.kt
@@ -48,7 +48,6 @@ private fun isHentaiSource(source: String): Boolean {
source.contains("pururin", true) ||
source.contains("simply hentai", true) ||
source.contains("tsumino", true) ||
- source.contains("hitomi.la", true) ||
source.contains("8muses", true) ||
source.contains("hbrowse", true) ||
source.contains("nhentai", true) ||
diff --git a/app/src/main/java/exh/util/SourceTagsUtil.kt b/app/src/main/java/exh/util/SourceTagsUtil.kt
index 5ccbf7747..d2941bfd8 100644
--- a/app/src/main/java/exh/util/SourceTagsUtil.kt
+++ b/app/src/main/java/exh/util/SourceTagsUtil.kt
@@ -6,7 +6,6 @@ import exh.source.EH_SOURCE_ID
import exh.source.EXH_SOURCE_ID
import exh.source.PURURIN_SOURCE_ID
import exh.source.TSUMINO_SOURCE_ID
-import exh.source.hitomiSourceIds
import exh.source.mangaDexSourceIds
import exh.source.nHentaiSourceIds
import java.util.Locale
@@ -22,7 +21,6 @@ object SourceTagsUtil {
sourceId == EXH_SOURCE_ID ||
sourceId == EH_SOURCE_ID ||
sourceId in nHentaiSourceIds ||
- sourceId in hitomiSourceIds ||
sourceId in mangaDexSourceIds ||
sourceId == PURURIN_SOURCE_ID ||
sourceId == TSUMINO_SOURCE_ID
@@ -34,7 +32,6 @@ object SourceTagsUtil {
}
if (parsed?.namespace != null) {
when (sourceId) {
- in hitomiSourceIds -> wrapTagHitomi(parsed.namespace!!, parsed.name.substringBefore('|').trim())
in nHentaiSourceIds -> wrapTagNHentai(parsed.namespace!!, parsed.name.substringBefore('|').trim())
in mangaDexSourceIds -> parsed.name
PURURIN_SOURCE_ID -> parsed.name.substringBefore('|').trim()
@@ -55,12 +52,6 @@ object SourceTagsUtil {
"$namespace:$tag$"
}
- private fun wrapTagHitomi(namespace: String, tag: String) = if (tag.contains(spaceRegex)) {
- "$namespace:$tag".replace("\\s".toRegex(), "_")
- } else {
- "$namespace:$tag"
- }
-
private fun wrapTagNHentai(namespace: String, tag: String) = if (tag.contains(spaceRegex)) {
if (namespace == "tag") {
""""$tag""""
diff --git a/source-api/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt b/source-api/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt
deleted file mode 100644
index c92fac0a7..000000000
--- a/source-api/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt
+++ /dev/null
@@ -1,87 +0,0 @@
-package exh.metadata.metadata
-
-import android.content.Context
-import eu.kanade.tachiyomi.source.R
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.model.copy
-import exh.metadata.MetadataUtil
-import exh.metadata.metadata.base.RaisedSearchMetadata
-import exh.util.nullIfEmpty
-import kotlinx.serialization.Serializable
-import java.util.Date
-
-@Serializable
-class HitomiSearchMetadata : RaisedSearchMetadata() {
- var url get() = hlId?.let { urlFromHlId(it) }
- set(a) {
- a?.let {
- hlId = hlIdFromUrl(a)
- }
- }
-
- var hlId: String? = null
-
- var title by titleDelegate(TITLE_TYPE_MAIN)
-
- var thumbnailUrl: String? = null
-
- var artists: List = emptyList()
-
- var genre: String? = null
-
- var language: String? = null
-
- var uploadDate: Long? = null
-
- override fun createMangaInfo(manga: SManga): SManga {
- val cover = thumbnailUrl
-
- val title = title
-
- // Copy tags -> genres
- val genres = tagsToGenreString()
-
- val artist = artists.joinToString()
-
- val status = SManga.UNKNOWN
-
- val description = "meta"
-
- return manga.copy(
- thumbnail_url = cover ?: manga.thumbnail_url,
- title = title ?: manga.title,
- genre = genres,
- artist = artist,
- status = status,
- description = description,
- )
- }
-
- override fun getExtraInfoPairs(context: Context): List> {
- return with(context) {
- listOfNotNull(
- getItem(hlId) { getString(R.string.id) },
- getItem(title) { getString(R.string.title) },
- getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
- getItem(artists.nullIfEmpty(), { it.joinToString() }) { getString(R.string.artist) },
- getItem(genre) { getString(R.string.genre) },
- getItem(language) { getString(R.string.language) },
- getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { getString(R.string.date_posted) },
- )
- }
- }
-
- companion object {
- private const val TITLE_TYPE_MAIN = 0
-
- const val TAG_TYPE_DEFAULT = 0
-
- const val BASE_URL = "https://hitomi.la"
-
- fun hlIdFromUrl(url: String) =
- url.split('/').last().split('-').last().substringBeforeLast('.')
-
- fun urlFromHlId(id: String) =
- "$BASE_URL/galleries/$id.html"
- }
-}
diff --git a/source-api/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt b/source-api/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt
deleted file mode 100644
index bfa2faf75..000000000
--- a/source-api/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt
+++ /dev/null
@@ -1,96 +0,0 @@
-package exh.metadata.metadata
-
-import android.content.Context
-import androidx.core.net.toUri
-import eu.kanade.tachiyomi.source.R
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.model.copy
-import exh.metadata.metadata.base.RaisedSearchMetadata
-import exh.metadata.metadata.base.RaisedTitle
-import exh.util.nullIfEmpty
-import kotlinx.serialization.Serializable
-
-@Serializable
-class PervEdenSearchMetadata : RaisedSearchMetadata() {
- var pvId: String? = null
-
- var url: String? = null
- var thumbnailUrl: String? = null
-
- var title by titleDelegate(TITLE_TYPE_MAIN)
- var altTitles
- get() = titles.filter { it.type == TITLE_TYPE_ALT }.map { it.title }
- set(value) {
- titles.removeAll { it.type == TITLE_TYPE_ALT }
- titles += value.map { RaisedTitle(it, TITLE_TYPE_ALT) }
- }
-
- var artist: String? = null
-
- var genre: String? = null
-
- var rating: Float? = null
-
- var status: String? = null
-
- var lang: String? = null
-
- override fun createMangaInfo(manga: SManga): SManga {
- val key = url
- val cover = thumbnailUrl
-
- val title = title
-
- val artist = artist
-
- val status = when (status) {
- "Ongoing" -> SManga.ONGOING
- "Completed", "Suspended" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- // Copy tags -> genres
- val genres = tagsToGenreString()
-
- val description = "meta"
-
- return manga.copy(
- url = key ?: manga.url,
- thumbnail_url = cover ?: manga.thumbnail_url,
- title = title ?: manga.title,
- artist = artist ?: manga.artist,
- status = status,
- genre = genres,
- description = description,
- )
- }
-
- override fun getExtraInfoPairs(context: Context): List> {
- return with(context) {
- listOfNotNull(
- getItem(pvId) { getString(R.string.id) },
- getItem(url) { getString(R.string.url) },
- getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
- getItem(title) { getString(R.string.title) },
- getItem(altTitles.nullIfEmpty(), { it.joinToString() }) { getString(R.string.alt_titles) },
- getItem(artist) { getString(R.string.artist) },
- getItem(genre) { getString(R.string.genre) },
- getItem(rating) { getString(R.string.average_rating) },
- getItem(status) { getString(R.string.status) },
- getItem(lang) { getString(R.string.language) },
- )
- }
- }
-
- companion object {
- private const val TITLE_TYPE_MAIN = 0
- private const val TITLE_TYPE_ALT = 1
-
- const val TAG_TYPE_DEFAULT = 0
-
- private fun splitGalleryUrl(url: String) =
- url.toUri().pathSegments.filterNot(String::isNullOrBlank)
-
- fun pvIdFromUrl(url: String): String = splitGalleryUrl(url).last()
- }
-}
diff --git a/source-api/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt b/source-api/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
index a2fe8ae12..b99f08083 100644
--- a/source-api/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
+++ b/source-api/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
@@ -5,10 +5,8 @@ import eu.kanade.tachiyomi.source.model.SManga
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.EightMusesSearchMetadata
import exh.metadata.metadata.HBrowseSearchMetadata
-import exh.metadata.metadata.HitomiSearchMetadata
import exh.metadata.metadata.MangaDexSearchMetadata
import exh.metadata.metadata.NHentaiSearchMetadata
-import exh.metadata.metadata.PervEdenSearchMetadata
import exh.metadata.metadata.PururinSearchMetadata
import exh.metadata.metadata.TsuminoSearchMetadata
import exh.metadata.sql.models.SearchMetadata
@@ -163,10 +161,8 @@ abstract class RaisedSearchMetadata {
subclass(EHentaiSearchMetadata::class)
subclass(EightMusesSearchMetadata::class)
subclass(HBrowseSearchMetadata::class)
- subclass(HitomiSearchMetadata::class)
subclass(MangaDexSearchMetadata::class)
subclass(NHentaiSearchMetadata::class)
- subclass(PervEdenSearchMetadata::class)
subclass(PururinSearchMetadata::class)
subclass(TsuminoSearchMetadata::class)
}