snd-r / komf Goto Github PK
View Code? Open in Web Editor NEWKomga and Kavita metadata fetcher
License: MIT License
Komga and Kavita metadata fetcher
License: MIT License
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?
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.
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.
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.
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.
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.
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 :
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.
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!
As far I understand, currently orderBooks
feature only applied via API. It would be nice if it's also written into <Number>
metadata in ComicInfo
when using COMIC_INFO
modes
so the data will not be lost if the file is used on another Komga instance and also usable in other reader that support parsing ComicInfo
metadata.
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!
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
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?
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.
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)
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)
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.
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 ?
Hi,
In nautiljon, we can have multiple editions for a same manga.
Example:
https://www.nautiljon.com/mangas/astro+boy.html
We can see 4 edition for this series.
How can bind the correct edition to a komga series?
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
Thank you for your hard work
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.
Hope you consider this. Thanks
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.
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.
Both Kavita and Komga are included in the https://github.com/ScoopInstaller/Extras bucket. Would be nice if komf was also available.
They do have a guide on how to do it here: https://github.com/ScoopInstaller/Scoop/wiki/App-Manifests
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.
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.
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
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.
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.
Is there a way to have komf search for higher resolution covers? Some of mine are quite pixelated.
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.
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.
Both MangaUpdates and AniList can return a name with native language.
It would be nice to have a option to enable this.
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.
Currently komf cannot pull metadata from providers that list multiple volumes together. Adding this functionality to allow book description would be a great addition to komf.
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…
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.
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
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.
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.
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 :)
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.
Some entries have characters with special characters in them, like if a title has the word Café or if it's Lucky★Star. Currently, the auto matcher errors on these titles and the aggregate filters entries with titles with non ascii printable characters.
https://cdn.discordapp.com/attachments/985838635783954492/1079580606297538680/message.txt
Logs of one instance where the auto matcher error'd
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
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)
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)
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)
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.