50 Commits
Author SHA1 Message Date
euzuandGitHub 7c82bf0b5d Feature/mcp (#933)
* Added
 - MCP server with Web UI config, stdio bridge and docs

Fixes
- GET /api/v1/stream-history rejected the `search_field` parameter the Web UI
  sends (400), because axum's Query cannot read repeated keys into a list.
  Add a FormQuery extractor (serde_html_form) and use it there.
- hls tests were flaky: HlsProxyManager::new() put every test manager's
  segment cache into the shared /tmp/tuliprox/cache/hls, and the orphan
  session cleanup of one manager deleted the files of parallel tests
  (surfacing as MissingTimestampAnchor / TerminalUnavailable). Each manager
  now owns a private cache directory that is removed on drop.

* fixed documentation: db dump paths and flag usage in operations-debugging

* Logs is a standalone Web UI view.

* mcp playlist iterator

* mcp playlist iterator

* media server import uses own categories

* mcp playlist iterator

* Playlit Update view layout changed
2026-10-24 09:49:44 +02:00
euzuandGitHub 69040f022b Feature/maintenance (#916)
* Maintenance mode
* fix(hls): release origin slot before next origin I/O
2026-10-13 22:30:21 +02:00
euzuandGitHub b6bab647df feat(watch): group added/removed contexts per watch entry (#912)
* feat(watch): group added/removed contexts per watch entry

- watch entries: regex string or {pattern, on:
[channels|group_added|group_removed]}
- one playlist.watch.changed per refresh with WatchChange list;
playlist.groups.changed aliased
- Telegram/ntfy message length limits
- web UI: Mapping and Watch sub pages, new Mapping icon
- ClusterFlags on create_bitset!, bitflags removed

BREAKING CHANGE: playlist.watch.changed templates must use the new
watch.* fields

* feat(watch): group added/removed contexts per watch entry

- watch entries: regex string or {pattern, on:
[channels|group_added|group_removed]}
- one playlist.watch.changed per refresh with WatchChange list;
playlist.groups.changed aliased
- Telegram/ntfy message length limits
- web UI: Mapping and Watch sub pages, new Mapping icon
- ClusterFlags on create_bitset!, bitflags removed

BREAKING CHANGE: playlist.watch.changed templates must use the new
watch.* fields
2026-10-12 21:05:55 +02:00
euzuandGitHub d27570bc79 Refactored EPG View (#901)
* **New Features**
  * Added an EPG group view with channel counts, programme details, and channel search.
  * Added timeline zooming and panning, recording controls for eligible upcoming programmes, and a resizable side panel with keyboard and pointer controls.
* **Improvements**
  * EPG group and grid results support JSON or CBOR responses and show up to 1,000 channels per group.
  * Channel filters support case-insensitive text and regular expressions; invalid patterns are rejected with an error.
2026-10-06 07:55:19 +02:00
euzuandGitHub 91f6c57159 Fix/merge live and vod recording (#876)
feat(dvr)!: unify live and VOD/series recording into one recoverable DVR

Merge fix/merge_live_and_vod_recording into develop.

- One recording queue for scheduled live captures and VOD/series transfers,
  with a shared transition graph, provider-slot scheduling, resumable HTTP
  transfers (strong ETag / Last-Modified validation) and ffmpeg live capture.
- Crash-recoverable persistence: B+Tree repository with a journal-first
  recovery history; one file can be shared by several library entries.
- Admission checks quota and disk on request, at transfer start (real size)
  and before an entry attaches to a finished file; idempotent requests.
- REST is command-only; state reaches clients via owner-filtered WebSocket
  snapshots.
- Deleting a recording removes the file once no entry holds it; removing an
  entry keeps a finished file and cleans up orphaned partials.
- User ids derive from the configured username (web:/api:); the identity
  registry is gone.
- Spanish locale added; ru/ar completed; locale parity test.

BREAKING CHANGE: `video.download` is now `video.recording` (nested
`recording` keys move up, `download_priority`/`recording_priority` become
`priority`); old configs fail to load with a migration hint.
BREAKING CHANGE: `/api/v1/file/download*` and `/file/record` are removed in
favour of `/api/v1/recording/*`.
BREAKING CHANGE: `download.*` and `recording.write` permissions are replaced
by `recording.read|create|manage|delete`; tokens from before the change must
re-authenticate.
BREAKING CHANGE: the old recording queue does not migrate; existing
`identity_registry.json` is ignored.
2026-10-04 16:02:55 +02:00
euzuandGitHub 308fd87288 Fix/flussonic (#889)
* **New Features**
  * Added a setting to limit Flussonic HLS catch-up archive duration. Valid values range from 1 second to 7 days; the default is 4 hours.
  * Bounded archive requests are capped at the configured limit, while shorter valid requests retain their requested duration. Changes apply after a playlist refresh.
  * Added a dashboard credits card with app and TMDB attribution.
* **Bug Fixes**
  * Open filter dialogs now render in the document body when available, helping them display correctly.
* **Documentation**
  * Documented the archive-duration setting and bounded-archive behavior.
2026-10-01 01:21:50 +02:00
Juanjo PresaandGitHub 0d4f113c54 feat: add TMDB Trending target curation (#872)
- add target-wide TMDB Trending discovery for movie/TV and day/week, bounded by an optional `limit` (default 100, range 1–500) of unique remote references before local matching
- compose concrete Trakt and TMDB sources under one target curation policy while retaining legacy `output[].trakt` compatibility
- match only positive TMDB IDs of the same media kind and preserve existing catalog identities, series closure, and Xtream alias behavior
- require every active selector to complete before target IDs, writers, caches, or watches can change
- preserve the YAML-owned block through Source Editor operations and add TMDB setup/failure documentation and application Credits attribution
- validate complete decoded pages under independent request, selector, and shared target-batch budgets, using a configured TMDB-only HTTP profile with certificate/hostname verification and no redirects or replays
2026-09-24 17:36:34 +02:00
33ed942c16 feat(update): add per-cluster quality safeguards (#855)
* feat(update): add per-input actions and pipeline transparency

Squash feature/cluster-update-quality onto upstream/develop.

Include request-local update policies, persisted input and cluster status, library rescan and target rebuild integration, and the update-card view. Align the M3U request regression with the existing Force capability.

* del(build): temporary dev changes

* fix(update): address playlist review findings

* fix(update): rename Shows to Series

* Playlist update refactor

* Playlist update refactor

---------

Co-authored-by: euzu <euzu@proton.me>
2026-09-14 16:44:23 +02:00
euzuandGitHub d116b7d51e Feature/bouquet editor (#854)
New Features

    Added target-specific bouquet filtering with whitelist and blacklist modes for Live, VOD, and Series groups.
    Added an in-context bouquet editor with search, selection controls, status indicators, reset, and streaming previews.
    Targets are managed by name, with saved selections available through the Source Editor.
    Improved stream alias resolution and provider failover behavior.

Bug Fixes

    Existing playlists are preserved when refreshes produce no usable items.
    Empty playlists are no longer published.
    Configuration changes now recover more safely from persistence failures.

Documentation

    Updated feature and configuration documentation and added translations.
2026-09-03 17:59:54 +02: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
euzuandGitHub 9c34d8e8ca feat: invert staged input connection flow and credentials inheritance (#779)
* feat: invert staged input connection flow
2026-07-13 12:43:25 +02:00
euzuandGitHub 49573dd6b1 Feature/UI improvements (#770)
* catchup fixes

* feat(frontend): bookmarkable views via URL hash deep linking

Persist the active view to the URL hash so views are bookmarkable and
survive a page refresh. Restore the view from the hash on load, sync the
hash on navigation, and handle browser back/forward via a hashchange listener.

* feat(dev): add dev container for reproducible development

* feat(frontend): interactive multi-series metric sparklines on stats cards

* feat(frontend): aggregate status health banner with capacity breakdown

* feat(frontend): add guided empty states with hints

* chore(devcontainer): add gh CLI, dev tooling, cache volumes, and tasks

- Install GitHub CLI, git, build-essential, clang, lld, mold, jq
- Add cargo-watch, cargo-llvm-cov, cargo-deny, cargo-machete
- Persist cargo registry, target, and gh config via named volumes
- Fix volume ownership for the dev user in post-create

* chore(vscode): add tasks and launch configs for dev workflow

- tasks.json: backend/frontend dev servers, test, lint, fmt, coverage, deps checks, docs
- launch.json: CodeLLDB configs for backend and workspace tests

* a11y: add accessible labels to inputs and collapsed sidebar buttons

- Input: add aria_label prop, falling back to placeholder when no visible label
- Sidebar: pass translated hint + aria_label to collapsed-mode icon buttons

* feat(frontend): warn on unsaved config changes before page unload

* feat(frontend): handle session expiry with client-side logout

Schedule a client-side logout when the JWT expires, showing a
notification and returning the user to the login screen instead of
silently failing with 401s.

* chore(vscode): update tasks.json

* New Features

Session expiration detection with proactive logout warning
Real-time health status banner showing connectivity and provider status
Live metric sparklines for CPU, memory, and network usage
Deep-linkable views via URL hash with back/forward browser support
Enhanced empty states with guided messages across app sections

Improvements

Faster system metrics sampling (2-second intervals)
Archive and catchup-aware EPG handling for accurate program guides

* New Features

Session expiration detection with proactive logout warning
Real-time health status banner showing connectivity and provider status
Live metric sparklines for CPU, memory, and network usage
Deep-linkable views via URL hash with back/forward browser support
Enhanced empty states with guided messages across app sections

Improvements

Faster system metrics sampling (2-second intervals)
Archive and catchup-aware EPG handling for accurate program guides
2026-06-04 18:00:37 +02:00
euzuandGitHub 4e82330c6a Fix/code duplicates and UI improvements (#769)
* feat(ui): toast progress bar, pause-on-hover, and copy-details for errors

Add a countdown progress bar to auto-dismiss toasts, pause both the timer and bar on hover (resuming with remaining time), and a 'copy details' action on error toasts. Respects prefers-reduced-motion.

* feat(ui): confirm destructive download/recording cancel and remove

Route the download/recording cancel and remove actions through the shared ConfirmDialog (which focuses the safe Cancel button by default), matching the existing confirmation flow for user/target/RBAC deletes.

* feat(ui): runtime-discovered languages with manifest and RTL support

Load available UI languages at runtime from assets/i18n/index.json, add a toolbar language picker (shown when >1 language), persist the choice, and set document dir/lang for RTL languages such as Arabic.

* feat(ui): recoverable error boundary with per-view retry fallback

Add an ErrorBoundary component (context handle + use_error_boundary hook) that shows a recoverable fallback with a retry button instead of blanking a section. Wrap each main view and the API-user playlist individually so a failure in one view stays contained and the rest of the UI keeps working.

* fix(api): use async canonicalize in local file stream handler

Replace the blocking std path.canonicalize() in local_stream_response with tokio::fs::canonicalize().await so the async runtime is not blocked while resolving the local media file path.

* Add Escape-to-close keyboard support for popup menus

Popup menus now close on Escape in addition to outside mouse-down, improving keyboard accessibility.

* Use descriptive alt text for logo and channel logo images

Login and sidebar logo images now use the configured app title, and playlist channel logos use the channel title, improving screen-reader accessibility.

* Add explicit type=button to shared button primitives

IconButton and TextButton now render with type=button to prevent accidental form submission when used inside forms.

* Persist sidebar collapsed state and table page size

The sidebar collapsed/expanded state and the stream-history table page size are now saved to localStorage and restored on reload, matching the already-persisted theme preference.

* Debounce filter editor input parsing

The filter editor textarea no longer re-parses, previews, and emits the filter on every keystroke. The textarea stays responsive via an immediate value while parsing and change notifications are debounced (300ms).

* Show localized message in table empty state

Data/paged tables now render the No content label in their empty state instead of an icon with no text. Sticky headers were already present.

* feat(frontend): improve screen-reader support for sidebar and toasts

* fix(frontend): handle missing window gracefully in sidebar

* feat(frontend): cross-dissolve colors on theme switch

* feat(frontend): add card hover lift, button press feedback, animated chevrons

* Removed code duplicates
2026-06-02 11:16:03 +02:00
euzuandGitHub ba16a66c2b Feature/stream history (#718)
* stream history refactoring
* tag develop after build
2026-04-16 14:40:38 +02:00
euzuandGitHub 9ce3e7a313 Feature/download (#700)
- Download manager
- Stream history fixes
- Stream history docs updated
2026-04-03 16:23:15 +02:00
euzuandGitHub 6c32deb4c3 Stream History (#667)
Stream history qos
2026-04-02 20:03:49 +02:00
euzuandGitHub 783c73275e theme refactor, added new themes (#679)
- Theme refactor, added new themes
- Fixed user session cleanup 3h problem
- Fixed sequence sorting with order none
2026-03-28 21:57:13 +01:00
euzuandGitHub a05b0536f5 Feature/stream meter (#659)
* Connection lock for shared stream fixed
* stream meter
2026-03-21 05:29:59 +01:00
euzuandGitHub 5f2756aa75 Feature/stats page merged with streams page (#621)
- Stas page and streams page are now merged to one page
- Explanations for fields added
2026-02-28 17:01:21 +01:00
euzuandGitHub 9b742997b0 initial setup (#601)
Initial Setup Wizard
2026-02-23 11:46:21 +01:00
euzuandGitHub 17df82f006 Sort Order (#600)
* Sort Order
* Frontend refactorings
2026-02-20 20:40:48 +01:00
euzuandGitHub fe6a35676c Feature/login background (#599)
* Login particle flow background
* Fixed initial input folder missing problem
2026-02-20 13:09:30 +01:00
euzuandGitHub 748fca44b3 Feature/request timeout and web UI updates (#555)
* Idle timeout for requests implemented
* fix: user api path
* WebUI Added APi Proxy Config
2026-01-31 15:29:32 +01:00
euzuandGitHub cc2e50549d Feature/panel api update (#524)
Panel Api update
2026-01-20 18:51:46 +01:00
euzuandGitHub 16fcd7f882 Optimizations
* New Features

Added series information display with episodes, cast, and metadata in playlist explorer
Introduced multi-cluster playlist endpoints (live, VOD, series) for flexible content retrieval
Added series info lookup and filtering capabilities
Implemented sidebar navigation for source editor with dedicated pages (Main, Options, Staged, Advanced, Alias)
Added filter state controls (All, Selected, Deselected) for playlist category management
Enabled Trakt configuration toggle to control integration
Performance Improvements

Optimized B+Tree indexing for faster queries
Reduced startup latency with disk-based operations and optional memory caching
Improved string memory handling through efficient reference-counted strings
UI Enhancements

Enhanced playlist explorer with series details and episode grouping by season
Added new UI icons (Options, Advanced, Staging, Alias, Trakt)
Improved form layouts with toolbar controls
Enhanced radio button group styling for better visual hierarchy

* New Features

Added series information display with episodes, cast, and metadata in playlist explorer
Introduced multi-cluster playlist endpoints (live, VOD, series) for flexible content retrieval
Added series info lookup and filtering capabilities
Implemented sidebar navigation for source editor with dedicated pages (Main, Options, Staged, Advanced, Alias)
Added filter state controls (All, Selected, Deselected) for playlist category management
Enabled Trakt configuration toggle to control integration
Performance Improvements

Optimized B+Tree indexing for faster queries
Reduced startup latency with disk-based operations and optional memory caching
Improved string memory handling through efficient reference-counted strings
UI Enhancements

Enhanced playlist explorer with series details and episode grouping by season
Added new UI icons (Options, Advanced, Staging, Alias, Trakt)
Improved form layouts with toolbar controls
Enhanced radio button group styling for better visual hierarchy

* New Features

Added series information display with episodes, cast, and metadata in playlist explorer
Introduced multi-cluster playlist endpoints (live, VOD, series) for flexible content retrieval
Added series info lookup and filtering capabilities
Implemented sidebar navigation for source editor with dedicated pages (Main, Options, Staged, Advanced, Alias)
Added filter state controls (All, Selected, Deselected) for playlist category management
Enabled Trakt configuration toggle to control integration
Performance Improvements

Optimized B+Tree indexing for faster queries
Reduced startup latency with disk-based operations and optional memory caching
Improved string memory handling through efficient reference-counted strings
UI Enhancements

Enhanced playlist explorer with series details and episode grouping by season
Added new UI icons (Options, Advanced, Staging, Alias, Trakt)
Improved form layouts with toolbar controls
Enhanced radio button group styling for better visual hierarchy

* New Features

Added series information display with episodes, cast, and metadata in playlist explorer
Introduced multi-cluster playlist endpoints (live, VOD, series) for flexible content retrieval
Added series info lookup and filtering capabilities
Implemented sidebar navigation for source editor with dedicated pages (Main, Options, Staged, Advanced, Alias)
Added filter state controls (All, Selected, Deselected) for playlist category management
Enabled Trakt configuration toggle to control integration
Performance Improvements

Optimized B+Tree indexing for faster queries
Reduced startup latency with disk-based operations and optional memory caching
Improved string memory handling through efficient reference-counted strings
UI Enhancements

Enhanced playlist explorer with series details and episode grouping by season
Added new UI icons (Options, Advanced, Staging, Alias, Trakt)
Improved form layouts with toolbar controls
Enhanced radio button group styling for better visual hierarchy
2026-01-20 10:09:58 +01:00
euzu 873235d8f3 - Fixed Sort
- Added cluster to favourites
- Added Regex cache to avoid multiple compilations of same regex
2026-01-13 16:37:27 +01:00
euzu 53723d3015 Merge commit '7bb8a0c4f1a65a542bd3fae716fcb4236461072a' into feature/provider_api 2025-12-19 18:30:07 +01:00
euzu b1903096b7 Worked on Filter Input and Filter editor 2025-12-04 16:28:03 +01:00
euzu d2aa7e7db7 Filter Input and Filter editor started 2025-12-03 18:07:40 +01:00
euzu 6b9032da2a source editor forms 2025-12-02 10:26:02 +01:00
euzu f432e215ff added target form 2025-11-03 21:19:35 +01:00
euzu 2c1dd1db71 Input editor form 2025-11-01 21:03:18 +01:00
euzu dcba807216 source editor 2025-10-31 09:43:34 +01:00
euzu 60c2e5a161 User Stream Connection table added 2025-10-24 18:37:14 +02:00
euzu c3f7912b41 Channel favourites 2025-10-23 18:26:25 +02:00
euzu 94a39ccc52 epg view 2025-09-26 14:13:30 +02:00
euzu af6ec9c3ef Reconnect on WebSocket disconnect 2025-09-24 12:32:15 +02:00
euzu 5faba69108 config save 2025-09-01 13:33:34 +02:00
euzu 2dd6185851 save config 2025-08-29 23:12:15 +02:00
euzu d55827f0dc role based content 2025-08-27 23:12:56 +02:00
euzu 8647223302 user edit proxy type 2025-08-22 10:07:46 +02:00
euzu a30f9d420b user editor 2025-08-21 22:33:04 +02:00
euzu 8a34673033 User edit form 2025-08-21 11:41:06 +02:00
euzu 9df150468c edit user form 2025-08-20 18:45:05 +02:00
euzu bd052562b9 web ui config pages 2025-08-13 23:07:21 +02:00
euzu b6f20a5ebc Web UI Config View 2025-08-13 16:17:05 +02:00
euzu 346478b260 Staged input 2025-08-13 13:40:41 +02:00
euzu dd72746498 batch input content view 2025-08-12 08:51:38 +02:00
euzu 4765cf6d0b Added accordion panel
Added mapper counter view
2025-08-08 11:35:42 +02:00
euzu e7e27adc8a react frontend deleted 2025-08-07 19:46:49 +02:00