Commit Graph
100 Commits
Author SHA1 Message Date
4gray f10c8b5990 fix(playlist): use file basename as playlist title
Extract the file's basename and strip common playlist extensions
before passing it as the playlist title when loading from a selected
file. This replaces the previous hardcoded "from file" title with a
cleaner, context-aware name derived from the file path.

- import basename from node:path
- compute filename and remove .m3u, .m3u8, .pls, .txt extensions
- fall back to "from file" if resulting title is empty

This improves UX by giving imported playlists meaningful names.
2025-12-14 17:53:54 +01:00
4gray a5685ef27d feat(ui): re-enable input selection and add context menu
Re-enable user selection for input and textarea elements so users
can select and copy text in form fields. Add an Electron context
menu handler that shows a focused edit menu only for recognized
text input types or editable fields. The menu includes Cut, Copy,
Paste and Select All and respects the editFlags to enable actions.

This restores native editing UX in the renderer while avoiding
global context menus elsewhere in the app.
2025-12-14 17:11:12 +01:00
4gray c2c06a99be fix(video-player): ignore hotkeys when typing in search input
Prevent global hotkeys from triggering while the user is typing in
input or textarea fields. Add a private isTypingInInput(event) helper
and short-circuit key handlers (info key and digit keys) to return
early when the event target is an input or textarea.

This avoids interfering with normal text entry (e.g., entering numbers
in forms) and prevents accidental overlay toggles or channel changes
while the user is focused on a form field.
2025-12-14 17:01:02 +01:00
4gray 8482e7c76a style: remove redundant light-theme CSS block from playlist item
Delete an unnecessary media query that set `.meta` color for the
light color scheme in the recent-playlists playlist-item stylesheet.
The rule duplicated default styling and added extra specificity,
so removing it simplifies the CSS and avoids redundant overrides.

This reduces stylesheet size and potential maintenance confusion while
preserving visual behaviour across themes.
2025-12-14 17:01:02 +01:00
4gray cf5d88a4b4 docs: add troubleshooting section for macOS & Linux
Add a Troubleshooting section to the README covering two common
platform-specific launch issues and how to resolve them.

- macOS: document Gatekeeper "App is damaged and can't be opened"
  and show how to clear the quarantine flag with xattr.
- Linux: document chrome-sandbox SUID permission error and provide
  two solutions — fix permissions (chown/chmod) for packaged installs,
  or run with --no-sandbox by editing the desktop launcher or using the
  command line.

These instructions reduce user confusion and support requests by
providing clear, actionable steps to get IPTVnator running on affected
systems.
2025-12-14 12:31:00 +01:00
4gray c714996ce0 feat(electron): refine Linux sandbox handling and format copy filter
Improve sandbox handling on Linux by detecting Snap, Flatpak,
and AppImage environments and applying appropriate Chromium
command-line switches:

- If running in Snap or Flatpak, disable Chromium's sandbox
  (--no-sandbox) to avoid conflicts with the distribution's
  own sandboxing.
- Otherwise (traditional packages and AppImage), disable the
  SUID sandbox and prefer the user namespace sandbox
  (--disable-setuid-sandbox). This avoids requiring a SUID
  chrome-sandbox binary and aligns with modern Linux best
  practices.

Also adjust apps/electron-backend/src/main.ts to only apply
these changes on Linux (process.platform === 'linux').

Minor formatting: expand the package.json copy "filter" array
to a multiline style for readability.
2025-12-14 12:31:00 +01:00
4gray d7bfd2648c feat(ci): add GitHub Action job to publish Snap on tags
Add a publish-snap job to the CI workflow that runs after build and
only triggers for version tags (refs/tags/v*). The job downloads the
linux build artifacts, installs snapcraft, locates the generated .snap
file and uploads it to the Snapcraft Store releasing to the stable
channel. It validates the presence of a snap file and fails if none is
found.

This enables automated Snap distribution for tagged releases using the
SNAPCRAFT_STORE_CREDENTIALS secret.
2025-12-14 12:31:00 +01:00
4gray 568a5feac3 fix(ci): use different runners for macos arm and intel arch
Update GitHub Actions workflow to support multiple OS runners and CPU
architectures, standardize matrix keys, and adjust platform-specific
steps and artifact names.

- Replace simple os matrix with include entries specifying os, runner,
  and arch to allow macOS x64/arm64 separation and explicit runners for
  linux/windows.
- Use runner matrix value for runs-on and change timeout/strategy
  accordingly.
- Adjust conditional checks to use normalized os values (linux, macos,
  windows) rather than platform-specific runner labels.
- Install Linux system deps only when os == 'linux' and keep Flatpak
  setup for electron-builder.
