Commit Graph
93 Commits
Author SHA1 Message Date
4gray f26e3e57c8 fix: normalize favorites and fix stalker nav 2026-01-12 00:39:11 +01:00
4gray 971ad70893 refactor: add lifecycle-safe router unsubscribe and optimize portal checks 2026-01-10 16:53:05 +01:00
4gray 6b94fcbdd6 feat(ui): use playlist-switcher in all modules 2026-01-10 15:19:37 +01:00
4gray 5070c2a707 feat(category-view): add showCounts input to conditionally display item counts 2026-01-07 23:40:28 +01:00
4gray f2b59d3994 refactor(stalker): remove debug logging for VOD series seasons fetching 2026-01-07 20:41:31 +01:00
4gray 16a5e1e4c9 feat(category-management): add snackbar notification for save errors 2026-01-07 20:41:22 +01:00
4gray 74a65a53a9 fix(category-view): ensure itemId is a number for selection comparison 2026-01-07 20:41:03 +01:00
4gray 8e15e89858 feat(xtream): add category item counts to category view 2026-01-07 19:10:17 +01:00
4gray 2043b7d8a1 feat(xtream): add category management to hide/show categories
Add the ability to hide irrelevant or empty categories in Xtream playlists.
Users can now manage category visibility through a dialog accessible from
the sidebar header in both VOD/Series and Live TV views.

Features:
- New category management dialog with search filter and select/deselect all
- Visibility settings persisted to database per playlist
- Hidden categories are filtered from sidebar navigation
- New categories added during playlist refresh default to visible
- Database migration for existing installations

Files changed:
- Database: schema.ts, connection.ts (hidden column + migration)
- Backend: category.events.ts, main.preload.ts (IPC handlers)
- Frontend: new dialog component, store method, UI integration
- Translations: en.json
- Documentation: docs/architecture/category-management.md
2026-01-06 21:34:44 +01:00
4gray 934c02d9ec fix: adjust player dialog opening condition for non-live content in favorites view 2026-01-06 19:51:10 +01:00
4gray 5904025e82 refactor: remove unnecessary console logs from Stalker events and portal import components 2026-01-06 19:50:44 +01:00
4gray 37fc5fb148 feat: enhance favorites button and series view with loading states and improved styling 2026-01-06 01:10:27 +01:00
4gray 0a4d00c081 Merge pull request #711 from 4gray/feat/epg-improvements
feat/epg-improvements
2026-01-06 00:40:07 +01:00
4gray fb14abbd86 refactor(ui): adjust header flow for selected item 2026-01-05 21:57:34 +01:00
4gray 876699d732 chore: remove debug log from stalker store 2026-01-05 21:57:19 +01:00
4gray 050ea5ae5e feat: refine category view image handling 2026-01-05 21:57:07 +01:00
4gray 7ae86a8266 feat(ui): unify season components and handle episode info 2026-01-05 21:56:54 +01:00
4gray 312bc766a6 feat(xstream): clear selection and adjust layout 2026-01-05 21:56:35 +01:00
4gray 3f29aa1b0d style: create vod and serial hero layout 2026-01-05 21:56:19 +01:00
4gray 90564a7d24 fix(grid-list): use fallback images and simplified attrs 2026-01-05 21:54:54 +01:00
4gray e2f3583e13 feat: split header menus for desktop and mobile 2026-01-05 21:54:54 +01:00
4gray afad80e61b feat(ui): add ContentHero component and detail view styles
Add a new standalone ContentHero component (template and TS) that
provides a cinematic hero section with backdrop, poster, title,
description, tags/meta/action slots, and a back button event emitter.
The component chooses backdrop or poster as the background, falls back
to a default poster image on load error, and exposes inputs for title,
description, posterUrl, and backdropUrl.

Introduce extensive cinematic styles for the detail view:
- define CSS custom properties for light and dark themes, poster size,
  shadows, and color tokens
- implement gradient vignette, layout sizing, and theming via
  :host and :host-context(.dark-theme)
