Commit Graph
167 Commits
Author SHA1 Message Date
4grayandClaude Opus 4.5 54cd1445c7 refactor: use signal-based output() in season-container component
Replace @Output() decorator with EventEmitter with modern Angular
signal-based output() function for consistency with other components.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 15:12:15 +01:00
4grayandClaude Opus 4.5 45213d8d1a fix: wrap isElectron in computed for proper reactivity
Changed from direct signal assignment to computed() wrapper to ensure
consistent reactive pattern and clearer intent.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 15:08:58 +01:00
4grayandClaude Opus 4.5 e1f04c598c fix: emit toggled state in favoriteToggled event
Changed toggleFavorite() to emit the desired new state (!isFavorite)
instead of the current state. Updated all parent handlers to match
the new semantic where isFavorite means "user wants it to be a favorite".

This makes the API more intuitive - consumers can now apply the payload
directly without inverting the boolean.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 15:07:01 +01:00
4grayandClaude Opus 4.5 88758609d5 fix: remove double navigation in vod-details goBack method
The goBack() method was both emitting backClicked and calling
location.back(), causing double navigation when parent components
also handled backClicked with their own location.back() call.

Now goBack() only emits the event, consistent with stalker-series-view.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 14:23:37 +01:00
4grayandClaude Opus 4.5 8aac765694 fix: only sync Stalker playlists to SQLite and normalize playlist ID
- Add check for macAddress and portalUrl to ensure only Stalker playlists
  are synced to the SQLite database
- Normalize playlist._id to string before passing to IPC handlers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 14:19:06 +01:00
4grayandClaude Opus 4.5 0643acac3a feat: add o_name support and Stalker playback position tracking
- Add o_name (original title) field to Stalker VOD interfaces
- Prefer o_name over name in adapters and grid list display
- Add playback position tracking for Stalker VOD content
- Support resume playback from last position in vod-details
- Add real-time position updates via IPC listener
- Add progress indicators for Stalker VOD items in grid view
- Add debug logging for VOD series seasons resource

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 10:55:45 +01:00
4grayandClaude Opus 4.5 83d031c3b0 fix: preserve page state on back navigation and sort downloads by newest
- Only reset page to 0 when category actually changes in setSelectedCategory
- Preserve current page when navigating back from VOD/series details
- Sort downloads list by createdAt descending (newest first)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 10:55:20 +01:00
4grayandClaude Opus 4.5 229392d5b0 fix: fix Stalker search thumbnails and series view for Ministra portals
- Convert relative screenshot_uri URLs to absolute URLs using portal base URL
- Fix series detection logic to distinguish between embedded series data
  (vclub/Ministra with episode numbers) vs items needing API fetch
- Only set is_series flag when seasons need to be fetched from API
- Items with embedded series array now correctly use vodWithSeries mode

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 10:54:40 +01:00
4gray f95ac9c34e refactor: refactor existing vod-details component and implement VOD details route component
- Added `VodDetailsRouteComponent` to handle VOD details with route parameters.
- Refactored existing `VodDetailsComponent` to use a unified structure for Xtream and Stalker portals.
- Enhanced VOD details display with normalized metadata and improved playback position handling.
- Integrated resizable sidebar functionality in main container and live stream layout components.
- Updated routing to use the new VOD details route component.
- Improved favorite toggling and download handling in VOD details.
- Adjusted styles for responsive sidebar and grid layouts.
2026-01-30 20:39:18 +01:00
4gray e4be046194 refactor: add SafePipe for sanitizing resource URLs 2026-01-30 20:38:41 +01:00
4grayandClaude Opus 4.5 c5db6ff0ea fix: improve Stalker ITV infinite scroll and episode download tracking
Stalker ITV infinite scroll:
- Replace "Load More" button with automatic infinite scroll
- Wrap mat-nav-list in scrollable div for reliable scroll detection
- Auto-load more content when viewport isn't filled
- Show loading spinner at bottom while fetching

Episode download status tracking:
- Add getEpisodeDownloadId() for consistent ID extraction
- Extract numeric ID from cmd string for regular-series episodes
- Use hash function fallback for non-numeric IDs
- Fix download button status not updating for Stalker VOD series

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 10:18:28 +01:00
4grayandClaude Opus 4.5 7c44541721 feat: add download manager for VOD and series episodes
Add comprehensive download functionality for Xtream and Stalker portals:

Backend (Electron):
- Add downloads table schema with foreign key to playlists
- Create downloads.events.ts with IPC handlers for download operations
- Support download start, cancel, retry, remove, and status queries
- Auto-create playlist entries for Stalker portals to satisfy FK constraints
- Add download folder selection and file reveal/play functionality

Frontend (Angular):
- Create DownloadsService with reactive signal-based state management
- Add DownloadsComponent with queue management UI
- Implement download buttons with three states: download, downloading, play local
- Support both Xtream and Stalker modes with proper playlist ID handling
- Add download progress indicators and status badges

UI Components:
- Update VodDetailsComponent with download/play-local buttons
- Update SeasonContainerComponent with episode download buttons
- Add navigation link to downloads page
- Style download buttons and progress indicators

Stalker Portal Support:
- Resolve stream URLs via fetchLinkToPlay API before downloading
- Handle both vod-series and regular-series episode types
- Use playlist._id for Stalker (vs portalId for Xtream)
- Pass playlist info for auto-creation in database

