Skip to content

Commit c9ec66a

Browse files
committed
Add request workflow, metadata enrichment, scoring, admin dashboard, uploads, Deluge + Transmission
Request system: - User request/approval workflow (like Jellyseerr) - Request state machine: pending → approved → searching → downloading → completed - Admin approve, cancel, retry, select result endpoints - In-app notifications (request_completed, request_failed, request_approved) Metadata enrichment: - Open Library metadata fetching (covers, descriptions, series, ISBN) - In-memory cache with 30-min TTL - Metadata included in search API responses Search scoring: - 0-100 confidence scoring with breakdown (title, author, format, seeders, size) - Results auto-sorted by score - High/medium/low confidence labels Admin dashboard: - Library stats, active downloads, source health, recent activity - Paginated activity log with user/action filters - Bulk retry/cancel for failed requests - Service health checks (Prowlarr, qBit, SABnzbd, ABS, Kavita, Calibre) File uploads: - Multipart upload for ebooks and audiobooks (max 500MB) - Auto-organize via existing pipeline + library scan trigger Download clients: - Deluge JSON-RPC client - Transmission RPC client (with session-id handling) - Config: DELUGE_URL, TRANSMISSION_URL env vars Activity logging throughout all major actions.
1 parent af2b429 commit c9ec66a

27 files changed

Lines changed: 3566 additions & 35 deletions

.github/workflows/release.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Release
2+
on:
3+
push:
4+
tags: ['v*']
5+
6+
permissions:
7+
contents: write
8+
packages: write
9+
10+
jobs:
11+
release:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v4
15+
with:
16+
fetch-depth: 0
17+
- uses: actions/setup-go@v5
18+
with:
19+
go-version: '1.24'
20+
cache: false
21+
- name: Test
22+
run: go test ./... -count=1
23+
- name: Run GoReleaser
24+
uses: goreleaser/goreleaser-action@v6
25+
with:
26+
version: '~> v2'
27+
args: release --clean
28+
env:
29+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30+
31+
docker:
32+
runs-on: ubuntu-latest
33+
permissions:
34+
packages: write
35+
steps:
36+
- uses: actions/checkout@v4
37+
- name: Log in to GHCR
38+
uses: docker/login-action@v3
39+
with:
40+
registry: ghcr.io
41+
username: ${{ github.actor }}
42+
password: ${{ secrets.GITHUB_TOKEN }}
43+
- name: Extract version
44+
id: version
45+
run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
46+
- name: Build and push
47+
uses: docker/build-push-action@v6
48+
with:
49+
context: .
50+
push: true
51+
tags: |
52+
ghcr.io/${{ github.repository }}:${{ steps.version.outputs.tag }}
53+
ghcr.io/${{ github.repository }}:latest

.github/workflows/test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ jobs:
1212
- uses: actions/checkout@v4
1313
- uses: actions/setup-go@v5
1414
with:
15-
go-version: '1.22'
15+
go-version: '1.24'
16+
cache: false
1617
- name: Build
1718
run: go build -o librarr ./cmd/librarr/
1819
- name: Test

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77
/data/
88
/tmp/
99
vendor/
10+
node_modules/
11+
package-lock.json
12+
package.json

.goreleaser.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
version: 2
2+
3+
builds:
4+
- main: ./cmd/librarr/
5+
binary: librarr
6+
env:
7+
- CGO_ENABLED=0
8+
goos:
9+
- linux
10+
- darwin
11+
- windows
12+
goarch:
13+
- amd64
14+
- arm64
15+
- arm
16+
goarm:
17+
- "7"
18+
ldflags:
19+
- -s -w
20+
- -X github.com/JeremiahM37/librarr/internal/api.Version={{.Version}}
21+
- -X github.com/JeremiahM37/librarr/internal/api.BuildTime={{.Date}}
22+
23+
archives:
24+
- formats: ['tar.gz']
25+
format_overrides:
26+
- goos: windows
27+
formats: ['zip']
28+
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}"
29+
30+
checksum:
31+
name_template: "checksums.txt"
32+
33+
changelog:
34+
sort: asc
35+
filters:
36+
exclude:
37+
- "^docs:"
38+
- "^test:"
39+
- "^ci:"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Self-hosted book, audiobook, and manga search and download manager.
44

55
Librarr aggregates 13 search sources into a single interface, handles downloads via qBittorrent or SABnzbd, and automatically organizes files into your Calibre, Audiobookshelf, Kavita, or Komga libraries. It exposes a Torznab/Newznab API so it can act as an indexer in Prowlarr or Readarr, and an OPDS 1.2 feed for e-readers.
66

7+
78
## Features
89

910
- **13 search sources** in one UI (see table below)

cmd/librarr/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func main() {
108108
go scanner.Start(ctx)
109109

110110
// Create HTTP server.
111-
server := api.NewServer(cfg, database, searchMgr, downloadMgr, qb, sab)
111+
server := api.NewServer(cfg, database, searchMgr, downloadMgr, qb, sab, organizer, targets)
112112

113113
httpServer := &http.Server{
114114
Addr: fmt.Sprintf(":%d", cfg.Port),

0 commit comments

Comments
 (0)