Commits
Add library::clean_title: movies render as "Title (Year)", TV episodes
keep their SxxExx marker, and resolution/codec/source/group tags are
stripped. Falls back to the filename stem if cleaning would empty the
title. Applied to ContentDirectory item titles (direct children + metadata).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move folder indexing into library::index_folders, spawning one task per
folder instead of scanning sequentially. A folder whose scan blocks (e.g.
a TCC-gated path that hangs in opendir for a headless daemon) no longer
prevents the other folders from indexing. Scan fn is injected so the
behavior is unit-tested with a deliberately slow folder.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Count playable direct children (media files + media-bearing subdirs) so
ContentDirectory containers report childCount instead of nothing, and
extend the item <res> protocolInfo with DLNA.ORG_CI and DLNA.ORG_FLAGS
to match the streaming features the HTTP layer advertises. Verified live
via a SOAP Browse against the running server.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add is_advertisable_ip and gate NOTIFY/Location selection on it so we no
longer advertise Tailscale CGNAT (100.64.0.0/10), link-local, or loopback
addresses that a LAN renderer cannot reach. Verified live: only real LAN
IPs now appear in NOTIFY Location headers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Index folders in a background task after startup (from_config_unscanned
+ replace_folder_files), keep ContentDirectory browse non-blocking via
try_write, and filter served files through is_media_file.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Restrict NOTIFY/M-SEARCH and discover responses to real LAN interfaces
(skip bridge/vmenet/utun/awdl/llw), advertise ContentDirectory and
ConnectionManager service targets, and pick a routable source IP for
unicast discover replies. Fixes discovery on hosts with Tailscale and
phantom subnets where Location pointed at unreachable IPs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add library::clean_title: movies render as "Title (Year)", TV episodes
keep their SxxExx marker, and resolution/codec/source/group tags are
stripped. Falls back to the filename stem if cleaning would empty the
title. Applied to ContentDirectory item titles (direct children + metadata).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move folder indexing into library::index_folders, spawning one task per
folder instead of scanning sequentially. A folder whose scan blocks (e.g.
a TCC-gated path that hangs in opendir for a headless daemon) no longer
prevents the other folders from indexing. Scan fn is injected so the
behavior is unit-tested with a deliberately slow folder.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Count playable direct children (media files + media-bearing subdirs) so
ContentDirectory containers report childCount instead of nothing, and
extend the item <res> protocolInfo with DLNA.ORG_CI and DLNA.ORG_FLAGS
to match the streaming features the HTTP layer advertises. Verified live
via a SOAP Browse against the running server.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add is_advertisable_ip and gate NOTIFY/Location selection on it so we no
longer advertise Tailscale CGNAT (100.64.0.0/10), link-local, or loopback
addresses that a LAN renderer cannot reach. Verified live: only real LAN
IPs now appear in NOTIFY Location headers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Restrict NOTIFY/M-SEARCH and discover responses to real LAN interfaces
(skip bridge/vmenet/utun/awdl/llw), advertise ContentDirectory and
ConnectionManager service targets, and pick a routable source IP for
unicast discover replies. Fixes discovery on hosts with Tailscale and
phantom subnets where Location pointed at unreachable IPs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>