- Add a macOS-specific make step that passes the architecture to the
  electron make command, while keeping a combined make step for
  non-macOS builds.
- Upload macOS artifacts per architecture and rename artifact paths to
  include arch; update release files list to include both macOS x64 and
  arm64 artifact patterns.

These changes enable reliable, architecture-aware macOS builds,
prevent native module conflicts across runners, and ensure artifacts
are labeled and uploaded correctly.
2025-12-12 22:22:31 +01:00
4gray ddc87e95a7 chore(package): bump version to 0.17.1 2025-12-12 21:25:36 +01:00
4gray a80f3b925f feat(package): include built remote-control-web in packaged app
Add a packaging rule to copy the built remote-control-web output from
dist/apps/remote-control-web into the installer as remote-control-web.
Previously the repository included the raw source pattern
remote-control-web/**/* which did not reflect the compiled build output.
By pointing files to the dist build and filtering all files, the packaged
app now contains the production web assets instead of source files.

This fixes missing runtime assets in releases and ensures the packaged
installer includes the correct built web app for remote control.
2025-12-09 16:43:25 +01:00
4gray 3e2afe11e3 feat(ui): add remote-control URLs + fix header typos and env
Add support for displaying local remote-control URLs and QR code in the
Settings UI, including styles for URL list, row layout, monospaced links,
and a QR container. Expose a new global API signature getLocalIpAddresses
for retrieving local IPs.

Fix several UI issues:
- Correct typo in header method name (opedAddPlaylistDialog -> openAddPlaylistDialog).
- Fix malformed GitHub URL and collapse img tag formatting.
- Reformat imports and viewChild usage for readability.

Change local development backend URL to localhost:3000 in the local
environment to point to the running local API during development.

These changes improve developer ergonomics (local backend), add a remote
control discovery UX for users on the same network, and tidy up header
bugs and formatting.
2025-12-06 21:46:35 +01:00
4gray 7e4732a1bf chore: add angularx-qrcode and tidy package-lock entries 2025-12-06 21:45:51 +01:00
4gray aba6ef024f feat(ui): enable XC refresh only in Electron environment
Add an isElectron flag to PlaylistItemComponent and conditionally
render the refresh button only when running inside Electron.
This prevents exposing the server refresh action in non-Electron
(environments like the browser) where window.electron is unavailable
and the feature is not supported.

Update ensures safer behavior by checking !!window.electron in the
component and using that value in the template to guard the UI.
2025-12-06 21:44:50 +01:00
4gray 4437d2c2cd feat(i18n): add new translations strings
Add new English keys for remote control URL and QR code to support
remote-control features in the settings UI. Extend French locale with
many missing and corrected translations: add "Playlists" root entry,
Xtream/Stalker import labels, UI copy improvements (e.g. "Chaînes",
grammar fixes), new playlist export/copy messages, search/auto-refresh
labels, and removal success message. Fix several typos and phrasing in
French strings (IPTV, chaînes, ajouter(e), requièrent).

These changes enable new remote-control functionality and improve UX
for French users by completing and correcting the translations.
2025-12-06 21:44:25 +01:00
4gray ccc50573d4 feat(ui): add app-region drag/no-drag and tweak styles
Add app-region: drag to container and header elements and app-region:
no-drag to interactive controls multiple components so the
Tauri window dragging behaves correctly while keeping buttons and form
controls clickable. Expand header search max width from 500px to 800px
to give more room on larger screens. Clean up and restyle video-player
toolbar toolbar primary colors and unify toolbar spacing.

Files changed include navigation, sidebar, header, main containers,
live-stream layout, navigation-bar, stalker container, and video-player
toolbar. These changes improve window drag UX on desktop and refine
toolbar/header appearance.
2025-12-06 21:44:25 +01:00
4gray 3b97fec939 feat(electron-backend): enable macOS title bar overlay for main window
Add macOS-specific title bar settings to the Electron main window
creation so the app uses a hidden title bar with an overlay on Darwin.
This ensures a more native, modern appearance on macOS while keeping
existing minimum size and saved bounds behavior unchanged.
2025-12-06 21:44:25 +01:00
4gray aa2d5b9508 feat(ui): add empty-state and expose addPlaylist event
Introduce explicit empty-state handling in RecentPlaylists:
- Replace previous direct rendering of an empty mat-list item with
  app-empty-state for two cases: a global "welcome" state when no
  playlists exist at all, and a "no-results" state when filters/search
  return nothing. This clarifies UX and provides a CTA for adding
  playlists in the welcome state.
