Commit Graph
376 Commits
Author SHA1 Message Date
4gray 5e41e3d1ce refactor(favs-recent): adapt UI and routing behavior
- Introduced StalkerCollectionDetailComponent to handle detailed views for Stalker collections.
- Added XtreamCollectionDetailComponent for managing Xtream collection details.
- Updated routing components to integrate new detail components for both Stalker and Xtream.
- Enhanced global favorites and recently viewed functionalities to support new detail navigation for Stalker and Xtream items.
- Improved styling and structure for better responsiveness and user experience in detail views.

Entire-Checkpoint: c6e522b4276c
2026-04-18 10:16:09 +02:00
4gray e0f6b34aa0 style: update form field styles and dialog components
- Set default appearance for mat-form-field to 'outline' and dynamic subscript sizing in app.config.ts.
- Adjust dialog dimensions in workspace-shell-actions.service.ts for better responsiveness.
- Refactor settings.component.scss to remove specific mat-form-field font size overrides.
- Enhance global styles in m3-theme.scss for outlined inputs, ensuring consistency across the application.
- Modify workspace-command-palette styles to improve visual integration with the overall theme.
- Revamp add-playlist-dialog component to utilize segmented controls for category selection, improving UX.
- Update file-upload component to provide better feedback on file selection and drag-and-drop interactions.
- Clean up text and URL upload components by removing unnecessary placeholders and improving layout.
- Refine stalker-portal-import component by removing placeholder text for clarity.

Entire-Checkpoint: c6e522b4276c
2026-04-17 23:20:17 +02:00
4gray 44791f3097 feat(i18n): update English translations for file upload and UI elements
Entire-Checkpoint: c6e522b4276c
2026-04-17 23:19:53 +02:00
4gray b6c71258e4 fix(player): playback position persistence for vlc
Entire-Checkpoint: c6e522b4276c
2026-04-17 23:19:33 +02:00
4gray af8bb19d6c fix(epg): add retry functionality for failed EPG fetches and enhance UI for error handling
Entire-Checkpoint: c6e522b4276c
2026-04-17 21:30:50 +02:00
4gray d6fd28450d test(e2e): rename filter option functions for clarity and improve source sorting logic
Entire-Checkpoint: c6e522b4276c
2026-04-16 23:53:25 +02:00
4gray 82c3004b3b fix(electron-backend): avoid double-gunzipping EPG responses
Stop treating content-encoding as a manual gunzip signal, because fetch already returns decoded bodies for transfer-compressed XMLTV responses.

Keep redirect and payload-based gzip detection in place, and add regression coverage for redirected .gz feeds, gzip MIME types, content-disposition filenames, and plain content-encoding responses.

Entire-Checkpoint: c6e522b4276c
2026-04-16 22:43:17 +02:00
Eliran Sapir 5e6f58a758 Fix dropped EPG programs for late channel batches 2026-04-15 19:49:51 -04:00
Eliran Sapir 17e8501b29 Fix EPG test query mocking 2026-04-15 17:39:11 -04:00
Eliran Sapir cffda39679 Fix EPG fallback spec mock chain 2026-04-15 17:27:53 -04:00
Eliran Sapir 3c73a4051b Harden EPG channel lookup and invalid rows 2026-04-15 17:08:24 -04:00
Eliran Sapir e2b313084c Fix redirected gzipped EPG feeds 2026-04-14 23:04:26 -04:00
4gray 4320f5e413 ci: add release information to metainfo.xml for version tracking 2026-04-13 08:31:35 +02:00
4gray 35141bec31 build: configure Flatpak finish arguments for external player launching
Entire-Checkpoint: 21b9b9f90f23
2026-04-12 18:38:07 +02:00
4gray 1136e9abac ci(flatpak): add Flatpak support with metainfo and asset validation
Entire-Checkpoint: 21b9b9f90f23
2026-04-12 12:13:05 +02:00
4gray e2d1bb5400 feat(m3u): add inline search functionality for group filtering and enhance group management UI
Entire-Checkpoint: 21b9b9f90f23
2026-04-11 23:30:38 +02:00
4gray 7401ba788d feat(m3u): add group management translations and hints for channels 2026-04-11 22:59:32 +02:00
4gray 7d4d9a280a test(xtream): add end-to-end test for handling empty VOD metadata fallback 2026-04-11 22:32:17 +02:00
4gray e72572a32f feat(i18n): add detail fallback metadata for missing portal information 2026-04-11 22:32:05 +02:00
4gray 3e30778f51 chore(xtream-mock-server): add support for empty metadata fallback in VOD details 2026-04-11 22:31:51 +02:00
4gray 0f72efb749 refactor(m3u): add loading state for channel list and improve playlist handling
- Implemented a loading state for channel lists in various components, enhancing user experience during data fetching.
- Added `ChannelListLoadingStateComponent` to display loading skeletons for channels and groups.
- Updated `M3uWorkspaceRouteSession` to manage loading states more effectively when fetching playlists.
- Modified `VideoPlayerComponent`, `SidebarComponent`, and `ChannelListContainerComponent` to utilize the new loading state.
- Enhanced tests to cover new loading behaviors and ensure proper dispatching of loading actions.
2026-04-11 13:20:22 +02:00
4gray 7cc25380dd docs: update EPG documentation to reflect new bulk handling and fallback logic 2026-04-11 10:44:18 +02:00
4gray 545dfd8c67 feat(stalker): refactor epg handling to use get_epg_info
- Implemented unit tests for StalkerCollectionChannelsListComponent to verify EPG program loading and state management.
- Created unit tests for StalkerLiveStreamLayoutComponent to ensure proper rendering of EPG lists and handling of channel playback.
- Refactored EPG loading logic in StalkerLiveStreamLayoutComponent to improve performance and maintainability.
- Updated HTML template in StalkerLiveStreamLayoutComponent to replace deprecated components with new EPG list component.
- Enhanced EPG program handling by introducing methods for timestamp parsing and current program detection.
2026-04-11 10:43:50 +02:00
4gray c97673b928 refactor: refactor date handling across components to use date-fns and Intl.DateTimeFormat
- Replaced moment.js usage with Intl.DateTimeFormat for date formatting in various components.
- Introduced utility functions `normalizeDateLocale` and `formatWithIntl` for locale normalization and date formatting.
- Updated PlaylistSwitcher, RecentPlaylists, ContentCard, EPG components, and MultiEpgContainer to utilize the new date formatting approach.
- Removed moment-date pipe and related tests, simplifying date handling logic.
- Ensured all date displays respect the current locale settings.

