diff --git a/apps/electron-backend/src/app/api/main.preload.ts b/apps/electron-backend/src/app/api/main.preload.ts index d4b84936f..917a5a822 100644 --- a/apps/electron-backend/src/app/api/main.preload.ts +++ b/apps/electron-backend/src/app/api/main.preload.ts @@ -305,7 +305,7 @@ const electronApi = { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: any, @@ -328,7 +328,7 @@ const electronApi = { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: any, diff --git a/apps/web/src/app/services/electron.service.ts b/apps/web/src/app/services/electron.service.ts index 2ec59d00c..0a7765fa5 100644 --- a/apps/web/src/app/services/electron.service.ts +++ b/apps/web/src/app/services/electron.service.ts @@ -156,7 +156,7 @@ export class ElectronService extends DataService { data.url, data.title ?? '', data.thumbnail ?? '', - data['user-agent'] ?? '', + data['user-agent'] ?? undefined, data.referer ?? undefined, data.origin ?? undefined, data.contentInfo, @@ -185,7 +185,7 @@ export class ElectronService extends DataService { data.url, data.title ?? '', data.thumbnail ?? '', - data['user-agent'] ?? '', + data['user-agent'] ?? undefined, data.referer ?? undefined, data.origin ?? undefined, data.contentInfo, diff --git a/apps/web/src/app/settings/settings.component.spec.ts b/apps/web/src/app/settings/settings.component.spec.ts index 096db46d9..2cd48a890 100644 --- a/apps/web/src/app/settings/settings.component.spec.ts +++ b/apps/web/src/app/settings/settings.component.spec.ts @@ -494,7 +494,9 @@ describe('SettingsComponent', () => { .some((player) => player.id === VideoPlayer.EmbeddedMpv) ).toBe(false); - expect(resolveSupport).toBeDefined(); + if (!resolveSupport) { + throw new Error('Expected embedded MPV support resolver'); + } resolveSupport({ supported: true, platform: 'darwin', @@ -983,4 +985,39 @@ describe('SettingsComponent', () => { }) ); }); + + it('preserves saved EPG settings when saving from the web settings form', async () => { + fixture.destroy(); + window.electron = undefined as unknown as typeof window.electron; + + const mockStore = settingsStore as unknown as MockSettingsStore; + mockStore._setSettings({ + epgUrl: ['https://example.com/guide.xml'], + preferUploadedEpgOverXtream: true, + }); + mockStore.updateSettings.mockResolvedValue(undefined); + + const webFixture = TestBed.createComponent(SettingsComponent); + const webComponent = webFixture.componentInstance; + webComponent.checkAppVersion = jest.fn(); + webComponent.fetchLocalIpAddresses = jest + .fn() + .mockResolvedValue(undefined); + webFixture.detectChanges(); + await webFixture.whenStable(); + + webComponent.settingsForm.patchValue({ theme: Theme.DarkTheme }); + webComponent.onSubmit(); + await webFixture.whenStable(); + + expect(mockStore.updateSettings).toHaveBeenCalledWith( + expect.objectContaining({ + epgUrl: ['https://example.com/guide.xml'], + preferUploadedEpgOverXtream: true, + theme: Theme.DarkTheme, + }) + ); + + webFixture.destroy(); + }); }); diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index 9ea9173e9..5c229ac67 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -496,12 +496,13 @@ export class SettingsComponent implements OnInit, OnDestroy { } private createSettingsFromFormValue(): Settings { + const currentSettings = this.settingsStore.getSettings(); const value = this.settingsForm.value; const epgUrl = Array.isArray(value.epgUrl) ? value.epgUrl.filter( (url): url is string => typeof url === 'string' ) - : []; + : (currentSettings.epgUrl ?? []); return { player: value.player ?? VideoPlayer.VideoJs, @@ -533,7 +534,9 @@ export class SettingsComponent implements OnInit, OnDestroy { coverSize: value.coverSize ?? 'medium', epgUrl, preferUploadedEpgOverXtream: - value.preferUploadedEpgOverXtream ?? false, + value.preferUploadedEpgOverXtream ?? + currentSettings.preferUploadedEpgOverXtream ?? + false, }; } diff --git a/apps/web/src/typings.d.ts b/apps/web/src/typings.d.ts index 1297fc31f..aa9469371 100644 --- a/apps/web/src/typings.d.ts +++ b/apps/web/src/typings.d.ts @@ -72,7 +72,7 @@ declare global { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: unknown, @@ -83,7 +83,7 @@ declare global { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: unknown, diff --git a/global.d.ts b/global.d.ts index e56f47274..d23dc5942 100644 --- a/global.d.ts +++ b/global.d.ts @@ -68,7 +68,7 @@ declare global { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: any, @@ -79,7 +79,7 @@ declare global { url: string, title: string, thumbnail: string, - userAgent: string, + userAgent: string | undefined, referer?: string, origin?: string, contentInfo?: any, diff --git a/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts b/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts index 0d0e5606b..1530ff910 100644 --- a/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts +++ b/libs/portal/xtream/data-access/src/lib/data-sources/pwa-xtream-data-source.ts @@ -616,8 +616,8 @@ export class PwaXtreamDataSource implements IXtreamDataSource { // Sort by updatedAt descending playlistPositions.sort( (a, b) => - new Date(b.updatedAt ?? '').getTime() - - new Date(a.updatedAt ?? '').getTime() + new Date(b.updatedAt ?? 0).getTime() - + new Date(a.updatedAt ?? 0).getTime() ); return limit ? playlistPositions.slice(0, limit) : playlistPositions;