github coconautilus17/LibraForge v0.3.0

3 hours ago

Upgrade notes

  • Metadata Forge no longer needs an Audible login. The new Audible public
    catalog (no login)
    provider searches Audible directly. If you picked
    Audiobookshelf as the provider only because Audible wanted a login, switch to
    the public catalog: on a 2,898-book library it matched more books and made
    fewer wrong matches than the ABS provider (2 wrong against 16). A login is
    still needed to download your own Audible library.
  • Series-only books are searched again. Books applied in series-only mode
    (only the series could be confirmed) are retried on the next normal run
    instead of being skipped, and their tags stop carrying another book's ASIN,
    ISBN or subtitle (see Fixes).
  • Goodreads no longer needs abs-tract. Metadata Forge reads Goodreads
    directly. abs-tract is now only used for Kindle covers, so if you ran it only
    for Goodreads you can remove it. (#452)
  • Books Audible doesn't match are looked up in AudioSilo. When Audible
    finds no confident match, Metadata Forge searches AudioSilo's community
    audiobook database before Goodreads, on every run. It sends that book's title
    and author to meta.audiosilo.app unless Settings > AudioSilo points it at a
    copy you run yourself. (#487)

New Features

  • Audible public catalog: Metadata Forge and M4B Tool offer Audible public
    catalog (no login)
    next to Audible (your account), with a marketplace
    picker (US, UK, CA, AU, DE, FR, IT, ES, IN, JP) remembered per browser. With no
    login the picker starts on the public catalog, an account pick switches to it
    with a notice, and the two pages no longer send a first-time user to Settings.
    Chapter Forge and the Audible comparison use the public catalog too when there
    is no login. (#395, #411)
  • Structured title and author search: Audible and Audiobookshelf searches
    start with the book's title and first author as separate fields, which finds
    listings keyword search misses (Postwar by Tony Judt, Enemy Contact by Mike
    Maden), then fall back to keyword queries. (#392, #418)
  • Embedded ASIN lookup in Audiobookshelf mode: a file's own ASIN is looked
    up directly in ABS mode too, as it already was with Audible; it ends the
    search only when the runtime agrees, so a stale ASIN from another edition
    can still lose to the right listing. ABS results also carry language and
    publisher now. (#392)
  • Author folder as an author clue: an untagged book under Author/Title or
    Author/Series/Book takes its author from that folder (never from a staging
    folder like _unorganized). The folder only fills a missing author and never
    vetoes a candidate. (#396)
  • Audiobookshelf cleanup flags: fix-series-book-number-suffix.py --abs-series cleans baked-in book numbers in ABS's own series records, and
    normalize-author-names.py --abs-authors applies the author-name scheme
    inside ABS (books, empty records renamed or deleted, data-bearing records
    adopted). ABS re-reads its own metadata on rescan, so cleaning only tags and
    sidecars never stuck. Both are logged and revertable. (#364, #365)
  • Folder Forge review alerts: new run-level checks flag a cut-off title, a
    repeated folder name, a longer series variant, an author spelled two ways in
    one series ("Kei Takano" vs "Kei Tadano"), mixed Book/Vol./Volume labels, the
    same ASIN twice, and a book number without a series. Derivation-only reasons
    show as notes, blocked items are counted separately, and cards show full
    source and destination paths. The reason filter lists only reasons that have
    moves under the current search and filters, with a count each. (#354, #413)
  • Enrichment Forge genre conflict warnings: when genres that exclude each
    other both reach the vote (Non-Fiction and a fiction genre, or Young Adult
    and Children's), the series shows a warning with each side's book count and
    which one was kept. In a batch those series are listed under Needs review and
    left unticked. When one book's own sources disagree, the side with more
    evidence wins for that book instead of the series vote treating it as a tie.
    Classics and Humor sit beside Non-Fiction without counting as a conflict.
    (#436)
  • Genre collections Audiobookshelf can open: ABS loads every book in a
    collection at once, so a 2,664-book Fantasy collection (49 MB) wouldn't open.
    A genre over 600 books is now made into numbered parts ("LitRPG 1",
    "LitRPG 2"), split between authors so a series stays in one part. LitRPG and
    Cultivation books stay out of the Fantasy and Sci-Fi collections. Non-Fiction
    is offered by subject (History, Politics, Philosophy and more) instead of as
    one shelf. A collection LibraForge made can be deleted from the list, and one
    the plan replaces is removed on apply. The page shows how many books the
    ticked collections hold. (#454)
  • Goodreads read directly: Metadata Forge's Goodreads fallback, ebook
    matching and Manual Review search read Goodreads' own public data, the same
    way Enrichment Forge's shelves do, instead of going through abs-tract. (#452)
  • Books Audible's search hides: Audible's search leaves out books that
    can't be bought where the request comes from (a title sold only in the US and
    Canada never shows up in a search from elsewhere), while a lookup by ASIN
    still returns them. When Audible finds no confident match, Metadata Forge now
    reads the book's own series listing, which names every book in it, and looks
    them all up by ASIN; then it searches AudioSilo's community database, whose
    pick is confirmed on Audible so the details written are Audible's own. On 118
    benchmark books that matched nothing before, this found 12, each the right
    recording (Hellstrom's Hive, Theft of Swords, Rise of Empire). With a
    signed-in account, what search shows depends on the account, so one account
    can see these books while another can't. (#487)
  • AudioSilo settings: a new Settings section takes the URL of your own
    copy of AudioSilo's database (the audiosilo-meta container), with Save and
    verify. Left empty, the public service is used. (#487)
  • Audiobook Guild first for its authors: a book by an author Audiobook
    Guild sells is matched there before Audible, from the store's catalog kept
    locally and refreshed weekly, with each book's runtime read from its page.
    A match keeps the file's own series name, ASIN and year, which the store
    doesn't list. (#469)

Fixes

  • Series-only matches stay series-only: a match that only confirms the
    series (a novella, an omnibus or the next volume of the same series) no
    longer writes that book's ASIN, ISBN or subtitle; the file keeps its own, and
    an ASIN left by an earlier series-only write is dropped. A series-only
    candidate no longer ends the search either, so a later query can still find
    the book itself. (#412)
  • Tags that contradict the audio go to review: when a file's tags (embedded
    ASIN and narrator) name one recording but its runtime matches another
    listing of the same title within 1%, the book is held for review instead of
    applied to the tagged recording (Jack Reacher rips tagged as the Jeff Harding
    edition holding the Scott Brick audio). (#419)
  • Different recordings keep the file's own fields: a match that is the same
    book in another recording no longer writes that recording's ASIN, cover,
    release year or ISBN, and such books are retried on later runs. A narrator
    tag that names a reader the listing doesn't have caps the match below full
    confidence, so the file's actual recording wins when it is among the
    results; group credits ("et al.") no longer count as a narrator. (#394)
  • Book range folders: a folder like "Books 1-3" or "Books 1 thru 3" is no
    longer read as book 3, which made the right omnibus score zero. A pack
    folder's range is no longer part of the series name either. (#410, #414)
  • Near-identical titles: titles that differ by one word on each side ("The
    Secondary Phase" vs "Tertiary Phase") no longer override a series number
    conflict, so the next book of the series can't win on title similarity.
    (#416)
  • Author spelled differently from Audible: the file's own author credit
    ("Pegaz A" for Audible's "Pegaz") is no longer mistaken for a narrator, which
    made the right listing look like another recording and kept a dead embedded
    ASIN. (#415)
  • Series name in the artist tag: an author tag that is just the series or
    album name ("The Starsea Cycle") counts as no author, so the Author/ folder
    applies instead of vetoing every real listing. (#417)
  • Series from the Audible subtitle: when Audible's series field is empty,
    the series named in the subtitle ("(Series, Book N)", "Volume N in the X
    series") is used, in Metadata Forge and Folder Forge alike. (#421)
  • Books in several Audible series: a listing in more than one series
    (Mage Errant and The Aetheriad, The Cosmere and The Stormlight Archive) got
    whichever one Audible listed first, and Audible changes that order between
    requests, so a book's series could change from run to run. The series the
    file already names now wins, then a numbered series over an unnumbered
    umbrella, and the series name and number always come from the same series
    (no more "The Cosmere 4"). (#430)
  • Enrichment Forge without a login: with no Audible login it searched
    through ABS's Audible provider, which returns less of what the genre vote
    uses. It now searches the Audible public catalog, and falls back to ABS only
    when Audible fails. (#429)
  • Enrichment Forge keeps every genre: a genre a source names is kept even
    when LibraForge's genre table doesn't list it (Folk Tales & Myths, LGBTQ+,
    Ideologies & Doctrines), under the source's own spelling. Only scrap is
    dropped: format words ("Audiobook", "Audio Book", "Hörbuch"), misspellings of
    them, and keyword strings that aren't genres. Non-fiction subjects
    (Philosophy, Economics, Health, Law, Religion and more) and Audible's top
    category now vote Non-Fiction with the subject as a subgenre, so Plato's
    Republic is no longer Historical Fiction. A novel Audible also shelves under
    a subject (Dungeon Crawler Carl under Music) stays fiction, AudioSilo's genre
    slugs ("health-wellness") map to the right genres, and the "Science Fiction &
    Fantasy" umbrella in ABS genres no longer votes Fantasy. Goodreads and Open
    Library keep their limits, since those sources return too many shelves.
    (#431, #432)
  • Genres in other languages: genres from Audible's other stores and
    languages ("Ciencia e ingeniería", "Fantasía", "Abenteuer") vote as their
    English genre plus its top-level category, so "Enfermedad física y
    trastornos" votes Health & Wellness and Non-Fiction. LibraForge learns the
    names from Audible's own category lists (US Spanish, Spain, Germany, France,
    Canada, Italy, Japan) and refreshes them monthly in the background. Italian
    and Japanese genres are recognized but left out of the vote, so they are
    never written under their foreign name. A foreign genre is never kept as
    your own, in Enrichment Forge or Metadata Forge. (#434, #442, #445)
  • Audio dramas aren't Non-Fiction: Audible files radio and audio dramas
    under Arts & Entertainment, which voted Non-Fiction on its own and put
    conflict warnings on full-cast editions (Red Rising, The Murderbot
    Diaries). Only its subjects (Art, Music, Film) vote Non-Fiction now. (#447)
  • Enrichment Forge and dead ASINs: a book whose ASIN Audible no longer has
    is searched by title and author instead of getting no Audible data. (#433)
  • Genres from an earlier match aren't yours: genres an earlier ABS or
    Audible match wrote to a book were treated as your own edits and pinned,
    blocking the vote (43 series in one library). Genres that came
    from the book's own listing are now voted on like any other source. (#435)
  • Junk genres aren't yours either: format words, misspellings and keyword
    strings already sitting in Audiobookshelf ("Audbioook", "Speech") were kept
    as your own genres. They are now replaced, along with cut-off pieces of
    genres ("men&#8217", "s Adventure") and descriptions ("A Dungeon Core
    Experience"). "Arts & Entertainment Film Philosophy" splits into its two
    genres, and subjects that are always non-fiction (Society, Self-Help,
    Literary Criticism) vote Non-Fiction on their own. (#443, #446)
  • Enrichment Forge books without an ASIN: these took Audible's first search
    result unchecked, often another book (The Catcher in the Rye got a study
    guide). They now use Metadata Forge's own pick, so the runtime settles between
    editions. If nothing passes, the author's own listing is used, never another
    author's. In one library, 134 of 260 such books get Audible data, and
    Hitchhiker's radio phases match the right phase. (#449, #451)
  • Publisher in an author or title: a credit like "BBC - Terry Jones" or a
    title ending in " - BBC Radio" is read as the person or title alone, using
    the publisher list, in every tool. A surname that is also a publisher name
    ("Stella Blackstone") is kept. (#451)
  • Enrichment Forge's own writes don't vote again: genres it wrote to
    Audiobookshelf were counted as a source on the next run, so it voted for its
    own output. 222 series got Progression Fantasy back as a main genre this way.
    Progression Fantasy is now only a subgenre, with LitRPG or Cultivation as the
    main genre. (#453)
  • Adult categories don't vote an audience: Audible reuses names like
    Family Life, Friendship and Occult under adult categories, and those voted
    Children's, Young Adult or Horror on their own (Dean Koontz's Watchers as
    Children's). They are subgenres now. A glued store genre written by an
    earlier match is no longer pinned as your own. (#449, #450)
  • Goodreads shelf counts: counts Goodreads sends as decimals ("181.0") were
    read as 0, so those shelves were dropped from the vote. (#452)
  • Hyphenated titles and credit-list authors: "The X-Files - Cold Cases" keeps
    its title instead of being read as title "The X-Files" by author "Cold Cases",
    and an author tag listing several people is kept over a guess from the folder
    name. (#390)
  • Title cleanup: a trailing descriptor is kept when removing it would leave
    a fragment ("Book 2 of a LitRPG Apocalypse" no longer becomes "Book 2 of"),
    and a bracket opened but never closed in a title is closed or dropped before
    it reaches tags and folder names. (#355, #366)
  • Folder Forge planning: a loose file whose destination already holds a book
    of the same kind is reported as a conflict instead of becoming a "-2" copy
    (--merge-existing-targets keeps the old merge). Roman "Book III" labels,
    series-equal-to-title names and leading "Book N -" labels no longer repeat in
    folder names, series prefix/suffix stripping no longer leaves fragments, and
    "Series, Book N - Title" folders keep the title as the title. (#354, #414)
  • Folder Forge sidecar ownership: a loose file no longer takes its folder's
    libraforge.json when that belongs to another book, so study-guide ebooks
    beside an audiobook stop resolving to its title and blocking each other, and
    loose books 02 and 03 stop taking book 01's number. A moved, copied or
    converted book keeps its own sidecar, and manual edits and Fix Series reach
    a converted book's grouped sidecar. An ebook of the same work beside its
    audiobook still reads the audiobook's record. (#356, #359)
  • Folder Forge moves report failed for no reason: when an audiobook and its
    ebook share a folder, the second move no longer fails on the libraforge.json
    or cover the first already took, and the emptied source folder is removed.
    (#425)
  • Covers and notes left behind: a book that is alone in its folder now takes
    every companion file with it (folder.jpg, info.txt, .cue, .nfo, .m3u and the
    like), not only files named after the book. In a folder holding several
    books those files stay put, since they can't be assigned. (#426)
  • Ebooks in Folder Forge: an epub and pdf with the same name in one folder
    are one book; two different editions that resolve to one folder get their
    own labelled folder instead of one being skipped; an epub with no tags gives
    its author and title from inside the file; and an ebook matches its
    audiobook across "Vol. 5" / "Volume 05" / "Book 5" spellings and subtitles.
    (#357, #367, #371, #372)
  • Folder Forge review reasons: title-identity conflicts ignore release-code
    names, honorifics, subtitle-only differences and Audible file stems, and
    label-only differences and path-inferred authors are notes, matching the
    suspicion report. (#414)
  • Smaller matching fixes: an omnibus title like "Books 1-3" or "Book 1 & 2"
    is recognised as an omnibus; " - Book N" titles count as generic;
    "1.0" keeps its decimal; a two-author prefix is removed from a title; a
    "Series - Book N - Title" folder is no longer read as author and series;
    "End of chapter N" announcements are not taken as chapter markers; a trailing
    year in a subtitle is not a book number; and a failed metadata restore is
    counted instead of stopping the run. (#389, #414)
  • A folder that names only the series: a "Book 1 - Master of the Arena"
    folder no longer replaces the file's own title (DOMINUS) with the series
    name, which also made the exact Audible listing count as series-only. (#486)
  • Series numbers kept: a series-only match no longer clears the file's
    book number, a full match in the same series with no number keeps it, and
    decimal numbers ("2.5", "14.5") are written as they are. A number is never
    written without a series. (#476, #479, #480)
  • Series in a listing's title: a listing titled "Bloodborn (Ard's Oath
    Book 3)" with no series field now gives the series and number, and the title
    is written without them. (#480)
  • Narrator kept when the listing has none: a match whose listing names no
    narrator keeps the file's narrator instead of clearing it. (#477)
  • Author in the narrator tag: a narrator tag holding the author's name or a
    placeholder ("Misc") no longer makes the right listing look like another
    recording. Co-authors are compared one by one. (#478)
  • File names as titles: a title tag that is a file or track name ("01
    Monster Core", underscores) is no longer written over the listing's title.
    (#481)
  • Goodreads titles: a Goodreads title ending in an unnumbered series ("(The
    Expanse)") is written without it, and titles naming two series are read.
    (#482)
  • Series placeholder titles: a title tag that only names the series and
    number ("The Riyria Revelations 03") is searched by the title in the file
    name ("Nyphron Rising"), and a folder repeating a title's number beats the
    file's part number ("Percepliquis 01" is book 6). A "Series NN" title only
    matches books of that series. (#465, #466, #471)
  • Other books with similar details: titles that each have words the other
    lacks are two books ("Mistborn - Collected Tales" vs "Secret History"), a
    shared surname under another given name is another author (Frank Herbert vs
    Brian Herbert), and a listing whose own title numbers another book is that
    book. (#463, #464, #470)
  • Book 2 matched as Book 1: an album that is the title without its number
    ("King of Superheroes" for "King of Superheroes 2") is the series again, so
    the book keeps its number. (#462)
  • Box sets and standalones written again: a box set whose runtime matches
    the whole set is written whatever its title says ("The Vesik Series"), and a
    standalone with a book number in its folder name ("Snow Crash; Book 01") is
    no longer held back. (#460, #461)
  • Author folders: in "Author/Author; Title; Book 01" the author folder is
    no longer read as the series. (#459)
  • Placeholders are not data: a file tagged with the NOREALASIN placeholder
    is no longer looked up by it or left with it, a publisher (GraphicAudio) is
    never written as the narrator, and "Misc" or "N/A" counts as no author in
    Metadata Forge and Folder Forge alike. (#467, #468, #474)
  • Goodreads needs no connection: choosing Goodreads no longer sends you to
    Settings when there is no Audible login or Audiobookshelf. (#458)

Docs

  • User and developer docs split: the README and docs/features.md cover
    using LibraForge; docs/developer/ covers architecture, data and files, and
    testing. Both were checked against the code. (#397)
  • Metadata providers guide: the Start Here guide explains each metadata
    provider and when to pick it, its no-login banner no longer says an auth file
    is required, and the README and docs describe the public catalog. (#411)
  • Smaller Docker image: the test suite and the dev/ developer tools
    (matching benchmark, chapter layout checker) are left out of the image.
    (#423, #428)
  • How a book is looked up: the docs list Metadata Forge's lookup steps in
    order, the checks before anything is written, and why Audible's search can
    miss a book that its ASIN still finds. (#492)
  • Product Model: product-model/ describes who LibraForge serves, what it
    keeps and the business rules it must keep true, in plain Markdown kept with
    the code (pdd-kit), now including the lookup order and the AudioSilo settings. It
    isn't part of the image. (#472, #493)

Don't miss a new LibraForge release

NewReleases is sending notifications on new releases.