Coder Social home page Coder Social logo

komf's People

Contributors

dchawisher avatar dieseltech avatar edgehub-cloud avatar halkeye avatar rroler avatar snd-r avatar winggao avatar zachstultz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

komf's Issues

[Nautiljon] Issue with parsing of specific manga

Hello @Snd-R ,
Great project you have here, i love it ! And pricess integration with Nautiljon.
When trying to fetch information https://www.nautiljon.com/mangas/chobits.html, i get a java exception.
It seems related to the parsing of Origine : Japon - 2001 as shown in the following java exception :

java.time.format.DateTimeParseException: Text '2001' could not be parsed at index 2
	at java.base/java.time.format.DateTimeFormatter.parseResolved0(Unknown Source)
	at java.base/java.time.format.DateTimeFormatter.parse(Unknown Source)
	at java.base/java.time.LocalDate.parse(Unknown Source)
	at org.snd.metadata.nautiljon.NautiljonParser.parseVolumeOriginalReleaseDate(NautiljonParser.kt:225)
	at org.snd.metadata.nautiljon.NautiljonParser.parseVolume(NautiljonParser.kt:102)
	at org.snd.metadata.nautiljon.NautiljonClient.getVolume(NautiljonClient.kt:50)
	at org.snd.metadata.nautiljon.NautiljonMetadataProvider.getBookMetadata(NautiljonMetadataProvider.kt:52)
	at org.snd.metadata.nautiljon.NautiljonMetadataProvider.matchSeriesMetadata(NautiljonMetadataProvider.kt:42)
	at org.snd.komga.KomgaService.matchSeriesMetadata(KomgaService.kt:56)
	at org.snd.api.KomfController.matchSeries(KomfController.kt:56)
	at org.snd.api.KomfController.register$lambda-0$matchSeries(KomfController.kt:28)
	at io.javalin.core.security.SecurityUtil.noopAccessManager(SecurityUtil.kt:20)
	at io.javalin.http.JavalinServlet.addHandler$lambda-5(JavalinServlet.kt:115)
	at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:44)
	at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:39)
	at io.javalin.http.JavalinServlet.service$tryWithExceptionMapper(JavalinServlet.kt:131)
	at io.javalin.http.JavalinServlet.service$tryBeforeAndEndpointHandlers(JavalinServlet.kt:39)
	at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:87)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:179)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Unknown Source)

Thank you for looking over this :)

[Feature Request] Per Library Filter

Some users separate their manga from their light novels by having two separate libraries. Some light novels have adaptations that share the same or similar name. Prior to one of the newer updates that filters OUT light novels, when I would auto-identify my light novel library, most of my light novels would get identified as manga adaptations instead of light novels. There should be some sort of line for the app config along the lines of:

library:
     1:
          malFilter: "manga, manhwa" # Ex. "manga" "light novel" or "manhwa" or "manga, manhwa"
     2:
          malFilter: "light novel" # Ex. "manga" "light novel" or "manhwa" or "manga, manhwa"

The filter should only search for the types of books specified. So if I enter "manga, manhwa" for library 1, MAL only matches the books in library 1 with the manga and manhwa types on MAL. The main idea is to make this library-specific. You should be able to set this filter based on each individual library.

Filter lower rank tags for Anilist

Many long-running or popular entries on Anilist get tangentially related tags that only apply to a small part of the series by users on Anilist, resulting in a wall of tags being added. However, these tags do have percentages associated with them, indicating how central/relevant they are to the story.
If there was a filter to filter out tags below a certain threshold, it'd be a nice way to not have a bunch of junk tags for each entry since Komga doesn't have a tag power system in place.

Metadata providers for manhwa and webtoons

There are many popular manhwa and webtoons that have very limited metadata on anilist, mangaupdates and MAL. Adding official (?) or more robust metadata providers for these types of content would be great.

Cover art

Is there a way to have komf search for higher resolution covers? Some of mine are quite pixelated.

Feature request: Auto ordering volumes + chapters in same folder

Hello, I created a script to be able to order the manga volumes and chapters in a single directory to keep the reading order. Works very well with English releases.

My script was made fast and it's a bit messy, but now that komf adds metadata for each volume of the series, maybe the “order” and “sort order” fields could be modified at the time metadata is added.

Komf should reorder series every time is updated because new volumes maybe added (and should be at first position) and ignore if the metadata fields are locked.

I added a Metadata refresh to update cover if order changes but not sure if is the best option.

I leave my script here in case it helps, although I already say, it is quite dirty…

https://gistcdn.githack.com/johanderohan/4782b277e708768bb24e453a1dc05542/raw/e8cfaa769e7330f9544f99916943912cccde1b27/komga-autoorder.v1.0.js

Captura de pantalla 2022-10-30 a las 19 11 24

application.yml causing errors in command prompt and on komga server

i just updated to the latest version of komf and komf userscript

it can now no longer run in command line and if it does on my komga server it gives me errror code 500 when trying to match a manga

command prompt
\Downloads>java -jar komf-0.17.1.jar C:\Users\scott\Downloads\application.yml.txt
18:44:00.720 [main] INFO io.javalin.Javalin - Starting Javalin ...
18:44:00.769 [main] ERROR io.javalin.Javalin - Failed to start Javalin
18:44:00.770 [main] INFO io.javalin.Javalin - Stopping Javalin ...
18:44:00.771 [main] ERROR io.javalin.Javalin - Javalin failed to stop gracefully
java.util.concurrent.ExecutionException: java.lang.IllegalStateException: STOPPED
at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096)
at org.eclipse.jetty.server.Server.doStop(Server.java:490)
at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
at io.javalin.Javalin.stop(Javalin.java:207)
at io.javalin.Javalin.start(Javalin.java:179)
at io.javalin.Javalin.start(Javalin.java:148)
at org.snd.module.ServerModule.(ServerModule.kt:69)
at org.snd.module.AppModule.(AppModule.kt:40)
at org.snd.module.AppContext.refresh(AppContext.kt:38)
at org.snd.module.AppContext.init(AppContext.kt:28)
at org.snd.cli.Komf.run(Komf.kt:30)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:400)
at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:397)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:415)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:440)
at org.snd.ApplicationKt.main(Application.kt:18)
Caused by: java.lang.IllegalStateException: STOPPED
at org.eclipse.jetty.server.handler.ContextHandler.shutdown(ContextHandler.java:773)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
at org.eclipse.jetty.util.component.Graceful.shutdown(Graceful.java:146)
... 17 common frames omitted
18:44:00.773 [main] ERROR org.snd.Application - Failed to start the app
io.javalin.util.JavalinException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: STOPPED
at io.javalin.Javalin.stop(Javalin.java:211)
at io.javalin.Javalin.start(Javalin.java:179)
at io.javalin.Javalin.start(Javalin.java:148)
at org.snd.module.ServerModule.(ServerModule.kt:69)
at org.snd.module.AppModule.(AppModule.kt:40)
at org.snd.module.AppContext.refresh(AppContext.kt:38)
at org.snd.module.AppContext.init(AppContext.kt:28)
at org.snd.cli.Komf.run(Komf.kt:30)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:400)
at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:397)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:415)
at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:440)
at org.snd.ApplicationKt.main(Application.kt:18)
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: STOPPED
at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096)
at org.eclipse.jetty.server.Server.doStop(Server.java:490)
at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:132)
at io.javalin.Javalin.stop(Javalin.java:207)
... 14 common frames omitted
Caused by: java.lang.IllegalStateException: STOPPED
at org.eclipse.jetty.server.handler.ContextHandler.shutdown(ContextHandler.java:773)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
at org.eclipse.jetty.util.component.Graceful.shutdown(Graceful.java:146)
... 17 common frames omitted

