Hade tråkigt och tröttnade på att inte ha en bra e-bokshanterare
Jag har länge letat efter ett vettigt sätt att hålla ordning på mina e-böcker. Calibre-web funkar, men det är fyrkantigt. Allt ska in i Calibres mappstruktur, och vill man göra något utanför den mallen får man kämpa. Booklore såg
lovande ut ett tag men trasade sönder sig, och jag tappade tålamodet. Så jag skrev mitt eget.
Vad Libris gör
Libris pekar på en mapp med e-böcker och läser av vad som finns. Den hashar varje fil med SHA-256 för att hålla koll på vilken bok som är vilken, även om filen byter namn eller flyttar. Metadata och omslag plockas ur filerna
automatiskt. Allt visas i ett webbgränssnitt man kan söka och bläddra i.
Det som jag verkligen ville få till är att inte röra nånting med Libris. Filerna ligger kvar där de är. Libris flyttar ingenting, byter inte namn på något, raderar ingenting. Metadata sparas i en JSON-fil bredvid varje bok. Vill man sluta använda Libris en dag tar man bort
JSON-filerna och allt är som förut. Ingen databas att exportera, ingen mappstruktur att packa upp.
Hur det hänger ihop
Vid uppstart skannar Libris mappen, hashar allt och stämmer av mot en lokal SQLite-databas. Sen scannar av på filändringar i realtid, så nya böcker dyker upp utan omstart.
Parsers finns för EPUB, PDF, MOBI, AZW/AZW3, FB2, CBZ och DjVu. Och fler kommer väl allt eftersom jag pillar med det här.
De drar ut titel, författare, omslag och språk direkt ur filerna. Vill man komplettera kan man söka Google Books och Open Library. Det finns också valfritt stöd för
OpenAI för att gissa genre och beskrivning åt böcker som inte går att hitta någon annanstans. Har man samma bok i flera format grupperas de automatiskt. Ett kort i gränssnittet, med en badge per format.
Hela grejen är "modulär". Parsers och metadatakällor är plugins där man lägger en Python-fil i rätt mapp och Libris hittar den vid uppstart. Vill man ha stöd för ett nytt format eller hämta metadata från en annan källa behöver man inte röra resten av koden.
Stacken
Python, FastAPI, HTMX, SQLite. Serverrenderad HTML, inga tunga JavaScript-ramverk. Körs med uv run libris eller via Docker.
Vill man lägga till stöd för ett nytt filformat eller en ny metadatakälla lägger man en Python-fil i rätt mapp. Libris hittar den vid uppstart.
Vibe-coded
Hela projektet är vibe-coded med hjälp av AI. Licensen heter "The Lagom License" och anger att tvister ska lösas över kaffe och en kanelbulle. Det kändes passande.
Koden ligger på GitHub.