Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,12 @@ metadataProviders:
# Datasource used for metadata retrieval. DATABASE mode will only work if MangaBaka database is installed
# API or DATABASE
mode: API
eHentai:
priority: 150
enabled: false
preferredLanguages:
- "en"
- "ja"

server:
port: 8085 # or env:KOMF_SERVER_PORT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ enum class KomfCoreProviders : KomfProviders {
BANGUMI,
BOOK_WALKER,
COMIC_VINE,
EHENTAI,
HENTAG,
KODANSHA,
MAL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ data class ProvidersConfigDto(
val bangumi: ProviderConfigDto,
val comicVine: ProviderConfigDto,
val hentag: ProviderConfigDto,
val eHentai: EHentaiConfigDto,
val mangaBaka: MangaBakaConfigDto,
val webtoons: ProviderConfigDto,
)
Expand Down Expand Up @@ -147,6 +148,21 @@ data class ProviderConfigDto(
override val artistRoles: Collection<KomfAuthorRole>,
) : ProviderConf

@Serializable
data class EHentaiConfigDto(
override val priority: Int,
override val enabled: Boolean,
override val seriesMetadata: SeriesMetadataConfigDto,
override val bookMetadata: BookMetadataConfigDto,
override val nameMatchingMode: KomfNameMatchingMode?,
override val mediaType: KomfMediaType,

override val authorRoles: Collection<KomfAuthorRole>,
override val artistRoles: Collection<KomfAuthorRole>,

val preferredLanguages: List<String>,
) : ProviderConf

