<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lumi.git/routers/films.py, branch master</title>
<subtitle>Personal film diary</subtitle>
<id>https://git.tylerhoang.xyz/lumi.git/atom?h=master</id>
<link rel='self' href='https://git.tylerhoang.xyz/lumi.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/'/>
<updated>2026-05-15T08:50:15Z</updated>
<entry>
<title>Refine Lumi stats and detail UX</title>
<updated>2026-05-15T08:50:15Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-15T08:50:15Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=20c1d02b40bcb9abb5882d0503e596c82e9819bb'/>
<id>urn:sha1:20c1d02b40bcb9abb5882d0503e596c82e9819bb</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add stats totals, runtime summary, and duplicate detection on add form</title>
<updated>2026-05-12T10:15:17Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-12T10:15:17Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=4279408876268f4960c98492d3814f5475e36e38'/>
<id>urn:sha1:4279408876268f4960c98492d3814f5475e36e38</id>
<content type='text'>
- Stats page now shows total films watched and total runtime (formatted
  as Xd Yh) in an overview panel above the world map
- /stats/data endpoint includes total_runtime_minutes in payload
- New GET /films/find endpoint returns all shelf matches for a tmdb_id
- Add film form shows an inline notice when the selected TMDB film is
  already logged, with shelf name, date, and a link to the entry
- Update CLAUDE.md and README to reflect current auth, OMDb, and
  router/service structure

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add IMDb, Rotten Tomatoes, and Metacritic ratings to film detail</title>
<updated>2026-05-09T08:41:48Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-09T08:41:48Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=2f3a891d0944a3b200d3dda949475bf9e1742f56'/>
<id>urn:sha1:2f3a891d0944a3b200d3dda949475bf9e1742f56</id>
<content type='text'>
Fetches ratings from OMDB API in parallel with TMDB context. Displays
three side-by-side chips between the subtitle and watch log panels.
Requires OMDB_API_KEY in .env; degrades silently if missing or no match.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Auto-select today's date on add form; clean up rewatch history panel</title>
<updated>2026-05-09T08:14:57Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-09T08:14:57Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=65466fd5c645e546707ce699b4ea289f894fea20'/>
<id>urn:sha1:65466fd5c645e546707ce699b4ea289f894fea20</id>
<content type='text'>
- Default date_watched to today when adding a new film (JS, en-CA locale)
- Match rewatch history by tmdb_id when available, fall back to title
- Replace inline styles in rewatch section with CSS classes
- Simplify redundant Jinja conditions (rewatch_history and, loop.length &gt; 1)
- Move review-panel margin-top hack to .review-panel-spaced class

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add rewatch history to film detail page</title>
<updated>2026-05-07T07:21:24Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-07T07:21:24Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=364634151d756ce28060e9a982019e7f7bdb17cc'/>
<id>urn:sha1:364634151d756ce28060e9a982019e7f7bdb17cc</id>
<content type='text'>
Display all watches for a film with dates, ratings, and companions. Show time elapsed between rewatches and highlight when rating changed.

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add genre tracking and year-in-review improvements</title>
<updated>2026-05-07T01:05:07Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-07T01:05:07Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=ead38fdb13abb406065cef0743d7e411cb27eaf3'/>
<id>urn:sha1:ead38fdb13abb406065cef0743d7e411cb27eaf3</id>
<content type='text'>
Adds genre field to Film model with TMDB enrichment. Genres populate from
TMDB detail fetch during add/edit and bulk enrichment. Genre metadata displays
on film cards, detail page (Production section), stats page (top genres panel),
and year-in-review (by decade and genre breakdowns).

Auto-detects rewatches when adding films via TMDB autocomplete - if a film with
the same TMDB ID already exists in diary, pre-fills rewatch checkbox and count.
Rewatch count now displays on film cards as "Rewatch #N".

Stats page now shows:
- Top genres (most watched)
- Film decades (sorted chronologically)
- Already shows: directors, companions, star distribution, rewatch rate

Year-in-review shows decades and genres alongside monthly activity and companions.

Bulk enrichment endpoint (/data/enrich-posters) now fetches missing genre
metadata along with posters and TMDB IDs.

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add TMDB poster picker to film detail page</title>
<updated>2026-05-07T00:20:35Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-07T00:20:35Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=2d298f982408f222ad344b2aa9c18bbe7dc70f12'/>
<id>urn:sha1:2d298f982408f222ad344b2aa9c18bbe7dc70f12</id>
<content type='text'>
- New movie_images() async function in services/tmdb.py fetches poster
  URLs from TMDB /movie/{id}/images endpoint, filtering for English
  and no-text posters only
- New GET /tmdb/posters endpoint returns list of available posters for
  a TMDB ID
- New POST /films/{film_id}/poster endpoint to save selected poster
  (mirrors the stars endpoint pattern)
- Add "Change Poster" button on detail page (only shown if film has a
  TMDB ID) that opens a 3-column grid of posters
- Selected poster gets accent border, main image updates instantly, no
  page reload needed
- Posters are cached per load to avoid refetching on re-open

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add search, filter, and sort functionality to film shelves</title>
<updated>2026-05-07T00:12:46Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-07T00:12:46Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=4bbafdd460945eb506ddb07b9068731245708812'/>
<id>urn:sha1:4bbafdd460945eb506ddb07b9068731245708812</id>
<content type='text'>
- Add _SORT_COLUMNS dict to routers/films.py with 8 sort options
- Extend _get_shelf_query to accept q (search) and sort parameters
- Update /films/partial endpoint to accept q/sort query params and pass
  search_active to template to suppress month grouping when searching
- Add filter bar (search input + sort select) to templates/index.html
- Add data-shelf attribute to #film-feed for JS to read current shelf
- Rewrite infinite scroll JS to support debounced search (300ms),
  feed reset on filter/sort change, and pass params on all fetches

Filters text search by title OR director (case-insensitive ilike).
Sort options: date watched (newest/oldest), title (A-Z/Z-A), year,
stars. Month grouping disabled when search is active.

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add director image and biography to director page</title>
<updated>2026-05-06T23:23:59Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-06T23:23:59Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=138eaaa12cdaeb6035951ff4f1547d73e8d12612'/>
<id>urn:sha1:138eaaa12cdaeb6035951ff4f1547d73e8d12612</id>
<content type='text'>
- Fetch director profile image and biography from TMDB API
- Display image next to director name with lazy loading
- Show biography below director name
- Gracefully handle missing data (image/biography optional)

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add authentication, public profile, and infinite scroll</title>
<updated>2026-05-06T22:25:36Z</updated>
<author>
<name>Tyler Hoang</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-06T22:25:36Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/lumi.git/commit/?id=1bdf4ca8c0f51718124ffe5247ac133973d4f251'/>
<id>urn:sha1:1bdf4ca8c0f51718124ffe5247ac133973d4f251</id>
<content type='text'>
- Implement session-based auth with argon2 password hashing
- Add login form and logout button in nav
- Create public /tyler profile page with curated stats
- Implement infinite scroll for film lists (load 20 at a time)
- Add lazy loading for poster images
- Fix profile page CSS to use dark theme variables
- Use consistent star character (✦) across all pages
- Add /films/partial endpoint for pagination

Co-Authored-By: Claude Haiku 4.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
