Commit Graph
51 Commits
Author SHA1 Message Date
4gray 09ad2c3b1b refactor(ui): tidy imports, simplify cleanup, and format styles 2025-11-23 18:50:46 +01:00
4gray 6a8ea69492 feat(multi-epg): redesign multi-EPG styles with modern dark theme
Revamp the Multi-EPG component stylesheet to introduce a polished,
broadcast-control-room inspired dark theme and improved layout
styling.

- Add Google fonts (Outfit, JetBrains Mono) for a clean UI and mono
  date display.
- Introduce color variables, gradients and accents for consistent
  theming and easier maintenance.
- Rework base container (.parent) with subtle grid overlay and updated
  typography.
- Implement a frosted glass navigation bar (#epg-navigation) with
  blur, glow, and accessible button styles.
- Add today-date styling using a monospace font and glowing accent.
- Expand channels column width, update background, borders, shadows,
  and hover transitions for clearer channel separation.
- Replace many hard-coded colors with variables and add transitions
  for smoother interactions.
- Add utility classes for navigation buttons and improved disabled/
  hover states.

These changes improve visual hierarchy, accessibility, and maintainabiity
of the EPG UI while setting up a consistent design system for further
enhancements.
2025-11-22 11:40:16 +01:00
4gray 5cf96d7112 feat(video-player): add channel number overlay UI
Add a transient channel number overlay to the video player UI so users
see the numeric channel feedback when entering or changing channels.

- Insert conditional overlay markup in the video-player template that
  renders when showChannelNumberOverlay is true and displays the
  channelNumberInput value.
- Add styles for .channel-number-overlay and
  .channel-number-display to center the overlay, style the numeric
  display (large bold font, dark translucent background, rounded
  corners, shadow) and include a brief scale-in animation.
- Keep overlay pointer-events disabled so it doesn't block player input.

This improves user experience by giving clear visual confirmation of
channel changes.
2025-11-22 11:40:16 +01:00
4gray 34ef9c57d1 fix: preserve favorites after auto-refresh 2025-11-22 11:40:16 +01:00
4gray 592f6e34f9 feat(toolbar): add info button and overlay toggle
Add "Show program info (Press I)" translation and an info icon
button to the video player toolbar. Emit an infoOverlayClicked event
from the toolbar and expose isLeftDrawerOpened to control the menu
icon state. Update the menu icon to reflect drawer open/closed state.

Implement showOverlay() on the info overlay component to toggle
visibility and auto-hide after 10 seconds when shown. This enables
manual toggling of the program info overlay via the new toolbar
button or keyboard shortcut, improving discoverability and user
control of program information.
2025-11-22 11:40:16 +01:00
4gray 3bf328343b style(ui/info-overlay): redesign EPG layout and styles
Refactor the info-overlay template to introduce a structured EPG
layout: replace the previous flat channel-logo + content structure with
an .epg-layout wrapper that groups .channel-logo and a richer .content
area. Split content into .content-header (separate program title and
channel name), conditional program description rendering, and a
program-timeline containing explicit start/end times and a progress
track. Remove fixed image width attribute and rely on responsive CSS.

Revamp component SCSS: import refined fonts, increase overlay max-height,
add horizontal padding, and add new styles for .epg-layout, .channel-logo,
.content, .content-header, .program-title and related elements. Add
animations, improved image handling (object-fit + drop shadow), and
layout spacing to support varying content lengths and improve visual
hierarchy.

These changes improve responsiveness, accessibility of EPG text
display, and visual polish of the overlay.
2025-11-22 11:40:16 +01:00
4gray 63f80064d6 refactor(i18n): update remote control copy and default port
Update English translations for the remote-control UI and change the
documented default remote-control port.

- Change default remote control port description from 3000 to 8765 to
  reflect actual configuration.
- Improve remote control UI copy:
  - Add SUBTITLE "Control your IPTV player remotely".
  - Capitalize UP_CHANNEL and DOWN_CHANNEL labels to "Channel Up" and
    "Channel Down" for consistent UI presentation.

These changes clarify the feature and align text with current behavior.
2025-11-22 11:27:57 +01:00
4gray c8961c94d5 feat: use signal for active channel + listen for remote control events
- Replace local selected state with store signal (selectActive) in the
  channel list container so templates bind to activeChannel()?.url
  instead of comparing selected?.id. This unifies selection handling
  with the global store and prevents stale local state.
- Update selectChannel to dispatch setActiveChannel instead of mutating
  local selected property; keep EPG lookup behavior intact.
- Import selectActive alongside other selectors from m3u-state and
  remove unused local InjectionToken in video player.
- Add remote control listener in VideoPlayer (Electron) to handle
  channel up/down events and wire a new handleRemoteChannelChange
  method skeleton. Use combineLatest/take to safely read required
  observables for channel switching.
- Minor rxjs import and formatting adjustments.

These changes centralize active channel state in the store, simplify
template logic, and add support for remote channel changes on desktop.
2025-11-22 11:26:22 +01:00
4gray a48f7d60be feat(electron-backend): add lightweight HTTP server for remote UI
Add a new HttpServer class that serves the built remote-control-web
static assets and provides a simple REST/API routing layer for remote
control endpoints.

Key changes:
- Implement server lifecycle: start, stop, updateSettings with port and
  enabled handling.
- Resolve distribution path depending on electron packaging (dev vs
  production).
- Serve static files with basic security (normalize path to prevent
  traversal) and SPA fallback to index.html for client-side routing.
- Provide registration API for remote control handlers mapped to
  /api/remote-control/* endpoints.
- Log server status and listening URL on start, and on stop.

These changes enable the Electron backend to host the remote control
web app and route API calls without external web servers, simplifying
development and packaging.
2025-11-22 11:26:22 +01:00
4gray 5fa4423400 feat(settings): enable desktop remote control and change port
Update default remote control port from 3000 to 8765 in settings
store and component initialization to avoid conflicts with common
development ports and align with the desktop/tauri environment.

Unhide and scope the remote control UI to desktop builds only:
- Restore the remote control block in settings template and guard it
  with @if (isDesktop) so the checkbox and description render for
  desktop users (previously commented out as not ported).
- Keep the remote control settings section conditionally visible
  when the remoteControl form value is true.

These changes ensure desktop users can configure and enable the
remote control feature with a non-conflicting default port.
2025-11-22 11:26:22 +01:00
4gray 5d2875e554 feat(remote-control-web): add new web app for remote control
Add a new remote-control-web application using Angular standalone
bootstrap. Add main.ts to bootstrap Application with appConfig and log
bootstrap errors.

Introduce global styles (styles.scss) to reset page margins, ensure
full-height layout, set dark background, and prevent horizontal scroll.

Add Nx project configuration (project.json) for build, serve, test,
lint, extract-i18n and serve-static targets with production and
development configurations, asset and style wiring, and Jest test
integration.

Add tsconfig.spec.json to configure testing compilation (Jest, Node),
include test files and test setup.

Start app configuration provider file (app.config.ts) to prepare
application providers (partial file added).

These changes scaffold the new remote-control-web application and
enable building, serving and testing in the monorepo.
2025-11-22 11:26:22 +01:00
4gray f2e8e15dcd feat(i18n): add German translations for sorting, EPG and playlist
Add new German translation keys for sorting options used across the
UI (SORT_BY, SORT_BY_DATE, SORT_BY_RATING, SORT_BY_NAME, SORT_PLAYLISTS,
SORT_OPTIONS). Introduce EPG title and success message (EPG.TITLE,
EPG.FETCH_SUCCESS). Expand playlist-related messages: export success/error,
refresh Xtream dialog and messages (REFRESH_XTREAM, REFRESH_XTREAM_DIALOG),
remove dialog success, playlist update/error messages, auto-refresh flags,
and a safer CORS note for URL upload (URL_UPLOAD.CORS_NOTE). Add STREAM_FORMAT
label under settings.

Also improve existing German copy for GLOBAL_FAVORITES_DESCRIPTION and
minor reordering of IMPORTED_AS_TEXT to keep related keys together.

These changes localize newly added UI features (sorting, playlist import/
export, Xtream refresh, EPG feedback) and provide clearer user-facing
messages and safety guidance.
2025-11-15 18:17:40 +01:00
4gray 80fa80ff09 feat(settings): filter pre-releases and add version compare
Filter out pre-release GitHub releases (beta,, rc, preview,
dev, canary, nightly) when resolving the latest app version and
validate release names using semver. Sort stable releases by
creation date and return the most recent stable release name.

Add isVersionOutdated(current, latest) to compare coerced semver
versions safely, handling invalid formats with a warning. Move
version comparison logic from the settings component to the
SettingsService and use the new helper to determine if the
installed app is outdated. This prevents false positives from
pre-release tags and improves version parsing robustness.
2025-11-15 17:37:17 +01:00
4gray c34bdf73e1 feat(xtream): show category page info and preserve page state
Update category header and list views to provide clearer context
and improve navigation state handling.

- Display category name with current page/total pages when viewing a
  category (non-detail) so users see which page they're on.
- Add i18n "PAGE" key and fill "SELECT_CATEGORY" in translations for
  en/de/ru to support the new page label and existing messaging.
- Tidy live-stream layout template formatting and fix filter pipe
  spacing for consistency.
- Change no-channel-selected fallback to use the translated
  "PORTALS.SELECT_CATEGORY" string.
- Preserve category selection state on CategoryContentView init:
  only set selected category when the route category differs from
  the current selection to keep paging/scroll position when returning
  from a detail view.

These changes improve UX by making pagination explicit and avoiding
unnecessary state resets when navigating between list and detail.
2025-11-15 17:36:58 +01:00
4gray 8bc8eab167 feat: show category icon when no channel selected
Add a disabled category icon button next to the "Select category"
placeholder in the live stream layout when no channel is selected, and
align the placeholder text and icon with flex and spacing. This gives a
clearer visual cue for the missing category.

Also add missing translation keys ("SELECT_CATEGORY" and "PAGE") to
English, Russian and German locale files so the new UI text and paging
label are available across supported languages.
2025-11-15 17:36:25 +01:00
4gray 3455ff75f1 refactor: clean up layout, simplify markup, fix img alt
Remove unused .link-input styles from player-dialog component and tidy
vod-details template indentation and structure. Reformat container and
image/detail sections to use consistent indentation, add an alt attribute
to the movie poster img, replace several label elements with simpler divs
for clearer semantics, and ensure placeholder-cover fallback remains.
These changes improve readability, reduce unused CSS, and enhance HTML
accessibility.
2025-11-15 14:27:47 +01:00
4gray 3c4af147a8 refactor(player): remove unused PlayerDialog and SafePipe
Remove the PlayerDialogComponent (TS, HTML, SCSS) and the standalone
SafePipe from the xtream feature. These files were deleted because
the dialog and pipe are no longer used by the application, reducing
dead code and simplifying the web module surface.

This change prevents maintaining UI code (player
markup, styles, and clipboard/snackbar logic) and an unused DOM
sanitizer pipe, improving project maintainability and build size.
2025-11-15 14:27:08 +01:00
4gray 34b252831b feat(account-info): add translations
Add a complete Angular template for the Xtream Tauri account-info dialog.
The new HTML lays out user and server information in a responsive
two-column grid, including status, username, connection counts,
creation/expiry dates, trial indicator, allowed output formats and
server details (live/movies/series counts, URL, protocol, timezone,
server time and ports). Translation pipes are used for all labels and
conditional classes mark active/trial states. This provides a full UI
for displaying parsed accountInfo data and prepares the dialog for
binding with component logic and styles.
2025-11-15 14:26:46 +01:00
4gray 730200f704 feat(xtream): preserve user Xtream data during refresh
Save and restore favorited and recently viewed Xtream items when
deleting and re-importing playlist content.

- Return favoritedXtreamIds and recentlyViewedXtreamIds from
  deleteXtreamPlaylistContent so callers can capture user data before
 .
- Add restoreXtreamUserData to the database service to allow restoring
  favorites and recently viewed entries after a refresh.
- Query and collect xtreamIds and timestamps for favorites and recently
  viewed items in the backend before deleting content.
- Persist the captured user data to localStorage in the recent playlists
  component so it can be used to restore state after re-importing the
  playlist.
- Keep existing playlist metadata update flow intact.

This prevents loss of user-specific favorites and recent history when
refreshing Xtream playlists.
2025-11-13 19:26:37 +01:00
4gray 67f54a94c7 fix(xtream): use signal syntax in template 2025-11-11 21:08:16 +01:00
4gray d2b076f1fe feat: auto-update playlists on startup
Add automatic playlist refresh on application startup by listening
for successful playlist load and dispatching an IPC event for any
playlists with autoRefresh enabled.

- Inject Actions into AppComponent and add triggerAutoUpdatePlaylists
  that waits for PlaylistActions.loadPlaylistsSuccess, selects
  selectAllPlaylistsMeta from the store, filters playlists with
  autoRefresh, and sends AUTO_UPDATE_PLAYLISTS via DataService.
- Call triggerAutoUpdatePlaylists from ngOnInit and remove a now-
  unused commented commands list.
- Add helper functions in backend playlist events to fetch and parse
  playlists from URL or file, consolidating parsing logic and creating
  playlist objects.

This implements the previously noted TODO to trigger playlist auto-
refresh and centralizes playlist fetching/parsing for reuse and
clarity.
2025-11-11 08:25:02 +01:00
4gray 487b721d7c refactor: replace shared COMPONENT_OVERLAY_REF with local tokens 2025-11-11 08:24:30 +01:00
4gray f694c60c93 style: set host width to full in favorites component 2025-11-08 23:54:57 +01:00
4gray e6afb412a9 fix(stalker): rename remove ouput to removeFavorite 2025-11-08 23:54:42 +01:00
4gray e06c154e0f fix(mpv, electron): improve process startup & error reporting
Refine MPV/VLC launch error handling in the renderer to extract and show
error.message when available, preventing unhelpful "[object Object]"
messages in the UI.

In the Electron backend, ensure failed MPV instances fall through to
creation by commenting intent, and wrap spawn in a promise to reliably
detect startup failures. On spawn error, clear stored references and
reject with a descriptive message that includes the mpv path. Add an
exit handler, conditional storage of the process for reuse, and proc.unref
for detached runs. Use a short timeout to resolve the promise when spawn
succeeds and log startup state. Convert a silent log to console.error and
rethrow the error to surface failures to callers.

These changes make MPV startup more robust and produce clearer error
feedback for debugging and UI notifications.
2025-11-08 23:02:15 +01:00
4gray 588664c3aa refactor(player): remove unused player path args 2025-11-08 23:02:15 +01:00
4gray 656c86dc30 refactor: rework ipc events handling 2025-11-08 23:02:15 +01:00
4gray d3fc2a5af8 feat(ui): enhance navigation sidebar visuals and tooltips
Update navigation components to improve sidebar usability and layout.
- Reformat stalker-shell navigation binding to align attributes consistently.
- Add matTooltip and matTooltipPosition to portal icon and nav items to
  surface portal status and item labels on hover.
 Rework navigation markup to use mat-nav-list, add home shortcut and dividers,
  and hide several textual labels/actions by commenting them out to create a
  more compact icon-only sidebar while preserving code for future restore.
- Collapse unused portal info/actions and library labels into comments to
  simplify DOM while keeping structure for reactivation.

These changes make the left navigation more compact, provide quick hover
context via tooltips, and prepare the UI for a condensed icon-driven layout.
2025-11-08 23:02:15 +01:00
4gray 837849ee57 refactor: code style improvements 2025-11-08 10:24:41 +01:00
4gray 6f9e8aa64e feat(player): pass playlist headers to external players 2025-11-08 10:22:27 +01:00
4gray 3eed15d806 feat(player): use user-agent, referrer, origin for vlc and mpv
Enhance MPV player IPC handler to accept and forward extra parameters
(url, path, title, userAgent, referer, origin). Attempt to reuse an
existing MPV instance when reuse is enabled and an IPC socket is
available; if reuse fails, fall back to spawning a new process.

When creating a new MPV process, generate a unique platform-aware IPC
socket path, build arguments conditionally from provided metadata
(user-agent, referrer, origin via http-header-fields, force-media-title)
and append the URL last. Improve logging for debugging and handle
process spawn errors by clearing stale process/socket references.

These changes enable smoother playback handoff, preserve headers and
title for remote resources, and make MPV invocations more robust.
2025-11-08 10:22:27 +01:00
4gray 4c6ee1b75a feat(store): migrate from electron-store to electron-conf 2025-10-27 08:20:29 +01:00
4gray 3520229670 fix: correct typo in settings import path 2025-10-27 08:20:29 +01:00
4gray ccbb08cfb4 fix(ui): correct imports, guard checks, logging and settings handling 2025-10-27 08:20:29 +01:00
4gray 51e04ab069 fix(settings): fix settings issues, fix ipc commands
Update channel.model to import Channel from the local interface file
instead of the package namespace. This fixes an incorrect module
resolution and keeps the codebase consistent with local typings.

Add a new SidebarView union type ('CHANNELS' | 'PLAYLISTS') to expose
possible sidebar view options for consumers of the shared interfaces.
2025-10-23 22:55:17 +02:00
4gray 1b420c67de refactor: code style improvements
- Comment/test stubs in several .spec.ts to avoid importing
  heavy modules and to disable flaky tests
 (video-player.component.spec.ts, channel-list-container.component.spec.ts,
  recent-playlists.component.spec.ts).
- Replace long relative import with package alias for PlaylistsService
  to simplify module resolution (video-player.component.spec.ts).
- Add missing alt attribute to channel logo img for accessibility
  (channel-list-item.component.ts).
- Assert non-null where templates expect values by removing optional
  chaining in template bindings (video-player.component.html):
  use activeChannel.url and activeChannel.epgParams, and non-null
  assertions for playerSettings.showCaptions to avoid runtime/template
  type errors.
- Consolidate SidebarView import with Channel from shared-interfaces to
  fix incorrect relative path (sidebar.component.ts).
- Restore or replace MomentDatePipe import usage in tests (info-overlay.spec.ts).

These changes reduce test import noise, fix template type issues,
improve accessibility, and simplify imports to match project aliases.
2025-10-23 22:52:44 +02:00
4gray 8e5a643fac feat(epg): worker-based EPG handlers and fetch logic 2025-10-23 21:53:51 +02:00
4gray 461e2e2e7e feat(xtream): Xtream playlist refresh workflow
a dedicated refresh button and workflow for Xtream in the
recent playlists UI. Show a refresh icon only when the playlist has a
serverUrl. For Xtream playlists, prompt the user with a confirmation
dialog, delete locally cached categories and streams, show a toast that
the refresh started, and navigate to the playlist to trigger re-import.
Keep existing refresh IPC logic for non-Xtream (M3U/local) playlists.

Also add English translations for the Xtream refresh tooltip and dialog
messages, and surface errors via snackbar on failure.

This enables safe re-importing of remote Xtream playlists while preserving
favorites and recent items.
2025-10-18 21:55:48 +02:00
4gray 0a934d2ac6 refactor(electron): migrate from tauri/plugin-sql to libsql 2025-10-18 21:31:29 +02:00
4gray 6dcbbadda8 refactor(app): replace TauriService with ElectronService usage 2025-10-18 13:05:26 +02:00
4gray 7c42c1b6fc feat(settings): add mpvReuseInstance setting to store and i18n
Add MPV_REUSE_INSTANCE key to the electron backend store service and
include mpvReuseInstance in the shared settings interface so the new
boolean setting is persisted and available across renderer and main
processes.

Also update English i18n JSON formatting and expand the HOME section
translations (reformatting and adding nested playlist-related keys)
to ensure the UI strings remain consistent after changes.
2025-10-18 11:57:20 +02:00
4gray d9cbb1ce87 refactor(player,epg): add MPV reuse, IPC commands, and EPG handlers
Introduce MPV process reuse and IPC control, and add basic EPG IPC
handlers.

- Add GET_CHANNEL_PROGRAMS and FETCH_EPG ipc handlers to epg.events.ts
  to expose fetching EPG data by channel or URLs.
- Rework player.events.ts:
  - Export proper bootstrap and add module-level mpvProcess and
    mpvSocketPath to track a reusable MPV instance.
  - Add sendMpvCommand helper to communicate with MPV via its IPC socket.
  - Implement OPEN_MPV_PLAYER handler that:
    - Reads MPV path and MPV_REUSE_INSTANCE setting from store.
    - Attempts to reuse an existing MPV process by sending loadfile
      command over the socket when reuse is enabled.
    - Falls back to spawning a new mpv process, creating a unique IPC
      socket path, and storing the process/socket when reuse is enabled.
    - Adds error and exit handlers to clear stored references.
  - Add necessary imports (ChildProcess, existsSync, createConnection).
  - Remove/comment unused import block for shared-interfaces and adapt
    existing code to the new flow.

Why:
- Enable reusing a single MPV instance to improve resource usage and
  provide faster playback switching.
- Add IPC endpoints for EPG to support frontend requests for program
  data.
2025-10-18 11:53:57 +02:00
4gray b61530f279 feat(preloadtauri): add external player IPC and playlist auto-update
MPV/VLC launch and playlist auto-update from the Electron preload
and migrate Tauri invoke calls to use the exposed window.electron API.

- Add openInMpv, openInVlc and autoUpdatePlaylists to the preload API,
  forwarding parameters to ipcRenderer for native handling.
- Replace tauri invoke('open_in_mpv') and invoke('open_in_vlc') calls
  with window.electron.openInMpv / openInVlc in tauri.service to use the
  unified Electron IPC surface.
- Replace file-based AUTO_UPDATE_PLAYLISTS handling with a call to
  window.electron.autoUpdatePlaylists and remove legacy file parsing
  code (now commented) so the main process owns playlist refresh logic.
- Import shared AUTO_UPDATE_PLAYLISTS/Playlist types into preload.

This centralizes native player launching and playlist updates through the
preload IPC bridge, simplifying web service code and moving file I/O to
the native/main layer for better security and separation of concerns.
2025-10-15 23:31:08 +02:00
4gray 6b693b3237 refactor: convert to standalone api 2025-10-15 23:12:19 +02:00
4gray bc3c9ce8cc feat(electron-backend): add IPC event scaffolding and persistent store 2025-10-15 08:55:03 +02:00
4gray 7487738a7d refactor(nx): remove packages, fix build issues 2025-10-14 23:44:33 +02:00
4gray 260f3b3da7 refactor(nx): app restructuring 2025-10-14 09:00:31 +02:00
4gray 2d4fdcfc1b refactor(nx): add restructuring 2025-10-13 01:33:50 +02:00
4gray 7028ff4049 refactor(nx): app restructuring 2025-10-13 00:24:54 +02:00
4gray 920afa6850 refactor(nx): created shared and m3u-utils library 2025-10-10 11:49:35 +02:00