docs(media): the metadata view is live, and duplicate pruning gets a page
`Media Metadata View.md` said "Not deployed on Dankserver — verified 2026-10-31". That was true yesterday and is false now: the overlay is mounted and both installed quadlets bind it (`view:/data` rw for Jellyfin, `view:/mnt/entropy:ro` for Plex). The page now states the live shape and the order that proves it — `media-view.sh verify`, then the `Volume=` lines — because the whole point of the page is to answer "is the view really serving?". `AGENTS.md` carried the same stale claim in its summary table. `Media Duplicate Prune.md` is new: the screen ladder (size, then head+tail blake2b, then a sparse-window confirmation before anything moves), which copy survives and why, the guards that each encode a file that would otherwise have been destroyed (qBittorrent `.!qB` state, year-required with digits kept, feature length, disc/part exclusion, media containers only), and the law that a hold on the same volume frees nothing until it is purged. It also carries the different way `media-verify.py` has to be READ for a prune — `landed: 0` is the correct end state because no server may index the hold — and the planner bug that class explains: when the planner re-derived "largest wins" from the hold list alone it dropped every keeper out of its own group and pruned 17 files instead of 205. `Media Relayout.md` keeps a one-line pointer; carrying the whole procedure there pushed it past the vault's 500-line ceiling, which is the linter telling the truth about progressive disclosure.
This commit is contained in:
1 parent
649bbafa17
commit
50e0c5a786
5 files changed
+153
-15
No files matched your search
@@ -3,7 +3,7 @@ type: reference
|
||||
title: Media Metadata View
|
||||
description: "The SSD-backed overlay the two media servers read and write: shape, guards, commands, laws, rollback."
|
||||
tags: [dankserver, media-server, jellyfin, plex, storage]
|
||||
timestamp: 2026-10-30T00:00:00Z
|
||||
timestamp: 2026-11-01T01:00:00Z
|
||||
---
|
||||
|
||||
# Media Metadata View
|
||||
@@ -20,18 +20,23 @@ The mount point is not a volume and holds nothing while unmounted. It sits insid
|
||||
merged door are one directory — and so the mount table grows no new `/mnt` entry
|
||||
next to the array.
|
||||
|
||||
**Not deployed on Dankserver — verified 2026-10-31.** `scripts/media-view.sh
|
||||
status` answers `view: /var/lib/media-meta/view NOT MOUNTED`,
|
||||
`/var/lib/media-meta` does not exist, and the installed quadlets under
|
||||
`~/.config/containers/systemd/` still carry the pre-view binds — `/mnt/entropy:/data:ro`
|
||||
for [[Jellyfin]], `/mnt/entropy:/mnt/entropy:ro` for [[Plex]]. Everything below
|
||||
is the shape git describes, not the shape the servers run. The cutover is an
|
||||
ordinary deploy: `deploy.sh dankserver --service jellyfin|plex` runs
|
||||
`ensure_media_view` (`install` then `verify`) before it restarts the container,
|
||||
so it must not be fired through the middle of a library scan. Until that deploy
|
||||
lands there is no upper layer, so no relayout can leave ghost metadata and
|
||||
`reap` has nothing to do — `media-apply.py` prints that follow-up only when the
|
||||
view really is a mountpoint.
|
||||
**Deployed on Dankserver — verified 2026-11-01.** `mount` shows the overlay on
|
||||
`/var/lib/media-meta/view` (`lowerdir=/mnt/entropy`,
|
||||
`upperdir=/var/lib/media-meta/upper`), and the installed quadlets under
|
||||
`~/.config/containers/systemd/` carry the view binds:
|
||||
`Volume=/var/lib/media-meta/view:/data` for [[Jellyfin]],
|
||||
`Volume=/var/lib/media-meta/view:/mnt/entropy:ro` for [[Plex]]. Prove it in that
|
||||
order: `scripts/media-view.sh verify` (the deploy gate), then
|
||||
`grep -n Volume ~/.config/containers/systemd/{jellyfin,plex}.container`.
|
||||
|
||||
The cutover itself is an ordinary deploy: `deploy.sh dankserver --service
|
||||
jellyfin|plex` runs `ensure_media_view` (`install` then `verify`) before it
|
||||
restarts the container, so it must not be fired through the middle of a library
|
||||
scan. Two consequences are now live rather than theoretical: inotify events for
|
||||
array writes do not cross the merge, so any relayout or prune needs a manual
|
||||
library refresh; and a move can leave ghost sidecars above, so `reap` runs after
|
||||
a relayout — a pass that moves only media files with no sidecars next to them
|
||||
leaves the upper layer untouched, and `reap` correctly finds nothing.
|
||||
|
||||
## Shape
|
||||
|
||||
|
||||
Reference in new issue
Block a user