feat(hls): persistent fMP4 segment cache + integrity + stats (0.9.7)
Cache keyed by sha256(absPath|quality|audioIdx)[:8] with .complete marker; LRU + size-budget eviction; per-key writer-lock; pinned during play; startup orphan reap; integrity verify on HIT; subtitle-completeness gate; hit/miss counters + daily log line. New [downloads.hls_cache] block in config.toml (enabled/size_gb/dir, default 5GB). Smoke test: 2nd play of same source+quality is 23-31× faster (HIT path skips ffmpeg entirely).
This commit is contained in:
parent
834c58c25a
commit
7e96976257
10 changed files with 1295 additions and 9 deletions
|
|
@ -52,10 +52,22 @@ type DownloadConfig struct {
|
|||
EnableUPnP bool `toml:"enable_upnp"` // map StreamPort to the WAN via UPnP/NAT-PMP (default: false; opt-in because it exposes the unauthenticated /stream + /hls endpoints to the public internet)
|
||||
CORSExtraOrigins []string `toml:"cors_extra_origins"` // extra browser origins added on top of the baked-in allowlist (torrentclaw.com, app.torrentclaw.com, localhost:3030)
|
||||
Transcode TranscodeConfig `toml:"transcode"`
|
||||
HLSCache HLSCacheConfig `toml:"hls_cache"`
|
||||
VPN VPNConfig `toml:"vpn"`
|
||||
Funnel FunnelConfig `toml:"funnel"`
|
||||
}
|
||||
|
||||
// HLSCacheConfig controls the persistent HLS segment cache. A completed encode
|
||||
// is kept on disk so a second play of the same file at the same quality skips
|
||||
// ffmpeg entirely. Old entries are evicted (LRU) once the cache exceeds the
|
||||
// size budget. Enabled by default — disable to save disk space at the cost of
|
||||
// re-encoding every play.
|
||||
type HLSCacheConfig struct {
|
||||
Enabled bool `toml:"enabled"` // default: true
|
||||
SizeGB int `toml:"size_gb"` // size budget in gigabytes; default: 5; minimum: 1
|
||||
Dir string `toml:"dir"` // override storage path; default: ~/.cache/unarr/hls-cache
|
||||
}
|
||||
|
||||
// FunnelConfig gates the optional CloudFlare Quick Tunnel that exposes the
|
||||
// daemon's HLS server over a public HTTPS hostname (https://<random>.try
|
||||
// cloudflare.com). Enabling it lets the web player on torrentclaw.com play
|
||||
|
|
@ -101,8 +113,27 @@ type OrganizeConfig struct {
|
|||
|
||||
type DaemonConfig struct {
|
||||
StatusInterval string `toml:"status_interval"`
|
||||
// AutoUpgrade gates the daemon's response to a server-flagged upgrade
|
||||
// (set via the "Force update" button on the web). When true the daemon
|
||||
// downloads + replaces the binary in-place and exits so the service
|
||||
// supervisor respawns on the new version. When false the daemon only
|
||||
// logs "new version available" and the operator must run `unarr update`
|
||||
// manually. Default: true. Available since unarr 0.9.6.
|
||||
AutoUpgrade *bool `toml:"auto_upgrade"`
|
||||
}
|
||||
|
||||
// AutoUpgradeEnabled returns the resolved AutoUpgrade flag — defaults to true
|
||||
// when the user has not set it explicitly. Pointer-vs-bool because Go's
|
||||
// zero-value bool would collapse "unset" and "false" together.
|
||||
func (d DaemonConfig) AutoUpgradeEnabled() bool {
|
||||
if d.AutoUpgrade == nil {
|
||||
return true
|
||||
}
|
||||
return *d.AutoUpgrade
|
||||
}
|
||||
|
||||
func boolPtr(v bool) *bool { return &v }
|
||||
|
||||
type NotificationsConfig struct {
|
||||
Enabled bool `toml:"enabled"`
|
||||
}
|
||||
|
|
@ -156,11 +187,24 @@ func Default() Config {
|
|||
// `unarr funnel off` (sets enabled=false in the TOML).
|
||||
Enabled: true,
|
||||
},
|
||||
HLSCache: HLSCacheConfig{
|
||||
// On by default — second play of a recently watched file at the
|
||||
// same quality skips ffmpeg (instant start, near-zero CPU).
|
||||
// Users can opt out (hls_cache.enabled=false) or shrink the
|
||||
// budget (hls_cache.size_gb) when disk is tight.
|
||||
Enabled: true,
|
||||
SizeGB: 5,
|
||||
},
|
||||
},
|
||||
Daemon: DaemonConfig{
|
||||
// Pointer-to-true so Default() round-trips through TOML marshal
|
||||
// as `auto_upgrade = true` instead of an omitted key — keeps the
|
||||
// freshly-written config aligned with what README documents.
|
||||
AutoUpgrade: boolPtr(true),
|
||||
},
|
||||
Organize: OrganizeConfig{
|
||||
Enabled: true,
|
||||
},
|
||||
Daemon: DaemonConfig{},
|
||||
Notifications: NotificationsConfig{
|
||||
Enabled: true,
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue