Commit Graph
888 Commits
Author SHA1 Message Date
DarkBreakpoint 9b4a56cf6b feat(dvr): the server tells the client which controls a recording offers
The transition graph landed as the single source of truth for state
changes, but the frontend never saw it. `action_availability` restated
the rules in TypeScript-shaped Rust: its own pausable set, its own
cancellable set, its own resumable-kind check. Two copies of a state
machine, and the module docstring already recorded that they had drifted
once before -- the queue would pause a task in any state while the
frontend offered pause for three.

`RecordingAllowedActions` moves to `shared` and rides on
`RecordingTaskDto`, computed by `allowed_actions` from the same
predicates the commands themselves use. The frontend now narrows that
set by permission and renders it:

    pause: can_manage && allowed.pause

State rules appear once, on the server.

The frontend tests that asserted "Live cannot be paused" and "VOD can be
retried" are gone rather than ported. They were restating the backend's
table through a second implementation, and the backend already proves it
exhaustively over kind x state x command. What is left tests what the
frontend actually decides now: that a command the server would refuse is
never offered, and that manage and delete gate separately.

`the_dto_offers_exactly_what_the_transition_graph_permits` walks all
three kinds across all nine states and compares the DTO against the
graph, so the projection cannot quietly stop matching.

The field is `#[serde(default)]`: a client that has not been rebuilt
sees an empty set and offers no controls, which fails closed.
2026-09-01 10:41:47 -05:00
DarkBreakpoint eaf456c18f refactor(recording): define the create-recording contract once, in shared
The request body was declared twice: CreateRecordingTaskBody in the REST
handler and CreateRecordingTaskRequest in the frontend client. The two had
to agree by hand, and they had already drifted — the frontend typed
visibility as a String and built "private"/"shared" literally at three call
sites, so a typo compiled cleanly and only failed once the server rejected
the body.

Move both the request and its source identifiers into shared as
CreateRecordingRequest / RecordingSourceRequest and have each side use
them. visibility is now the RecordingVisibility enum end to end, so
visibility_to_wire returns a value the server can parse by construction.

Both types deny unknown fields: a client sending a field this build does
not understand has a different idea of what it is asking for, and
recording the wrong thing is worse than refusing. Tests cover the exact
minimal JSON, an injected "url" field, an unknown visibility and an
unknown source field.

Also widen the availability preflight to accept any recording permission.
It answers "is the DVR usable" and carries no recording data, so gating it
on read-or-create alone would have refused a manage-only principal.
2026-09-01 07:23:02 -05:00
DarkBreakpoint 5561ff7690 feat(auth)!: split recording.write into create, manage and delete
A single write permission could not express the policy the DVR needs: a
user who may request a recording is not necessarily one who may cancel
someone else's, and neither implies the right to delete a file. Replace it
with recording.create, recording.manage and recording.delete, and map each
action onto the one it actually needs:

- create private/shared          -> recording.create
- edit, cancel, manage rules     -> recording.manage
- delete, system retention sweep -> recording.delete

The split renumbers every permission bit above recording.read, so
CURRENT_PERMISSION_SCHEMA_VERSION is bumped to 4 and tokens issued earlier
fail closed at the validator instead of having their bits reinterpreted.
The removed recording.write name now decodes to nothing, so a groups file
that still lists it loses the permission rather than silently gaining one
of the three replacements.