- change container sizing behavior to full-height and hide overflow

These changes create a reusable hero UI and themed detail-page styles
to support a Netflix-style streaming detail experience.
2026-01-05 21:54:54 +01:00
4gray 520f00a133 feat(epg): restructure progress panel template and actions
Refactor the EPG progress panel template to improve DOM structure and
action handling. Move the top-level panel wrapper and header markup so
the "dismiss all" button is rendered consistently when multiple imports
exist. Reorder imports list and per-item blocks so each import item
contains its own header, icon, url and dismiss button. Restore the
per-item dismiss button and adjust classes to distinguish between the
global dismiss-all and item-level dismiss actions.

These changes simplify markup nesting, fix button placement bugs, and
prepare the template for clearer styling and behavior of active and
queued import items.
2026-01-05 21:52:45 +01:00
4gray 397f57186e feat: add EPG progress panel, snackbar and i18n message
Register EPG progress panel component and MatSnackBar in AppComponent,
inject MatSnackBar and show a brief confirmation when all EPG sources
are already fresh. Re-enable keyboard handling in Electron-like
environments by switching the tauri check to window.electron and
restoring the keydown listener. Add new English i18n keys for total
counts and an "EPG is up-to-date" message.

Why:
- Expose EPG progress panel so it can be used in the app template.
- Provide user feedback when EPG sync finds no stale sources via a
  transient snackbar message.
- Restore cross-platform keyboard shortcuts by detecting electron
  instead of the commented-out tauri guard.
- Add missing translations used by the UI.
2026-01-05 21:52:45 +01:00
4gray 16baf54b16 feat(stalker): support ministra shows under VOD content type
Update translations and refactor StalkerPortalImportComponent to use
Angular signals and readonly/dependency-injected readonly properties.
- Add new i18n keys: LOADING_SEASONS and NO_EPISODES; adjust
  PLAYBACK_ERROR punctuation.
- Replace EventEmitter @Output with a signals-based readonly output and
  mark form, constants and flags as readonly.
- Switch to inject() style for services and mark many injected fields
  private/readonly to clarify intent.
- Replace DataService import with STALKER_SERIAL_NUMBER token import.
- Improve logging formatting, whitespace and minor code cleanup.
- Minor template/style whitespace fixes.

These changes modernize the component for better immutability,
improve DX with clearer logging, and add missing user-facing
translation strings.
2026-01-05 21:44:29 +01:00
4gray 61eef5e00d feat(stalker): feat: add auth for stalker portal, expend portal import UI
Refactor stalker-series-view template to guard fields with conditionals
so that only available metadata is displayed. Replace selectedItem() with
displayItem() to use the updated selection accessor. Add checks for
director, actors, year/release date, genre/genres_str, imdb and kinopoisk
ratings to avoid showing empty labels.

Enhance stalker-portal-import component by adding reactive form fields
for serial/device IDs and signatures, importing MatProgressSpinnerModule,
and wiring TranslateService and StalkerSessionService into the component.
Include a small loading-container style. These changes prepare the UI for
improved import UX and safer rendering of optional series metadata.
2026-01-04 19:07:37 +01:00
4gray 99b5ad161f feat(ui): improve info overlay and add EPG header search styles
Update info-overlay template to read simplified EPG fields and
avoid indexing into arrays for title, icon and description so bindings
are resilient and clearer:
- Use epgProgram?.iconUrl instead of epgProgram?.icon?.[0]?.src
- Use epgProgram?.title instead of epgProgram?.title?.[0]?.value
- Use epgProgram?.desc instead of epgProgram?.desc?.[0]?.value
- Guard description rendering with epgProgram?.desc

Adjust multi-epg header layout and add search UI styles to support
desktop window chrome and draggable regions:
- Add left padding to #epg-navigation for macOS traffic lights, enable
  backdrop drag via -webkit-app-region: drag and set z-index to keep
  header above content.