Entire-Checkpoint: 271bd0162027
2026-04-11 10:41:33 +02:00
4gray c2f5c62e82 feat: add channel details dialog and context menu for channel items 2026-04-10 07:54:44 +02:00
4gray 695fe5ffd0 feat: add optional title parameter to fetchPlaylistByUrl for improved playlist handling 2026-04-06 17:57:20 +02:00
4gray 76e4e1b032 feat: enhance playlist management by adding optional title input and updating URL submission logic 2026-04-06 17:57:04 +02:00
4gray 5fdd999c7e style: enhance settings UI with responsive action bar and snackbar adjustments 2026-04-06 17:56:50 +02:00
4gray f229b3b1f2 test(e2e): enhance E2E tests for Xtream and Stalker portals, improve category selection logic, and streamline IndexedDB cleanup 2026-04-06 12:56:23 +02:00
4gray 04f9686483 feat: implement detailed tracing for database operations, window events, and renderer API interactions 2026-04-05 23:26:09 +02:00
4gray c42ddeaef2 feat: enhance EPG functionality with new types, fixtures, and tests for Xtream integration 2026-04-05 19:05:03 +02:00
4gray 0a8a9c9637 feat: implement full and short EPG handlers, enhance data generation and scenarios for EPG support 2026-04-05 19:04:59 +02:00
4gray 2659d52cb9 feat: add new Xtream actions and enhance internationalization for archive playback 2026-04-05 19:04:55 +02:00
4gray 04e8709d7b feat: implement URL probing functionality and enhance time formatting in EPG component 2026-04-05 19:04:20 +02:00
4gray 71befe0d47 feat: enhance typings and localization for Xtream categories and URL handling 2026-04-04 21:17:13 +02:00
4gray 1d0b4ca1fe feat: implement category ID normalization and enhance category operations tests 2026-04-04 21:16:32 +02:00
4gray 4e0afe8b20 feat: implement playlist refresh functionality and cache management 2026-04-04 13:39:45 +02:00
4gray 4d047f89ca feat: add dashboard settings and startup behavior options to settings component 2026-04-04 13:38:53 +02:00
4gray 26fa697afe test(e2e): add comprehensive tests for dashboard activation, favorites, recent items, and settings behavior
Entire-Checkpoint: 02062a64b591
2026-04-04 10:09:27 +02:00
4gray bf09b39ffc test(e2e): replace content card visibility checks with dedicated function for better readability 2026-04-02 08:45:50 +02:00
4gray a15ac7f7c1 test(e2e): enhance category management dialog and update playlist handling 2026-04-01 22:41:15 +02:00
Claude 0f3a75f2b2 fix(e2e): fix category-management navigation race and grid card click race
Two separate root causes:

1. category-management.e2e.ts: openWorkspaceSection('Live TV') was not
   awaited — pickSidebarCategory ran before the route settled on the live
   section, so it read VOD categories from the stale sidebar (e.g. 'Action'
   instead of a live category). The manage-categories dialog opens for the
   live section, so searching for a VOD name found nothing.
   Fix: add waitForURL(/\/workspace\/xtreams\/[^/]+\/live/) after both
   openWorkspaceSection('Live TV') calls.