[Bug] Crash on a Viz series with only one volume

I have a crash when I try to match the series PPPPPP using the Viz metadata plugin. Here is the stacktrace:

16:55:15.192 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService - attempting to match series "PPPPPP" MediaServerSeriesId(id=0B8CD5N6D3192)
16:55:16.026 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService - found match: "PPPPPP" from MANGA_UPDATES  ProviderSeriesId(id=17528809089)
16:55:16.054 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService - launching metadata aggregation using [ANILIST, YEN_PRESS, KODANSHA, VIZ]
16:55:16.054 [komf-meta-aggregator-4] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using KODANSHA
16:55:16.054 [komf-meta-aggregator-1] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using YEN_PRESS
16:55:16.054 [komf-meta-aggregator-3] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using VIZ
16:55:16.054 [komf-meta-aggregator-2] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using ANILIST
16:55:16.337 [komf-meta-aggregator-2] INFO org.snd.mediaserver.MetadataService - found match: "PPPPPP" from ANILIST  ProviderSeriesId(id=139358)
16:55:16.775 [komf-meta-aggregator-4] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using KODANSHA
16:55:17.221 [komf-meta-aggregator-1] INFO org.snd.mediaserver.MetadataService - searching "PPPPPP" using YEN_PRESS
16:55:17.388 [komf-meta-aggregator-4] INFO org.snd.mediaserver.MetadataService - searching "Pipipipipipi" using KODANSHA
16:55:17.624 [komf-meta-aggregator-1] INFO org.snd.mediaserver.MetadataService - searching "Pipipipipipi" using YEN_PRESS
Exception in thread "komf-event-listener-1" java.util.concurrent.CompletionException: java.lang.IllegalStateException: can't find link to all books
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: can't find link to all books
	at org.snd.metadata.providers.viz.VizParser.parseLinkToAllBooks(VizParser.kt:125)
	at org.snd.metadata.providers.viz.VizParser.parseBook(VizParser.kt:90)
	at org.snd.metadata.providers.viz.VizClient.getBook-vXDvI5U(VizClient.kt:54)
	at org.snd.metadata.providers.viz.VizMetadataProvider.matchSeriesMetadata(VizMetadataProvider.kt:55)
	at org.snd.mediaserver.MetadataService$getAggregationMetadata$3.invoke(MetadataService.kt:231)
	at org.snd.mediaserver.MetadataService$getAggregationMetadata$3.invoke(MetadataService.kt:231)
	at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:210)
	at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:170)
	at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:194)
	at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
	at kotlin.sequences.SequencesKt___SequencesKt.firstOrNull(_Sequences.kt:168)
	at org.snd.mediaserver.MetadataService.getAggregationMetadata(MetadataService.kt:237)
	at org.snd.mediaserver.MetadataService.aggregateMetadataFromProviders$lambda$25$lambda$24(MetadataService.kt:210)
	... 4 more

Error : Required value 'alternateTitles' missing at $.metadata

Hi, i ave this error when i add a new book in komga :

15:34:15.453 [main] WARN org.snd.config.ConfigLoader - No metadata providers enabled. You will not be able to get new metadata
15:34:16.772 [main] INFO io.javalin.Javalin - Starting Javalin ...
15:34:16.947 [main] INFO io.javalin.Javalin - Listening on http://localhost:8085/
15:34:16.961 [main] INFO io.javalin.Javalin - You are running Javalin 5.2.0 (released November 20, 2022).
15:34:16.963 [main] INFO io.javalin.Javalin - Javalin started in 191ms \o/
15:34:18.957 [OkHttp http://192.168.1.100:10110/...] INFO org.snd.mediaserver.komga.KomgaEventListener - connected to komga on http://192.168.1.100:10110/
Exception in thread "komf-event-listener-1" com.squareup.moshi.JsonDataException: Required value 'alternateTitles' missing at $.metadata
at com.squareup.moshi.internal.Util.missingProperty(Util.java:660)
at org.snd.mediaserver.komga.model.dto.KomgaSeriesMetadataJsonAdapter.fromJson(KomgaSeriesMetadataJsonAdapter.kt:154)
at org.snd.mediaserver.komga.model.dto.KomgaSeriesMetadataJsonAdapter.fromJson(KomgaSeriesMetadataJsonAdapter.kt:25)
at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:41)
at org.snd.mediaserver.komga.model.dto.KomgaSeriesJsonAdapter.fromJson(KomgaSeriesJsonAdapter.kt:72)
at org.snd.mediaserver.komga.model.dto.KomgaSeriesJsonAdapter.fromJson(KomgaSeriesJsonAdapter.kt:22)
at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:41)
at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:205)
at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:70)
at org.snd.mediaserver.komga.KomgaClient.getSeries-4X2igCU(KomgaClient.kt:269)
at org.snd.mediaserver.komga.KomgaMediaServerClientAdapter.getSeries-iuyh2M0(KomgaMediaServerClientAdapter.kt:36)
at org.snd.mediaserver.MetadataService.matchSeriesMetadata-iuyh2M0(MetadataService.kt:108)
at org.snd.mediaserver.komga.KomgaEventListener.processEvents(KomgaEventListener.kt:132)
at org.snd.mediaserver.komga.KomgaEventListener.onEvent$lambda$6$lambda$5(KomgaEventListener.kt:118)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

My config :

komga:
  baseUri: http://192.168.1.100:10110 #or env:KOMF_KOMGA_BASE_URI
  komgaUser: [email protected] #or env:KOMF_KOMGA_USER
  komgaPassword: password #or env:KOMF_KOMGA_PASSWORD
  eventListener:
    enabled: true # if disabled will not connect to komga and won't pick up newly added entries
    libraries: [ ]  # listen to all events if empty
  notifications:
    libraries: [ ]  # Will send notifications if any notification source is enabled. If empty will send notifications for all libraries
