Promote Media Sink preview to production (v0.8.0) #1

Open
Grok wants to merge 11 commits from dev into main
Member

Work on dev for the Guildhall preview. Do not merge unless promoting to production.

Current tip is v0.8.0: personal-library Permissions (Hidden / Show / Sync) with profile defaults and bulk actions, library selection on the left and bulk buttons on the right, table pager with go-to-page and rows controls, curator select-all clears after bulk when rows leave, and Curator/Admin side nav highlights only the current page. Earlier dev work (disposition, Operations Scan, hub scans, scripts) is included.

Preview: https://dev.mediasink.valleygeek.net/
Production (after merge): https://mediasink.valleygeek.net/

Verified: pytest 56 passed; local compose health 0.8.0, My library Permissions and bulk labels, Account default permission, /curator/queue and /admin/users side nav current page, page size persisted.

Work on `dev` for the Guildhall preview. Do not merge unless promoting to production. Current tip is **v0.8.0**: personal-library Permissions (Hidden / Show / Sync) with profile defaults and bulk actions, library selection on the left and bulk buttons on the right, table pager with go-to-page and rows controls, curator select-all clears after bulk when rows leave, and Curator/Admin side nav highlights only the current page. Earlier `dev` work (disposition, Operations Scan, hub scans, scripts) is included. Preview: https://dev.mediasink.valleygeek.net/ Production (after merge): https://mediasink.valleygeek.net/ Verified: `pytest` 56 passed; local compose health 0.8.0, My library Permissions and bulk labels, Account default permission, `/curator/queue` and `/admin/users` side nav current page, page size persisted.
Lift the site-app shell (sessions, mail, hardening, admin, Docker) from
spin-the-activity, rename STA_ identifiers to MS_ / media_sink, and drop
register, guests, carnival copy, and the Readable/carnival theme pair.
The profile has no theme control; screens use one dark Okabe–Ito palette
and a left-rail layout. Domain tables and the script API (scan, PUT, TUS,
split, download) follow DESIGN.md and TECHNICAL.md. Version 0.2.0
(pre-beta MINOR: first application-code).
Local docker-compose.yml stays port-published for this machine. Preview
uses docker-compose.preview.yml so Coolify does not publish 8080 and so
prod/dev blob and Postgres directories stay separate under
/mnt/nas/appstore/media-sink/.
Coolify's compose proxy matches an unmapped container port. expose
alone did not attach the Host router for the preview hostname.
Privacy and Terms routes, templates, footer links, and operator legal
tunables are removed. This is a closed-team tool; those pages were
shell leftovers and are not part of the catalog or hub flow.

Upload bash variants no longer call Python. They check curl, sha256sum,
find, and flock, report HTTP and scan errors, and skip files that
cannot be read or hashed. PowerShell variants use Get-FileHash and
Invoke-WebRequest, with curl.exe for TUS and rate-limited PUT.
Those checks only restated the deletion of Privacy and Terms. The
pages stay absent; the suite no longer special-cases their 404s.
The basic PUT script parsed no arguments and only logged skips and
errors. Operators had no usage text, no stage or file progress, and no
way to post and upload after each file.

-h prints usage and exits before the lock, token, or curl checks so help
works on an unconfigured copy. -v prints stages; repeating it (-vv)
prints each file path. -i POSTs a one-file scan batch and GETs
hub-wanted after each scanned file, then still does the final wanted
pass. getopts treats -vv as two -v flags.

Left upload-tus.sh, upload-split.sh, and the PowerShell variants
unchanged. Did not add SITE_URL env overrides; the configuration block
stays the operator interface.

Version 0.3.0 -> 0.4.0 (new script behavior).
Scan named a main library and created a user library on first contact,
so a script name had to match the shared catalog. Operators instead keep
personal library names of their own and link them on My library. The
administrator creates main libraries, sets each local directory under
MS_MEDIA_ROOT, and designates a already-linked personal library as hub
before queue jobs exist.

