2041 Commits

Author SHA1 Message Date
Estrella Pan
ccb3f8d257 Merge pull request #1118 from EstrellaXD/fix/3.3.5-issues
Release 3.3.6
3.3.6
2026-09-19 18:07:59 +02:00
Estrella Pan
aaa464193b chore(release): prepare 3.3.6
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KU9GqKzULrNb7MN5T9TYix
2026-09-19 17:58:18 +02:00
Estrella Pan
37fa6b4ea5 fix: RSS matching, proxy pool, parser, healthcheck and log issues (#1103 #1104 #1105 #1106 #1108 #1114 #1117)
- match_bangumi_in_list: also accept a torrent whose rebuilt title equals
  the stored title_raw (#1103, #1114)
- download_bangumi / collect_season: drop items whose season or type
  conflicts with the bangumi (#1105)
- request_url: swap in a fresh shared client on PoolTimeout without
  closing the old one (#1104)
- classic parser: Unicode Roman numeral season, strip fullwidth dash
  wrapper (#1108)
- Docker HEALTHCHECK: healthcheck.py reads the configured WebUI port and
  probes IPv4 then IPv6 loopback (#1106)
- scheduler: non-positive interval falls back to 1s; deploy docs cap
  container logs at 10 MB x 3 (#1117)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KU9GqKzULrNb7MN5T9TYix
2026-09-19 17:58:17 +02:00
Estrella Pan
fd798519fe chore: add GitHub Sponsors funding 2026-08-04 21:11:05 +02:00
Estrella Pan
2befeb4933 Merge pull request #1102 from EstrellaXD/3.3-dev
Release 3.3.5 (mypy fix)
3.3.5
2026-07-26 15:53:23 +02:00
Estrella Pan
5cc2fabc64 fix(types): correct type-ignore codes and narrow Optional in tests
CI mypy (not run locally before) flagged the is_not() ignores as
union-attr and the un-narrowed RSSItem | None in the re-enable test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:53:14 +02:00
Estrella Pan
3d7b4d8417 Merge pull request #1101 from EstrellaXD/3.3-dev
Release 3.3.5
2026-07-26 15:49:29 +02:00
Estrella Pan
f54df55754 chore(release): prepare 3.3.5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:49:06 +02:00
Estrella Pan
d33a43f201 Merge fix/config-mask-empty (#1100): stop masking empty secrets, scrub corrupted sentinels 2026-07-26 15:46:16 +02:00
Estrella Pan
8b8a15f322 Merge fix/reset-all-fk (#1099): clear FK references before bangumi reset-all 2026-07-26 15:46:16 +02:00
Estrella Pan
0916bf688a Merge fix/issue-1092-episodeless-special (#1098): admit unmarked episode-less releases 2026-07-26 15:45:48 +02:00
Estrella Pan
900328928e Merge fix/issue-1094-telegram-poster (#1097): Telegram poster via source URL with fallbacks 2026-07-26 15:45:48 +02:00
Estrella Pan
708b937108 Merge fix/issue-1095-rss-reenable (#1096): re-enable disabled RSS on re-subscribe 2026-07-26 15:45:48 +02:00
Estrella Pan
2f1a18f37e fix(config): stop masking empty secrets and scrub corrupted mask sentinels
Empty sensitive fields were masked to '********' in GET /config, so the
UI showed a phantom password where none was set. Worse, 3.2.3/3.2.4
masked without restoring on save, so users who saved config on those
versions had the literal sentinel written into stored proxy/downloader
credentials, breaking authentication until manually cleared.

- _sanitize_dict now masks only non-empty values.
- Settings._migrate_old_config scrubs literal '********' sentinels from
  sensitive fields on load (original values are unrecoverable), logging
  a warning so users know to re-enter real secrets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:39:11 +02:00
Estrella Pan
f1ca52cbe8 fix(database): clear FK references before bangumi reset-all
BangumiDatabase.delete_all() issued a bare DELETE FROM bangumi while
torrent.bangumi_id and aria2_gid.bangumi_id rows still referenced it;
with PRAGMA foreign_keys=ON the whole reset rolled back with
IntegrityError, and the surviving torrent dedup rows made re-added
bangumi skip episodes as already downloaded. Delete bangumi-linked
torrent records (same semantics as delete_rule) and detach aria2_gid
mappings before the table wipe.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:36:02 +02:00
Estrella Pan
dee536cdc9 fix(parser): admit unmarked episode-less releases on classic engine (#1092)
Subtitle groups sometimes release TV specials without an episode number
or any special/movie marker (e.g. LoliHouse's ONE PIECE HEROINES). The
Preview engine's admission policy already accepts such evidence-backed
single releases as eps_collect bangumi, but the classic engine's legacy
Episode projection rejected them outright, so default installs silently
skipped the torrent.

Align classic admission with the Preview persistence policy for exactly
this shape (no episode, unknown media type, admissible under
persistence_target). The frozen legacy Episode contract and its golden
corpus stay untouched; numbered legacy rejections (e.g. fractional
episodes) keep their behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 11:39:24 +02:00
Estrella Pan
cadaf1fe59 fix(notification): send Telegram posters by source URL with text fallback (#1094)
Download-complete notifications were silently dropped when sendPhoto
failed: post_form returned None on any error and the provider crashed
on resp.status_code, with no text fallback. HTTP rejections were also
logged as "Cannot connect", hiding the real cause.

- save_image now records the poster's source URL in a .url sidecar;
  Telegram prefers sendPhoto with that URL (server-side fetch), falls
  back to local multipart upload, then to a plain text message.
- load_image returns None instead of raising when the cached file is
  missing.
- post_url/post_form log HTTP status and response body separately from
  connection errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 11:13:15 +02:00
Estrella Pan
e3b6e03067 fix(rss): re-enable disabled RSS on re-subscribe (#1095)
Deleting a bangumi disables its orphan standalone RSS feed (#1053), but
re-subscribing the same feed hit the duplicate-URL early return in
RSSDatabase.add() and never reset enabled, so the rebuilt bangumi
silently stopped updating. Re-enable the existing row and report it as
a successful add.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 11:08:19 +02:00
Estrella Pan
520873f035 test(e2e): align standalone movie contract (#1080) 2026-07-15 15:33:36 +02:00
Estrella Pan
bd6d35dbe5 Merge 3.3-dev for 3.3.4 3.3.4 2026-07-13 20:37:28 +02:00
Estrella Pan
f354a63959 chore(release): prepare 3.3.4 2026-07-13 20:36:26 +02:00
Estrella Pan
a99b78931c Merge fix/issue-1078-revision-replace into 3.3-dev 3.3.4-beta.2 2026-07-13 01:37:10 +02:00
Estrella Pan
37d794db0d chore(release): prepare 3.3.4-beta.2 2026-07-13 01:36:29 +02:00
Estrella Pan
9d5b1c3998 fix(renamer): safely replace higher revisions (#1078) 2026-07-13 01:36:17 +02:00
Estrella Pan
00b78dfa64 docs(renamer): design revision replacement for #1078 2026-07-13 00:31:34 +02:00
Estrella Pan
01534b802c test(e2e): assert the standalone movie contract 2026-07-12 21:18:54 +02:00
Estrella Pan
32dcbc53df fix(webui): type template event handlers 2026-07-12 21:07:33 +02:00
Estrella Pan
4cb2b369ab fix(parser): preserve CJK movie words in titles 2026-07-12 21:07:33 +02:00
Estrella Pan
e8bcece42f feat(parser): add selectable preview engine 2026-07-12 21:07:33 +02:00
Estrella Pan
060b602aaf docs(parser): design classic and preview engine switch 2026-07-12 21:07:33 +02:00
Estrella Pan
e744b3601a fix(parser): handle ranges and mixed collections safely 2026-07-12 21:07:33 +02:00
Estrella Pan
8ceec47174 perf(parser): add reproducible tokenizer benchmark 2026-07-12 21:07:33 +02:00
Estrella Pan
56ce4dbe21 docs(parser): record resolved tokenizer architecture 2026-07-12 21:07:33 +02:00
Estrella Pan
274977e665 fix(rss): preserve typed media identities 2026-07-12 21:07:33 +02:00
Estrella Pan
24f060b4b9 refactor(parser): migrate consumers to parsed releases 2026-07-12 21:07:33 +02:00
Estrella Pan
cd9ae7b03b refactor(parser): resolve immutable release candidates 2026-07-12 21:07:33 +02:00
Estrella Pan
5748892c41 docs(parser): design candidate resolver migration 2026-07-12 21:07:33 +02:00
Estrella Pan
0741a23a6a fix(parser): handle movie results in search and rss 2026-07-12 21:07:33 +02:00
Estrella Pan
3f1feb8655 refactor(parser): support generic anime release titles 2026-07-12 21:07:33 +02:00
Estrella Pan
fd1936fb1d refactor(parser): replace regex raw_parser with pipeline tokenizer
Replaces the monolithic regex-based parser with a multi-stage tokenizer
pipeline (normalize, tokenize, classify, resolve). Fixes multiple parsing
bugs: Atlas format (#986), VTuber/Lv2 title splits (#798, #766),
Pre-episode format (#794), western S01E05 format (#764), and separator
dash leaking into titles (#819).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-12 21:07:33 +02:00
Estrella Pan
f75b8e55cd feat(parser): add movie/gekijouban support with full DB model
Add detection and handling for anime movies (剧场版/劇場版) as a
separate entity from TV series. Previously, movies in RSS feeds were
either parsed as episode 0 or skipped entirely.

- Add TokenKind.MOVIE and movie keyword/pattern detection in tokenizer
- Add is_movie flag to Episode dataclass
- Create Movie SQLModel, MovieDatabase with CRUD + TTL cache
- Add migration v10 to create movie table
- Route TitleParser.raw_parser() to return Movie or Bangumi
- Update RSS analyser/engine for movie-aware parsing and downloads
- Add movie save path (no Season subfolder) and rename logic
- Add Movie REST API endpoints (get/update/delete/disable/enable)
- Add 11 tests for movie marker detection and non-movie regression

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-12 21:07:33 +02:00
Estrella Pan
5cc5f57e91 docs: design beta tokenizer lineage integration 2026-07-12 20:44:31 +02:00
Estrella Pan
be8d23c319 fix(webui): hide archived anime from calendar 2026-07-11 12:36:50 +02:00
Estrella Pan
86e39811d1 fix(ci): track e2e fixture and sync beta lock 3.3.4-beta.1 2026-07-10 14:12:00 +02:00
Estrella Pan
5ab2a660ab chore: release 3.3.4-beta.1 2026-07-10 14:05:18 +02:00
Estrella Pan
7319c91c5e style: format log rollover test 2026-07-10 13:51:54 +02:00
Estrella Pan
76b8cfbb6a ci: add hermetic e2e lanes 2026-07-10 13:51:35 +02:00
Estrella Pan
df280c33f7 test: cover e2e runtime retry boundaries 2026-07-10 13:51:17 +02:00
Estrella Pan
7680514a1b test: verify real downloader release flow 2026-07-10 13:50:51 +02:00
Estrella Pan
57d071b2c9 test: cover issue-driven ui regressions 2026-07-10 13:50:36 +02:00