Permission bit values are frozen in a test: they are the wire format, and
reordering the enum would reinterpret every issued token.
2026-08-31 15:30:39 -05:00
euzu 486aa955d8 DVR Feature 2026-08-29 11:14:44 +02:00
euzu 3d42c7ab9e DVR Feature 2026-08-28 19:17:39 +02:00
euzu 93a5c5f162 DVR Feature 2026-08-28 09:58:27 +02:00
euzuandGitHub 9ec775b35b Feature/multi crate (#837)
Refactored to multi crate project
2026-08-27 15:36:23 +02:00
euzu eb9b2a01fa ci: bump version v3.3.91 2026-08-24 18:16:43 +00:00
euzuandGitHub 56ea26d764 Fix/dvr (#836)
New Features

    Added recording availability checks before opening recording forms, with clear service-status errors.
    Added configurable recording settings for retention, disk limits, quotas, notifications, priority, and filename templates.
    Recording configuration is now available in video settings.
    Added validation for recording quotas, ranges, and unsigned values.

Bug Fixes

    Improved recording progress updates and configuration preservation.
    Recording navigation visibility now follows recording permissions.

Style

    Improved muted and debug log-console contrast across themes.

Translations

    Updated English, Arabic, and Russian recording-related messages.
2026-08-24 20:14:47 +02:00
euzu baf6198157 ci: bump version v3.3.90 2026-08-24 10:10:51 +00:00
euzuandGitHub ed7f680829 Fix/stats view (#835)
New Features

    Log consoles now support consistent theming across all available visual themes, including severity and target colors.
    Filtering and actions use shared controls with improved accessibility hints and visual states.
    Logs are expanded by default, with playlist updates displayed under a dedicated “Playlist Update” section.

Bug Fixes

    Improved radio-button group borders and selected-state layering.
    Refined stats panel sizing and styling for more consistent layouts.
2026-08-24 12:09:40 +02:00
euzu dfde03e900 ci: bump version v3.3.89 2026-08-22 22:15:03 +00:00
euzuandGitHub 4173724a23 Fix/dialog stack (#834)
New Features

    Dialogs can now be stacked, allowing multiple dialogs to remain open while keeping only the topmost dialog interactive.
    Added improved dialog layering and dismissal behavior for nested dialogs.

Improvements

    Updated the Yew framework and related routing and hooks libraries.
    Improved dialog handling so background layers remain visible without responding to clicks or results.
2026-08-23 00:12:52 +02:00
euzu 2a73d4f2c7 ci: bump version v3.3.88 2026-08-22 19:37:16 +00:00
euzuandGitHub 11fe8f0443 Fix DiskAlert activation (#833)
New Features

    Disk-space alerts can now be enabled and saved from the Web UI.
    Selected radio buttons now have clearer background, text, border, and focus styling.
    Messaging settings preserve configured disk-alert thresholds, including default values.

Bug Fixes

    Disabled disk-space alerts are correctly removed when deselected.
    Messaging notification types now accept standard and case-insensitive variant names.
    Improved reliability when saving messaging configuration changes.
2026-08-22 21:35:13 +02:00
euzu e731a5b8f2 ci: bump version v3.3.87 2026-08-22 16:53:29 +00:00
euzuandGitHub 1afbe7cca5 health check fix (#832)
New Features

    Added a /ready readiness endpoint with clear initializing, exhausted, and ready states.
    Improved health-banner behavior for shared provider capacity, disabled providers, aliases, and idle fallback capacity.

Bug Fixes

    Improved capacity calculations with shared provider grouping, overflow-safe totals, and empty-capacity handling.

Documentation

    Documented liveness, readiness, and detailed status endpoints, including Docker and orchestrator usage.
2026-08-22 18:52:19 +02:00
euzu 5f63fd453b ci: bump version v3.3.86 2026-08-21 18:06:25 +00:00
euzu a37468aab9 ci: bump version v3.3.85 2026-08-21 17:25:13 +00:00
euzu febdd1f582 ci: bump version v3.3.84 2026-08-21 12:52:19 +00:00
euzuandGitHub 16d32d1298 DVR Feature (#819)
feat: complete DVR and improve streaming, security, configuration, and UI

Complete the Digital Video Recorder subsystem and add a broad set of
reliability, security, streaming, configuration, processing, and Web UI
improvements across Tuliprox.

DVR:

* complete live recording and provider-aware VOD download support
* add recording queue, workers, scheduling, and recurring recording rules
* add conflict detection and capacity-aware scheduling
* add pause, resume, retry, edit, cancel, and delete workflows
* add recording quotas and configurable retention policies
* add crash recovery and startup reconciliation
* add durable lifecycle notifications with per-channel retries
* add DVR health monitoring and diagnostic tooling
* add secure access to recordings, thumbnails, and subtitles
* add WebSocket notifications for recording and rule changes
* add Web UI management for recordings, rules, progress, and task state
* add RBAC, configuration, documentation, and i18n support

Streaming and HLS:

* fix shared-stream idle handling and release dead provider streams correctly
* stop tee streams when both client and cache consumers are gone
* cancel provisioning probes when client streams terminate
* fix transient HLS origin work accounting and intermittent 503 responses
* make stream buffer byte limits configurable
* make shared subscriber idle timeout configurable
* make initial HLS manifest wait timeout configurable
* add configurable TS chunk packet count
* add configurable HLS refresh failure backoff
* centralize redirect limits and retry jitter handling
* improve provider DNS refresh behavior and failover tuning
* preserve UTF-8 characters in catchup templates
* improve stream history validation and persistence error handling

Security:

* use constant-time credential comparisons
* harden library and media path handling against traversal and symlink escapes
* only trust forwarded client IP headers from configured trusted proxies
* redact credentials and sensitive URL data from logs
* reject invalid authentication status-code configuration
* deny users with unresolved plans or invalid content filters
* improve authentication error handling across proxy and HLS endpoints

Configuration and reliability:

* prevent invalid api-proxy.yml reloads from terminating the running server
* fully validate API proxy configuration before persisting changes
* log configuration and EPG cleanup failures instead of silently discarding them
* keep the last valid configuration active after failed hot reloads
* align backend and shared media-server validation
* remove duplicated path and normalization logic
* improve DNS-store recovery and Windows rename fallback handling
* reject invalid duration, timestamp, and numeric conversions safely
* fix playlist bouquet save error handling
* fix provider record update detection
* fix cache boundary handling
* improve startup and persistence failure diagnostics

Filtering, search, sorting, and processing:

* add field-scoped playlist explorer search
* centralize shared stream-history search field definitions
* extend the filter DSL with string, set, and numeric operators
* add EPG ID, channel number, and detected quality as filterable fields
* add filter dry-run preview API with match statistics and samples
* report filter syntax errors with line and column information
* add natural numeric-aware sorting
* add quality-aware channel deduplication
* add accent-independent deduplication
* move natural sorting and quality detection helpers into shared code
* persist explorer search-field selection across reloads

User plans and content access:

* add reusable API user plans for capability tiers
* support inherited cluster and connection limits with per-user overrides
* add plan-level and user-level content filters
* enforce content filters across Xtream, M3U, direct playback, resource access,
  stream info, short EPG, categories, and XMLTV
* add trial plans with automatic expiry and Trial status
* add plan selection and content filtering to the user editor
* add full plan management to the API configuration Web UI
* migrate the API user database to schema V7 with plan and filter persistence

Web UI and accessibility:

* add live logging console to the stats page
* improve login error handling and prevent duplicate authentication requests
* add keyboard navigation to tabs, menus, tables, and search
* add ARIA roles, labels, validation state, and live-region feedback
* add confirmation dialogs for destructive actions
* add unsaved-change warnings and Ctrl/Cmd+S shortcuts
* add loading, progress, empty, and in-flight states across views
* improve dropdown and single-selection behavior
* add clipboard and credential-copy helpers
* persist table pagination and explorer search preferences
* improve error recovery when UI context providers are unavailable
* remove multiple panic-prone unwrap and browser API paths
* replace remaining hardcoded UI strings with translation keys

Maintenance:

* resolve backend and frontend compiler and Clippy warnings
* update packages and test fixtures
* consolidate duplicated helpers and validation logic
* improve documentation for configuration, filters, plans, DVR, and REST APIs
* add and update tests for migrations, filters, deduplication, sorting,
  configuration, streaming, and accessibility behavior
2026-08-21 14:50:12 +02:00
euzu df961e4bf7 ci: bump version v3.3.83 2026-08-06 20:31:25 +00:00
euzu 6c4082992b ci: bump version v3.3.82 2026-08-05 15:04:28 +00:00
euzu 77e7432ad6 ci: bump version v3.3.81 2026-08-05 14:00:48 +00:00
euzu de45535647 ci: bump version v3.3.80 2026-08-01 10:51:57 +00:00
euzu f56f8a0f0a ci: bump version v3.3.79 2026-08-01 09:56:08 +00:00
MaxPain99andGitHub 9cb8ea9aad fix: Flussonic/BitTV archive catchup routing and Streams panel stability (#807)
* feat: improve Flussonic/TiviMate M3U catchup and DVR playback

Unified catchup-type export, default Wink append template, leaked relative
DVR path recovery, session-based archive EPG reference, and panel archive
playback helpers for Flussonic-style origins.

* fix: Flussonic/BitTV archive Streams sticky panel and catchup routing

Prefer catchup-type for Flussonic detection, keep archive rows stable across HLS segments without immortal ghosts, scroll Active Streams list, and dedupe HLS chips.
2026-08-01 11:55:02 +02:00
euzu 81bf19028b ci: bump version v3.3.78 2026-07-30 16:49:18 +00:00
euzu 3ae44e1f5c ci: bump version v3.3.77 2026-07-30 12:58:56 +00:00
euzu 73a3da5f55 ci: bump version v3.3.76 2026-07-29 16:46:50 +00:00
euzu fb925b0171 ci: bump version v3.3.75 2026-07-29 14:04:46 +00:00
euzuandGitHub 42e4c72608 STRM title/filename can now selected from header or metadata. (#803)
* **New Features**
  * Added a STRM export option to control whether generated folder/file names use media metadata or the processed title.
  * STRM naming now prefers the processed title by default; enabling the option switches to metadata-derived names.
  * Added a UI chip/tag and editor control for the setting.

* **Documentation**
  * Updated STRM configuration docs with the new option, its default, and its effect.
  * Added localization text for the setting in supported languages.

* **Tests**
  * Added/updated tests to verify filename behavior for videos and series with and without the option.
2026-07-29 16:01:24 +02:00
euzu 0dd6ef8a54 ci: bump version v3.3.74 2026-07-27 13:14:08 +00:00
euzuandGitHub 4d8df8f534 M3u catchup fix (#794)
* **New Features**
  * Catch-up streams can now auto-detect whether to serve direct video or an HLS playlist.
  * Added archive-aware HLS session/identity handling and improved upstream user-agent propagation for manifests.
  * Enhanced M3U timeshift/archiving, including nested handling and native Flussonic archive support; Short EPG can advertise archive availability.

* **Bug Fixes**
  * Provider session headers now persist across retries and deferred-open scenarios.
  * Legacy HLS routing is now cache-aware; seek detection improvements.
  * Stalker errors now better redact sensitive URL details.
  * Fix: Preserve VOD client range requests

* **Tests**
  * Expanded coverage for probing, archive/timeshift resolution, header overlay rules, and related routing.
2026-07-27 15:13:10 +02:00
euzu bcc1badcfe ci: bump version v3.3.73 2026-07-23 13:38:32 +00:00
euzuandGitHub fa87a65c9f Feature/hls disable (#800)
* **New Features**
  * Added **Force MPEG-TS** / `disable_hls_streaming` for Xtream live streams, rewriting live `.m3u8` requests to `.ts`.
  * Added UI controls and option indicators, with localized labels in English, Arabic, and Russian.

* **Documentation**
  * Clarified MPEG-TS behavior and added an Xtream example configuration.

* **Bug Fixes**
  * Improved live-stream playback routing/extension handling and related permission-failure responses.
  * Refined provider allocation and grace-period handling for more consistent connection admission.
2026-07-23 15:37:14 +02:00
euzu 2cc23aa92f ci: bump version v3.3.72 2026-07-22 12:32:33 +00:00
euzu 427ea8fee3 ci: bump version v3.3.71 2026-07-22 09:19:48 +00:00
euzuandGitHub fa514031d6 Fixed input form state (#797)
Bug Fixes
- Input forms now consistently update when switching between configured sources.
- Improved filter matching for captions/titles and more accurate type handling for live/video/series (including series-info variants).

New Features
- Mapping DSL now supports reading @input and @type as metadata sources, while rejecting assignments to them.
- Regex capture results are now more consistently exposed across captures (by index and name).

Tests
- Added WASM browser coverage for input switching and updated coverage for filter/mapping behavior.

Documentation
- Updated mapping DSL documentation and changelog to reflect @input/@type read-only behavior and capture access rules.
2026-07-22 11:18:46 +02:00
euzu 21ba9322ca ci: bump version v3.3.70 2026-07-21 09:23:01 +00:00
euzuandGitHub ab4031e567 Fix: Mapper counter reset (#795)
Bug Fixes
Fixed playlist counter assignments so values reset correctly during each refresh.
Corrected counter displays to consistently show their configured starting values.
Improved counter comparisons to detect changes in starting values accurately.
2026-07-21 11:21:34 +02:00
euzu b0ac44372c ci: bump version v3.3.69 2026-07-20 15:41:09 +00:00
euzu 922cb8f028 ci: bump version v3.3.68 2026-07-20 13:00:59 +00:00
euzuandGitHub f8e8941929 Feature/stalker (#780)
New Features

- Added first-class Stalker/Ministra portal support, including live, VOD, series, playback-link refresh, and bulk EPG ingestion.
- Added Stalker configuration and batch/CSV support in the Web UI.
- Added playlist preview and playback handling for Stalker inputs, with support for partial refreshes.
2026-07-20 14:58:06 +02:00
euzu ca2daee21b ci: bump version v3.3.67 2026-07-17 15:58:29 +00:00
euzu e3956a30cd ci: bump version v3.3.66 2026-07-16 13:30:23 +00:00
knylbyteandGitHub 2c39bebc2d fix: clean up orphaned active streams (#791) 2026-07-16 15:28:16 +02:00
euzu a9336f5a44 ci: bump version v3.3.65 2026-07-15 10:53:30 +00:00
euzu d4da4466ac ci: bump version v3.3.64 2026-07-15 08:41:31 +00:00
euzu 8f65e98241 ci: bump version v3.3.63 2026-07-15 07:40:51 +00:00