Hub files that already sit at {media root}/{local directory}/{relative
path} are marked stored and are not uploaded. Downloads read that path
when present, otherwise the checksum blob store. Uploads of files the
hub does not yet hold still land in the blob store; they are not written
into the Plex tree.

Rejected auto-matching a personal name to a main library, and rejected
chown of MS_MEDIA_ROOT in the entrypoint.

Script-only commits bump PATCH. This change also updates the app, so
the version is 0.4.0 -> 0.5.0.
Coolify rejects volume sources that contain ${, so the preview bind
${MS_MEDIA_ROOT:-/mnt/smb/plexmedia} failed deploy. The Guildhall
compose now mounts /mnt/smb/plexmedia and sets MS_MEDIA_ROOT to that
path. Local compose mounts ./media at /media.

Environment substitution for secrets is unchanged.
Library tables were capped at 72rem, headers packed name/select/summary
into one cramped row, sizes were always GB, and item length showed days
on every row. Delete confirmed but the personal-library row looked
unchanged. Personal libraries could be created in the UI. Sort was
fixed to file name. Target format standard was treated as a codec
label, and the admin form showed the live media root (a lab path on
published hosts).

Library pages now use the same small stat blocks as the admin dashboard,
tables scroll to their content width, and column headers sort with the
choice stored per account. Sizes under 1 GB display in MB with US
commas; item length is H:MM or M:SS. After Delete, the row is marked
deleted. Personal libraries are created by scan only; Edit library
settings handles rename, link, and unlink, with a Hub mark when
designated and unlink blocked until an administrator changes the hub.
Main library rows show file state from hub files, blobs, and pending
jobs. The curator queue has bulk approve/exclude/not wanted.

Paths with spaces and backslash escapes are unescaped in validation and
in the scripts. Product copy uses generic examples such as /mnt/media;
operator binds stay in compose and PROMOTION.md.

Version 0.5.0 -> 0.6.0.
Grok changed title from Instantiate Media Sink (dev preview) to Promote Media Sink preview to production (v0.6.0) 2026-09-18 18:22:45 +00:00
Item disposition was a single catalog value, personal rows had Show,
Sync, Not wanted, and Delete, hub scans enqueued upload jobs, and
length used clock time. That mixed team listing with one account's
choice and hid copy-count rules.

Each account now has Wanted, Exclude (blue), or Not wanted (yellow)
per item on both library pages. Delete is gone. Not wanted keeps at
least minimum copies (default 2), preferring Wanted libraries, then
the hub, then a per-main-library mirror. Hub scans do not enqueue
hub-wanted jobs; files already on the mount are marked present.
New scans match the main library by checksum then name, with a
length confidence for the duplicate finder. Admin Operations Scan
walks the local directory with a live progress bar and writes File
state. Item length is 2h 10m or 15m 7s.

Version 0.6.0 -> 0.7.0.
Grok changed title from Promote Media Sink preview to production (v0.6.0) to Promote Media Sink preview to production (v0.7.0) 2026-09-18 20:40:23 +00:00
Personal libraries get a Hidden/Show/Sync permission next to
disposition, with matching bulk actions and profile defaults (Show
for new accounts). Library selection sits on the left; bulk buttons
on the right. Tables persist page size and add go-to-page and rows
controls. Curator select-all clears after bulk when rows leave.
Side nav on Curator and Admin highlights only the current page.
Grok changed title from Promote Media Sink preview to production (v0.7.0) to Promote Media Sink preview to production (v0.8.0) 2026-09-18 21:27:30 +00:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin dev:dev
git switch dev

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff dev
git switch dev
git rebase main
git switch main
git merge --ff-only dev
git switch dev
git rebase main
git switch main
git merge --no-ff dev
git switch main
git merge --squash dev
git switch main
git merge --ff-only dev
git switch main
git merge dev
git push origin main
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
ai-collab/media-sink!1
No description provided.