discord:
  webhooks: [https://discord.com/api/webhooks/MASQUED
  seriesCover: true # include series cover in message. Requires imgurClientId
  imgurClientId: MASQUED
  templatesDirectory: "./" #path to a directory with discordWebhook.vm template
database:
  file: ./database.sqlite #database file location.
server:
  port: 8085 #or env:KOMF_SERVER_PORT
logLevel: INFO #or env:KOMF_LOG_LEVEL

And i don't receive the notif on discord

Thanks

[Feature Request] Add Book Name Log on `INFO` Level Log When Auto Identify and Manual Identify

Currently, INFO level log only show Series log like this:

08:36:39.551 [JettyServerThreadPool-93] INFO org.snd.mediaserver.MetadataService - attempting to match series "Boku no Hero Academia" MediaServerSeriesId(id=0BD6WG32B275F)
08:36:42.126 [JettyServerThreadPool-93] INFO org.snd.mediaserver.MetadataService - found match: "Boku no Hero Academia" from MANGA_UPDATES  ProviderSeriesId(id=63868402874)
08:44:04.765 [JettyServerThreadPool-93] INFO org.snd.mediaserver.MetadataService - finished metadata update of series "Boku no Hero Academia" MediaServerSeriesId(id=0BD6WG32B275F)

DEBUG level log show log like this:

09:08:50.810 [JettyServerThreadPool-26] INFO org.snd.mediaserver.MetadataService - attempting to match series "Grand Blue" MediaServerSeriesId(id=0BD6WG1BF2AHK)
09:08:50.810 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - --> POST https://api.mangaupdates.com/v1/series/search (192-byte body)
09:08:51.268 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - <-- 200 https://api.mangaupdates.com/v1/series/search (457ms, unknown-length body)
09:08:51.270 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - --> GET https://api.mangaupdates.com/v1/series/65672018770
09:08:51.669 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - <-- 200 https://api.mangaupdates.com/v1/series/65672018770 (398ms, unknown-length body)
09:08:51.671 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - --> GET https://cdn.mangaupdates.com/image/i389071.jpg
09:08:51.989 [JettyServerThreadPool-26] DEBUG org.snd.module.MetadataModule - <-- 200 https://cdn.mangaupdates.com/image/i389071.jpg (317ms, 13027-byte body)
09:08:52.055 [JettyServerThreadPool-26] INFO org.snd.mediaserver.MetadataService - found match: "Grand Blue" from MANGA_UPDATES  ProviderSeriesId(id=65672018770)
09:08:52.056 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - --> GET http://localhost:8080/api/v1/series/0BD6WG1BF2AHK/books?unpaged=true
09:08:52.076 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - <-- 200 http://localhost:8080/api/v1/series/0BD6WG1BF2AHK/books?unpaged=true (19ms, 23273-byte body)
09:08:52.092 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : select SERIES_THUMBNAILS.SERIES_ID, SERIES_THUMBNAILS.SERVER_TYPE, SERIES_THUMBNAILS.THUMBNAIL_ID from SERIES_THUMBNAILS where (SERIES_THUMBNAILS.SERIES_ID = ? and SERIES_THUMBNAILS.SERVER_TYPE = ?)
09:08:52.093 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : select SERIES_THUMBNAILS.SERIES_ID, SERIES_THUMBNAILS.SERVER_TYPE, SERIES_THUMBNAILS.THUMBNAIL_ID from SERIES_THUMBNAILS where (SERIES_THUMBNAILS.SERIES_ID = '0BD6WG1BF2AHK' and SERIES_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:08:52.095 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +---------+-----------+------------+
09:08:52.096 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : |SERIES_ID|SERVER_TYPE|THUMBNAIL_ID|
09:08:52.096 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : +---------+-----------+------------+
09:08:52.097 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched row(s)           : 0
09:08:52.097 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - --> GET http://localhost:8080/api/v1/series/0BD6WG1BF2AHK/thumbnails
09:08:52.104 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - <-- 200 http://localhost:8080/api/v1/series/0BD6WG1BF2AHK/thumbnails (6ms, 2-byte body)
09:08:52.105 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : delete from SERIES_THUMBNAILS where (SERIES_THUMBNAILS.SERIES_ID = ? and SERIES_THUMBNAILS.SERVER_TYPE = ?)
09:08:52.106 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : delete from SERIES_THUMBNAILS where (SERIES_THUMBNAILS.SERIES_ID = '0BD6WG1BF2AHK' and SERIES_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:08:52.108 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Affected row(s)          : 0
09:08:52.442 [HikariPool-1 housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Pool stats (total=1, active=0, idle=1, waiting=0)
09:08:52.442 [HikariPool-1 housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0).
09:09:12.454 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : select BOOK_THUMBNAILS.BOOK_ID, BOOK_THUMBNAILS.SERVER_TYPE, BOOK_THUMBNAILS.SERIES_ID, BOOK_THUMBNAILS.THUMBNAIL_ID from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = ? and BOOK_THUMBNAILS.SERVER_TYPE = ?)
09:09:12.455 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : select BOOK_THUMBNAILS.BOOK_ID, BOOK_THUMBNAILS.SERVER_TYPE, BOOK_THUMBNAILS.SERIES_ID, BOOK_THUMBNAILS.THUMBNAIL_ID from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = '0BD6WG1BF2AHM' and BOOK_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:09:12.456 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +-------+-----------+---------+------------+
09:09:12.456 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : |BOOK_ID|SERVER_TYPE|SERIES_ID|THUMBNAIL_ID|
09:09:12.457 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : +-------+-----------+---------+------------+
09:09:12.457 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched row(s)           : 0
09:09:12.458 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - --> GET http://localhost:8080/api/v1/books/0BD6WG1BF2AHM/thumbnails
09:09:12.464 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - <-- 200 http://localhost:8080/api/v1/books/0BD6WG1BF2AHM/thumbnails (5ms, 84-byte body)
09:09:12.465 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : delete from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = ? and BOOK_THUMBNAILS.SERVER_TYPE = ?)
09:09:12.466 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : delete from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = '0BD6WG1BF2AHM' and BOOK_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:09:12.467 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Affected row(s)          : 0
09:09:22.444 [HikariPool-1 housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Pool stats (total=1, active=0, idle=1, waiting=0)
09:09:22.444 [HikariPool-1 housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Fill pool skipped, pool has sufficient level or currently being filled (queueDepth=0).
09:09:25.121 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : select BOOK_THUMBNAILS.BOOK_ID, BOOK_THUMBNAILS.SERVER_TYPE, BOOK_THUMBNAILS.SERIES_ID, BOOK_THUMBNAILS.THUMBNAIL_ID from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = ? and BOOK_THUMBNAILS.SERVER_TYPE = ?)
09:09:25.121 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : select BOOK_THUMBNAILS.BOOK_ID, BOOK_THUMBNAILS.SERVER_TYPE, BOOK_THUMBNAILS.SERIES_ID, BOOK_THUMBNAILS.THUMBNAIL_ID from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = '0BD6WG1BF2AHN' and BOOK_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:09:25.122 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +-------+-----------+---------+------------+
09:09:25.122 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : |BOOK_ID|SERVER_TYPE|SERIES_ID|THUMBNAIL_ID|
09:09:25.123 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener -                          : +-------+-----------+---------+------------+
09:09:25.123 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Fetched row(s)           : 0
09:09:25.123 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - --> GET http://localhost:8080/api/v1/books/0BD6WG1BF2AHN/thumbnails
09:09:25.129 [JettyServerThreadPool-26] DEBUG org.snd.module.MediaServerModule - <-- 200 http://localhost:8080/api/v1/books/0BD6WG1BF2AHN/thumbnails (5ms, 84-byte body)
09:09:25.130 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Executing query          : delete from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = ? and BOOK_THUMBNAILS.SERVER_TYPE = ?)
09:09:25.132 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : delete from BOOK_THUMBNAILS where (BOOK_THUMBNAILS.BOOK_ID = '0BD6WG1BF2AHN' and BOOK_THUMBNAILS.SERVER_TYPE = 'KOMGA')
09:09:25.132 [JettyServerThreadPool-26] DEBUG org.jooq.tools.LoggerListener - Affected row(s)          : 0

Eventhough it's logging book level, it's only show the book ID which not really human readable.

It would be nice if Book Name also got logged but in INFO level log similar to Series Name Log to know the progress of auto identify and manual identify especially in ComicInfo update mode where it could take a bit time to identify large series/library.

Kodansha - Uncaught exception

Fails to get metadata from https://kodansha.us/series/that-time-i-got-reincarnated-again-as-a-workaholic-slime.

17:42:56.691 [JettyServerThreadPool-27] INFO org.snd.komga.KomgaMetadataService - attempting to match series "That Time I Got Reincarnated (Again!) as a Workaholic Slime" KomgaSeriesId(id=09YHNT2RQN9RV)

17:42:57.372 [JettyServerThreadPool-27] INFO org.snd.komga.KomgaMetadataService - found match: "That Time I Got Reincarnated (Again!) as a Workaholic Slime" from ANILIST  ProviderSeriesId(id=114566)

17:42:57.420 [pool-2-thread-2] INFO org.snd.komga.KomgaMetadataService - searching "That Time I Got Reincarnated (Again!) as a Workaholic Slime" using VIZ

17:42:57.420 [pool-2-thread-4] INFO org.snd.komga.KomgaMetadataService - searching "That Time I Got Reincarnated (Again!) as a Workaholic Slime" using YEN_PRESS

17:42:57.420 [pool-2-thread-3] INFO org.snd.komga.KomgaMetadataService - searching "That Time I Got Reincarnated (Again!) as a Workaholic Slime" using KODANSHA

17:42:57.420 [pool-2-thread-1] INFO org.snd.komga.KomgaMetadataService - searching "That Time I Got Reincarnated (Again!) as a Workaholic Slime" using MANGA_UPDATES

17:42:57.704 [pool-2-thread-2] INFO org.snd.komga.KomgaMetadataService - searching "Tensei shitemo Shachiku Datta Ken" using VIZ

17:42:59.084 [pool-2-thread-1] INFO org.snd.komga.KomgaMetadataService - found match: "Tensei Shite mo Shachiku Datta Ken" from MANGA_UPDATES  ProviderSeriesId(id=37056750840)

17:42:59.859 [pool-2-thread-4] INFO org.snd.komga.KomgaMetadataService - found match: "That Time I Got Reincarnated as a Slime" from YEN_PRESS  ProviderSeriesId(id=9781975313500/that-time-i-got-reincarnated-as-a-slime-vol-1-manga)

17:43:06.119 [JettyServerThreadPool-27] WARN io.javalin.Javalin - Uncaught exception

java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: No enum constant org.snd.metadata.providers.kodansha.model.Status.COMPLETE

	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)

	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)

	at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)

	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

	at java.base/java.lang.Thread.run(Unknown Source)