@Serializable
data class AniListConfigDto(
override val priority: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ data class ProvidersConfigUpdateRequest(
val bangumi: PatchValue<ProviderConfigUpdateRequest> = PatchValue.Unset,
val comicVine: PatchValue<ProviderConfigUpdateRequest> = PatchValue.Unset,
val hentag: PatchValue<ProviderConfigUpdateRequest> = PatchValue.Unset,
val eHentai: PatchValue<EHentaiConfigUpdateRequest> = PatchValue.Unset,
val mangaBaka: PatchValue<MangaBakaConfigUpdateRequest> = PatchValue.Unset,
val webtoons: PatchValue<ProviderConfigUpdateRequest> = PatchValue.Unset,
)
Expand All @@ -126,6 +127,21 @@ class ProviderConfigUpdateRequest(
val artistRoles: PatchValue<Collection<KomfAuthorRole>> = PatchValue.Unset,
)

@Serializable
class EHentaiConfigUpdateRequest(
val priority: PatchValue<Int> = PatchValue.Unset,
val enabled: PatchValue<Boolean> = PatchValue.Unset,
val seriesMetadata: PatchValue<SeriesMetadataConfigUpdateRequest> = PatchValue.Unset,
val bookMetadata: PatchValue<BookMetadataConfigUpdateRequest> = PatchValue.Unset,
val nameMatchingMode: PatchValue<KomfNameMatchingMode> = PatchValue.Unset,
val mediaType: PatchValue<KomfMediaType> = PatchValue.Unset,

val authorRoles: PatchValue<Collection<KomfAuthorRole>> = PatchValue.Unset,
val artistRoles: PatchValue<Collection<KomfAuthorRole>> = PatchValue.Unset,

val preferredLanguages: PatchValue<List<String>> = PatchValue.Unset,
)

@Serializable
class AniListConfigUpdateRequest(
val priority: PatchValue<Int> = PatchValue.Unset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import snd.komf.api.config.AniListConfigDto
import snd.komf.api.config.AppriseConfigDto
import snd.komf.api.config.BookMetadataConfigDto
import snd.komf.api.config.DiscordConfigDto
import snd.komf.api.config.EHentaiConfigDto
import snd.komf.api.config.EventListenerConfigDto
import snd.komf.api.config.KavitaConfigDto
import snd.komf.api.config.KomfConfig
Expand Down Expand Up @@ -34,6 +35,7 @@ import snd.komf.notifications.apprise.AppriseConfig
import snd.komf.notifications.discord.DiscordConfig
import snd.komf.providers.AniListConfig
import snd.komf.providers.BookMetadataConfig
import snd.komf.providers.EHentaiConfig
import snd.komf.providers.MangaBakaConfig
import snd.komf.providers.MangaDexConfig
import snd.komf.providers.MetadataProvidersConfig
Expand Down Expand Up @@ -174,6 +176,7 @@ class AppConfigMapper {
bangumi = toDto(config.bangumi),
comicVine = toDto(config.comicVine),
hentag = toDto(config.hentag),
eHentai = toDto(config.eHentai),
mangaBaka = toDto(config.mangaBaka),
webtoons = toDto(config.webtoons),
)
Expand All @@ -192,6 +195,20 @@ class AppConfigMapper {
)
}

private fun toDto(config: EHentaiConfig): EHentaiConfigDto {
return EHentaiConfigDto(
nameMatchingMode = config.nameMatchingMode?.fromNameMatchingMode(),
priority = config.priority,
enabled = config.enabled,
mediaType = config.mediaType.fromMediaType(),
authorRoles = config.authorRoles.map { it.fromAuthorRole() },
artistRoles = config.artistRoles.map { it.fromAuthorRole() },
seriesMetadata = toDto(config.seriesMetadata),
bookMetadata = toDto(config.bookMetadata),
preferredLanguages = config.preferredLanguages,
)
}

private fun toDto(config: AniListConfig): AniListConfigDto {
return AniListConfigDto(
nameMatchingMode = config.nameMatchingMode?.fromNameMatchingMode(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import snd.komf.api.config.AniListConfigUpdateRequest
import snd.komf.api.config.AppriseConfigUpdateRequest
import snd.komf.api.config.BookMetadataConfigUpdateRequest
import snd.komf.api.config.DiscordConfigUpdateRequest
import snd.komf.api.config.EHentaiConfigUpdateRequest
import snd.komf.api.config.EventListenerConfigUpdateRequest
import snd.komf.api.config.KavitaConfigUpdateRequest
import snd.komf.api.config.KomfConfigUpdateRequest
Expand All @@ -31,6 +32,7 @@ import snd.komf.notifications.apprise.AppriseConfig
import snd.komf.notifications.discord.DiscordConfig
import snd.komf.providers.AniListConfig
import snd.komf.providers.BookMetadataConfig
import snd.komf.providers.EHentaiConfig
import snd.komf.providers.MangaBakaConfig
import snd.komf.providers.MangaDexConfig
import snd.komf.providers.MetadataProvidersConfig
Expand Down Expand Up @@ -153,6 +155,8 @@ class AppConfigUpdateMapper {
?.let { providerConfig(config.comicVine, it) } ?: config.comicVine,
hentag = patch.hentag.getOrNull()
?.let { providerConfig(config.hentag, it) } ?: config.hentag,
eHentai = patch.eHentai.getOrNull()
?.let { eHentaiProviderConfig(config.eHentai, it) } ?: config.eHentai,
mangaBaka = patch.mangaBaka.getOrNull()
?.let { mangaBakaProviderConfig(config.mangaBaka, it) } ?: config.mangaBaka,
webtoons = patch.webtoons.getOrNull()
Expand Down Expand Up @@ -186,6 +190,28 @@ class AppConfigUpdateMapper {
)
}

private fun eHentaiProviderConfig(config: EHentaiConfig, patch: EHentaiConfigUpdateRequest): EHentaiConfig {
return config.copy(
priority = patch.priority.getOrNull() ?: config.priority,
enabled = patch.enabled.getOrNull() ?: config.enabled,
mediaType = patch.mediaType.getOrNull()?.toMediaType() ?: config.mediaType,
authorRoles = patch.authorRoles.getOrNull()?.map { it.toAuthorRole() } ?: config.authorRoles,
artistRoles = patch.artistRoles.getOrNull()?.map { it.toAuthorRole() } ?: config.artistRoles,
seriesMetadata = patch.seriesMetadata.getOrNull()
?.let { seriesMetadataConfig(config.seriesMetadata, it) }
?: config.seriesMetadata,
bookMetadata = patch.bookMetadata.getOrNull()
?.let { bookMetadataConfig(config.bookMetadata, it) }
?: config.bookMetadata,
nameMatchingMode = when (val mode = patch.nameMatchingMode) {
PatchValue.None -> null
is PatchValue.Some -> mode.value.toNameMatchingMode()
PatchValue.Unset -> config.nameMatchingMode
},
preferredLanguages = patch.preferredLanguages.getOrNull() ?: config.preferredLanguages
)
}

private fun aniListProviderConfig(config: AniListConfig, patch: AniListConfigUpdateRequest): AniListConfig {
return config.copy(
priority = patch.priority.getOrNull() ?: config.priority,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ fun CoreProviders.fromProvider() = when (this) {
CoreProviders.BANGUMI -> KomfCoreProviders.BANGUMI
CoreProviders.BOOK_WALKER -> KomfCoreProviders.BOOK_WALKER
CoreProviders.COMIC_VINE -> KomfCoreProviders.COMIC_VINE
CoreProviders.EHENTAI -> KomfCoreProviders.EHENTAI
CoreProviders.HENTAG -> KomfCoreProviders.HENTAG
CoreProviders.KODANSHA -> KomfCoreProviders.KODANSHA
CoreProviders.MAL -> KomfCoreProviders.MAL
Expand All @@ -109,6 +110,7 @@ fun KomfProviders.toProvider() = when (this) {
KomfCoreProviders.BANGUMI -> CoreProviders.BANGUMI
KomfCoreProviders.BOOK_WALKER -> CoreProviders.BOOK_WALKER
KomfCoreProviders.COMIC_VINE -> CoreProviders.COMIC_VINE
KomfCoreProviders.EHENTAI -> CoreProviders.EHENTAI
KomfCoreProviders.HENTAG -> CoreProviders.HENTAG
KomfCoreProviders.KODANSHA -> CoreProviders.KODANSHA
KomfCoreProviders.MAL -> CoreProviders.MAL
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ class ConfigLoader(private val yaml: Yaml) {
config.metadataProviders.defaultProviders.bangumi.enabled.not() &&
config.metadataProviders.defaultProviders.comicVine.enabled.not() &&
config.metadataProviders.defaultProviders.hentag.enabled.not() &&
config.metadataProviders.defaultProviders.eHentai.enabled.not() &&
config.metadataProviders.defaultProviders.mangaBaka.enabled.not() &&
config.metadataProviders.defaultProviders.webtoons.enabled.not() &&
config.metadataProviders.libraryProviders.isEmpty()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ enum class CoreProviders {
BANGUMI,
BOOK_WALKER,
COMIC_VINE,
EHENTAI,
HENTAG,
KODANSHA,
MAL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ data class ProvidersConfig(
val bangumi: ProviderConfig = ProviderConfig(),
val comicVine: ProviderConfig = ProviderConfig(),
val hentag: ProviderConfig = ProviderConfig(),
val eHentai: EHentaiConfig = EHentaiConfig(),
val mangaBaka: MangaBakaConfig = MangaBakaConfig(),
val webtoons: ProviderConfig = ProviderConfig(),
)
Expand All @@ -58,6 +59,21 @@ data class ProviderConfig(
val artistRoles: Collection<AuthorRole> = listOf(PENCILLER, INKER, COLORIST, LETTERER, COVER),
)

@Serializable
data class EHentaiConfig(
val priority: Int = 10,
val enabled: Boolean = false,
val seriesMetadata: SeriesMetadataConfig = SeriesMetadataConfig(),
val bookMetadata: BookMetadataConfig = BookMetadataConfig(),
val nameMatchingMode: NameMatchingMode? = null,
val mediaType: MediaType = MANGA,

val preferredLanguages: List<String> = listOf("en", "ja"),

val authorRoles: Collection<AuthorRole> = listOf(WRITER),
val artistRoles: Collection<AuthorRole> = listOf(PENCILLER, INKER, COLORIST, LETTERER, COVER),
)

@Serializable
data class MangaBakaConfig(
val priority: Int = 10,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ import snd.komf.providers.comicvine.ComicVineClient
import snd.komf.providers.comicvine.ComicVineMetadataMapper
import snd.komf.providers.comicvine.ComicVineMetadataProvider
import snd.komf.providers.comicvine.ComicVineRateLimiter
import snd.komf.providers.ehentai.EHentaiClient
import snd.komf.providers.ehentai.EHentaiMetadataMapper
import snd.komf.providers.ehentai.EHentaiMetadataProvider
import snd.komf.providers.hentag.HentagClient
import snd.komf.providers.hentag.HentagMetadataMapper
import snd.komf.providers.hentag.HentagMetadataProvider
Expand Down Expand Up @@ -260,6 +263,25 @@ class ProvidersModule(
}
)

/* Load limiting: 4-5 sequential requests usually okay before having to wait for ~5 seconds */
private val eHentaiClient = EHentaiClient(
baseHttpClientJson.config {
install(HttpRequestRateLimiter) {
interval = 6.seconds
eventsPerInterval = 4
allowBurst = true
}
install(HttpRequestRetry) {
defaultRetry()
}
},
baseHttpClientJson.config {
install(HttpRequestRetry) {
defaultRetry()
}
}
)

private val mangaBakaClient = MangaBakaApiClient(
baseHttpClientJson.config {
install(HttpRequestRateLimiter) {
Expand Down Expand Up @@ -411,6 +433,12 @@ class ProvidersModule(
defaultNameMatcher
),
hentagPriority = config.hentag.priority,
eHentai = createEHentaiMetadataProvider(
config.eHentai,
eHentaiClient,
defaultNameMatcher
),
eHentaiPriority = config.eHentai.priority,
mangaBaka = createMangaBakaMetadataProvider(
config = config.mangaBaka,
datasource = when (config.mangaBaka.mode) {
Expand Down Expand Up @@ -761,6 +789,28 @@ class ProvidersModule(
)
}

private fun createEHentaiMetadataProvider(
config: EHentaiConfig,
client: EHentaiClient,
defaultNameMatcher: NameSimilarityMatcher,
): EHentaiMetadataProvider? {
if (config.enabled.not()) return null

val eHentaiMetadataMapper = EHentaiMetadataMapper(
metadataConfig = config.seriesMetadata,
authorRoles = config.authorRoles,
preferredLanguages = config.preferredLanguages,
)

val ehentaiSimilarityMatcher: NameSimilarityMatcher =
config.nameMatchingMode?.let { nameSimilarityMatcher(it) } ?: defaultNameMatcher
return EHentaiMetadataProvider(
client,
eHentaiMetadataMapper,
ehentaiSimilarityMatcher,
config.seriesMetadata.thumbnail,
)
}

private fun createMangaBakaMetadataProvider(
config: MangaBakaConfig,
Expand Down Expand Up @@ -860,6 +910,9 @@ class ProvidersModule(
private val hentag: HentagMetadataProvider?,
private val hentagPriority: Int,

private val eHentai: EHentaiMetadataProvider?,
private val eHentaiPriority: Int,

private val mangaBaka: MangaBakaMetadataProvider?,
private val mangaBakaPriority: Int,

Expand All @@ -880,6 +933,7 @@ class ProvidersModule(
bangumi?.let { it to bangumiPriority },
comicVine?.let { it to comicVinePriority },
hentag?.let { it to hentagPriority },
eHentai?.let { it to eHentaiPriority },
mangaBaka?.let { it to mangaBakaPriority },
webtoons?.let { it to webtoonsPriority }
)
Expand All @@ -901,6 +955,7 @@ class ProvidersModule(
CoreProviders.BANGUMI -> bangumi
CoreProviders.COMIC_VINE -> comicVine
CoreProviders.HENTAG -> hentag
CoreProviders.EHENTAI -> eHentai
CoreProviders.MANGA_BAKA -> mangaBaka
CoreProviders.WEBTOONS -> webtoons
}
Expand Down
Loading