- Change playlist data binding from playlists$ to playlistsData$ and
  adapt loops and accessors to data.playlists / data.totalCount.
- Keep existing global favorites item and playlist-item rendering.

Wire up addPlaylist event and components:
- Add addPlaylistClicked output to RecentPlaylists component and
  forward the event from the home component so the parent can open
  the add-playlist flow.
- Import EmptyStateComponent and PlaylistType types used by the new
  output.

Minor cleanup and imports:
- Reformat some imports and add tap to RxJS imports.
- Adjust template structure and placeholders for deferred loading.
2025-12-06 21:44:25 +01:00
4gray b82d47f6b6 feat(ui): add AddPlaylistMenu component for playlist imports
Introduce a reusable AddPlaylistMenuComponent that provides a Material
menu with options to add playlists via file, URL, text, Xtream or Stalker
portal. Define a PlaylistType union and expose a playlistTypeSelected
output so parent components can react to the selected import type.

- Add component TypeScript with Angular metadata and required Material
  imports.
- Add template with accessible menu items, icons, translation keys and
  click handlers that emit the selected PlaylistType.
- Organize menu items with a divider to separate common file/URL/text
  options from provider-specific imports.

This adds a focused UI building block for playlist import flows and
standardizes how import type selection is communicated to parent scopes.
2025-12-06 21:44:25 +01:00
4gray c5ddbde305 chore: increase component CSS size error threshold
Raise the maximumError for anyComponentStyle from 8kb to
kb in the web app build configuration. This relaxes the
build-size enforcement for component styles to accommodate
slightly larger CSS bundles and avoid spurious build failures.
2025-12-06 21:44:25 +01:00
4gray 578a9567d1 feat(ui): add recent-playlists empty state component
Add a new EmptyState component and template for the recent-playlists
widget, providing two visual states: "welcome" and "no-results".

- Create empty-state.component.html with:
  - a welcome illustration (monitor + WiFi) and content for first-time
    users, including translated title/description, add-playlist action
    button and features list.
  - a no-results illustration (magnifying glass + box) and compact
    content for empty search/results.
  - conditional rendering based on type() to switch states.

- Start empty-state.component.ts with type definition and imports for
  Angular Material and translation; wire up AddPlaylistMenu types.

This implements the UI for when there are no recent playlists and
provides the primary CTA to add the first playlist, improving onboarding
and empty-state UX.
2025-12-06 21:44:25 +01:00
4gray 892857f000 docs: add Angular signal-based coding standards 2025-12-06 21:44:25 +01:00
4gray 31c557d506 feat(i18): add welcome and no-results copy for playlists
Add new strings for the PLAYLIST view across English,
Spanish, French, German, and translations. The additions include a
welcome title description, a prompt to the first playlist, feature
labels for supported playlist types (MU/M3U, Xtream Codes Stalker),
and "no results title and description to clarify search/filter
.

These changes improve the onboarding experience new users and giveclearer feedback when searches return no. They also
ize feature labels across languages to communicate
supported playlist formats
2025-12-06 21:44:25 +01:00
4gray 852758bc31 fix(i18): clean up and normalize translation JSON structures
- Shorten German settings TITLE from "Einstellungen / IPTVnator" to
  "Einstellungen" to remove redundant app name and keep UI labels concise.
- Reformat and normalize Korean i18n JSON indentation and structure to
  match expected layout (consistent nesting and whitespace).
- Reintroduce missing HOME -> nested sections (TABS, PLAYLISTS,
  FILE_UPLOAD, URL_UPLOAD, TEXT_IMPORT, STALKER_PORTAL, XTREAM_PLAYLIST)
  in ko.json to restore previously collapsed keys and ensure all keys
  are present for runtime lookup.
- Fix several untranslated/placeholder labels and ensure key presence
  for dialogs, validations and UI strings so translations load
  consistently across components.
2025-12-06 21:44:25 +01:00
4gray 5a453a3f40 style(recent-playlists): refine styles and add clipboard imports
Update recent playlists styles to improve visuals, hover feedback,
and theme adaptability. Key changes:
- Hide horizontal overflow on playlists list to avoid scroll bleed.
- Add rounded corners, subtle transitions, and hover background for
  mat-list-item; include light theme hover variant.
- Reduce drag preview radius, replace shadow with layered shadows,
  increase opacity, and extend drag animation duration for smoother
  interactions.
- Adjust responsive selector formatting.
- Add transitions and hover scaling to action buttons, plus light
  theme variant; improve icon opacity transitions.
- Improve icon container behavior and upload-type-icon visibility on
  hover.
- Restyle status dot and state shadows, tweak unavailable color.
- Restyle auto-refresh indicator with shadow, rotation on hover, and
  light theme background.