Caused by: java.lang.IllegalArgumentException: No enum constant org.snd.metadata.providers.kodansha.model.Status.COMPLETE

	at java.base/java.lang.Enum.valueOf(Unknown Source)

	at org.snd.metadata.providers.kodansha.model.Status.valueOf(KodanshaSeries.kt)

	at org.snd.metadata.providers.kodansha.KodanshaParser.parseSeries(KodanshaParser.kt:59)

	at org.snd.metadata.providers.kodansha.KodanshaClient.getSeries(KodanshaClient.kt:38)

	at org.snd.metadata.providers.kodansha.KondanshaMetadataProvider.getSeries(KondanshaMetadataProvider.kt:61)

	at org.snd.metadata.providers.kodansha.KondanshaMetadataProvider.matchSeriesMetadata(KondanshaMetadataProvider.kt:52)

	at org.snd.komga.KomgaMetadataService.getAggregationMetadata(KomgaMetadataService.kt:389)

	at org.snd.komga.KomgaMetadataService.aggregateMetadataFromProviders$lambda-31$lambda-30(KomgaMetadataService.kt:372)

	... 4 common frames omitted

Setting DIfferent Rules for Different Libraries

I couldn't find anywhere to ask a komf question other than here. If I need to move elsewhere, please tell me.

If it is possible to set different rules for different libraries, I haven't figured out how to do it. For example, I have three libraries now Comics (for western comics) that I want to have default to left-to-right, Manga (for manga, manhwa, etc.) which should default to right-to-left, and Webtoons which should default to webtoon view.

If this can't be done currently then you can call this a feature request. I have figured out that I can run three copies of komf in docker each linked to a single library but running three instances feels a bit wasteful of system resources if it can be done in one.

Feature request: Allow option to chose series title if provider has multiple ones

Hi, I've recently installed Komf and it's working pretty good for the most part.

I've chosen to use the AniList metadata provide, and I noticed that some series were getting their official English title instead of the Romaji one, even though AniList shows the Romaji one as the main series title.

I looked at the code and saw that the Romaji title was only used if there wasn't an English one. An option to choose the preferred title on the application.yml would be greatly appreciated.

UnkownPropertyException with example config

I tried to make my config (based on the example config)

