diff --git a/libs/m3u-state/src/lib/effects.ts b/libs/m3u-state/src/lib/effects.ts index 0e335ab41..bef31d0ff 100644 --- a/libs/m3u-state/src/lib/effects.ts +++ b/libs/m3u-state/src/lib/effects.ts @@ -11,7 +11,9 @@ import { EMPTY, filter, firstValueFrom, + from, map, + mergeMap, switchMap, tap, withLatestFrom, @@ -277,12 +279,14 @@ export class PlaylistEffects { parsePlaylist$ = createEffect(() => { return this.actions$.pipe( ofType(PlaylistActions.parsePlaylist), - map((action) => - this.playlistsService.handlePlaylistParsing( - action.uploadType, - action.playlist, - action.title, - action.path + mergeMap((action) => + from( + this.playlistsService.handlePlaylistParsing( + action.uploadType, + action.playlist, + action.title, + action.path + ) ) ), map((playlist) => diff --git a/libs/services/src/lib/playlist-backup.service.ts b/libs/services/src/lib/playlist-backup.service.ts index 521918106..b987254c1 100644 --- a/libs/services/src/lib/playlist-backup.service.ts +++ b/libs/services/src/lib/playlist-backup.service.ts @@ -610,7 +610,7 @@ export class PlaylistBackupService { playlistId: string, existing: Playlist | null ): Promise { - const parsedPlaylist = this.playlistsService.handlePlaylistParsing( + const parsedPlaylist = await this.playlistsService.handlePlaylistParsing( 'TEXT', entry.source.rawM3u, entry.title diff --git a/libs/services/src/lib/playlists.service.ts b/libs/services/src/lib/playlists.service.ts index 47d36afbf..92f4272e6 100644 --- a/libs/services/src/lib/playlists.service.ts +++ b/libs/services/src/lib/playlists.service.ts @@ -2,7 +2,6 @@ import { inject, Injectable } from '@angular/core'; import { MatSnackBar } from '@angular/material/snack-bar'; import { TranslateService } from '@ngx-translate/core'; -import { parse } from 'iptv-playlist-parser'; import { aggregateFavoriteChannels, createFavoritesPlaylist, @@ -760,13 +759,17 @@ export class PlaylistsService { ); } - handlePlaylistParsing( + async handlePlaylistParsing( uploadType: 'FILE' | 'URL' | 'TEXT', playlist: string, title: string, path?: string ) { try { + // Dynamic import keeps the ~130KB validator dep (transitively pulled + // by iptv-playlist-parser) out of the eager bundle. parse() only runs + // on user-triggered imports. + const { parse } = await import('iptv-playlist-parser'); const parsedPlaylist = parse(playlist); return createPlaylistObject( title,