pstream is dead; long live pstream
taciturnaxolotl.github.io/pstream-ng/
1import { MediaPlaylist } from "hls.js";
2
3import { MWMediaType } from "@/backend/metadata/types/mw";
4import { AudioTrack, CaptionListItem } from "@/stores/player/slices/source";
5import { LoadableSource, SourceQuality } from "@/stores/player/utils/qualities";
6import { Listener } from "@/utils/events";
7
8export type DisplayErrorType = "hls" | "htmlvideo" | "global";
9export type DisplayError = {
10 stackTrace?: string;
11 message?: string;
12 key?: string;
13 errorName: string;
14 type: DisplayErrorType;
15 hls?: {
16 details: string;
17 fatal: boolean;
18 level?: number;
19 levelDetails?: {
20 url: string;
21 width: number;
22 height: number;
23 bitrate: number;
24 };
25 frag?: {
26 url: string;
27 baseurl: string;
28 duration: number;
29 start: number;
30 sn: number | string;
31 };
32 type: string;
33 url?: string;
34 };
35};
36
37export type DisplayInterfaceEvents = {
38 play: void;
39 pause: void;
40 fullscreen: boolean;
41 volumechange: number;
42 time: number;
43 duration: number;
44 buffered: number;
45 loading: boolean;
46 qualities: SourceQuality[];
47 changedquality: SourceQuality | null;
48 audiotracks: AudioTrack[];
49 changedaudiotrack: AudioTrack | null;
50 needstrack: boolean;
51 canairplay: boolean;
52 playbackrate: number;
53 error: DisplayError;
54};
55
56export interface qualityChangeOptions {
57 source: LoadableSource | null;
58 automaticQuality: boolean;
59 preferredQuality: SourceQuality | null;
60 startAt: number;
61}
62
63export interface DisplayMeta {
64 title: string;
65 type: MWMediaType;
66}
67
68export interface DisplayCaption {
69 id: string;
70 srtData: string;
71 language: string;
72 url?: string;
73}
74
75export type DisplayType = "web" | "casting";
76
77export interface DisplayInterface extends Listener<DisplayInterfaceEvents> {
78 play(): void;
79 pause(): void;
80 load(ops: qualityChangeOptions): void;
81 changeQuality(
82 automaticQuality: boolean,
83 preferredQuality: SourceQuality | null,
84 ): void;
85 changeAudioTrack(audioTrack: AudioTrack): void;
86 processVideoElement(video: HTMLVideoElement): void;
87 processContainerElement(container: HTMLElement): void;
88 toggleFullscreen(): void;
89 togglePictureInPicture(): void;
90 setSeeking(active: boolean): void;
91 setVolume(vol: number): void;
92 setTime(t: number): void;
93 destroy(): void;
94 startAirplay(): void;
95 setPlaybackRate(rate: number): void;
96 setMeta(meta: DisplayMeta): void;
97 setCaption(caption: DisplayCaption | null): void;
98 getType(): DisplayType;
99 getCaptionList(): CaptionListItem[];
100 getSubtitleTracks(): MediaPlaylist[];
101 setSubtitlePreference(lang: string): Promise<void>;
102}