komga:
  baseUri: http://localhost:8080 #or env:KOMF_KOMGA_BASE_URI
  komgaUser: [email protected] #or env:KOMF_KOMGA_USER
  komgaPassword: pass #or env:KOMF_KOMGA_PASSWORD
  eventListener:
    enabled: false # if disabled will not connect to komga and won't pick up newly added entries
    libraries: [ ]  # listen to all events if empty
  notifications:
    libraries: [ ]  # Will send notifications if any notification source is enabled. If empty will send notifications for all libraries
  aggregateMetadata: true #if enabled will search and aggregate metadata from all configured providers
  metadataUpdate:
    # Update modes is the way komf will update metadata.
    # If you're using anything other than API then your existing files might be modified with embedded metadata
    modes: [ COMIC_INFO ] # can use multiple options at once. available options are API, COMIC_INFO
    bookThumbnails: false # update book thumbnails
    seriesThumbnails: false # update series thumbnails
    seriesTitle: true # update series title
    titleType: LOCALIZED # "LOCALIZED" "ROMAJI" or "NATIVE"
    readingDirectionValue: RIGHT_TO_LEFT # override reading direction for all series. should be one of these: LEFT_TO_RIGHT, RIGHT_TO_LEFT, VERTICAL, WEBTOON
    languageValue: en # set default language for series. Must use BCP 47 format e.g. "en"
    orderBooks: true # will order books using parsed volume or chapter number
kavita:
  baseUri: "http://localhost:5000" #or env:KOMF_KAVITA_BASE_URI
  apiKey: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" #or env:KOMF_KAVITA_API_KEY
  eventListener:
    enabled: true # if disabled will not connect to kavita and won't pick up newly added entries
    libraries: [ ]  # listen to all events if empty
  notifications:
    libraries: [ ]  # Will send notifications if any notification source is enabled. If empty will send notifications for all libraries
  aggregateMetadata: true #if enabled will search and aggregate metadata from all configured providers
  metadataUpdate:
    # Update modes is the way komf will update metadata.
    # If you're using anything other than API then your existing files might be modified with embedded metadata
    modes: [ COMIC_INFO ] # can use multiple options at once. available options are API, COMIC_INFO
    bookThumbnails: false #update book thumbnails
    seriesThumbnails: false #update series thumbnails
    seriesTitle: true #update series title
    titleType: LOCALIZED # Can be "LOCALIZED" "ROMAJI" or "NATIVE". Sets Localized Name api field and series comicinfo field.
    languageValue: en # set default language for series. Must use BCP 47 format e.g. "en"
discord:
  webhooks: #list of discord webhook urls. Will call these webhooks after series or books were added
  templatesDirectory: "./" #path to a directory with discordWebhook.vm template
database:
  file: ./database.sqlite #database file location.
metadataProviders:
  mangaUpdates:
    priority: 80
    enabled: true
    seriesMetadata:
      useOriginalPublisher: false
  mal: #requires clientId. See https://myanimelist.net/forum/?topicid=1973077
    clientId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    priority: 80
    enabled: true
  nautiljon:
    priority: 90
    enabled: true
  aniList:
    priority: 80
    enabled: true
  yenPress:
    priority: 20
    enabled: true
  kodansha:
    priority: 20
    enabled: true
  viz:
    priority: 20
    enabled: true
  bookWalker:
    priority: 80
    enabled: true
server:
  port: 8085 #or env:KOMF_SERVER_PORT
logLevel: INFO #or env:KOMF_LOG_LEVEL

output:

18:28:18.198 [main] ERROR org.snd.Application - Failed to start the app
com.charleskorn.kaml.UnknownPropertyException: Unknown property 'titleType'. Known properties are: bookThumbnails, mode, modes, readingDirectionValue, seriesThumbnails, seriesTitle
        at com.charleskorn.kaml.YamlObjectInput.throwUnknownProperty(YamlObjectInput.kt:73)
        at com.charleskorn.kaml.YamlObjectInput.decodeElementIndex(YamlObjectInput.kt:43)
        at org.snd.config.MetadataUpdateConfig$$serializer.deserialize(AppConfig.kt:49)
        at org.snd.config.MetadataUpdateConfig$$serializer.deserialize(AppConfig.kt:49)
        at kotlinx.serialization.encoding.Decoder$DefaultImpls.decodeSerializableValue(Decoding.kt:257)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:16)
        at com.charleskorn.kaml.YamlInput.decodeSerializableValue(YamlInput.kt:103)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at org.snd.config.KomgaConfig$$serializer.deserialize(AppConfig.kt:21)
        at org.snd.config.KomgaConfig$$serializer.deserialize(AppConfig.kt:21)
        at kotlinx.serialization.encoding.Decoder$DefaultImpls.decodeSerializableValue(Decoding.kt:257)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:16)
        at com.charleskorn.kaml.YamlInput.decodeSerializableValue(YamlInput.kt:103)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at org.snd.config.AppConfig$$serializer.deserialize(AppConfig.kt:10)
        at org.snd.config.AppConfig$$serializer.deserialize(AppConfig.kt:10)
        at kotlinx.serialization.encoding.Decoder$DefaultImpls.decodeSerializableValue(Decoding.kt:257)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:16)
        at com.charleskorn.kaml.YamlInput.decodeSerializableValue(YamlInput.kt:103)
        at com.charleskorn.kaml.Yaml.decodeFromReader(Yaml.kt:54)
        at com.charleskorn.kaml.Yaml.decodeFromString(Yaml.kt:43)
        at org.snd.infra.ConfigLoader.loadConfig(ConfigLoader.kt:17)
        at org.snd.cli.Komf.run(Komf.kt:32)
        at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:198)
        at com.github.ajalt.clikt.parsers.Parser.parse(Parser.kt:18)
        at com.github.ajalt.clikt.core.CliktCommand.parse(CliktCommand.kt:400)
        at com.github.ajalt.clikt.core.CliktCommand.parse$default(CliktCommand.kt:397)
        at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:415)
        at com.github.ajalt.clikt.core.CliktCommand.main(CliktCommand.kt:440)
        at org.snd.ApplicationKt.main(Application.kt:18)

I tried to comment out all titleType, languageValue and orderBooks fields, which cause the exception and now app starts

komga:
  baseUri: http://localhost:8080 #or env:KOMF_KOMGA_BASE_URI
  komgaUser: [email protected] #or env:KOMF_KOMGA_USER
  komgaPassword: pass #or env:KOMF_KOMGA_PASSWORD
  eventListener:
    enabled: false # if disabled will not connect to komga and won't pick up newly added entries
    libraries: [ ]  # listen to all events if empty
  notifications:
    libraries: [ ]  # Will send notifications if any notification source is enabled. If empty will send notifications for all libraries
  aggregateMetadata: true #if enabled will search and aggregate metadata from all configured providers
  metadataUpdate:
    # Update modes is the way komf will update metadata.
    # If you're using anything other than API then your existing files might be modified with embedded metadata
    modes: [ COMIC_INFO ] # can use multiple options at once. available options are API, COMIC_INFO
    bookThumbnails: false # update book thumbnails
    seriesThumbnails: false # update series thumbnails
    seriesTitle: true # update series title
    # titleType: LOCALIZED # "LOCALIZED" "ROMAJI" or "NATIVE"
    readingDirectionValue: RIGHT_TO_LEFT # override reading direction for all series. should be one of these: LEFT_TO_RIGHT, RIGHT_TO_LEFT, VERTICAL, WEBTOON
    # languageValue: en # set default language for series. Must use BCP 47 format e.g. "en"
    # orderBooks: true # will order books using parsed volume or chapter number