2. recent.e2e.ts / favorites.e2e.ts: waitForFirstGridListCardTitle read
   the first card's title, but clickGridListCardByTitle then did a fresh
   DOM search by that title. Between those two calls the grid could
   re-sort/paginate, making the card unfindable.
   Fix: new clickFirstGridListCard helper atomically reads the title and
   clicks the same card reference, replacing the two-step pattern.

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-04-01 06:07:26 +00:00
Claude df0c7f79d1 fix(e2e): wait for category-item list to render before interacting with manage-categories dialog
The dialog's 'Select All' button appears as soon as isLoading() flips,
but Angular still needs a change-detection cycle to paint the @for loop.
On slower CI runners (especially after a refreshSource cycle) the
.category-item rows were not yet in the DOM when toggleManagedCategory
tried to locate them, causing a spurious 5 s timeout.

Fix: add an explicit `toBeVisible` guard on the first .category-item
inside openManageCategoriesDialog, and raise the per-row timeout in
toggleManagedCategory from 5 s to 15 s.

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-04-01 05:32:53 +00:00
Claude ffa5b59a5c fix(e2e): fix category-management filter scoping and recent grid pagination
- category-management: replace filter({ has: dialog.locator(...) }) with
  filter({ hasText }) on the .category-item row. Playwright cannot scope an
  absolute locator (created via dialog.locator()) to each candidate element
  when used inside filter({ has: }), so the query always returned empty.
  Using hasText on the whole row correctly retries until Angular's @for loop
  re-renders filteredCategories() after the search field is populated.

- recent.e2e.ts Xtream test: same pagination fix as favorites — derive
  movieTitle and seriesTitle from waitForFirstGridListCardTitle() instead of
  pickDistinctTitles(fixture.items)[0], which may be on page 2 of the
  date-sorted grid and never visible.

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-04-01 05:08:30 +00:00
Claude 78a2dd3766 fix(e2e): fix category-management race condition and favorites grid pagination
- toggleManagedCategory: replace manual count-loop with Playwright filter so
  the locator retries internally until Angular re-renders the filtered list
  after the search field is populated (previously called .count() before the
  @for loop had reacted to the updated searchTerm signal)

- favorites Xtream test: pick movie/series titles from the first displayed
  grid card instead of vodFixture.items[0]. The grid sorts by date-desc and
  paginates at 25 items; the first API item may land on page 2 making
  clickGridListCardByTitle time out with "element not found". Reading the
  title from the DOM after navigation ensures we always target a visible card.

- electron-test-fixtures: export waitForFirstGridListCardTitle helper

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-03-31 21:58:40 +00:00
Claude 3f08aba550 fix(e2e): fix dragSourceBefore and toggleManagedCategory selectors
- dragSourceBefore: replace mat-list-item with .playlist-item as the
  drag target; playlist-item.component has no mat-list-item element,
  the inner container div carries the .playlist-item class
- toggleManagedCategory: match categories by name only instead of
  name+itemCount; after an Xtream refresh the itemCounts Map passed to
  the dialog may be empty (streams not yet counted), causing a false
  mismatch even though the category is present and uniquely named

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-03-31 07:25:47 +00:00
Claude ef344f4ee8 fix(e2e): resolve 4 remaining test failures in electron e2e suite
- Fix getVisibleSourceTitles: use .playlist-title selector instead of
  .mdc-list-item__primary-text which no longer matches playlist-item component
- Fix category-management test: re-navigate to sources page after
  refreshSource since refresh navigates away from sources
- Fix recent.e2e test: remove switchUnifiedCollectionContent calls after
  clearRecentItems since the content toggle disappears when all items cleared
- Fix stalker mock server: generate numeric episode IDs ("1","2",...) in
  season.series array so toSeriesNumbers() can parse them; previously used
  non-numeric IDs like "30000-s1-e1" which parsed to NaN, producing empty
  episode arrays and causing playFirstSeriesEpisode to time out

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-03-30 18:35:17 +00:00
Claude fc878e7c09 fix(e2e): update electron e2e fixtures for new unified add-playlist dialog
Replace menuitem selectors with mat-button-toggle[value] selectors in
all four playlist import helpers (file, url, xtream, stalker) and rename
openAddPlaylistMenu to openAddPlaylistDialog to reflect that clicking
"Add playlist" now opens a dialog directly instead of a dropdown menu.

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-03-30 17:52:12 +00:00
Claude 464d2eda01 fix(e2e): use mat-button-toggle value selectors for playlist type selection
mat-button-toggle elements inside a group render their internal buttons
with role="radio", not role="button", so getByRole('button') selectors
fail. Switch to attribute selectors targeting the value attribute instead.

https://claude.ai/code/session_01VU6ZZTG7YrhKhKBQvBfmpp
2026-03-30 06:48:49 +00:00
4gray cf311ddf6f refactor(e2e): update dialog interactions for playlist addition in tests
Entire-Checkpoint: 84693b066142
2026-03-29 15:28:02 +02:00