mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-12 03:56:15 -08:00
* feat(epg): manual EPG-to-channel mapping with mapping fallback in all EPG paths
* fix: epg mapping in live tv list
* fix(epg): harden manual EPG mapping — upgrade safety, perf, playlist-scoped keys
Follow-up fixes on top of the manual EPG-to-channel mapping feature:
- epg-database: dedupe existing epg_programs rows before creating the
unique (channel_id, start, title) index — a plain CREATE UNIQUE INDEX
crashed the EPG worker on upgrade when historical duplicates exist;
replace INSERT OR REPLACE with ON CONFLICT DO UPDATE so the
epg_programs_fts delete trigger is not bypassed (REPLACE skips delete
triggers unless recursive_triggers is on), with a plain-INSERT
fallback when the index cannot be created
- db: add idx_content_epg_channel — the mapping fallback scanned the
whole content table on every single-channel EPG lookup
- keys: scope Xtream mapping keys per playlist via shared
buildXtreamEpgMappingKey (xtream:{playlistId}:{id}) — bare stream ids
collide across portals; the backend fallback now joins categories to
resolve the playlist id
- pwa: hide "Map EPG channel" entries behind the supportsEpgMapping
capability — the menu item was a dead end in the PWA
- parser: parse the XMLTV offset sign from the string — Math.sign(0)
dropped the minutes of ±00:xx offsets
- cleanup: typed window.electron access instead of ad-hoc casts, drop
unused resolveChannelId and dialog data field, shared
EpgMappingDialogComponent.open() for all seven call sites
- dialog UX: minimum-characters search hint, save/remove snackbars,
current mapping shows the EPG channel display name,
takeUntilDestroyed on the search stream
- i18n: fill the new keys in all 17 locales
- tests: cover mapping CRUD/search escaping, the dedup-index guard,
offset parsing and playlist-scoped keys; update stale stream-resolver
specs for the new 50-item limit and 10s timeout
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(epg): escape backslashes in EPG channel search LIKE pattern
CodeQL js/incomplete-sanitization: a lone trailing backslash in the
search term paired with the closing wildcard under the ESCAPE clause
and corrupted the pattern.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* perf(epg): batch mapping lookups in the viewport preview queue
Expose the existing getEpgMappingsBatch operation over a new
EPG_MAPPING_GET_BATCH IPC channel and use it in resolveManualMappings —
the per-entry lookup issued one IPC round-trip per visible channel on
every scroll event.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* perf(epg): batch mapping prefetch in the collection preview loader
Resolve all candidate mapping keys for an Xtream preview batch with a
single getEpgMappingsBatch IPC call instead of per-channel lookups.
Also fix a worker early-exit: a channel without tvgId/name returned out
of the shared-iterator loop and silently killed one of the three
concurrent preview workers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: 4gray <serega05@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
64 lines
2.8 KiB
TypeScript
64 lines
2.8 KiB
TypeScript
export * from './lib/channel.interface';
|
|
export * from './lib/channel.model';
|
|
export * from './lib/dev-logger.util';
|
|
export * from './lib/embedded-mpv-session.interface';
|
|
export * from './lib/electron-api.interface';
|
|
export * from './lib/epg-channel-metadata.model';
|
|
export * from './lib/epg-channel-with-programs.interface';
|
|
export * from './lib/epg-channel.model';
|
|
export * from './lib/epg-item.interface';
|
|
export * from './lib/epg-mapping-key.util';
|
|
export * from './lib/epg-program.model';
|
|
export * from './lib/external-player-arguments.utils';
|
|
export * from './lib/external-player-session.interface';
|
|
export * from './lib/global-search-result.interface';
|
|
export * from './lib/indexed-db.config';
|
|
export * from './lib/ipc-command.class';
|
|
export * from './lib/ipc-commands';
|
|
export * from './lib/language.enum';
|
|
export * from './lib/m3u-favorite-channel.interface';
|
|
export * from './lib/parsed-playlist.interface';
|
|
export * from './lib/playback-position.interface';
|
|
export * from './lib/playlist-backup.interface';
|
|
export * from './lib/playlist-meta.type';
|
|
export * from './lib/playlist-recently-viewed.interface';
|
|
export * from './lib/playlist-recently-viewed.utils';
|
|
export * from './lib/playlist-refresh.interface';
|
|
export * from './lib/playlist.interface';
|
|
export * from './lib/portal-activity-item.interface';
|
|
export * from './lib/portal-debug.interface';
|
|
export * from './lib/portal-playback.interface';
|
|
export * from './lib/security-policy-error.utils';
|
|
export * from './lib/settings.interface';
|
|
export * from './lib/stalker-portal-actions.enum';
|
|
export * from './lib/store-keys.enum';
|
|
export * from './lib/stream-format.enum';
|
|
export * from './lib/catalog-title-match.interface';
|
|
export * from './lib/theme.enum';
|
|
export * from './lib/title-normalization.util';
|
|
export * from './lib/tmdb.interface';
|
|
export * from './lib/xtream-account-info-dialog-data.interface';
|
|
export * from './lib/xtream-category.interface';
|
|
export * from './lib/xtream-code-actions';
|
|
export * from './lib/xtream-item.interface';
|
|
export * from './lib/xtream-live-stream.interface';
|
|
export * from './lib/xtream-response.interface';
|
|
export * from './lib/xtream-portal.utils';
|
|
export * from './lib/xtream-restore-state.util';
|
|
export * from './lib/xtream-recently-added.utils';
|
|
export * from './lib/xtream-serie-details.interface';
|
|
export * from './lib/xtream-serie-item.interface';
|
|
export * from './lib/xtream-vod-details.interface';
|
|
export * from './lib/xtream-vod-stream.interface';
|
|
|
|
// Stalker interfaces
|
|
export * from './lib/stalker-item.normalizer';
|
|
export * from './lib/stalker-identity.utils';
|
|
export * from './lib/stalker-portal-item.interface';
|
|
export * from './lib/stalker-serial-details.interface';
|
|
export * from './lib/stalker-vod-details.interface';
|
|
|
|
// Unified VOD details (discriminated union + adapters)
|
|
export * from './lib/vod-details-adapters';
|
|
export * from './lib/vod-details-item.interface';
|