kavita:
  baseUri: "http://localhost:5000" #or env:KOMF_KAVITA_BASE_URI
  apiKey: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" #or env:KOMF_KAVITA_API_KEY
  eventListener:
    enabled: true # if disabled will not connect to kavita and won't pick up newly added entries
    libraries: [ ]  # listen to all events if empty
  notifications:
    libraries: [ ]  # Will send notifications if any notification source is enabled. If empty will send notifications for all libraries
  aggregateMetadata: true #if enabled will search and aggregate metadata from all configured providers
  metadataUpdate:
    # Update modes is the way komf will update metadata.
    # If you're using anything other than API then your existing files might be modified with embedded metadata
    modes: [ COMIC_INFO ] # can use multiple options at once. available options are API, COMIC_INFO
    bookThumbnails: false #update book thumbnails
    seriesThumbnails: false #update series thumbnails
    seriesTitle: true #update series title
    # titleType: LOCALIZED # Can be "LOCALIZED" "ROMAJI" or "NATIVE". Sets Localized Name api field and series comicinfo field.
    # languageValue: en # set default language for series. Must use BCP 47 format e.g. "en"
discord:
  webhooks: #list of discord webhook urls. Will call these webhooks after series or books were added
  templatesDirectory: "./" #path to a directory with discordWebhook.vm template
database:
  file: ./database.sqlite #database file location.
metadataProviders:
  mangaUpdates:
    priority: 80
    enabled: true
    seriesMetadata:
      useOriginalPublisher: false
  mal: #requires clientId. See https://myanimelist.net/forum/?topicid=1973077
    clientId: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    priority: 80
    enabled: true
  nautiljon:
    priority: 90
    enabled: true
  aniList:
    priority: 80
    enabled: true
  yenPress:
    priority: 20
    enabled: true
  kodansha:
    priority: 20
    enabled: true
  viz:
    priority: 20
    enabled: true
  bookWalker:
    priority: 80
    enabled: true
server:
  port: 8085 #or env:KOMF_SERVER_PORT
logLevel: INFO #or env:KOMF_LOG_LEVEL

Did the mentioned fields' names change or are they not supported anymore?

[Nautiljon] Enhancement : Pick French publisher over Japanease one

Hello @Snd-R ,
Taking into consideration that people searching for french metadata fetch will most likely possess french translated manga, i tought it would make sense if you could pick French publishers over japanease ones.
I've discussed with Gotson (creator of Komga) on having both publishers but he believes it should be unique (or create another tag for other publishers).
eg : Choosing Pika over Kodansha here
Screenshot_20220401_204921

Thank you for your hard work

Feature Request: Option for seriesTitle

Option for seriesTitle to update both the Localized name and the name in Kavita instead of just the localized name.
This should NOT apply to the sort names, only names and localized names.

Rate limiting issue with MAL

Two requests per second is too fast for MAL, after a while MAL will rate limit you (breaking komf). Could you try bumping it down to one per second?

Feature request: Option to filter names before searching / Change auto identification name to title

Some directory names are 'Manganame (2022) (Digital) (Groupname)' and renaming them is not an option. Kavita automatically filters all names so only 'Manganame' remains.
Komga doesn't do that the name of the series is 'Manganame (2022) (Digital) (Groupname)', so an option in application.yml would be appreciated.
Simply allowing everything in parenthesis to be excluded from search would be enough, since most automatic identifications don't work currently.

Edit: I used the Komga API to rename all series but it was useless since komf uses 'name' and not 'title'. That should be changed. The name can only be changed if you change the directory name. Title can be changed in webui and API. It is the same as name except if you manually change it. So it shouldn't break anything for users. (interestingly enough the userscript uses title when manually identifying)
Please change the source from name to title.

[Feature Request] Please add adult manga site support

As someone who mainly uses Kavita to compile and read doujins, I'd love to be able to easily fetch metadata for hentai manga and incorporate them into my library, but it seems KOMF currently doesn't support adult manga sites.
Unfortunately, most doujinshi and hentai manga are not listed on the standard anime databases like MAL.
Please consider adding support for adult manga sites like nhentai.net, hitomi.la, e-hentai.org.

Nautiljon - Sequence is empty

Hello, I update Komf to 0.6.1 and I have this error with some Mangas.
Before with Komf 0.4.5 Scrap is good, after this version, it crash :(

For "Family Compo" or "Ai non stop !" :

java.util.NoSuchElementException: Sequence is empty.
        at kotlin.sequences.SequencesKt___SequencesKt.first(_Sequences.kt:111)
        at org.snd.metadata.nautiljon.NautiljonParser.parseEditionVolumes(NautiljonParser.kt:283)
        at org.snd.metadata.nautiljon.NautiljonParser.parseVolumes(NautiljonParser.kt:272)
        at org.snd.metadata.nautiljon.NautiljonParser.parseSeries(NautiljonParser.kt:89)
        at org.snd.metadata.nautiljon.NautiljonClient.getSeries(NautiljonClient.kt:39)
        at org.snd.metadata.nautiljon.NautiljonMetadataProvider.getSeriesMetadata(NautiljonMetadataProvider.kt:22)
        at org.snd.komga.KomgaService.setSeriesMetadata(KomgaService.kt:45)
        at org.snd.api.KomfController.identifySeries(KomfController.kt:44)
        at org.snd.api.KomfController.register$lambda-0$identifySeries(KomfController.kt:27)
        at io.javalin.core.security.SecurityUtil.noopAccessManager(SecurityUtil.kt:20)
        at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96)
        at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43)
        at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43)
        at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:98)
        at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85)
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
        at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85)
        at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-10$lambda-9(JavalinServletHandler.kt:112)
        at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684)
        at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662)
        at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168)
        at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:112)
        at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85)
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
        at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85)
        at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:179)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:516)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
        at java.base/java.lang.Thread.run(Thread.java:833)

Allow setting a default language.

It would be nice to be able to set the default language like you are able to set the default reading direction.
I recently moved from komi to komf and this is the only feature I miss from it.

Feature Request: Search w/o Brackets included in the search

I leave the ripper tags in the file folder names for each of my entries, so search fails a lot of the time. If a failed search can be retried without any words within brackets {}, [], () to be safe, it could improve the success rate of searches.

Feature request: Add a configuration field Reading direction

It would be great to have the possibility to indicate the reading direction directly in the komf configuration and force the update of the field if the field is not locked.

With this komf would be perfect. Congratulations on this gorgeous application!

Bangumi metadata provider (Chinese)

