mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-10 18:36:15 -08:00
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>
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { app, BrowserWindow } from 'electron';
|
|
import fixPath from 'fix-path';
|
|
import App from './app/app';
|
|
import { initDatabase } from './app/database/connection';
|
|
import DatabaseEvents from './app/events/database.events';
|
|
import {
|
|
resetStaleDownloads,
|
|
setMainWindow as setDownloadsMainWindow,
|
|
} from './app/events/database/downloads.events';
|
|
import ElectronEvents from './app/events/electron.events';
|
|
import EpgEvents from './app/events/epg.events';
|
|
import PlayerEvents from './app/events/player.events';
|
|
import PlaylistEvents from './app/events/playlist.events';
|
|
import RemoteControlEvents from './app/events/remote-control.events';
|
|
import SettingsEvents from './app/events/settings.events';
|
|
import SharedEvents from './app/events/shared.events';
|
|
import SquirrelEvents from './app/events/squirrel.events';
|
|
import StalkerEvents from './app/events/stalker.events';
|
|
import XtreamEvents from './app/events/xtream.events';
|
|
|
|
app.setName('iptvnator');
|
|
|
|
export default class Main {
|
|
static initialize() {
|
|
if (SquirrelEvents.handleEvents()) {
|
|
// squirrel event handled (except first run event) and app will exit in 1000ms, so don't do anything else
|
|
app.quit();
|
|
}
|
|
}
|
|
|
|
static bootstrapApp() {
|
|
App.main(app, BrowserWindow);
|
|
}
|
|
|
|
static async bootstrapAppEvents() {
|
|
// Initialize database before other events
|
|
await initDatabase();
|
|
|
|
ElectronEvents.bootstrapElectronEvents();
|
|
PlaylistEvents.bootstrapPlaylistEvents();
|
|
SharedEvents.bootstrapSharedEvents();
|
|
PlayerEvents.bootstrapPlayerEvents();
|
|
SettingsEvents.bootstrapSettingsEvents();
|
|
StalkerEvents.bootstrapStalkerEvents();
|
|
XtreamEvents.bootstrapXtreamEvents();
|
|
DatabaseEvents.bootstrapDatabaseEvents();
|
|
EpgEvents.bootstrapEpgEvents();
|
|
RemoteControlEvents.bootstrapRemoteControlEvents();
|
|
|
|
// Set main window for downloads and reset stale downloads
|
|
if (App.mainWindow) {
|
|
setDownloadsMainWindow(App.mainWindow);
|
|
}
|
|
await resetStaleDownloads();
|
|
|
|
// initialize auto updater service
|
|
if (!App.isDevelopmentMode()) {
|
|
// UpdateEvents.initAutoUpdateService();
|
|
}
|
|
}
|
|
}
|
|
|
|
fixPath();
|
|
|
|
// handle setup events as quickly as possible
|
|
Main.initialize();
|
|
|
|
// bootstrap app
|
|
Main.bootstrapApp();
|
|
|
|
// Bootstrap app events after Electron app is ready
|
|
app.whenReady().then(async () => {
|
|
await Main.bootstrapAppEvents();
|
|
});
|