dacc057af6
fix: lazy-load wrapup backgrounds, cap sqlite pool to 4 connections
...
CI / Check / Test (push) Failing after 6m32s
backgrounds were decoded to RGBA at startup (~173MB for 9 images).
now only store paths, decode on demand during video generation.
2026-06-04 14:57:47 +02:00
bd7dc648c4
feat: search reindex, worker improvements, person IDs, user display names
...
- add admin POST /api/v1/admin/reindex-search endpoint + event-driven handler
- backfill persons from movie_cast/movie_crew into persons table
- paginate person list_page/backfill_from_credits_batch to cap memory
- concurrent worker event dispatch with semaphore (max 8)
- graceful worker shutdown (drain in-flight tasks on SIGINT)
- always ack events, log handler errors as warnings (no infinite retry)
- NATS ack_wait 600s, AtomicBool guard against concurrent reindex
- add username/display_name to UserSummaryDto and users list
- add person_id to CastMemberDto/CrewMemberDto via get_movie_profile use case
- add movie_id to wrapup MovieRef, person_id to wrapup PersonStat
- thread tmdb_person_id through wrapup cast pipeline
- add is_federated to FeedEntryDto
- cap orphaned persons query with LIMIT 500
- add SPA link to classic site footer
2026-06-04 14:43:28 +02:00
b9c0b10740
feat: add SPA, serve at /app/, update Dockerfile and README
...
- React + TanStack Router + shadcn/ui SPA under spa/
- serve spa/dist at /app/ with index.html fallback for client routing
- Dockerfile: node build stage for SPA, copy dist into runtime image
- README: document SPA, CORS_ORIGINS env var, architecture entry
- vite base set to /app/, manifest.json paths fixed
2026-06-04 04:20:15 +02:00
15dc0e526b
feat: expose display_name, also_known_as, profile fields in GET /profile
2026-06-04 02:58:12 +02:00
cf2f4a1b4f
feat: watchlist add accepts title/year/imdb for movies not in DB
2026-06-04 02:47:55 +02:00
e7cdbf9ca7
fix: user profile URLs, typed returns for following/followers
...
- avatar_url/banner_url now use full base_url + /images/ prefix
- get_user_following/followers return Result<Json<_>, ApiError>
- add ap_to_domain helper for anyhow→DomainError conversion
2026-06-04 02:40:04 +02:00
837b7866af
feat: include avatar_url and banner_url in UserProfileResponse
2026-06-04 02:37:16 +02:00
c4908b7765
feat: API endpoints for any user's following/followers
2026-06-04 02:34:01 +02:00
dbc78a1ff4
feat: add user_id to FeedEntryDto
2026-06-04 02:22:08 +02:00
a97e263ed3
fix: always return following/followers counts, only hide pending for non-own profiles
2026-06-04 02:19:27 +02:00
b1d667d3cb
fix: user profile returns social counts when viewing own profile
2026-06-04 02:18:28 +02:00
bf73d4a695
feat: CORS, role in auth, banner_url, diary sort, cleanup
...
- CORS layer on API routes via CORS_ORIGINS env var
- role field in login + profile responses
- banner_url in profile response
- diary sort_by: rating_desc/rating_asc/date_asc/date_desc
- UserRole::as_str() to deduplicate role mapping
- typed DTOs for import preview (replace ad-hoc JSON)
- warn on invalid CORS origins
2026-06-04 02:06:51 +02:00
7b9b0f9ffe
feat: API preview endpoint for import sessions
2026-06-04 01:59:09 +02:00
7d6f874ae7
feat: activity feed accepts sort_by param
2026-06-04 01:35:45 +02:00
4206bb4b06
fix: diary sort_by rating_desc/rating_asc in all/movie queries
2026-06-04 01:28:35 +02:00
004243dcbb
fix: use embed=true for serde bool compat
CI / Check / Test (push) Failing after 6m35s
2026-06-03 10:17:43 +02:00
c798b851dc
fmt
CI / Check / Test (push) Has been cancelled
2026-06-03 10:14:53 +02:00
c18d4eebc1
fix: use array instead of vec for clippy
2026-06-03 10:14:20 +02:00
3f6e01ed65
feat: add embed snippet to profile settings
2026-06-03 10:09:38 +02:00
19642175eb
feat: wire embed param to EmbedProfileTemplate
2026-06-03 10:08:51 +02:00
fad73a9fab
feat: add embed_profile.html template
2026-06-03 10:07:45 +02:00
627db45a56
feat: add embed_base.html template shell
2026-06-03 10:07:43 +02:00
976d872eed
feat: add EmbedProfileTemplate struct
2026-06-03 10:07:41 +02:00
6c7ce24e1f
feat: add embed param to ProfileQueryParams
2026-06-03 10:07:39 +02:00
6668ba511c
fmt
CI / Check / Test (push) Failing after 6m32s
2026-06-03 01:38:25 +02:00
430fbb21ea
refactor: rename image-storage crate to object-storage
CI / Check / Test (push) Failing after 44s
2026-06-03 01:37:14 +02:00
f262417971
refactor: rename ImageStorage → ObjectStorage
CI / Check / Test (push) Failing after 46s
2026-06-03 01:33:08 +02:00
d94ccbe057
refactor: store typed WrapUpReport in domain, serialize in adapters
CI / Check / Test (push) Failing after 45s
2026-06-03 01:25:16 +02:00
e4b8ba550e
refactor: extract storage key conventions into WrapUpStorage
CI / Check / Test (push) Failing after 43s
2026-06-03 01:20:51 +02:00
3cec726e3d
refactor: move VideoRenderConfig from domain to adapter, inject at construction
CI / Check / Test (push) Failing after 44s
2026-06-03 01:18:52 +02:00
e8e83d3f16
assets + fmt
CI / Check / Test (push) Has been cancelled
2026-06-03 01:13:06 +02:00
8cabc6af70
fix: clippy — redundant closure in AdminApiUser
CI / Check / Test (push) Has been cancelled
2026-06-03 01:12:36 +02:00
e378191045
fix: clippy — collapse nested if in cast photo store
CI / Check / Test (push) Has been cancelled
2026-06-03 01:12:07 +02:00
bca07b7824
fix: clippy — collapse nested ifs, use div_ceil
CI / Check / Test (push) Failing after 41s
2026-06-03 01:11:17 +02:00
857896f057
feat: add video download link to wrapup HTML page
CI / Check / Test (push) Failing after 41s
2026-06-03 01:06:11 +02:00
e905842b62
fix: idempotency guard on wrapup handler to prevent duplicate processing
CI / Check / Test (push) Failing after 42s
2026-06-03 01:01:50 +02:00
83103e5eb5
feat: redesign wrapup HTML with glass cards, ranked lists, better layout
CI / Check / Test (push) Failing after 42s
2026-06-03 01:00:50 +02:00
fc086de7f7
refactor: move DateRange validation to value object, add delete/cleanup
CI / Check / Test (push) Failing after 40s
2026-06-03 00:58:07 +02:00
3a66f89609
fix: reverse rating bar order to 5★→1★ in video slides
CI / Check / Test (push) Failing after 42s
2026-06-03 00:55:43 +02:00
45d6183ea4
fix: reverse rating bar order to 5★→1★
CI / Check / Test (push) Failing after 41s
2026-06-03 00:54:59 +02:00
241063c914
feat: wrapup date validation, delete endpoint, failed record cleanup
CI / Check / Test (push) Failing after 41s
2026-06-03 00:54:08 +02:00
3f483f8f81
fix: alpha-blend glass panels instead of opaque overwrite
CI / Check / Test (push) Failing after 41s
2026-06-03 00:46:09 +02:00
c842ad6a55
feat: download top-5 cast photos during TMDb enrichment
CI / Check / Test (push) Failing after 41s
2026-06-03 00:42:25 +02:00
a5cf62e281
fix: cover-fill backgrounds, bigger highlight posters
CI / Check / Test (push) Failing after 42s
2026-06-03 00:40:35 +02:00
d52120d6a9
feat: frutiger aero visual overhaul — backgrounds, glass panels, cast photos, full mosaic
CI / Check / Test (push) Failing after 42s
2026-06-03 00:34:13 +02:00
e57ddd78ac
feat: frutiger aero visual overhaul for wrapup video slides
2026-06-03 00:32:39 +02:00
0d02f23f4f
fix: decode AVIF posters via ffmpeg fallback for mosaic slide
CI / Check / Test (push) Failing after 41s
2026-06-03 00:23:39 +02:00
86639853d2
fix: render genres via SlideRenderer, enable AVIF decoding, add poster fetch logging
CI / Check / Test (push) Failing after 42s
2026-06-03 00:19:18 +02:00
7155bea78e
fix: disable plotters axis labels to avoid system font lookup
CI / Check / Test (push) Failing after 43s
2026-06-03 00:10:56 +02:00
8429d13db0
fix: enable ab_glyph font backend for plotters
CI / Check / Test (push) Failing after 42s
2026-06-03 00:09:10 +02:00