feat(player): add embedded-mpv player for macOS as experimental feature

- Introduced tooling for building and staging the macOS `libmpv` runtime for IPTVnator's embedded MPV player.
- Added `build-macos-runtime.mjs` for building an LGPL-compatible runtime from source.
- Created `stage-macos-runtime.mjs` for staging the built runtime artifacts.
- Implemented validation for the packaged embedded MPV runtime in `electron-after-pack.cjs` and `embedded-mpv-macos.cjs`.
- Updated packaging scripts to ensure the embedded MPV runtime is correctly integrated and validated during the build process.
- Added README files to document the expected layout and usage for the embedded MPV runtime artifacts.

Entire-Checkpoint: c6e522b4276c
This commit is contained in:
4gray committed 2026-04-27 00:32:14 +02:00
1 parent 10139955e7
commit 9f873e6bed
53 files changed
+6099 -49

No files matched your search

+1
View File
@@ -1,5 +1,6 @@
export * from './lib/channel.interface';
export * from './lib/channel.model';
export * from './lib/embedded-mpv-session.interface';
export * from './lib/epg-channel-metadata.model';
export * from './lib/epg-channel-with-programs.interface';
export * from './lib/epg-channel.model';
@@ -0,0 +1,44 @@
export type EmbeddedMpvSessionStatus =
| 'idle'
| 'loading'
| 'playing'
| 'paused'
| 'error'
| 'closed';
export interface EmbeddedMpvBounds {
x: number;
y: number;
width: number;
height: number;
}
export interface EmbeddedMpvSupport {
supported: boolean;
platform: string;
reason?: string;
}
export interface EmbeddedMpvAudioTrack {
id: number;
title?: string;
language?: string;
selected: boolean;
defaultTrack?: boolean;
forced?: boolean;
}
export interface EmbeddedMpvSession {
id: string;
title: string;
streamUrl: string;
status: EmbeddedMpvSessionStatus;
positionSeconds: number;
durationSeconds: number | null;
volume: number;
audioTracks: EmbeddedMpvAudioTrack[];
selectedAudioTrackId: number | null;
startedAt: string;
updatedAt: string;
error?: string;
}
@@ -37,6 +37,17 @@ export const SET_VLC_PLAYER_PATH = 'SET_VLC_PLAYER_PATH';
export const CLOSE_EXTERNAL_PLAYER_SESSION = 'CLOSE_EXTERNAL_PLAYER_SESSION';
export const EXTERNAL_PLAYER_SESSION_UPDATE =
'EXTERNAL_PLAYER_SESSION_UPDATE';
export const EMBEDDED_MPV_SUPPORT = 'EMBEDDED_MPV_SUPPORT';
export const EMBEDDED_MPV_CREATE_SESSION = 'EMBEDDED_MPV_CREATE_SESSION';
export const EMBEDDED_MPV_LOAD_PLAYBACK = 'EMBEDDED_MPV_LOAD_PLAYBACK';
export const EMBEDDED_MPV_SET_BOUNDS = 'EMBEDDED_MPV_SET_BOUNDS';
export const EMBEDDED_MPV_SET_PAUSED = 'EMBEDDED_MPV_SET_PAUSED';
export const EMBEDDED_MPV_SEEK = 'EMBEDDED_MPV_SEEK';
export const EMBEDDED_MPV_SET_VOLUME = 'EMBEDDED_MPV_SET_VOLUME';
export const EMBEDDED_MPV_SET_AUDIO_TRACK = 'EMBEDDED_MPV_SET_AUDIO_TRACK';
export const EMBEDDED_MPV_DISPOSE_SESSION = 'EMBEDDED_MPV_DISPOSE_SESSION';
export const EMBEDDED_MPV_SESSION_UPDATE = 'EMBEDDED_MPV_SESSION_UPDATE';
export const EMBEDDED_MPV_PREPARE = 'EMBEDDED_MPV_PREPARE';
// Xtream
export const XTREAM_REQUEST = 'XTREAM_REQUEST';
@@ -8,6 +8,7 @@ import { Theme } from './theme.enum';
export enum VideoPlayer {
VideoJs = 'videojs',
Html5Player = 'html5',
EmbeddedMpv = 'embedded-mpv',
MPV = 'mpv',
VLC = 'vlc',
ArtPlayer = 'artplayer',