- Minor spacing and layout tweaks across SCSS.

Code imports:
- Add Clipboard and ClipboardModule import and include MatIconButton
  and MatTooltip references in playlist-info component to support new
  copy/tooltip UI affordances.

These changes enhance UX polish, accessibility of interactive affordances,
and light/dark theme consistency.
2025-12-06 21:44:25 +01:00
4gray 9238fc8d86 refactor(header): modernize header styles and remove unused module
Update header component UI and streamline imports.

- Remove MatToolbarModule import and module list entry
  because the toolbar styling is handled by local SCSS and the
  Angular Material toolbar is no longer required.
- Rewrite header SCSS to introduce a .modern-header wrapper with
  consistent sizing, padding, alignment and a subtle bottom border.
- Add layered ambient and depth effects: refined ::before ambient
  gradient (headerAmbience), ::after bottom accent, and adjusted
  keyframes for a gentler motion.
- Refine home-header styles to target .modern-header and tune colors
  and gradients for a cohesive dark theme.
- Rework .brand-block visuals: lighter glass effect, adjusted
  radii, blur, borders, hover transform, and shadowing for a modern
  elevated look.
- Minor cleanup: remove legacy variables and comments; improve
  box-sizing, layout, and pointer-event handling to ensure expected
  interaction regions.

These changes modernize the header's visual design, improve layout
consistency across pages, and remove an unnecessary module import.
2025-12-06 21:44:25 +01:00
4gray 53cbd64575 feat(header): add home styling, search output and host binding
Enhance the header component to support a distinct "home" appearance
and emit search updates. Add a HostBinding that toggles a home-header
class from the isHome flag so styles can target the home state.
Expose a searchQuery output and wire an onSearchQueryUpdate method to
emit the search text, enabling parent components to react to user
searches.
Refactor imports to include HostBinding and output. Tidy toolbar metrics
and adjust element sizing for a compact brand block and pulsing logo.
Introduce comprehensive SCSS for the home header:
- gradient background, animated glow overlay, and edge accent
- brand block styling with blur, border, hover states and box-shadow
- logo sizing, pulse animation and responsive tweaks
- reduced toolbar height and overall visual polish
These changes separate home-specific styling from the default header
appearance and provide a programmatic hook for search interactions.
2025-12-06 21:44:25 +01:00
4gray 7ee2cc4eea feat(db): add API to delete all playlists and related rows
Add a new IPC handler_DELETE_ALL_PLAYLIST that removes all
and related data from the SQLite database in a safe order that respects
foreign key relationships. The handler deletes favorites and recently
viewed entries first, then content, categories, and finally playlists.
Errors are logged and propagated.

