Release 1.0.0: CI, VERSION, and four review fixes #1

Merged
joeyr merged 3 commits from fix/review-small-bugs into main 2026-10-05 18:33:32 -05:00
Owner

First release of the self-hosted fork, based on upstream v2.0.0 (900faea).

CI (.forgejo/workflows/ci.yml)

  • gate: go vet and unit tests on golang:1.27.
  • lint: golangci-lint v2.11 with upstream's config.
  • image: on pushes to main only, after both pass. Builds on a Pi via the jellyfin-newsletter-docker runner label and pushes :latest, :1.0.0 and :<sha> to forgejo.jrendar.org/joeyr/jellyfin-newsletter.

Versioning: VERSION holds 1.0.0 and is the single source. CHANGELOG.md starts here.

Fixes from the 2026-10-05 review

  • TMDB name search no longer pairs one title's description with another's poster.
  • max_displayed_items now limits the TMDB lookups, not just the email.
  • Dry-run creates its preview folder when it is missing.
  • An unparsable recipient is logged with the reason; the SMTP session now ends with QUIT.

Each new test fails against v2.0.0 and passes here. Locally: go vet clean, all unit tests pass, golangci-lint 0 issues, and the image builds.

Before merging: the image job needs the runner label to be live and a REGISTRY_TOKEN repo secret.

🤖 Generated with Claude Code

First release of the self-hosted fork, based on upstream v2.0.0 (`900faea`). **CI** (`.forgejo/workflows/ci.yml`) - `gate`: `go vet` and unit tests on golang:1.27. - `lint`: golangci-lint v2.11 with upstream's config. - `image`: on pushes to `main` only, after both pass. Builds on a Pi via the `jellyfin-newsletter-docker` runner label and pushes `:latest`, `:1.0.0` and `:<sha>` to `forgejo.jrendar.org/joeyr/jellyfin-newsletter`. **Versioning:** `VERSION` holds `1.0.0` and is the single source. `CHANGELOG.md` starts here. **Fixes from the 2026-10-05 review** - TMDB name search no longer pairs one title's description with another's poster. - `max_displayed_items` now limits the TMDB lookups, not just the email. - Dry-run creates its preview folder when it is missing. - An unparsable recipient is logged with the reason; the SMTP session now ends with QUIT. Each new test fails against v2.0.0 and passes here. Locally: `go vet` clean, all unit tests pass, golangci-lint 0 issues, and the image builds. **Before merging:** the `image` job needs the runner label to be live and a `REGISTRY_TOKEN` repo secret. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
TMDB name search mixed two results. When the most popular result had
no overview (or no poster), the field was taken from a less popular
result instead, so one title's description could sit under another
title's poster. Both fields now come from the single most popular
result, with the usual defaults for whatever it lacks.

max_displayed_items saved no work. Every new item was looked up on
TMDB before the email builder cut the list down, so a cap of 10 on a
500-item week still cost 500 requests. DisplayedItemIDs now selects
the displayed items with the builder's own steps (ignore filter, sort,
cap) and only those are enriched. Both sorts are now stable, so the
two passes resolve ties identically; a test checks the IDs against the
rendered items in every sort mode, with a tie at the cut.

Dry-run could not save its preview by default. The default output
directory, /app/config/previews/, is never created and os.WriteFile
does not create directories. SaveDryRunEmail now creates it.

Email sending: the log line for an unparsable recipient recorded the
wrong (always nil) error, so the reason was missing; and the SMTP
session was never closed. It now ends with QUIT, falling back to
closing the connection if QUIT fails.

Each new test fails against the v2.0.0 code and passes here.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Replaces the untested docker command with the two that were actually
run on 2026-10-05 (vet + unit tests, and gofmt + golangci-lint v2.11 as
upstream CI pins it), with module and build caches.

Records the gofmt trap on this machine: core.autocrlf=true checks every
.go file out with CRLF, so gofmt on the working tree flags all of them.
Also notes how to prove a new test catches its bug, and that the
integration tests (the only coverage of newsletter.Run) haven't run.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Add Forgejo CI and prepare the 1.0.0 release
All checks were successful
CI / gate (pull_request) Successful in 1m10s
CI / lint (pull_request) Successful in 1m35s
CI / image (pull_request) Has been skipped
f518adf904
CI mirrors mcp-gateway: `gate` (go vet + unit tests on golang:1.27)
and `lint` (golangci-lint v2.11 with upstream's config) run on every
push and pull request on the shared runner; `image` builds on a Pi via
the new jellyfin-newsletter-docker label and pushes :latest, :X.Y.Z
and :<sha> to forgejo.jrendar.org/joeyr/jellyfin-newsletter, on pushes
to main only and only after both checks pass. Checkout is git by hand,
since none of the job images has the Node runtime actions/checkout
needs. The integration tests stay out: they need a Docker socket.

Adding .forgejo/workflows also stops Forgejo from falling back to
upstream's .github/workflows, which include a nightly Crowdin cron.

VERSION now holds the fork's version (1.0.0) and is the single source:
CI validates it, passes it to the Dockerfile's VERSION build arg and
tags the image with it. CHANGELOG.md starts here, based on upstream
v2.0.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
joeyr merged commit a756b01f13 into main 2026-10-05 18:33:32 -05:00
joeyr deleted branch fix/review-small-bugs 2026-10-05 18:33:32 -05:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
joeyr/jellyfin-newsletter!1
No description provided.