First of all, thanks for working on this wonderful project :)

Wonder if anyone is interested in metadata providers in Chinese. Bangumi is a good one. I did some poking and have something working for myself on Kavita (see screenshot for Full Metal Alchemist). Can tidy it up for a pull request if this seems valuable.

image

[Feature Request] Please consider adding a tag for mean score

Hello,
I would love having an indicator of the mean score of a specific series available on Komga, with the value being scraped from one of the providers Komf is already supporting.

For example, For Berserk on MyAnimeList, we have the mean score of :
image
It would be great to have the int value of 9 as a tag, for example tag:"rating: 9"

The benefit from this feature is to be able to filter, sort series by mean score so that it can give us a better visibility on series we still haven't read that may be worth it.

It would be great also to have the choice of the source to get that info from (Nautiljon, MyAnimelist, Anilist, ..)
Thank you for considering it.

[error] [error] [error]

11:46:29.375 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService -- searching "Platinum Blood" using MANGADEX
11:46:30.472 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService -- found match: "プラチナ・ブラッド" from MANGADEX ProviderSeriesId(id=5249812c-9e9b-4797-a188-f9e5fd740ac0)
11:46:30.472 [komf-event-listener-1] INFO org.snd.mediaserver.MetadataService -- launching metadata aggregation using [MANGA_UPDATES, ANILIST, YEN_PRESS, KODANSHA, VIZ, BOOK_WALKER]
11:46:30.473 [komf-meta-service-3] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using MANGA_UPDATES
11:46:30.473 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using YEN_PRESS
11:46:30.473 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using ANILIST
11:46:30.473 [komf-meta-service-1] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using KODANSHA
11:46:30.942 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "白金之血" using YEN_PRESS
11:46:31.011 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "白金之血" using ANILIST
11:46:31.180 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using VIZ
11:46:31.264 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "プラチナ・ブラッド" using BOOK_WALKER
11:46:31.506 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "白金之血" using VIZ
11:46:31.723 [komf-meta-service-1] INFO org.snd.mediaserver.MetadataService -- searching "白金之血" using KODANSHA
11:46:32.093 [komf-meta-service-3] INFO org.snd.mediaserver.MetadataService -- found match: "Platinum Blood" from MANGA_UPDATES ProviderSeriesId(id=9151322570)
11:46:35.959 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "白金之血" using BOOK_WALKER
Exception in thread "komf-event-listener-1" java.lang.NullPointerException
at org.snd.mediaserver.MetadataService.mergeMetadata(MetadataService.kt:279)
at org.snd.mediaserver.MetadataService.aggregateMetadataFromProviders(MetadataService.kt:266)
at org.snd.mediaserver.MetadataService.matchSeriesMetadata-APDQdY8(MetadataService.kt:135)
at org.snd.mediaserver.komga.KomgaEventListener.processEvents(KomgaEventListener.kt:133)
at org.snd.mediaserver.komga.KomgaEventListener.onEvent$lambda$6$lambda$5(KomgaEventListener.kt:119)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

Feature request: Add a swagger page

Since this project is API only, I think it would be neat to have a swagger page with the endpoints, so we can call them without needing postman or curl!

See the following documentation on Swagger/OpenApi for javalin: https://javalin.io/plugins/openapi

It could serve as documentation as well as a way to easily call the endpoints.

Let me know what you think!

I’m also on the Komga discord if you want to talk there.

Doesn't reset series thumbnails in Kavita

If I reset metadata it works as expected for all metadata but the thumbnails.
Even if i restart Kavita so it probably isn't just in the cache.

Expected behavior: Reset thumbnail to standard. Standard being first page of first book in the series. (Which is still saved by Kavita like in Komga)
Actual behavior: Thumbnail stays the same as the one downloaded.

It works as expected in Komga.

Book metadata for non-volume release If book metadata isn't found

Currently, if komf can't get any book metadata and only got series metadata (e.g. mangaupdates) it will look for first volume (by filename) and write series metadata to it. With current behaviour, non-volume releases (e.g. manhwa) won't have desc in the first chapter if book metadata isn't found.

One of the way to solve this is by adding a fallback, if volume is not found in the filename, then use first file alphabetically in the series.

(reported on discord, just move this to github)

It adds completed manga as ongoing

Hi I started using komf yesterday, everything was fine, but today for some reason it's adding completed manga as ongoing.
OS: Arch Linux komf:0.18.2 komga: 0.160.0
Running komga with systemd for all users (system-wide) (java -jar komga) , Running komf systemd as well (java -jar komf.jar --config-dir=/home/user/komf)
https://termbin.com/9fo36 application yml

bypassing .cbz archives with prior comicinfo.xml

I have mentioned this before on discord, but it would be cool if there was a way for komga to skip over cbzs in a folder that already contained a comicinfo.xml to save time and compute when adding files to komga.

Feature Request: Merge tags/genres/etc

Hi, thanks for komf, really useful software.

I have a feature request, kind of an add-on to metadata aggregation: I would like to be able to merge fields such as tags and genres across providers. So for example, komf would grab all of the tags from anilist, then add all of the tags from mangaupdates, filtering out dupes.

Remember last metadata provider for future scans

Currently komf picks up metadata when new books are added to a library or a scan is manually initiated and will use closest match or exact matching based on file name. If set to exact, many series do not get picked up and if using closest match the series may grab another closely named series (i.e. matching A Certain Scientific Accelerator to A Certain Scientific Railgun).

If there was a way to have komf use the latest ID match (wether manually or automatically) to match future scans when books are added it would save the user from needing to manually scan improperly matched sources.

Tags and genres not being applied

Hello, when using it everything works great, but genres and tags do not stay.
I do not know if this is its intended behavior. What made me open this issue is that, when metadata is being applied (by manually identifying, for example) I can see tags and genres being applied for a split second in the background, but are then removed.
Either way, this is mere curiosity in case something's wrong on my end.
Thank you very much for your amazing work, it truly is a blessing.

Feature request: Allow Komf to write a comicinfo file after fetching metadata

