bvandeusen
96e984cded
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 20s
CI / backend-lint-and-test (push) Successful in 28s
CI / integration (push) Failing after 3m14s
feat(external): download worker for file-host links (Phase 4b)
...
tasks/external.py drives the external_link ledger:
- fetch_external_link(link_id): atomic claim (pending/failed→downloading, so a
duplicate enqueue no-ops), per-host Redis serialize lock (#720 pattern;
requeue-with-countdown if busy), fetch via external_fetch into the artist
library tree, then route each file through importer.attach_in_place via a
synthesized sidecar so it links to the SAME post (archive→ImageRecords,
else→PostAttachment; on-disk original removed for captured files, art stays);
thumbnail+ML enqueue for new images; status downloaded | failed | dead with
attempts/last_error/completed_at/duration.
- sweep_external_links(): enqueue a bounded batch of actionable links.
- recover_external_links() + prune_external_links(): recovery + retention (#89 ).
- per-host enable read via getattr (forward-compatible; Settings UI adds the
columns in 4d — defaults on, rule #26 ).
Wiring: celery include + route (download lane) + beat (sweep 10m, recover +
prune daily); download_service phase 3 enqueues a sweep after recording links.
Integration tests: download+attach, failure, dead-letter, non-claimable, sweep.
mega still needs the MEGAcmd binary in the runtime image (Phase 4c). Refs #830 .
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-14 13:44:07 -04:00
..
2026-06-05 19:16:20 -04:00
2026-05-14 07:32:17 -04:00
2026-06-10 16:03:58 -04:00
2026-06-04 07:35:28 -04:00
2026-06-04 16:47:36 -04:00
2026-06-12 13:05:58 -04:00
2026-05-28 11:33:05 -04:00
2026-06-01 14:17:52 -04:00
2026-05-28 12:43:08 -04:00
2026-06-03 15:45:59 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 12:43:08 -04:00
2026-06-04 16:55:20 -04:00
2026-06-05 22:49:43 -04:00
2026-05-30 00:59:05 -04:00
2026-05-28 11:33:05 -04:00
2026-06-01 00:41:17 -04:00
2026-06-04 07:01:07 -04:00
2026-05-28 11:33:05 -04:00
2026-06-10 13:50:30 -04:00
2026-05-28 12:43:08 -04:00
2026-06-12 00:04:06 -04:00
2026-06-01 14:17:52 -04:00
2026-06-11 23:10:30 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 11:33:05 -04:00
2026-05-30 23:15:07 -04:00
2026-06-06 21:22:32 -04:00
2026-06-12 13:05:58 -04:00
2026-06-10 11:34:42 -04:00
2026-05-28 11:33:05 -04:00
2026-06-03 23:26:04 -04:00
2026-05-28 11:33:05 -04:00
2026-06-06 17:39:54 -04:00
2026-06-01 21:57:29 -04:00
2026-06-06 14:33:24 -04:00
2026-05-21 22:14:15 -04:00
2026-05-20 12:54:47 -04:00
2026-06-01 14:17:52 -04:00
2026-06-03 15:45:59 -04:00
2026-05-19 11:11:07 -04:00
2026-05-26 01:18:38 -04:00
2026-05-26 01:18:07 -04:00
2026-05-19 14:59:04 -04:00
2026-06-01 22:09:02 -04:00
2026-06-10 14:29:17 -04:00
2026-05-16 18:02:01 -04:00
2026-06-07 09:00:03 -04:00
2026-05-14 07:34:47 -04:00
2026-05-21 16:02:36 -04:00
2026-05-26 08:13:53 -04:00
2026-06-11 21:30:01 -04:00
2026-06-02 17:04:27 -04:00
2026-06-02 17:04:27 -04:00
2026-06-09 23:46:01 -04:00
2026-06-05 22:49:43 -04:00
2026-05-25 11:12:55 -04:00
2026-06-06 11:34:37 -04:00
2026-06-06 21:22:32 -04:00
2026-05-28 12:43:08 -04:00
2026-05-15 13:53:42 -04:00
2026-06-14 13:29:20 -04:00
2026-06-14 13:44:07 -04:00
2026-05-29 15:34:20 -04:00
2026-05-20 20:39:17 -04:00
2026-06-03 22:58:46 -04:00
2026-06-05 23:39:28 -04:00
2026-06-04 07:01:07 -04:00
2026-06-03 23:50:19 -04:00
2026-06-12 00:36:44 -04:00
2026-06-04 08:47:43 -04:00
2026-05-28 11:33:05 -04:00
2026-06-14 13:02:21 -04:00
2026-06-10 15:55:32 -04:00
2026-05-19 11:14:49 -04:00
2026-05-19 11:22:17 -04:00
2026-05-18 21:33:55 -04:00
2026-06-08 19:28:33 -04:00
2026-05-25 20:33:44 -04:00
2026-05-25 22:16:26 -04:00
2026-06-01 14:40:28 -04:00
2026-06-01 14:17:52 -04:00
2026-05-25 02:34:36 -04:00
2026-06-14 13:15:36 -04:00
2026-06-10 11:57:31 -04:00
2026-05-26 21:23:12 -04:00
2026-06-11 18:52:33 -04:00
2026-05-15 15:48:29 -04:00
2026-06-01 14:17:52 -04:00
2026-06-01 14:17:52 -04:00
2026-05-19 11:10:53 -04:00
2026-05-20 12:53:34 -04:00
2026-05-20 18:32:52 -04:00
2026-05-20 18:33:14 -04:00
2026-05-20 20:36:19 -04:00
2026-06-12 13:05:58 -04:00
2026-06-10 13:52:20 -04:00
2026-06-01 02:08:10 -04:00
2026-05-15 07:37:53 -04:00
2026-05-15 07:36:17 -04:00
2026-06-12 13:05:58 -04:00
2026-06-03 13:00:08 -04:00
2026-06-10 13:50:30 -04:00
2026-05-14 07:34:29 -04:00
2026-06-07 18:34:11 -04:00
2026-05-14 14:24:25 -04:00
2026-06-14 12:44:46 -04:00
2026-06-05 21:56:58 -04:00
2026-06-14 12:44:46 -04:00
2026-06-14 12:44:46 -04:00
2026-06-06 21:32:15 -04:00
2026-06-05 19:26:57 -04:00
2026-06-11 18:52:33 -04:00
2026-05-17 22:18:07 -04:00
2026-06-06 21:22:32 -04:00
2026-05-20 18:34:02 -04:00
2026-06-14 13:15:36 -04:00
2026-06-01 14:17:52 -04:00
2026-06-07 12:08:02 -04:00
2026-06-06 14:33:24 -04:00
2026-05-25 22:16:26 -04:00
2026-05-19 11:14:49 -04:00
2026-05-30 12:08:43 -04:00
2026-06-11 21:30:01 -04:00
2026-06-11 23:17:14 -04:00
2026-06-11 21:47:58 -04:00
2026-06-07 18:58:18 -04:00
2026-06-11 21:30:01 -04:00
2026-06-11 23:10:30 -04:00
2026-06-11 23:10:30 -04:00
2026-05-15 15:49:25 -04:00
2026-06-14 13:15:36 -04:00
2026-05-27 15:35:25 -04:00
2026-05-14 12:04:05 -04:00
2026-06-05 23:43:23 -04:00
2026-06-10 16:03:58 -04:00
2026-05-15 15:50:41 -04:00
2026-06-11 21:30:01 -04:00
2026-06-06 23:57:06 -04:00
2026-05-26 21:00:12 -04:00
2026-06-10 00:19:17 -04:00
2026-05-15 07:39:33 -04:00
2026-06-06 17:39:54 -04:00
2026-05-24 21:22:42 -04:00
2026-06-11 18:52:33 -04:00
2026-06-10 14:29:17 -04:00
2026-06-07 00:08:19 -04:00
2026-06-11 18:52:33 -04:00
2026-05-27 22:45:11 -04:00
2026-05-21 18:53:35 -04:00
2026-05-14 12:05:19 -04:00
2026-05-21 16:01:59 -04:00
2026-05-19 18:15:59 -04:00