Translations:
- Add download-related strings for en, de, es, fr

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 09:22:30 +01:00
4grayandClaude Opus 4.5 85225c03d2 fix: improve VLC property parsing with defensive handling
- Add resolved flag to prevent double resolution race condition
- Use regex to parse numeric values instead of fragile line filtering
- Centralize cleanup in done() helper for consistent handling
- Increase timeout to 2000ms to match MPV

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:43:36 +01:00
4grayandClaude Opus 4.5 1df371b163 fix: replace deprecated substr() and fix MPV IPC timeout handling
- Use manual time calculation instead of fragile toISOString().substr()
- Explicitly resolve null on MPV IPC timeout to prevent hanging promises
- Clear timeout handle in all event paths to prevent races

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:34:32 +01:00
4grayandClaude Opus 4.5 9cd278256b fix: use specific listener cleanup instead of removeAllListeners
Return unsubscribe function from onPlaybackPositionUpdate to ensure
only the specific listener is removed on destroy, preventing issues
with multiple store instances.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:32:04 +01:00
4grayandClaude Opus 4.5 0219d3253e fix: add type safety to PlaybackPositionService and clarify watched state logic
- Move PlaybackPositionData interface to shared-interfaces lib
- Replace all `any` types with proper PlaybackPositionData typing
- Add comment clarifying position=duration semantics for watched episodes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:25:10 +01:00
4gray adb89145a3 feat: playback position persistence for all players and grid indicators 2026-01-18 11:40:27 +01:00
4gray e53555d324 fix(epg): robustly load better-sqlite3 from workerData, resourcesPath, or fallback 2026-01-13 23:31:27 +01:00
4gray 9a40230361 feat: add greek translation 2026-01-13 22:55:32 +01:00
4gray b57f4a640a fix(electron): pass nativeModulesPath to workers and load native modules in worker to support packaged app 2026-01-13 22:55:32 +01:00
4gray 1bd31bf18c fix(electron): use app.isPackaged to detect dev mode
Replace custom environment-based dev detection with Electron's
built-in app.isPackaged check. Import the app module from Electron
and remove reliance on ELECTRON_IS_DEV and the environment file.

This simplifies logic, improves reliability of development vs
production detection, and reduces dependency on external env vars.
2026-01-13 22:43:11 +01:00
4gray 155a7d1209 style(category-management): improve layout and styling of dialog components 2026-01-12 18:17:38 +01:00
4gray 4491880e81 fix(stalker-search): remove redundant width style from search page 2026-01-12 18:05:58 +01:00
4gray 6cc9000a61 refactor: code style and formatting 2026-01-12 18:02:54 +01:00
4gray aced6209aa fix(stalker-search): remove unused MatButton and MatIcon imports 2026-01-12 17:53:58 +01:00
4gray 0a8c890df5 fix: restore ContentType import and optimize sorting logic in selection feature 2026-01-12 17:50:37 +01:00
4gray 225e9866ef chore: bump TS lib for newer ES features 2026-01-12 00:55:25 +01:00
4gray 76191b415f refactor(xtream): refine search result card layout 2026-01-12 00:55:18 +01:00
4gray 54f4abb48b fix(xtream): track and show import progress of playlist 2026-01-12 00:54:55 +01:00
4gray c173553d78 feat(xtream): add recently added views 2026-01-12 00:54:00 +01:00
4gray 16469256df refactor: wrap search & recent in global components 2026-01-12 00:53:07 +01:00
4gray 09b8752a3d fix(xtream): switch to XtreamApiService and sendRequest 2026-01-12 00:52:42 +01:00
4gray d31605da9f style(stalker-search): move details view out of search page 2026-01-12 00:52:42 +01:00
4gray fb1104f6b7 feat(category-management): show category item counts 2026-01-12 00:52:42 +01:00
4gray 33d8036ecc Merge pull request #724 from 4gray/refactor/store-refactoring
refactor/store-refactoring
2026-01-12 00:40:40 +01:00
4gray 960b295cd8 fix: handle Unicode search in DB queries 2026-01-12 00:39:11 +01:00
4gray f26e3e57c8 fix: normalize favorites and fix stalker nav 2026-01-12 00:39:11 +01:00
4gray 6737270a58 fix: provide XtreamStore to components 2026-01-11 21:20:50 +01:00
4gray 2630025b11 feat: restore hidden category state after playlist refresh 2026-01-11 21:20:50 +01:00
4gray afd8da0c25 feat: indicate loading while fetching details 2026-01-11 21:20:50 +01:00
4gray 5ad74e44ab refactor: update imports and provide Xtream data 2026-01-11 06:27:21 +01:00
4gray 46a78f2d86 refactor: unify xtream feature stores 2026-01-11 06:26:57 +01:00
4gray 3a2ee74b96 refactor: add Xtream data source abstraction 2026-01-11 06:26:38 +01:00
4gray aa27e6da0d refactor: add xtream api services 2026-01-11 06:25:12 +01:00
4gray 97a678a98d refactor: add xtream feature stores 2026-01-11 06:24:48 +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 ffd71b673c refactor(e2e): simplify smoke test by removing verbose debug logs and 2026-01-09 14:33:10 +01:00
4gray e8a80fdb60 test(electron): add Playwright smoke E2E tests for app
Add a new Electron smoke test suite using Playwright to verify the
packaged application starts, renders the main window, and exposes
expected window properties. The tests launch the built Electron main
bundle, locate the primary (non-DevTools) window, wait for DOM load,
and assert the title contains "IPTVnator". They also check window
visibility and bounds, validate rendered body content, and capture
screenshots to dist/test-results/electron-backend-e2e for debugging.

Include helpers to resolve project paths, ensure the screenshot
directory exists, and robustly find the main application window. Set
NODE_ENV and ELECTRON_IS_DEV to ensure the app loads built artifacts.
2026-01-09 12:53:53 +01:00
4gray 5070c2a707 feat(category-view): add showCounts input to conditionally display item counts 2026-01-07 23:40:28 +01:00