If Komf was able to write the fetched metadata fields into a comicinfo.xml or json file this would help with migrating large libraries when copying the sqlite file is not possible. This could also be used a backup in case the db gets corrupted/overwritten. This could also help reduce metadata processing if series with comicinfo files are skipped unless forced.

  • This option could be enabled through the application.yml
  • The location could be to any set folder though the application.yml (if that's easier to implement than writing it into the series folder)
  • It doesn't need to embed it into every cbz, just one copy of the comicinfo is needed

Hope you consider this. Thanks

Western Comic Metadata Providers

Is there a chance to have any western comic metadata providers added to komf? I have separate libraries in Komga for my manga and comics and while this is the second program I've found for updating my manga metadata, I haven't found one to handle my comic metadata. If that's outside of the scope of this application that's fine, I'll just use this one for my manga and look for something else for my comics.

Thanks for your assistance here!

[Issue/Bug] Komf seems to be ignoring AniList staff roles when their language is set to anything other than Japanese

Like the title says - I've gotten the issue to reproduce on multiple Korean titles (e.g. Jungle Juice), I initially thought it was a different issue because of a false positive (FFF-class Trashero) but I've since sent a language correction to AniList (the author was misattributed as Japanese) so that should be just as broken if my submission goes through.

Suggestion: whitelist at least Korean and Chinese for staff roles (i.e Story, Art, Story & Art, Illustration)

[more][error][error][error]

22:21:04.614 [JettyServerThreadPool-985] INFO org.snd.mediaserver.MetadataService -- launching metadata aggregation using [MANGA_UPDATES, ANILIST, YEN_PRESS, KODANSHA, VIZ, BOOK_WALKER]
22:21:04.615 [komf-meta-service-3] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using MANGA_UPDATES
22:21:04.615 [komf-meta-service-1] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using ANILIST
22:21:04.615 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using YEN_PRESS
22:21:04.615 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using KODANSHA
22:21:04.947 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using VIZ
22:21:04.956 [komf-meta-service-1] INFO org.snd.mediaserver.MetadataService -- searching "Osu!! Karate Bu" using ANILIST
22:21:05.039 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "Osu!! Karate Bu" using VIZ
22:21:05.106 [komf-meta-service-2] INFO org.snd.mediaserver.MetadataService -- searching "Osu!! Karate Bu" using YEN_PRESS
22:21:05.165 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "押忍!!空手部" using BOOK_WALKER
22:21:05.565 [komf-meta-service-4] INFO org.snd.mediaserver.MetadataService -- searching "Osu!! Karate Bu" using BOOK_WALKER
22:21:06.448 [komf-meta-service-3] INFO org.snd.mediaserver.MetadataService -- found match: "Osu!! Karatebu" from MANGA_UPDATES ProviderSeriesId(id=17066145969)
22:21:06.448 [JettyServerThreadPool-985] WARN io.javalin.Javalin -- Uncaught exception
java.lang.NullPointerException: null
at org.snd.metadata.providers.kodansha.KodanshaParser.parseSearchResults(KodanshaParser.kt:23)
at org.snd.metadata.providers.kodansha.KodanshaClient.searchSeries(KodanshaClient.kt:31)
at org.snd.metadata.providers.kodansha.KodanshaMetadataProvider.matchSeriesMetadata(KodanshaMetadataProvider.kt:52)
at org.snd.mediaserver.MetadataService$matchSeries$4.invoke(MetadataService.kt:177)
at org.snd.mediaserver.MetadataService$matchSeries$4.invoke(MetadataService.kt:177)
at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:210)
at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:170)
at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:194)
at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:214)
at kotlin.sequences.SequencesKt___SequencesKt.firstOrNull(_Sequences.kt:168)
at org.snd.mediaserver.MetadataService.matchSeries(MetadataService.kt:183)
at org.snd.mediaserver.MetadataService.aggregateMetadataFromProviders$lambda$29$lambda$28(MetadataService.kt:261)
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)

[Feature Request] OPF Metadata Update Mode for EPUB files

Light Novel support has been added since v0.19.0 and stabilized in v0.20.0, but currently it's only target API to update the metadata. One of file format usually used for light novel is EPUB, which store metadata in OPF file inside the EPUB archive.

It would be nice if it's also possible to write metadata into the OPF file directly similar to how we can write metadata into ComicInfo file in CBZ files.

Something to keep in mind is that EPUB 2 and EPUB 3 have a bit different way to store certain metadata1.

Footnotes

  1. https://wiki.kavitareader.com/en/guides/managing-your-files/ebooks

Series not added to the Sqlite database

Running Komf and Kavita latest version in docker, arch64, ubuntu 20.04.

Komf works perfectly with kavita, it adds metadata and works as intended, but I wasn't sure how it works for old series till I realized it must add the info in the db created in the config volume.

It doesn't seem to add metadata to series as they're added in Kavita, but the manual trigger with the userscript and command line works fine.
What buffles me the most is that series don't get added to the database, hence every time I run a new scan for metadata, it starts at 0. (It created the db file with the predefined template when I installed Komf, but nothing else get added to it)

Notifications for Discord also don't work; it worked once, but I'm not sure why it doesn't anymore (I think it must be database-related too).
Permissions are good too.
I tried looking at the logs for the problem, but it doesn't show anything weird; it shows connected, pings Kavita, receives metadata, and sends metadata to Kavita.
Only once did I see some incompatibility with arch64 when I reinstalled it (especially with the sources that were feathered at the beginning for sqlite and jar), but I can't see the logs for it anymore.
Could it be that the sources for compiling are not fully compartible with arch64? I'm not sure what other information I can provide, sadly.

Failed to start the app - Migrations have failed validation

Hello,

I reset my installation and I failed to start Komf :(

Komga version : release 0.157.0
Komf version : release 0.4.4

Launch method : java -jar komf.jar application.yml

Logs:
c:\Komga>java -jar komf.jar application.yml
16:20:13.091 [main] INFO org.flywaydb.core.internal.license.VersionPrinter - Flyway Community Edition 8.5.10 by Redgate
16:20:13.093 [main] INFO org.flywaydb.core.internal.license.VersionPrinter - See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#8.5.10
16:20:13.097 [main] INFO org.flywaydb.core.internal.license.VersionPrinter -
16:20:13.266 [main] INFO org.flywaydb.core.internal.database.base.BaseDatabaseType - Database: jdbc:sqlite:C:\Users\himura95.komga\database.sqlite (SQLite 3.36)
16:20:13.304 [main] ERROR org.snd.Application - Failed to start the app
org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
Detected resolved migration not applied to database: 1.
To ignore this migration, set -ignoreIgnoredMigrations=true. To allow executing this migration, set -outOfOrder=true.
Detected resolved migration not applied to database: 2.
To ignore this migration, set -ignoreIgnoredMigrations=true. To allow executing this migration, set -outOfOrder=true.
Detected resolved migration not applied to database: 3.
To ignore this migration, set -ignoreIgnoredMigrations=true. To allow executing this migration, set -outOfOrder=true.
Need more flexibility with validation rules? Learn more: https://rd.gt/3AbJUZE
at org.flywaydb.core.Flyway$1.execute(Flyway.java:130)
at org.flywaydb.core.Flyway$1.execute(Flyway.java:124)
at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:205)
at org.flywaydb.core.Flyway.migrate(Flyway.java:124)
at org.snd.ApplicationKt.applyMigrations(Application.kt:40)
at org.snd.ApplicationKt.main(Application.kt:26)

I can start Komf If I compile with .outOfOrder(true) in Application.kt but It's not a solution if I want to stay update with coming version.

Have you an Idea ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.