Expose the new operation in the renderer preload API as
dbDeleteAllPlaylists() to allow UI code to invoke the purge. This
provides a single-call way to clear playlists and their dependent
records for testing or user-driven reset.
2025-12-06 14:46:37 +01:00
4gray ac39c2a9dd chore(deps): replace @libsql with better-sqlite3
Remove @libsql/client and its transitive entries from package-lock and
add better-sqlite3 plus its TypeScript types. This updates the lockfile
to reflect switching DB client dependencies: drop the @libsql packages
and related node_modules entries, and add "better-sqlite3" and
"@types/better-sqlite3". The change reduces unused libsql artifacts and
ensures type definitions are available for the new native sqlite client.
2025-12-06 09:26:27 +01:00
4gray 72802f3f7c build(win): unpack libsql native bindings in ASAR
Add an asarUnpack rule for node_modules/@libsql/** so native bindings are
not embedded in the ASAR archive. This ensures libsql's native modules
are available at runtime for the Electron app and prevents issues when
loading native binaries from inside an ASAR.

Also remove ia32 architecture from NSIS target, keeping only x64 to
align installers with supported platforms and reduce build artifacts.
2025-12-05 08:38:18 +01:00
4gray f05469cc44 feat(ui): extract channel list item template and add EPG dialog 2025-11-27 08:20:54 +01:00
4gray 008f267808 feat(ui/epg-list): replace mat-list with custom markup and add progress
Refactor EPG list template to remove Material selection list and 
dividers, replacing them with plain markup and CSS-friendly elements. 
Key changes: - Replace <mat-divider> with .header-divider for consistent
styling. - Replace mat-selection-list/mat-list-option with plain divs 
(.program-item,   .program-meta, .program-title) to allow richer DOM 
structure and avoid   Material selection semantics.
- Use track $index in ngFor to stabilize rendering and avoid using 
program   start/stop concatenation as key.
- Render live progress bar inside program items when a program is 
playing,   using calculateProgress(program) to set width.
- Convert empty-state <p> to .epg-not-available div for layout 
consistency. - Add clickable class and active class binding to 
interactive items. Code changes and cleanup:
- Update component imports to use ChangeDetectionStrategy and
  ChangeDetectorRef and remove unused Material imports (MatDivider, 
MatListModule)   from the component file.
- Adjust template bindings: use [innerHTML] and class bindings instead 
of   matList directives.
Why:
- Remove heavy dependency on Material selection list to gain finer 
control   over DOM and styles, enable custom progress UI and clickable 
behavior,
  and simplify template for better performance and maintainability.
2025-11-24 22:29:42 +01:00
4gray 7918c4849d fix: suppress snackbar for portal status checks and log them
Refactor error handling for Xtream requests to avoid showing user
snackbars when the request is a portal status check (get_account_info).
Instead of treating these errors as full failures, log them with
console.log to indicate the portal may be unavailable and return early.
Key changes:
- Introduce isStatusCheck detection in electron and pwa services.
- Replace console.error + snackbar with console.log for status checks.
- Only display snackbars for non-status-check errors.
- Add a console.log when pwa response has no payload for status checks.
This prevents unnecessary user-facing error popups for routine
portal health/status checks while keeping errors surfaced for other
requests.
2025-11-24 21:25:10 +01:00
4gray a948ce0265 feat(electron): bundle worker assets and resolve worker path
Add webpack config and include it in the electron backend build so 
worker scripts are correctly bundled for packaged apps. Move worker 
files to be packaged as extraResources instead of asar unpack patterns 
so the packaged app can load worker JS from Resources/dist/... at 
runtime. Fix worker path resolution in epg.events: compute resourcesPath
from app.getAppPath() and point to dist/apps/electron-backend/workers 
when app.isPackaged. Remove verbose app path logging and update comments
to reflect the actual packaged layout.
Why: ensure webworker entry points are included in the renderer/backend
bundle and accessible when the Electron app is packaged, preventing
worker loading failures in production builds.
2025-11-24 20:46:15 +01:00
4gray 5b697f458a feat(electron): load epg worker from asar.unpacked in prod
Update EPG worker path handling and unpack worker files for production
builds so the worker can be spawned when the app is packaged with ASAR.
- Change workerPath to let and, when the resolved path includes
  app.asar, replace it with app.asar.unpacked. This ensures the spawned
  worker points to the unpacked resource in production.
- Add electron-builder asarUnpack pattern for workers/** so worker files
  are packaged outside the ASAR archive.
These changes fix runtime errors where worker threads cannot be started
from inside app.asar and ensure the EPG parser can run in packaged apps.
2025-11-23 22:16:33 +01:00
4gray 573ca01925 fix(artplayer): manage Hls instance and centralize player teardown
Add a dedicated hls field and a destroyPlayer() helper to ensure Hls
instances are properly destroyed when the component is torn down or
re-initialized. Replace inline Hls creation with a guarded pattern that
destroys any existing hls before creating a new one, preventing leaks or
duplicate attachments. Use destroyPlayer() from ngOnDestroy and when the
channel input changes to centralize teardown logic and keep lifecycle
handling consistent.
2025-11-23 21:53:01 +01:00
4gray 5f35d22076 style: adjust overflow rules in xtream detail views
Change overflow handling in the xtream detail-view SCSS files to avoid
unwanted scrollbars and ensure proper layout stretching. In the web
version, remove a global overflow:auto and set overflow:visible on the
.details block and the grid container so inner content can expand as
needed. In the tauri variant, remove a min-height that forced an
artificial viewport-based height.
These tweaks fix layout clipping and scrollbar issues when detail 
content
grows, and allow natural sizing across web and Tauri builds.
2025-11-23 21:39:07 +01:00
4gray 94a07d3a63 feat(stalker): add back button in details view
Add clearSelectedItem() to the stalker store to reset selected item
state (selectedVodId, selectedSerialId, selectedItvId, selectedItem).
This centralizes clearing logic and avoids manual nulling elsewhere.
Introduce goBackToList() in the container component to use the new
store method when navigating back from item details. Update the
template to conditionally show the back button when a selected item
exists, and ensure category title rendering and the disabled category
button behave correctly with the new conditional structure.
These changes simplify state management for returning from detail
views and make the template logic clearer and less error-prone.
2025-11-23 21:38:46 +01:00
4gray 12a513802a fix(electron): simplify production load and CI frontend build
Remove unused url.format import and switch from loadURL with a
formatted file: URL to loadFile for production. This simplifies code,
avoids manual file URL construction, and makes the production path
loading more robust.
Also update CI job to build the frontend via the NX command
(npx nx build web --skip-nx-cache) instead of npm run build:frontend,
aligning the workflow with the monorepo's canonical build command.
2025-11-23 19:14:01 +01:00
4gray e279172dfe fix(ui): correct fonts, semicolons and preload target
- Add missing semicolon in apps/web/src/styles.scss to fix invalid CSS
  that could break style parsing for .scroll-viewport.
- Change preconnect in apps/web/src/index.html from fonts.gstatic.com to
  fonts.googleapis.com and consolidate multiple Google Fonts links into 
  a single stylesheet URL to reduce redundant requests and ensure 
  Material Icons and selected font families load together.
  Remove duplicated @import of Outfit in
  
  libs/ui/components/src/lib/multi-epg/multi-epg-container.component.scss, 
  switch component font-family to Roboto (with fallback) and update 
  button font to match, ensuring consistent typography and avoiding 
  external import duplication across components. ese changes fix a 
  ntax error, optimize font loading, and standardize
typography across the UI.
2025-11-23 18:50:46 +01:00
4gray 09ad2c3b1b refactor(ui): tidy imports, simplify cleanup, and format styles 2025-11-23 18:50:46 +01:00
4gray 13c05c85b0 docs: normalize list indentation and fix formatting
Adjust documentation lists and code blocks for consistent
indentation and spacing across CLAUDE.md. Convert mixed dash
and nested list levels to use uniform two-space indentation for
subitems, reflow a few wrapped lines, and add blank lines where
needed to separate sections and examples. These changes improve
readability and maintain a consistent markdown structure for the
project documentation.
2025-11-23 18:50:46 +01:00
4gray 7da2202119 ci: add icon paths to electron packager configs
Add explicit icon settings to packaged app configuration for macOS,
Linux and Windows. Set macOS icon to 
apps/web/src/assets/icons/favicon.ic, Linux icon directory to 
apps/web/src/assets/icons and Windows icon to 
apps/web/src/assets/icons/favicon.ico. This ensures bundled installers 
and app bundles include the intended application icon across platforms 
and prevents missing icon assets when creating artifacts. Also add 
trailing commas to keep JSON formatting
consistent.
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 9073bf1bb3 feat(m3u): add compact mode and conditional EPG display
Add compact layout support for channel list items and make EPG
display conditional based on runtime environment and stored settings.

- Introduce .compact styles in channel-list-item.component.scss to
  reduce item height, padding, and logo size when EPG is hidden.
- Add StorageMap injection and read STORE_KEY.Settings in
  ChannelListContainerComponent to determine whether EPG is configured
  (only enable EPG in Electron when epgUrl exists; disable in PWA).
- Expose shouldShowEpg flag and itemSize getter to switch virtual
  scroll item size between 68 and 48 pixels.
- Bind [class.compact] on channel list item and wire [showEpg] input
  to channel-list-item components so item rendering adapts to mode.
- Replace hardcoded itemSize in cdk-virtual-scroll-viewport with
  dynamic [itemSize] to match compact/expanded layouts.

This reduces visual clutter and avoids showing EPG in environments
(where it is not configured or supported), improving UX and resource
usage.
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 d564a0d564 feat(m3u): show current EPG program in channels list
Reset EPG fields when epgProgram becomes null to avoid stale
displayed durations and ensure consistent behavior when no program
is available.

Improve channel list container and item styling:
- hide horizontal overflow to prevent unexpected scrollbars
  (scroll-viewport, #all-channels, .channel-list).
- add empty-favorites layout and hint styles for clearer empty
  state presentation.
- refactor channel-list-item SCSS: introduce structured layout
  (.channel-list-item, .channel-content, .channel-logo,
  .channel-details), apply responsive truncation rules and font
  imports, add hover/active visuals and dark-theme support, and
  tweak drag-icon spacing.

These changes fix UI glitches (stale EPG, horizontal scrollbars)
and modernize the channel list presentation for better readability
and theming.
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 ce6aa1b3d1 feat(info-overlay): add no-EPG layout and gradient blur
Introduce a separate no-EPG presentation and move backdrop blur
into an isolated pseudo-element to avoid visual bleed and improve
layout control.

- Replace direct backdrop-filter on the overlay with a ::before
  pseudo-element that applies backdrop-filter and mask-image
  gradients (with -webkit- prefixed fallbacks) for a smoother
  gradient blur effect.
- Add isolation on the overlay to contain stacking context and set
  z-index of the pseudo-element to -1 to keep content above the blur.
- Add .no-epg modifier on the overlay and new .no-epg-layout,
  .channel-logo-large and .channel-name-large styles to provide a
  centered, accessible layout when no EPG data is available.
- Update template to render two distinct layouts: one when
  epgProgram exists (original detailed view) and one fallback view
  when epgProgram is missing, including larger channel logo and
  centered channel name.

These changes improve visual fidelity of the blur effect and add a
clear fallback UI for channels without EPG data.
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 79b1e991ef feat(remote-control): add remote control UI library
Add a new library libs/ui/remote-control including component, template,
Jest setup, and project configuration to provide a remote-control UI
component.

- Add RemoteControlComponent implemented with inject-based service
  usage, loading and error state, and async channelUp/channelDown handlers.
  This centralizes remote control logic and handles errors for the UI.
- Add HTML template for the remote-control touchpad, buttons, error
  display, and basic branding markup.
- Add Jest config (jest.config.ts) and tsconfig.spec.json configured for
  unit tests with jest-preset-angular to enable testing of Angular
  components.
- Add Nx project configuration (project.json) with test and lint
  targets so the library is discoverable and runnable by the workspace.

These changes scaffold the remote-control feature as a reusable UI
library and enable testing and linting within the monorepo.
2025-11-22 11:26:22 +01:00
4gray 028ccf1580 feat(ui/components): export and reuse overlay injection token
Introduce a shared InjectionToken for OverlayRef used by the multi-EPG
overlay component and export it from the components module.

- Add overlay-ref.token.ts defining COMPONENT_OVERLAY_REF to provide
  OverlayRef for dynamically created overlay components.
- Replace a locally created InjectionToken with an injected
  COMPONENT_OVERLAY_REF in multi-epg-container.component to avoid
  token duplication and ensure consistent DI across modules.
- Export the token from libs/ui/components/src/index.ts so other
  consumers can import and use the same token.

This reduces duplicated token definitions, fixes DI inconsistencies,
and makes the overlay ref reusable by external components.
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 2bcbffa5e5 chore: expand allowed Claude local commands
Add additional allowed commands to .claude/settings.local.json so the
assistant can run frontend build and view file contents during local
debugging. Specifically, permit Bash(npm run build:frontend:*) and
Bash(cat:*) alongside the existing WebFetch(domain:www.electronjs.org).

This change enables local automation for building the frontend and
inspecting files, improving developer workflow and troubleshooting
without broadening external network permissions.
2025-11-15 17:37:34 +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 aee5d93118 refactor(interfaces): remove angular dep (InjectionToken) from shared lib
Remove the COMPONENT_OVERLAY_REF InjectionToken and its export from the
shared interfaces library. The token was unused in the codebase, so
deleting it cleans up dead code and reduces API surface area exposed by
libs/shared/interfaces. This simplifies imports and avoids maintaining an
unneeded token definition.
2025-11-11 08:24:12 +01:00
4gray a06c642eef feat(recent-playlists): show auto-refresh indicator on playlist items
Add a compact auto-refresh icon to playlist items to indicate when a
playlist has auto-refresh enabled. Move existing upload-type icons into
an .icon-container so the auto-refresh indicator can be positioned
absolutely beside them.

- Add .auto-refresh-indicator styles to position and size the indicator,
  match colors, and center the icon.
- Wrap mat-icon elements in .icon-container and render an additional
  mat-icon when item.autoRefresh is true for URL and file playlists.
- Keep tooltips for the auto-refresh icon to explain its meaning.

This improves UX by making auto-refresh state visible at a glance.
2025-11-11 08:23:27 +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 0d6e519709 chore(deps): update nx & angular packages
Update Angular in pnpm-lock to newer 20.3.x versions
and align CDK/Material specifiers to the compatible 20.2.12/20.2.12
releases. This brings core, common, compiler, platform-browser,
animations, forms and related packages to the 20.3.x series to fix
version skew and ensure dependency compatibility.

Add tsConfig for tests in libs/shared/interfaces project config so
jest runner uses the correct TypeScript spec configuration, fixing
test/compile issues for that library.

Remove husky commit-msg hooks and local pre-commit checks to avoid
running commitlint, tests and eslint on commit (CI remains unaffected).
2025-11-08 23:24:56 +01:00
4gray c4f721304f feat(m3u-state): include HTTP headers and title when opening players
Add title, user-agent, refer and origin fields to IPC payloads sent
when opening MPV/VLC players and when launching streams from effects.
Replace legacy userAgent property with standardized 'user-agent' key and
consistently include referer and origin from channel.http. This ensures
external players receive correct HTTP header metadata and stream titles
for proper request handling and display.
2025-11-08 23:02:15 +01:00
4gray 30b7cdb7c6 fix(ui): unsubscribe observable and mark DI fields readonly 2025-11-08 23:02:15 +01:00
4gray 60a06c2b60 fix(epg-list): normalize days value before subtracting 2025-11-08 23:02:15 +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 fbed100fb0 ci: make release step create draft prereleases for PRs
Update the GitHub release action to mark releases from pull 
request events as prerelease and to set a safe tag name when the
 is not triggered by a tag ref.

- Set prerelease to true when github.event_name == 'pull_request'
  so draft releases created during PR workflows are marked as
  prereleases.
- Use the tag name from github.ref_name when the workflow is
  triggered by a tag; otherwise generate a deterministic test tag
  "test-<sha>" to avoid using an invalid or empty tag name.

This prevents accidental full releases from PR runs and ensures the
action always has a valid tag_name value.
2025-11-08 23:02:15 +01:00
4gray ea3c2b1e45 feat(build): set deterministic artifact file names
Standardize generated installer/artifact file names across build
targets by adding explicit artifactName patterns in package.json.
Add a general artifactName at the top-level build config, ensure
linux targets (snap/deb/rpm) carry the same pattern, and set a
Windows-specific artifactName for win and nsis outputs that includes
the platform and arch.

This makes build outputs predictable for CI, releases, and automated
upload tooling by embedding name, version, OS, arch, and extension in
artifact filenames.
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 1b9dc0b37e fix(ui): disable two Angular template accessibility rules 2025-11-08 10:22:57 +01:00
4gray e6aa33959e feat(deps): bump Electron to v39.x 2025-11-08 10:22:57 +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 e079d268f0 docs: add CLAUDE.md with developer guidance 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 681e58728f chore(config): normalize YAML quoting and indentation 2025-10-27 08:20:29 +01:00
4gray 6ac61720ad feat(ci): add GitHub Actions workflow to build and make app 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 516a376dc0 chore(deps): remove Tauri packages and bump test deps 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 2f930a6dfe chore(deps): upgrade video.js to 8
Add nested @videojs/http-streaming and related module entries (v2.16.3,
video.js 7.21.7, mpd-parser, @videojs/xhr, videojs-font, etc.) required by
the upgraded video.js ecosystem.

These changes ensure the lockfile reflects the new major video.js
version and pulls in compatible HTTP streaming and parsing libraries so
consumers get consistent, resolved dependency trees and avoid runtime
mismatches when using the newer player.
2025-10-23 22:54:22 +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 57005d4f46 refactor(epg): improve list rendering, state handling, and styles
- Track list items by start+stop to avoid incorrect reuse of DOM
  nodes when program time ranges change.
- matListItemLine with matListItemTitle and add
  program-title class to ensure proper styling and layout of titles.
- Add left margin to item label for visual spacing.
- Update imports to use shared-interfaces barrel to simplify paths.
- Remove unused OnDestroy and related ipc cleanup; epg list no longer
  manages EPG IPC listeners directly.
- Introduce setEpgAvailableFlag dispatch when handling EPG data to
  expose availability state; clear current EPG program via
  resetActiveEpgProgram when no programs are returned.
- Remove direct Store usage from EpgService and update BehaviorSubject
  flow to set epgAvailable=false on error.
- Clean up unused imports and minor formatting.

These changes fix rendering glitches, improve state clarity for EPG
availability, simplify imports, and tidy up lifecycle responsibilities.
2025-10-23 22:51:28 +02:00
4gray 8b0db47caf feat(epg): normalize channel data and fix template bindings
Convert channel structures to a consistent and adapt templates
to read new safely.

- Add accessors in EListComponent:
  - getChannelName(channel) returns first displayName or ''
  - getChannelIcon(channel) returns first icon.src or ''
  These helpers make reading channel metadata robust against missing or
  differently-shaped data.

- Build channel object with normalized fields in ngOnInit:
  - set id, displayName[], url[], icon[] rather than raw name/icon
  - ensure fallbacks to empty strings/arrays to avoid undefined values

- Update InfoOverlay template to safely access program fields:
  - use epgProgram?.icon?.[0]?.src for image source
  - use epgProgram?.title?.[0]?.value and epgProgram?.desc?.[0]?.value

- Fix MultiEpg templates for property access and tracking:
  - replace invalid template boolean expressions with safe non-null
    assertion where needed ((hourWidth$ | async)! ...)
  - use track item.id instead of track $any(item).channel
  - call getChannelIcon/getChannelName and render icon/name via helpers

These changes prevent runtime errors when fields are missing or have
array-wrapped values, improve template safety, and standardize channel
data handling across the EPG UI.
2025-10-23 21:54:11 +02:00