caedmon5/bibnow: v2.1.0 — duplicate detection, preprints, and accumulated mapping fixes

Read full text
Authors: Daniel Paul O'Donnell
Cited by: 0

Abstract

Everything committed since v2.0.2 (25 August 2025). Backward-compatible: no input that worked before needs changing, though preprints should now be typed as such. New Duplicate detection before upload. Bibnow now checks whether a work is already in the library and skips it if so, reporting the existing item, its Zotero link, and the evidence the match was made on. Previously nothing prevented a second copy of an already-filed work. Matching is strongest-evidence-first: exact DOI, then ISBN, then title + first-author surname + year (strict on the title, lenient on the year, since preprints and grey literature are dated inconsistently across sources). --allow-duplicates files anyway. The check runs against a local index rather than the search endpoint, because Zotero's q parameter does not index the DOI or ISBN fields — searching for a DOI that is demonstrably present on an item returns nothing. The index is cached in .zotero-index.json and refreshed incrementally via ?since= , with /deleted applied so removed items cannot raise false alarms. First build takes several minutes on a large library; steady state is a single request. If the library cannot be reached, the run warns and proceeds — a network failure must never read as "no duplicates found". Preprint support. CSL preprint (a local extension — CSL 1.0.2 has no such type) and Crossref's posted-content both map to Zotero's preprint item, with publisher → Repository, number → Archive ID, and genre → Type. Preprints were previously filed as journalArticle with the server left as loose text in extra. User-provided full text is stored as a Zotero child note on the created item. Fixed input.txt was opened as a bare relative path, so which file was read depended on the working directory: running the script from the repository root read ./input.txt, while running it from v2/ read v2/input.txt. A stale scratch file could be processed in place of the intended entries with no indication anything was wrong. Both loaders now resolve against the repository root, and the load message prints the path. Citekeys no longer contain spaces when the creator is a literal name such as "Wikipedia contributors". "et al" in Obsidian filenames now counts authors rather than all creators, so a single-author book with two editors is no longer filed as "Author et al". CSL date-parts are zero-padded to ISO 8601 across map_issued_date, extract_year_from_issued, and map_access_date; the last also accepts date-parts rather than raw dates only. Field mapping for web-based source types: container-title extended to broadcast, blog, forum, and webpage; genre mapped to presentationType/postType/letterType and the rest; new mappers for volume, issue, edition, ISBN, ISSN, number, medium, place, numPages, series; publisher mapped to network/distributor/studio/company for media types; a missing comma in the standard_keys set. Zotero's dateAdded is recorded as date_added in the Obsidian frontmatter. Note on call numbers call-number continues to land in Zotero's extra rather than the callNumber field. This is deliberate: a populated callNumber marks a physical copy held, so auto-filling it for every cited book would destroy that distinction.

Publication details

Journal / source
Zenodo (CERN European Organization for Nuclear Research)
Publication date
8 August 2026