Files
tuliprox/frontend/scss/app/_component.scss
T
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

104 lines
4.1 KiB
SCSS

@forward "app_header";
@forward "app";
@forward "components/input";
@forward "components/menu_item";
@forward "components/icon_button";
@forward "components/text_button";
@forward "components/toggle_switch";
@forward "components/table";
@forward "components/task_status";
@forward "components/panel";
@forward "components/card";
@forward "components/collapse_panel";
@forward "components/breadcrumbs";
@forward "components/login";
@forward "components/sidebar";
@forward "components/preferences";
@forward "components/dashboard/action_card";
@forward "components/dashboard/status_card";
@forward "components/dashboard/sparkline";
@forward "components/dashboard/dashboard_view";
@forward "components/dashboard/stats_view";
@forward "components/dashboard/log_console";
@forward "components/dashboard/streams_view";
@forward "components/dashboard/stream_history_view";
@forward "components/list_view";
@forward "components/reveal_content";
@forward "components/hide_content";
@forward "components/playlist/playlist_settings_view";
@forward "components/playlist/playlist_explorer_view";
@forward "components/playlist/playlist_explorer";
@forward "components/playlist/target/target_common";
@forward "components/playlist/target/target_watch";
@forward "components/playlist/target/target_options";
@forward "components/playlist/target/target_output";
@forward "components/playlist/target/xtream_output";
@forward "components/playlist/target/m3u_output";
@forward "components/playlist/target/strm_output";
@forward "components/playlist/target/hdhomerun_output";
@forward "components/playlist/target/target_table";
@forward "components/playlist/target/target_sort";
@forward "components/playlist/target/target_rename";
@forward "components/playlist/input/input_table";
@forward "components/playlist/input/input_type";
@forward "components/playlist/input/batch_input_content_view";
@forward "components/playlist/playlist_mappings";
@forward "components/playlist/playlist_processing";
@forward "components/playlist/source_selector";
@forward "components/playlist/playlist_update_view";
@forward "components/setup/setup";
@forward "components/tag_list";
@forward "components/chip";
@forward "components/popup_menu";
@forward "components/dialog";
@forward "components/custom_dialog";
@forward "components/filter";
@forward "components/mapper_script";
@forward "components/mapper_counter";
@forward "components/userlist/userlist_view";
@forward "components/userlist/user_state";
@forward "components/userlist/proxy_type";
@forward "components/userlist/max_connections";
@forward "components/userlist/proxy_user_credentials_form";
@forward "components/userlist/user_table";
@forward "components/radio_button_group";
@forward "components/no_content";
@forward "components/search";
@forward "components/loading_indicator";
@forward "components/theme_picker";
@forward "components/language_picker";
@forward "components/error_boundary";
@forward "components/toastr";
@forward "components/drop_down_icon_button";
@forward "components/downloads";
@forward "components/accordion";
@forward "components/cvs_table";
@forward "components/config/config_view";
@forward "components/config/local_library_config";
@forward "components/config/log_config";
@forward "components/config/api_config";
@forward "components/config/messaging_config";
@forward "components/config/panel_api_config";
@forward "components/config/schedules_config";
@forward "components/tabset";
@forward "components/select";
@forward "components/form";
@forward "components/api_user/api_user_view";
@forward "components/keyvalue_editor";
@forward "components/loading_screen";
@forward "components/websocket_status";
@forward "components/health_banner";
@forward "components/playlist/epg_view";
@forward "components/particle_flow_background";
@forward "components/source_editor/source_editor";
@forward "components/source_editor/source_editor_form";
@forward "components/source_editor/source_editor_block";
@forward "components/cluster_flags";
@forward "components/titled_card";
@forward "components/filter_input";
@forward "components/filter_editor";
@forward "components/field_explanation";
@forward "components/rbac/user_management";
@forward "components/country";
@forward "components/recording";