- Exclude interactive elements (buttons, search inputs) from drag by
  applying -webkit-app-region: no-drag to maintain native interactions.
- Add extensive styles for a channel search container (search input,
  icons, clear button, filter count, animations) and scaffold a program
  search container.

These changes improve robustness of EPG data rendering and add styled
search controls while ensuring proper window dragging behavior on
desktop builds.
2026-01-02 17:22:09 +01:00
4gray 87bf0f6178 feat(ui): add EPG import progress panel component
Introduce a standalone EpgProgressPanelComponent with template and
bindings to show active, completed and queued EPG imports. The new
component:
- provides a header with title and optional "dismiss all" button when
  multiple imports exist.
- lists active/completed imports with status icon, URL display,
  dismiss button, and conditional progress bar for loading state.
- shows stats (channels/programs) or error text when available.
- renders a queued section with positions and dismiss controls.
- wires to EpgProgressService observables (imports, visibility and
  counts) and implements helper getters (activeImports).

This adds UI for import progress feedback and controls so users can
monitor and manage EPG import operations. Files added:
- epg-progress-panel.component.ts
- epg-progress-panel.component.html
2026-01-02 01:02:20 +01:00
4gray 81bdcd644c refactor: move global favorites to header 2025-12-26 00:53:14 +01:00
4gray e6ad644ee8 chore: improve player error handling
App imports and streams
capture MPV stdout/stderr now
friendly errors sent
2025-12-25 23:33:21 +01:00
4gray a874db0b41 feat(ui): add filter and sort menu to header and clean styles
Add a new mat-menu component for filtering and sorting playlists in the
header area. The filter section iterates playlistTypes and allows toggling
type selection with visual check state. The sort section adds options for
name (asc/desc) and date added (newest/oldest) with active-state visuals
and click handlers that call setSortOptions. A close button is also
included.

Remove unused/duplicate CSS rules from header styles: drop .filter-
container and obsolete .dropdown-menu-header rules to avoid styling
conflicts and reduce dead code. Adjust surrounding selector formatting.
2025-12-21 00:42:48 +01:00
4gray c84b42284a style(settings): adjust settings container height to account for header
Reduce the settings page container height calculation from
calc(100vh - 100px) to calc(100vh - 70px) so the content fits the
visible viewport when the header height is 70px. This prevents
unnecessary vertical overflow and avoids extra whitespace at the
bottom of the settings page.
2025-12-21 00:42:48 +01:00
4gray 3772d5c0cf feat(i18n): add filter/sort labels and playlist types
Update English, German, and Russian locale files to improve playlist
UI text and provide explicit playlist type labels.

- Rename and adjust several labels: change FILTER_BY_TYPE to a more
  descriptive "Playlist Types" and add a new FILTER_AND_SORT string.
- Normalize capitalization for SORT_BY ("Sort By") in en.json.
- Add PLAYLIST_TYPES object with keys for M3U, XTREAM, and STALKER,
  providing localized descriptions for each language.
- Keep existing sorting options and parsing messages intact.

These changes make filtering, sorting, and playlist source options
clearer to users in multiple locales and prepare the UI for showing
playlist type choices.
2025-12-21 00:42:48 +01:00
4gray ac31cf18e5 refactor(web): replace individual action imports with namespaced
imports and update dispatch calls

Replace multiple direct or wildcard imports for actions with
namespaced action groups from 'm3u-state' (e.g. PlaylistActions,
ChannelActions, EpgActions). Update dispatch calls to use the
namespaced action creators (for example, setAdjacentChannelAsActive,
setEpgAvailableFlag, resetActiveEpgProgram, setCurrentEpgProgram,
setActiveEpgProgram, addPlaylist).

This cleans up imports, improves tree-shaking and readability,
and standardizes how actions are referenced across components. It
also fixes inconsistent import styles (wildcard vs. named) and
prepares the codebase for clearer action organization.
2025-12-21 00:42:48 +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 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 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 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 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 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 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 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 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 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