nixamp 0.51.0 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-label.d.ts +70 -3
- package/dist/ai-label.js +375 -29
- package/dist/label-routes.js +2 -1
- package/dist/main.js +9 -0
- package/dist/mcp.js +42 -0
- package/dist/music-cli.d.ts +2 -0
- package/dist/music-cli.js +109 -0
- package/dist/music-client.d.ts +62 -0
- package/dist/music-client.js +73 -0
- package/dist/station-cli.js +8 -1
- package/dist/station-mcp.d.ts +62 -0
- package/dist/station-mcp.js +5 -2
- package/dist/station-usage.d.ts +1 -1
- package/dist/station-usage.js +3 -0
- package/package.json +1 -1
- package/src/ai-label.ts +381 -29
- package/src/label-routes.ts +2 -1
- package/src/main.ts +8 -0
- package/src/mcp.ts +38 -0
- package/src/music-cli.ts +86 -0
- package/src/music-client.ts +86 -0
- package/src/station-cli.ts +8 -1
- package/src/station-mcp.ts +5 -2
- package/src/station-usage.ts +3 -0
- package/web/dist/assets/{ar--GRGOL7F.js → ar-Cmon75WL.js} +1 -1
- package/web/dist/assets/chunk-Q2XQMA4B-DdHrVlSJ.css +1 -0
- package/web/dist/assets/{chunk-Q2XQMA4B-CDsJ8fBU.js → chunk-Q2XQMA4B-PTuZPMen.js} +1 -1
- package/web/dist/assets/{cs-B2ab-8qO.js → cs-BRaPWZ-l.js} +1 -1
- package/web/dist/assets/{da-Ek2g1uTg.js → da-DzwX-95l.js} +1 -1
- package/web/dist/assets/{de-CM7-9Fbk.js → de-Dp5yZesS.js} +1 -1
- package/web/dist/assets/{es-BFSOrr3I.js → es-DI_neNna.js} +1 -1
- package/web/dist/assets/{fi-D9Tf69sv.js → fi-RizsR0Qs.js} +1 -1
- package/web/dist/assets/{fr-Gh9yYJGo.js → fr-Du-Xj-FG.js} +1 -1
- package/web/dist/assets/{hi-B3ow3HJC.js → hi-K3VZUZDS.js} +1 -1
- package/web/dist/assets/{hls-OR5FY6YP-bdUZBB11.js → hls-OR5FY6YP-CxI-FwpW.js} +1 -1
- package/web/dist/assets/{hu-paju-6Kr.js → hu-s6bvR7Qx.js} +1 -1
- package/web/dist/assets/{id-mubOQFX0.js → id-BtqFTjdZ.js} +1 -1
- package/web/dist/assets/{it-0EM-qnDT.js → it-DlTM2OMR.js} +1 -1
- package/web/dist/assets/{main-CECXge6G.js → main-DaqdNlZC.js} +2 -2
- package/web/dist/assets/{mpegts-7CN75AI2-iUctLWip.js → mpegts-7CN75AI2-D-6xFZI-.js} +1 -1
- package/web/dist/assets/{mpegts-DeEBZUXP.js → mpegts-D2ZKeEby.js} +1 -1
- package/web/dist/assets/{nl-c6HalphH.js → nl-KW4bKgIq.js} +1 -1
- package/web/dist/assets/{radio-CDUEoM0y.js → radio-B8n_n-WD.js} +1 -1
- package/web/dist/assets/{ru-CUKYVlgf.js → ru-CZhm9rUN.js} +1 -1
- package/web/dist/assets/{station-D769XVG0.js → station-CrAZxHcX.js} +1 -1
- package/web/dist/assets/{sv-BUxBsZR5.js → sv-Bs6WYhqU.js} +1 -1
- package/web/dist/assets/{uk-708lBssa.js → uk-OcuLYdVU.js} +1 -1
- package/web/dist/assets/{vi-B1ropUvk.js → vi-BX_K6R8j.js} +1 -1
- package/web/dist/assets/{vod-bM1DvPEx.js → vod-CrvTO3FN.js} +1 -1
- package/web/dist/assets/{watch-BbhPO0HS.js → watch-itlvgIf8.js} +1 -1
- package/web/dist/assets/{zh-C_ndTsNh.js → zh-CEzbVQ57.js} +1 -1
- package/web/dist/index.html +11 -8
- package/web/dist/radio.html +3 -3
- package/web/dist/station.html +3 -3
- package/web/dist/sw.js +28 -28
- package/web/dist/vod.html +3 -3
- package/web/dist/watch.html +3 -3
- package/web/dist/assets/chunk-Q2XQMA4B-BBzoLLVb.css +0 -1
package/src/mcp.ts
CHANGED
|
@@ -245,6 +245,29 @@ export const TOOLS: ToolDefinition[] = [
|
|
|
245
245
|
required: ["server"],
|
|
246
246
|
},
|
|
247
247
|
},
|
|
248
|
+
{
|
|
249
|
+
name: "music_catalog",
|
|
250
|
+
description: "The AI label's catalogue: genres, artists, albums and songs (with lyrics), and each genre's free live station. Read from the server that holds the music, live.streaming by default.",
|
|
251
|
+
inputSchema: { type: "object", properties: { server: { ...STRING, description: "The music server's https address (default https://live.streaming.pit.world)." } } },
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: "music_buy",
|
|
255
|
+
description: "Buy AI label music as files (a song 10¢, an album $1, everything by an artist $2) with crypto via CoinPay. Answers the page to pay on and the receipt link where the zip (MP3s with cover art and lyrics) is downloaded once paid. Pass a nixamp.com/buy link, or server + kind + artist (+ album, + n).",
|
|
256
|
+
inputSchema: {
|
|
257
|
+
type: "object",
|
|
258
|
+
properties: {
|
|
259
|
+
link: { ...STRING, description: "A nixamp.com/buy?... link." },
|
|
260
|
+
server: STRING, kind: { type: "string", enum: ["song", "album", "artist"] }, artist: STRING, album: STRING, n: { type: "integer" },
|
|
261
|
+
email: { ...STRING, description: "Where the receipt goes; the signed-in account's email by default." },
|
|
262
|
+
coin: { ...STRING, description: "USDC_POL (default), USDC_SOL, SOL, POL, ETH, BTC..." },
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
name: "music_purchases",
|
|
268
|
+
description: "The AI label music this account bought, with a fresh download link for each zip. Needs `nixamp login` with the email used to buy.",
|
|
269
|
+
inputSchema: { type: "object", properties: {} },
|
|
270
|
+
},
|
|
248
271
|
...STATION_TOOLS,
|
|
249
272
|
...(PUBLIC_TOOLS as unknown as ToolDefinition[]),
|
|
250
273
|
...LIBRARY_TOOLS,
|
|
@@ -327,6 +350,21 @@ export async function callTool(name: string, args: Record<string, unknown>, opti
|
|
|
327
350
|
...(options.session?.site ? { site: options.session.site } : {}),
|
|
328
351
|
}) as unknown as ToolResult;
|
|
329
352
|
}
|
|
353
|
+
// The AI label's music: the catalogue and buying need no sign-in; what was bought does.
|
|
354
|
+
if (name === "music_catalog" || name === "music_buy" || name === "music_purchases") {
|
|
355
|
+
const shop = await import("./music-client.ts");
|
|
356
|
+
try {
|
|
357
|
+
if (name === "music_catalog") return text(JSON.stringify(await shop.catalogue(typeof args["server"] === "string" && args["server"] ? args["server"] : undefined, options.fetcher), null, 2));
|
|
358
|
+
if (name === "music_purchases") return text(JSON.stringify(await shop.purchases(options.fetcher), null, 2));
|
|
359
|
+
const link = typeof args["link"] === "string" ? shop.fromBuyLink(args["link"]) : null;
|
|
360
|
+
if (typeof args["link"] === "string" && !link) return failed("that is not a nixamp.com/buy link");
|
|
361
|
+
const pick = (keys: string[]): Record<string, unknown> => Object.fromEntries(keys.filter((key) => args[key] !== undefined).map((key) => [key, args[key]]));
|
|
362
|
+
const made = await shop.buy({ ...(link ?? pick(["server", "kind", "artist", "album", "n"])), ...(link?.["n"] ? { n: Number(link["n"]) } : {}), coin: typeof args["coin"] === "string" ? args["coin"] : "USDC_POL", ...pick(["email"]) }, options.fetcher);
|
|
363
|
+
return text(`Pay here: ${made.url}\nReceipt and download, once paid: ${made.receipt}`);
|
|
364
|
+
} catch (error) {
|
|
365
|
+
return failed((error as Error).message);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
330
368
|
// Stations first: on this machine they need the daemon, not a sign-in.
|
|
331
369
|
if (isStationTool(name) || isLibraryTool(name)) {
|
|
332
370
|
const local = { ...(options.fetcher ? { fetcher: options.fetcher } : {}), ...(options.session !== undefined ? { session: options.session } : {}), ...(options.stations ?? {}) };
|
package/src/music-cli.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nixamp music`: the AI label's catalogue, buying, and what you bought.
|
|
3
|
+
*
|
|
4
|
+
* nixamp music [list] what you bought (signed in with that email)
|
|
5
|
+
* nixamp music catalog [SERVER] artists, albums and songs (live.streaming by default)
|
|
6
|
+
* nixamp music buy LINK|--server S --kind song|album|artist --artist A [--album B] [--n N]
|
|
7
|
+
* [--email E] [--coin SOL] prints the CoinPay page to pay on
|
|
8
|
+
* nixamp music download ID|all [--out DIR] the zip(s) of what you bought
|
|
9
|
+
*
|
|
10
|
+
* Listening is free on the live stations; the files are sold: a song 10¢, an
|
|
11
|
+
* album $1, everything by an artist $2.
|
|
12
|
+
*/
|
|
13
|
+
import { buy, catalogue, download, fromBuyLink, PRICE_WORDS, purchases } from "./music-client.ts";
|
|
14
|
+
|
|
15
|
+
export const MUSIC_USAGE = `nixamp music: the AI label's songs as files (${PRICE_WORDS}; live radio is free)
|
|
16
|
+
|
|
17
|
+
nixamp music [list] what you bought, with its download link
|
|
18
|
+
nixamp music catalog [SERVER] the artists, albums and songs (live.streaming by default)
|
|
19
|
+
nixamp music buy LINK a nixamp.com/buy link, or:
|
|
20
|
+
nixamp music buy --server URL --kind song|album|artist --artist KEY [--album KEY] [--n N]
|
|
21
|
+
[--email you@example.com] [--coin SOL] prints the CoinPay page to pay on
|
|
22
|
+
nixamp music download ID|all [--out DIR] save the zip(s): MP3s with art and lyrics
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
function flag(argv: string[], name: string): string | undefined {
|
|
26
|
+
const at = argv.indexOf(name);
|
|
27
|
+
return at === -1 ? undefined : argv[at + 1];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function music(argv: string[]): Promise<number> {
|
|
31
|
+
const [sub = "list", arg] = argv;
|
|
32
|
+
const json = argv.includes("--json");
|
|
33
|
+
try {
|
|
34
|
+
if (sub === "help" || argv.includes("--help")) {
|
|
35
|
+
console.log(MUSIC_USAGE);
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
if (sub === "list") {
|
|
39
|
+
const mine = await purchases();
|
|
40
|
+
if (json) { console.log(JSON.stringify(mine, null, 2)); return 0; }
|
|
41
|
+
if (mine.purchases.length === 0) { console.log(`Nothing bought yet for ${mine.email}. Every AI label song is for sale: ${PRICE_WORDS}.`); return 0; }
|
|
42
|
+
for (const one of mine.purchases) console.log(`${one.id} ${one.kind.padEnd(6)} ${one.title} · ${one.artistName} ${new Date(one.paidAt).toISOString().slice(0, 10)}\n ${one.zip ?? "(not paid yet)"}`);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
if (sub === "catalog" || sub === "catalogue") {
|
|
46
|
+
const view = await catalogue(arg && !arg.startsWith("--") ? arg : undefined);
|
|
47
|
+
if (json) { console.log(JSON.stringify(view, null, 2)); return 0; }
|
|
48
|
+
for (const genre of view.genres) {
|
|
49
|
+
console.log(`\n${genre.genre}${genre.station ? ` (live: /watch/${genre.station})` : ""}`);
|
|
50
|
+
for (const artist of genre.artists) {
|
|
51
|
+
console.log(` ${artist.name} [${artist.key}]`);
|
|
52
|
+
for (const album of artist.albums) console.log(` ${album.year} ${album.title} [${album.key}] ${album.songs.length} songs${album.complete ? "" : " (recording)"}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
console.log(`\n℗ ${view.holder}. ${PRICE_WORDS}: nixamp music buy --server ${view.server ?? "URL"} --kind album --artist KEY --album KEY`);
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
if (sub === "buy") {
|
|
59
|
+
const fromLink = arg && !arg.startsWith("--") ? fromBuyLink(arg) : null;
|
|
60
|
+
if (arg && !arg.startsWith("--") && !fromLink) { console.error("nixamp music buy: that is not a nixamp.com/buy link"); return 2; }
|
|
61
|
+
const input: Record<string, unknown> = {
|
|
62
|
+
...(fromLink ?? { server: flag(argv, "--server"), kind: flag(argv, "--kind"), artist: flag(argv, "--artist"), album: flag(argv, "--album"), n: flag(argv, "--n") ? Number(flag(argv, "--n")) : undefined }),
|
|
63
|
+
coin: flag(argv, "--coin") ?? "USDC_POL",
|
|
64
|
+
...(flag(argv, "--email") ? { email: flag(argv, "--email") } : {}),
|
|
65
|
+
};
|
|
66
|
+
if (typeof input["n"] === "string") input["n"] = Number(input["n"]);
|
|
67
|
+
const made = await buy(input);
|
|
68
|
+
if (json) { console.log(JSON.stringify(made, null, 2)); return 0; }
|
|
69
|
+
console.log(`Pay here: ${made.url}\nYour receipt and download, once paid: ${made.receipt}`);
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
if (sub === "download") {
|
|
73
|
+
if (!arg) { console.error("nixamp music download needs a purchase id (nixamp music) or all"); return 2; }
|
|
74
|
+
const mine = await purchases();
|
|
75
|
+
const chosen = arg === "all" ? mine.purchases : mine.purchases.filter((one) => one.id === arg);
|
|
76
|
+
if (chosen.length === 0) { console.error(`nixamp music: no purchase ${arg}`); return 1; }
|
|
77
|
+
for (const one of chosen) console.log(`saved ${await download(one, flag(argv, "--out") ?? ".")}`);
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
console.error(`nixamp music: no command "${sub}".\n\n${MUSIC_USAGE}`);
|
|
81
|
+
return 2;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error(`nixamp music: ${(error as Error).message}`);
|
|
84
|
+
return 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The AI label's catalogue and the music store, for the terminal and MCP.
|
|
3
|
+
*
|
|
4
|
+
* The catalogue is read from the server that holds the music (live.streaming
|
|
5
|
+
* by default); buying and what was bought are nixamp.com's (music-store.ts),
|
|
6
|
+
* with this machine's sign-in when there is one.
|
|
7
|
+
*/
|
|
8
|
+
import { createWriteStream, mkdirSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { Readable } from "node:stream";
|
|
11
|
+
import { pipeline } from "node:stream/promises";
|
|
12
|
+
import { readSession } from "./session.ts";
|
|
13
|
+
|
|
14
|
+
export const DEFAULT_CATALOGUE = "https://live.streaming.pit.world";
|
|
15
|
+
|
|
16
|
+
export interface CatalogueSong { n: number; title: string; seconds: number; lyrics?: string }
|
|
17
|
+
export interface CatalogueAlbum { key: string; title: string; year: number; concept: string; cover: boolean; complete: boolean; songs: CatalogueSong[] }
|
|
18
|
+
export interface CatalogueArtist { key: string; name: string; genre: string; bio: string; albums: CatalogueAlbum[] }
|
|
19
|
+
export interface Catalogue { holder: string; server?: string; genres: Array<{ genre: string; station: string; artists: CatalogueArtist[] }> }
|
|
20
|
+
|
|
21
|
+
export interface Bought {
|
|
22
|
+
id: string; kind: "song" | "album" | "artist"; title: string; artistName: string; server: string;
|
|
23
|
+
status: string; paidAt: number; amountUsd: number; zip?: string; link?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type Fetcher = typeof fetch;
|
|
27
|
+
|
|
28
|
+
function site(): string {
|
|
29
|
+
return (readSession()?.site ?? process.env["NIXAMP_SITE"] ?? "https://nixamp.com").replace(/\/+$/, "");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function auth(): Record<string, string> {
|
|
33
|
+
const token = readSession()?.token;
|
|
34
|
+
return token ? { authorization: `Bearer ${token}` } : {};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function catalogue(server = DEFAULT_CATALOGUE, fetcher: Fetcher = fetch): Promise<Catalogue> {
|
|
38
|
+
const response = await fetcher(`${server.replace(/\/+$/, "")}/api/v1/label`, { signal: AbortSignal.timeout(15_000) });
|
|
39
|
+
if (!response.ok) throw new Error(`${server} has no AI label catalogue (HTTP ${response.status})`);
|
|
40
|
+
return await response.json() as Catalogue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A /buy link read back into what it sells. */
|
|
44
|
+
export function fromBuyLink(link: string): Record<string, string> | null {
|
|
45
|
+
try {
|
|
46
|
+
const url = new URL(link);
|
|
47
|
+
if (url.pathname !== "/buy") return null;
|
|
48
|
+
return Object.fromEntries(url.searchParams.entries());
|
|
49
|
+
} catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function buy(input: Record<string, unknown>, fetcher: Fetcher = fetch): Promise<{ url: string; id: string; token: string; receipt: string }> {
|
|
55
|
+
const response = await fetcher(`${site()}/api/v1/store/checkout`, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: { "content-type": "application/json", ...auth() },
|
|
58
|
+
body: JSON.stringify(input),
|
|
59
|
+
});
|
|
60
|
+
const body = await response.json().catch(() => ({})) as { url?: string; id?: string; token?: string; error?: string };
|
|
61
|
+
if (!response.ok || !body.url) throw new Error(body.error ?? `nixamp.com answered ${response.status}`);
|
|
62
|
+
return { url: body.url, id: body.id ?? "", token: body.token ?? "", receipt: `${site()}/purchases/${body.id}?t=${body.token}` };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function purchases(fetcher: Fetcher = fetch): Promise<{ email: string; purchases: Bought[] }> {
|
|
66
|
+
if (!readSession()) throw new Error("not signed in: run `nixamp login` (with the email you bought with)");
|
|
67
|
+
const response = await fetcher(`${site()}/api/v1/store/purchases`, { headers: auth() });
|
|
68
|
+
const body = await response.json().catch(() => ({})) as { email?: string; purchases?: Bought[]; error?: string };
|
|
69
|
+
if (!response.ok) throw new Error(body.error ?? `nixamp.com answered ${response.status}`);
|
|
70
|
+
return { email: body.email ?? "", purchases: body.purchases ?? [] };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A purchase's zip, saved under `dir` with the name its server gives it. */
|
|
74
|
+
export async function download(one: Bought, dir: string, fetcher: Fetcher = fetch): Promise<string> {
|
|
75
|
+
if (!one.zip) throw new Error(`"${one.title}" is not paid yet`);
|
|
76
|
+
const response = await fetcher(one.zip);
|
|
77
|
+
if (!response.ok || !response.body) throw new Error(`the download of "${one.title}" answered HTTP ${response.status}`);
|
|
78
|
+
const named = /filename\*=UTF-8''([^;]+)/.exec(response.headers.get("content-disposition") ?? "")?.[1];
|
|
79
|
+
const name = (named ? decodeURIComponent(named) : `${one.artistName} - ${one.title}.zip`).replace(/[/\\]/g, "");
|
|
80
|
+
mkdirSync(dir, { recursive: true });
|
|
81
|
+
const path = join(dir, name);
|
|
82
|
+
await pipeline(Readable.fromWeb(response.body as import("node:stream/web").ReadableStream), createWriteStream(path));
|
|
83
|
+
return path;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export const PRICE_WORDS = "a song 10¢, an album $1, everything by an artist $2";
|
package/src/station-cli.ts
CHANGED
|
@@ -440,7 +440,9 @@ async function labelCommand(argv: string[], call: Call, show: Show): Promise<num
|
|
|
440
440
|
`files ${String(body["root"])}/<genre>/<artist>/<year>-<album>/`,
|
|
441
441
|
`composer ${String(body["composer"] ?? "none")}; words by ${String(body["writer"] ?? "nobody (no model key)")}`,
|
|
442
442
|
`this month ${String(body["secondsThisMonth"])} of ${Number(settings["monthlySeconds"]) === 0 ? "unlimited" : String(settings["monthlySeconds"])} s${body["busy"] ? `; recording ${String(body["busy"])}` : ""}`,
|
|
443
|
-
`albums ${String(settings["songsPerAlbum"])} songs of ${String(settings["songSeconds"])} s; ${String(settings["seedAlbums"])} to start, then one every ${String(settings["everyDays"])} days`,
|
|
443
|
+
`albums ${String(settings["songsPerAlbum"])} songs of ${String(settings["songSeconds"])} s; ${String(settings["seedAlbums"])} to start, then one every ${String(settings["everyDays"])} days; ${String(settings["parallel"] ?? 1)} at a time`,
|
|
444
|
+
`genres ${((settings["genreOrder"] as string[] | undefined) ?? []).join(", ")} first`,
|
|
445
|
+
`after that ${Number(settings["albumsPerDay"] ?? 0) > 0 ? `${String(settings["albumsPerDay"])} album a day, a new artist ${Math.round(Number(settings["newArtistChance"] ?? 0) * 100)}% of the time` : `one per artist every ${String(settings["everyDays"])} days`}`,
|
|
444
446
|
...(body["waiting"] ? [`waiting ${String(body["waiting"])}`] : []),
|
|
445
447
|
"",
|
|
446
448
|
...(artists.length ? artists.map(describe) : ["Nobody signed yet. nixamp station label sign --roster"]),
|
|
@@ -496,6 +498,11 @@ async function labelCommand(argv: string[], call: Call, show: Show): Promise<num
|
|
|
496
498
|
seedAlbums: number("--seed-albums"),
|
|
497
499
|
songsPerAlbum: number("--songs"),
|
|
498
500
|
songSeconds: number("--seconds"),
|
|
501
|
+
parallel: number("--parallel"),
|
|
502
|
+
albumsPerDay: number("--per-day"),
|
|
503
|
+
videos: has(argv, "--no-videos") ? false : has(argv, "--videos") ? true : undefined,
|
|
504
|
+
newArtistChance: number("--new-artists"),
|
|
505
|
+
genreOrder: flag(argv, "--genres"),
|
|
499
506
|
enabled: has(argv, "--off") ? false : has(argv, "--on") ? true : undefined,
|
|
500
507
|
publish: has(argv, "--unlisted") ? false : has(argv, "--public") ? true : undefined,
|
|
501
508
|
}).filter(([, value]) => value !== undefined));
|
package/src/station-mcp.ts
CHANGED
|
@@ -120,7 +120,10 @@ export const STATION_TOOLS = [
|
|
|
120
120
|
sound: { ...STRING, description: "The music in words: instruments, tempo, mood. Name no real artist." },
|
|
121
121
|
voice: STRING, bio: STRING, themes: STRING, enabled: { type: "boolean" }, publish: { type: "boolean" }, holder: STRING,
|
|
122
122
|
monthlySeconds: { type: "integer" }, everyDays: { type: "integer" }, seedAlbums: { type: "integer" },
|
|
123
|
-
songsPerAlbum: { type: "integer" }, songSeconds: { type: "integer" },
|
|
123
|
+
songsPerAlbum: { type: "integer" }, songSeconds: { type: "integer" }, parallel: { type: "integer" },
|
|
124
|
+
albumsPerDay: { type: "integer", description: "After the first sweep: new albums a day, by a random artist or a newly invented one." },
|
|
125
|
+
newArtistChance: { type: "number", description: "0-1: how often the day's album is by a new artist." },
|
|
126
|
+
genreOrder: { type: "array", items: STRING, description: "Genres whose artists get albums first, in order." },
|
|
124
127
|
},
|
|
125
128
|
},
|
|
126
129
|
},
|
|
@@ -250,7 +253,7 @@ export async function callStationTool(name: string, args: Record<string, unknown
|
|
|
250
253
|
const key = typeof args["key"] === "string" && /^[a-f0-9]{10}$/.test(args["key"]) ? args["key"] : "";
|
|
251
254
|
const answer = action === "status" ? await call("GET", "/api/v1/stations/label")
|
|
252
255
|
: action === "sign" ? await call("POST", "/api/v1/stations/label/artists", pick(["preset", "roster", "name", "genre", "sound", "voice", "bio", "themes", "enabled"]))
|
|
253
|
-
: action === "configure" ? await call("POST", "/api/v1/stations/label", pick(["holder", "monthlySeconds", "everyDays", "seedAlbums", "songsPerAlbum", "songSeconds", "enabled", "publish"]))
|
|
256
|
+
: action === "configure" ? await call("POST", "/api/v1/stations/label", pick(["holder", "monthlySeconds", "everyDays", "seedAlbums", "songsPerAlbum", "songSeconds", "parallel", "genreOrder", "albumsPerDay", "newArtistChance", "enabled", "publish"]))
|
|
254
257
|
: action === "run" ? await call("POST", "/api/v1/stations/label/run", {})
|
|
255
258
|
: action === "resume" ? await call("POST", "/api/v1/stations/label", { resume: true })
|
|
256
259
|
: !key ? null
|
package/src/station-usage.ts
CHANGED
|
@@ -46,6 +46,9 @@ export const USAGE = `nixamp station — make a collection into a station
|
|
|
46
46
|
nixamp station label drop KEY [--files]
|
|
47
47
|
nixamp station label config [--holder "Profullstack, Inc."] [--budget SECONDS] [--every-days 30] [--seed-albums 1]
|
|
48
48
|
[--songs 8] [--seconds 150] [--on|--off] [--public|--unlisted]
|
|
49
|
+
[--parallel 4] [--genres "Punk,Blues,Country"] songs made at once; genres first
|
|
50
|
+
[--per-day 1] [--new-artists 0.25] after the first sweep: albums a day, share by new artists
|
|
51
|
+
[--videos|--no-videos] a music video per song and a TV station of them
|
|
49
52
|
nixamp station label run record whatever is due now
|
|
50
53
|
nixamp station label resume after the provider ran out of credit
|
|
51
54
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./main-
|
|
1
|
+
import{t as e}from"./main-DaqdNlZC.js";var t={...e,"No parties live right now.":`لا توجد جلسات مباشرة الآن.`,"Could not refresh parties.":`تعذر تحديث الجلسات.`,"Pick a server in the directory, or paste its link here.":`اختر خادمًا من الدليل أو الصق رابطه هنا.`,"Interface language":`لغة الواجهة`,Language:`اللغة`,"Translation language":`لغة الترجمة`,"Original (auto-detect)":`الأصل (اكتشاف تلقائي)`,Play:`تشغيل`,Pause:`إيقاف مؤقت`,Stop:`إيقاف`,Next:`التالي`,Previous:`السابق`,Select:`اختيار`,"Next/Prev":`التالي/السابق`,Quit:`خروج`,"Now Playing":`قيد التشغيل`,"Spectrum Analyser":`محلل الطيف`,Playlist:`قائمة التشغيل`,Files:`الملفات`,"Open files":`فتح ملفات`,"Open folder":`فتح مجلد`,"Add to library":`إضافة إلى المكتبة`,"Replace playlist":`استبدال قائمة التشغيل`,Filter:`تصفية`,Search:`بحث`,"Nothing loaded.":`لم يُحمّل أي محتوى.`,"Empty.":`فارغ.`,"Loading…":`جارٍ التحميل…`,"Connecting…":`جارٍ الاتصال…`,Connected:`متصل`,"Not connected":`غير متصل`,"No source":`لا يوجد مصدر`,Playing:`يعمل`,Stopped:`متوقف`,Volume:`مستوى الصوت`,Seek:`موضع التشغيل`,"Full screen":`ملء الشاشة`,Download:`تنزيل`,Share:`مشاركة`,Copy:`نسخ`,"Copy link":`نسخ الرابط`,Copied:`تم النسخ`,Save:`حفظ`,Cancel:`إلغاء`,Close:`إغلاق`,Remove:`إزالة`,Delete:`حذف`,Edit:`تعديل`,Add:`إضافة`,Send:`إرسال`,Retry:`إعادة المحاولة`,Back:`رجوع`,"Next page":`الصفحة التالية`,"Previous page":`الصفحة السابقة`,"Show more":`عرض المزيد`,Panels:`اللوحات`,"Reset layout":`إعادة ضبط التخطيط`,Show:`إظهار`,Hide:`إخفاء`,Collapse:`طي`,Expand:`توسيع`,"Move up":`نقل لأعلى`,"Move down":`نقل لأسفل`,Install:`تثبيت`,"TV mode":`وضع التلفاز`,On:`مفعّل`,Off:`معطّل`,Account:`الحساب`,"Sign in":`تسجيل الدخول`,"Sign out":`تسجيل الخروج`,"Create account":`إنشاء حساب`,Email:`البريد الإلكتروني`,Password:`كلمة المرور`,"Forgot password?":`نسيت كلمة المرور؟`,"Welcome back":`مرحبًا بعودتك`,Profile:`الملف الشخصي`,Handle:`اسم المستخدم`,"Your servers":`خوادمك`,Server:`الخادم`,Connect:`اتصال`,Disconnect:`قطع الاتصال`,Directory:`الدليل`,Favourites:`المفضلة`,Follow:`متابعة`,Unfollow:`إلغاء المتابعة`,Notifications:`الإشعارات`,"Phone number":`رقم الهاتف`,"Save number":`حفظ الرقم`,Transcript:`النص المفرغ`,Captions:`الترجمة النصية`,"Translate audio":`ترجمة الصوت`,"Audio language":`لغة الصوت`,"Audio options":`خيارات الصوت`,"Keep background sound":`الاحتفاظ بأصوات الخلفية`,"Background level":`مستوى صوت الخلفية`,"Speaker voices":`أصوات المتحدثين`,"Any voice":`أي صوت`,"Male voice":`صوت رجالي`,"Female voice":`صوت نسائي`,"Original audio.":`الصوت الأصلي.`,"Buy translated audio":`شراء الصوت المترجم`,"Audio credit":`رصيد الصوت`,"Buy pass":`شراء تصريح`,Pass:`تصريح`,"Pay with":`الدفع باستخدام`,"Check payment":`التحقق من الدفع`,"Open checkout":`الانتقال للدفع`,"Free sessions":`جلسات مجانية`,"Usage rates and expiry":`الأسعار ومدة الصلاحية`,Catalogs:`الكتالوجات`,"Add catalog":`إضافة كتالوج`,"Catalog name":`اسم الكتالوج`,Link:`الرابط`,"Play link":`تشغيل الرابط`,"Go live":`بدء بث مباشر`,Publish:`نشر`,Listen:`استماع`,"Live now":`مباشر الآن`,Upcoming:`قريبًا`,Parties:`حفلات المشاهدة`,"Join party":`الانضمام للحفلة`,"Invite code":`رمز الدعوة`,Invite:`دعوة`,Chat:`الدردشة`,"Chat message":`رسالة دردشة`,People:`الأشخاص`,Speaker:`متحدث`,Speakers:`المتحدثون`,Listener:`مستمع`,Moderator:`مشرف`,"Raise hand":`رفع اليد`,"Hand raises":`الأيدي المرفوعة`,Questions:`الأسئلة`,Resources:`الموارد`,Replay:`إعادة العرض`,Schedule:`الجدول`,Event:`الفعالية`,Host:`المضيف`,About:`حول`,Stage:`المنصة`,Title:`العنوان`,Description:`الوصف`,Topic:`الموضوع`,Public:`عام`,"Anyone with the link":`أي شخص لديه الرابط`,"Invited people":`الأشخاص المدعوون`,"Who can join":`من يمكنه الانضمام`,"Date and time":`التاريخ والوقت`,"Expected length":`المدة المتوقعة`,Repeat:`تكرار`,"Does not repeat":`لا يتكرر`,"Every day":`كل يوم`,"Every week":`كل أسبوع`,Homepage:`الموقع الإلكتروني`,"Host name":`اسم المضيف`,"Profile photo URL":`رابط صورة الملف الشخصي`,"Broadcast link":`رابط البث`,"Edit event":`تعديل الفعالية`,"Save changes":`حفظ التغييرات`,"Create live":`إنشاء بث مباشر`,"Schedule class":`جدولة درس`,"Start class":`بدء الدرس`,"End event":`إنهاء الفعالية`,"End session":`إنهاء الجلسة`,"Session ended":`انتهت الجلسة`,"Event ended":`انتهت الفعالية`,Cancelled:`ملغاة`,"Replay available":`إعادة العرض متاحة`,Join:`انضمام`,"Create invite":`إنشاء دعوة`,"Invite as":`الدعوة بصفة`,"Watch now":`شاهد الآن`,"Start a room":`إنشاء غرفة`,"Recent replays":`إعادات العرض الأخيرة`,"Your account":`حسابك`,"Write with AI":`الكتابة بالذكاء الاصطناعي`,"Suggested title":`العنوان المقترح`,"Suggested description":`الوصف المقترح`,"Suggested topic":`الموضوع المقترح`,"Use these details":`استخدام هذه التفاصيل`,"Learn something live.":`تعلّم شيئًا مباشرة.`,"Screen share":`مشاركة الشاشة`,"Upload and broadcast":`رفع وبث`,Help:`مساعدة`,"Reload Player":`إعادة تحميل المشغل`,"Copy Bundled CLI Path":`نسخ مسار أداة سطر الأوامر المضمنة`,"Developer tools":`أدوات المطور`,Undo:`تراجع`,Redo:`إعادة`,Cut:`قص`,Paste:`لصق`,"Select all":`تحديد الكل`,Status:`الحالة`,"Activity log":`سجل النشاط`,Admin:`الإدارة`,"Playback controls":`عناصر التحكم بالتشغيل`,"Tracks and folders":`المقاطع والمجلدات`,"Original-language captions.":`ترجمة نصية باللغة الأصلية.`,"Skip to playback controls":`الانتقال إلى عناصر التحكم بالتشغيل`,"Skip to playlist":`الانتقال إلى قائمة التشغيل`,"Skip to transcript and translated audio":`الانتقال إلى النص المفرغ والصوت المترجم`};export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg:#080c09;--panel:#0c120e;--edge:#1d2c22;--green:#4af689;--green-dim:#55a97b;--fg:#cfe8d8;--muted:#819d8c;--warn:#e8c35a;--accent:#7ef0c4;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}input:not([type=range]):not([type=file]),select,textarea{min-height:28px}input[type=checkbox],input[type=radio]{vertical-align:middle;min-width:24px;min-height:24px}[hidden]{display:none!important}html,body{background:var(--bg);min-height:100%;color:var(--fg);margin:0;font:14px/1.45 ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}body{background-image:repeating-linear-gradient(#4af68906 0 1px,#0000 1px 3px)}#app{max-width:1100px;padding:calc(12px + env(safe-area-inset-top)) calc(12px + env(safe-area-inset-right)) calc(16px + env(safe-area-inset-bottom)) calc(12px + env(safe-area-inset-left));flex-direction:column;gap:10px;margin:0 auto;display:flex}.adnet{width:100%;display:block}.adnet[hidden]{display:none}.adnet:not([data-cp-filled]){height:0;overflow:hidden}.adnet[data-cp-filled][data-format=text_link]{min-height:40px;margin:8px 0}.welcome-title{color:var(--green);margin:4px 0 8px;font-size:22px;font-weight:600;line-height:1.25}.welcome-lead{max-width:70ch;color:var(--fg);margin:0 0 14px}.welcome-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:14px;display:grid}.welcome-grid h2{letter-spacing:.06em;text-transform:uppercase;color:var(--green-dim);margin:0 0 4px;font-size:13px}.welcome-grid p{color:var(--muted);margin:0;font-size:13px}.welcome-grid code,.welcome-install{color:var(--accent)}.welcome-actions{gap:10px}.welcome-install{border:1px dashed var(--edge);overflow-wrap:anywhere;border-radius:4px;padding:6px 10px;font-size:12px}.welcome .button.primary{color:var(--green);border-color:var(--green-dim)}@media (max-width:720px){.welcome-grid{grid-template-columns:1fr}.welcome-title{font-size:19px}}.bar{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.brand{color:var(--green);letter-spacing:.14em;align-items:center;gap:6px;font-weight:700;display:inline-flex}.brand-mark{flex:none;width:1.15em;height:1.15em}.status{color:var(--muted)}.ghost-link{color:var(--fg);border:1px solid var(--edge);border-radius:4px;padding:1px 8px;text-decoration:none}.ghost-link:hover,.ghost-link:focus-visible{border-color:var(--green-dim);color:var(--green)}.status[data-playing=true]{color:var(--green)}.status[data-playing=loading]{color:var(--accent)}.status[data-playing=loading]:before,.row.loading>.name:after{content:"";vertical-align:-.1em;border:2px solid;border-right-color:#0000;border-radius:50%;width:.8em;height:.8em;animation:.8s linear infinite turn;display:inline-block}.status[data-playing=loading]:before{margin-right:6px}.row.loading>.name:after{color:var(--accent);margin-left:8px}@keyframes turn{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.status[data-playing=loading]:before,.row.loading>.name:after{animation-duration:2.4s}}.chip{color:var(--muted);border:1px solid var(--edge);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;max-width:46vw;margin-left:auto;padding:1px 10px;font-size:12px;overflow:hidden}.panel{background:linear-gradient(var(--panel), var(--panel)) 0 9px / 100% calc(100% - 9px) no-repeat;min-width:0;padding:22px 12px 12px;position:relative}.panel:after{content:"";border:1px solid var(--edge);pointer-events:none;border-radius:6px;position:absolute;inset:9px 0 0}.panel:before{content:none}.panel-loading-spinner{vertical-align:-1px;border:2px solid var(--edge);border-top-color:var(--accent);border-radius:50%;flex:none;width:10px;height:10px;margin-left:8px;animation:.7s linear infinite delete-spin;display:none}.panel[data-loading=true]>.panel-heading .panel-loading-spinner{display:inline-block}.panel:has([aria-busy=true])>.panel-heading .panel-loading-spinner{display:inline-block}.panel-heading-text{text-overflow:ellipsis;min-width:0;overflow:hidden}.panel>.panel-heading{white-space:nowrap;text-overflow:ellipsis;background:var(--panel);max-width:calc(100% - 108px);color:var(--green-dim);letter-spacing:.06em;z-index:1;align-items:center;margin:0;padding:0 6px;font-size:12px;font-weight:400;line-height:18px;display:flex;position:absolute;top:0;left:10px;overflow:hidden}.panel-tools{background:var(--panel);z-index:1;align-items:center;gap:2px;height:18px;padding:0 4px;display:flex;position:absolute;top:0;right:8px}.panel-tools button{font:inherit;border:1px solid var(--edge);height:16px;color:var(--muted);cursor:pointer;background:#121a15;border-radius:3px;padding:0 5px;font-size:11px;line-height:1}.panel-tools button:hover{color:var(--fg);border-color:var(--green-dim)}.panel-tools .grip{cursor:grab}.panel[data-collapsed]{padding:18px 12px 0}.panel[data-collapsed]>:not(.panel-tools):not(.panel-heading),.panel[data-closed]{display:none!important}.panel.dragging{opacity:.45}.panel.drop-before{box-shadow:0 -4px 0 0 var(--accent)}.panel.drop-after{box-shadow:0 4px 0 0 var(--accent)}.link-note{color:var(--warn);margin:6px 0 0}.log-list{max-height:220px;margin:0;padding:0;font-size:12px;list-style:none;overflow-y:auto}.log-list li{border-bottom:1px dotted var(--edge);align-items:baseline;gap:8px;padding:2px 0;display:flex}.log-list time{color:var(--muted);flex:none}.log-list span{overflow-wrap:anywhere;min-width:0}.trollbox-list{max-height:320px;margin:0 0 8px;padding:0;font-size:13px;list-style:none;overflow-y:auto}.trollbox-list li{border-bottom:1px dotted var(--edge);align-items:baseline;gap:6px;padding:2px 0;display:flex}.trollbox-list .when{color:var(--muted);flex:none;font-size:11px}.trollbox-list .who{color:var(--accent);flex:none}.trollbox-list .who:after{content:":"}.trollbox-list .line{overflow-wrap:anywhere;flex:auto;min-width:0}.button.mic{min-width:44px}.button.mic[aria-pressed=true]{color:#ff6b6b;border-color:#ff6b6b;animation:1.2s ease-in-out infinite listening}.button.mic[disabled]{opacity:.6}@keyframes listening{50%{opacity:.55}}.transcript-list{max-height:320px;margin:0;padding:0;font-size:13px;list-style:none;overflow-y:auto}.transcript-list li{border-bottom:1px dotted var(--edge);align-items:baseline;gap:6px;padding:2px 0;display:flex}.transcript-list .when{color:var(--muted);flex:none;font-size:11px}.transcript-list .line{overflow-wrap:anywhere;flex:auto;min-width:0}.transcript-list li.now .line{color:var(--accent)}.transcript-switch{color:var(--muted);align-items:center;gap:6px;margin:0 0 6px;font-size:12px;display:inline-flex}.transcript-switch+.transcript-switch{margin-left:12px}.transcript-language{font:inherit;color:var(--fg);background:var(--panel);border:1px solid var(--edge);border-radius:3px;max-width:12em;padding:1px 4px;font-size:12px}select option,select optgroup{color:var(--fg);background:var(--panel)}.transcript-list .lang{color:var(--muted);flex:none;font-size:11px}.transcript-actions{flex-wrap:wrap;gap:6px;margin:4px 0 10px;display:flex}.transcript-audio{border-top:1px solid var(--edge);padding-top:8px}.transcript-audio select,#transcript-speakers select{max-width:min(18em,100%);font:inherit;color:var(--fg);background:var(--panel);border:1px solid var(--edge);border-radius:3px;padding:3px}.transcript-audio .transcript-switch,#transcript-speakers .transcript-switch{flex-wrap:wrap;max-width:100%;margin-left:0;margin-right:10px}#transcript-speakers{max-height:150px;overflow:auto}.subtitle{z-index:2;pointer-events:none;text-align:center;color:#fff;text-shadow:0 1px 2px #000;background:#000000a8;border-radius:4px;padding:4px 10px;font-size:clamp(14px,2.4vw,22px);line-height:1.3;position:absolute;left:12px;right:12px}body.tv .subtitle{font-size:28px}.panels-list li{align-items:center;gap:8px;padding:3px 0;display:flex}.panels-list li label{cursor:pointer;flex:auto;align-items:center;gap:8px;display:flex}.panels-list li .name{flex:auto}.panels-list li.off .name{color:var(--muted)}.panels-list li .detail{color:var(--muted);white-space:nowrap;font-size:12px}#panels-panel{z-index:20;border:1px solid var(--edge);background:var(--panel);width:min(42rem,100vw - 24px);max-height:none;color:var(--fg);margin:0;position:fixed;inset:4rem auto auto 50%;overflow:visible;transform:translate(-50%);box-shadow:0 8px 30px #0006}#panels-panel::backdrop{background:0 0}.party-groups,.party-rows{margin:0;padding:0;list-style:none}.party-groups{overflow-anchor:none;scrollbar-gutter:stable;max-block-size:14rem;overflow-y:auto}.party-server+.party-server{margin-block-start:8px}.party-server h3{color:var(--muted);overflow-wrap:anywhere;margin:0 0 3px;font-size:12px;font-weight:600}.party-row{grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:6px;min-block-size:28px;font-size:12px;display:grid}.party-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.party-name .name{text-overflow:ellipsis;overflow:hidden}.party-row>button,.party-row>a,.party-actions summary{min-block-size:24px;font:inherit;padding:3px 6px;line-height:1.3}.party-actions summary{cursor:pointer;text-align:center;border:1px solid var(--edge);border-radius:3px;min-inline-size:24px;list-style:none}.party-actions summary::-webkit-details-marker{display:none}.party-actions[open]{grid-column:1/-1;justify-self:end;display:flex}.party-actions .onair-actions{flex-wrap:wrap;margin-block:4px}.party-row.removing,.group.removing{opacity:0;pointer-events:none;transition:opacity .24s,transform .24s;transform:translateY(-3px)}.delete-spinner{border:2px solid var(--edge);border-top-color:var(--accent);vertical-align:middle;border-radius:50%;block-size:1em;inline-size:1em;margin-inline-start:4px;animation:.7s linear infinite delete-spin;display:inline-block}@keyframes delete-spin{to{transform:rotate(360deg)}}.party-invite{margin-block-start:6px;font-size:12px}.party-invite summary{cursor:pointer;min-block-size:24px}.party-invite .picker{margin-block:4px 0}.split{columns:2;column-gap:10px}.split>*{break-inside:avoid;width:100%;margin-bottom:14px;display:block}@supports (display:grid-lanes){.split{display:grid-lanes;columns:auto;grid-template-columns:1.3fr 1fr;gap:14px 10px}.split>*{margin-bottom:0}.split>.col-a{grid-column:1}.split>.col-b{grid-column:2}}.directory-list li.onair{border-bottom:1px solid var(--edge);flex-direction:column;align-items:stretch;gap:6px;padding:6px 0}.directory-list li.onair:last-child{border-bottom:0}.directory-list li.onair>.recent-label{flex:none}.directory-list li.onair .detail{white-space:normal;overflow-wrap:anywhere}.onair-actions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.icon{border:1px solid var(--edge);min-width:2.2em;height:2.2em;color:var(--muted);cursor:pointer;background:0 0;border-radius:3px;flex:none;padding:0 6px;font-size:1em;line-height:1}.icon:hover{color:var(--accent);border-color:var(--accent)}.directory-list li>.button:disabled,.directory-list li>.way-in:disabled{opacity:.4;cursor:not-allowed}.directory-list li>.way-in:disabled:hover{color:var(--muted);border-color:var(--edge)}.directory-list li>.way-in{color:var(--fg);flex:none;align-self:center;padding:0 8px}.directory-list li>.way-in svg{width:18px;height:18px}.heart{color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:3px;padding:2px 6px;font-size:1.1em;line-height:1}.heart:hover{color:var(--accent);border-color:var(--accent)}.heart[data-on=yes]{color:var(--accent)}.directory-list li>span.server-label{flex-direction:column;flex:1 1 0;gap:2px;min-width:0;padding:4px 2px;display:flex}.directory-list li>.server-label .name{font-weight:600}.directory-list li>.server-label .detail{color:var(--muted);white-space:nowrap}.directory-list li>.server-label .live{color:var(--green)}@media (max-width:720px){.split{columns:1}@supports (display:grid-lanes){.split{grid-template-columns:1fr}.split>.col-a,.split>.col-b{grid-column:auto}}}.track-title{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;font-weight:700;overflow:hidden}.track-sub{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.track-title.with-context,.track-sub.with-context{white-space:normal;overflow-wrap:anywhere}.track-live{color:var(--muted);overflow-wrap:anywhere;margin-top:6px;line-height:1.5}.track-live b{color:var(--green);font-weight:700}.track-meta{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;margin-bottom:4px;display:flex}.meta-chip{color:var(--muted);border:1px solid var(--edge);letter-spacing:.04em;text-overflow:ellipsis;white-space:nowrap;border-radius:999px;max-width:100%;padding:0 8px;font-size:11px;line-height:1.7;overflow:hidden}.meta-chip-clock{font-variant-numeric:tabular-nums;text-align:start;min-inline-size:7.5ch}.meta-chip:first-of-type{color:var(--green);border-color:var(--green-dim)}.meta-logo{object-fit:contain;background:#000;border-radius:3px;max-width:64px;height:22px}.meta-logo.meta-poster{max-width:52px;height:72px}.live-art{object-fit:cover;vertical-align:middle;background:#000;border-radius:3px;flex:0 0 28px;width:28px;height:28px;margin-right:6px}.meta-score{flex-wrap:wrap;flex-basis:100%;align-items:center;gap:6px;min-width:0;font-size:14px;line-height:1.4;display:flex}.meta-team{color:var(--fg);text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:38vw;overflow:hidden}.meta-points{font-variant-numeric:tabular-nums;font-size:16px;font-weight:700}.meta-dash{color:var(--muted);padding:0 2px}.meta-team-logo{object-fit:contain;flex:none;width:20px;height:20px}.meta-chip.chip-live{color:var(--fg);border-color:#b3261e}.meta-chip.chip-live:before{content:"";vertical-align:1px;background:#e53935;border-radius:50%;width:7px;height:7px;margin-right:5px;animation:1.4s ease-in-out infinite pulse;display:inline-block}@keyframes pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.meta-chip.chip-live:before{animation:none}}.track-blurb{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:4px 0 0;font-size:12px;line-height:1.5;display:-webkit-box;overflow:hidden}#video{border:1px solid var(--edge);background:#000;border-radius:4px;width:100%;max-height:46vh;margin-bottom:8px}.scrub{align-items:center;gap:10px;margin-top:6px;display:flex}.time{color:var(--fg);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}input[type=range]{appearance:none;cursor:pointer;background:0 0;flex:1;min-width:0;height:14px}input[type=range]::-webkit-slider-runnable-track{background:linear-gradient(var(--edge), var(--edge));border:1px solid var(--edge);border-radius:3px;height:6px}input[type=range]::-moz-range-track{background:var(--edge);border-radius:3px;height:6px}input[type=range]::-webkit-slider-thumb{appearance:none;background:var(--green);border-radius:2px;width:10px;height:16px;margin-top:-6px}input[type=range]::-moz-range-thumb{background:var(--green);border:0;border-radius:2px;width:10px;height:16px}input[type=range]:disabled{opacity:.45;cursor:default}#spectrum{border:1px solid var(--edge);background:#060a07;border-radius:4px;width:100%;height:190px;display:block}.meters{align-items:baseline;gap:10px;margin-top:6px;display:flex;overflow:hidden}.glyphs{color:var(--green);letter-spacing:1px;white-space:pre;flex:auto;min-width:0;min-height:1.4em;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow:hidden}.levelmeter{color:var(--accent);white-space:pre;font-variant-ligatures:none;text-align:right;flex:none;min-width:15ch;margin-left:auto;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace}.filter{border:1px solid var(--edge);width:100%;color:var(--fg);font:inherit;background:#0a100c;border-radius:4px;margin-bottom:6px;padding:4px 8px}.filter:focus{border-color:var(--accent);outline:none}.crumbs{color:var(--muted);flex-wrap:wrap;align-items:center;gap:4px;margin-bottom:6px;font-size:12px;display:flex}.crumbs button{font:inherit;color:var(--accent);cursor:pointer;background:0 0;border:0;padding:0 2px}.crumbs button:hover{text-decoration:underline}.crumbs .here{color:var(--fg)}.catalog-tag{color:var(--muted);letter-spacing:.06em;flex:none;font-size:11px}.catalog-live{color:var(--green)}#catalogs-entries{max-height:320px;overflow-y:auto}#catalogs-list{max-height:240px}#catalogs-list li{align-items:center}#catalogs-list .name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#catalogs-list .detail{opacity:1;color:var(--muted);font-size:11px}#catalogs-list button{min-height:24px;padding:2px 8px;font-size:12px}.folder{cursor:pointer;white-space:nowrap;color:var(--accent);border-radius:3px;gap:8px;padding:2px 6px;display:flex}.folder:hover{background:#142019}.folder .name{text-overflow:ellipsis;flex:1;overflow:hidden}.folder .count{color:var(--muted);flex:none}.playlist{scrollbar-color:var(--green-dim) transparent;max-height:214px;margin:0;padding:0;list-style:none;overflow-y:auto}.row{cursor:pointer;white-space:nowrap;border-radius:3px;align-items:flex-start;gap:8px;padding:2px 6px;display:flex}.file-row{grid-template-columns:minmax(0,1fr) auto auto auto;display:grid}.file-row>.row-main,.file-row>.n{grid-column:1}.file-row>.row-label{text-align:left;grid-column:2/-1;justify-self:stretch;align-items:flex-start}.file-row .row-file{text-align:left}.live-file-row{cursor:default;grid-template-columns:minmax(0,1fr);row-gap:0}.file-row>.row-main{padding:0}.live-file-row>.row-main{cursor:default}.file-row>.row-value{grid-column:1/-1;width:100%}.row:hover{background:#142019}.row.selected{background:#16241c}.row.selected .name{color:var(--accent)}.row.playing .name{color:var(--green)}.group{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;border-top:1px solid var(--edge);align-items:center;gap:8px;margin-top:4px;padding:6px 6px 2px;font-size:11px;display:flex}.group:first-child{border-top:0;margin-top:0}.group-name{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.group-remove{border:1px solid var(--edge);color:var(--muted);cursor:pointer;background:0 0;border-radius:3px;flex:none;padding:0 6px;line-height:1.4}.group-remove:hover{color:var(--accent);border-color:var(--accent)}.row .n{color:var(--muted);text-align:right;flex:none;width:2.4em}.row .name{text-overflow:ellipsis;flex:1;overflow:hidden}.row-label{white-space:normal;flex-direction:column;flex:1;justify-content:center;min-width:0;min-height:24px;line-height:1.2;display:flex;overflow:hidden}.row-value{min-width:0;max-width:100%;display:block;overflow:hidden}.long-string-scroller{box-sizing:border-box;padding-inline:4px}.long-string-scroller-content{transform:translateX(var(--path-shift,0));pointer-events:none;transition:transform .28s ease-out;display:block}@media (hover:hover) and (pointer:fine){.row .long-string-scroller-content{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.long-string-scroller-content[data-pan=true]{white-space:nowrap;will-change:transform;width:max-content;max-width:none;transition:none}}.row-file{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.row-path{max-width:100%;color:var(--muted);white-space:normal;overflow-wrap:anywhere;font-size:.78em;display:block}.row .time{color:var(--muted);flex:none}.row-copy{color:var(--muted);cursor:pointer;opacity:.55;background:0 0;border:1px solid #0000;border-radius:3px;flex:none;padding:0 5px;line-height:1.4}.row:hover .row-copy,.row.selected .row-copy{opacity:1}.row-copy svg,.icon svg{vertical-align:-2px;width:14px;height:14px;display:inline-block}.icon{justify-content:center;align-items:center;display:inline-flex}.row-copy:hover{color:var(--accent);border-color:var(--accent)}.transport{border:1px solid var(--edge);background:var(--panel);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;display:flex}button{font:inherit;color:var(--fg);border:1px solid var(--edge);cursor:pointer;background:#121a15;border-radius:4px;padding:6px 12px}button:hover{border-color:var(--green-dim);color:var(--green)}button:active{transform:translateY(1px)}button:focus-visible,input:focus-visible,a:focus-visible{outline:2px solid var(--green);outline-offset:2px}button.primary{color:var(--green);border-color:var(--green-dim);min-width:64px}button.ghost{color:var(--muted);background:0 0}a.ghost{color:var(--muted);padding:6px 4px;font-size:.9em;text-decoration:none}a.ghost:hover{color:var(--green);text-decoration:underline}button.share{color:var(--accent);border-color:var(--edge);letter-spacing:.04em}button.share:hover{background:#16241c}button.golive{color:#ff5c5c;letter-spacing:.06em;border-color:#7a2b2b}button.school{color:#b9a6ff;border-color:#4a3a8a}button.school:hover{color:#d9cdff;border-color:#6d5bc4}button.golive:hover{color:#fff;background:#7a2b2b;border-color:#ff5c5c}button.golive:disabled{opacity:.5;cursor:progress}.row-live:hover{color:#ff5c5c;border-color:#ff5c5c}.directory-list li:has(>.server-lives){flex-wrap:wrap}.directory-list li>.server-lives{border-left:2px solid var(--green-dim);flex-direction:column;flex:100%;gap:4px;margin:2px 0 0;padding:0 0 0 12px;list-style:none;display:flex}.server-lives li{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.server-lives li>.detail{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.server-lives li>.button{flex:none;padding:2px 10px;font-size:12px}.volume{flex:1;align-items:center;gap:8px;min-width:120px;max-width:220px;margin-left:auto;display:flex}.vol{color:var(--muted);letter-spacing:.08em;font-size:12px}.picker{flex-wrap:wrap;align-items:center;gap:8px;display:flex}#party-form label{color:var(--muted);flex-basis:100%}#party-code{flex:12ch;min-width:0}.link-form{margin-top:8px}.link-form input{flex:240px;min-width:0}.link-form select{min-width:0;font:inherit;color:inherit;background:#0b120e;border:1px solid #2a3a30;border-radius:4px;flex:0 180px;padding:6px 8px}.button{border:1px solid var(--edge);cursor:pointer;color:var(--fg);background:#121a15;border-radius:4px;padding:6px 12px;display:inline-block}.button:hover{border-color:var(--green-dim);color:var(--green)}.button:has(input[type=file]){position:relative}.button input[type=file]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.button:focus-within{outline:2px solid var(--green);outline-offset:2px}#remote-url{font:inherit;min-width:12ch;color:var(--fg);border:1px solid var(--edge);background:#060a07;border-radius:4px;flex:1;padding:6px 10px}.check{color:var(--muted);align-items:center;gap:8px;margin-top:10px;display:flex}.check input{accent-color:var(--green)}.hint{color:var(--muted);margin:0 0 8px;font-size:13px}.hint code{color:var(--accent)}#remote-state[data-status=live]{color:var(--green)}#remote-state[data-status=connecting],#remote-state[data-status=error]{color:var(--warn)}.note{color:var(--warn);border-left:2px solid var(--warn);margin:0;padding-left:8px}.statusbar{color:var(--muted);border-top:1px solid var(--edge);flex-wrap:wrap;gap:14px;padding-top:8px;font-size:12px;display:flex}.statusbar b{color:var(--green);font-weight:700}.statusbar .tv-toggle{color:var(--accent);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;text-decoration:underline}body.tv .statusbar .tv-toggle{color:var(--green)}.statusbar .spacer{flex:1}.statusbar a{color:var(--muted)}.directory{border-top:1px solid var(--line);margin-top:.6rem;padding-top:.6rem}.directory-list{max-height:12rem;margin:0;padding:0;list-style:none;overflow-y:auto}.directory-list li+li{margin-top:.3rem}.directory-list button{border:1px solid var(--line);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:4px;padding:.4rem .5rem}.directory-list button:hover,.directory-list button:focus-visible{border-color:var(--accent);background:#ffffff0a}.directory-list .name{color:var(--accent);display:block}.directory-list .detail{opacity:.7;text-overflow:ellipsis;white-space:nowrap;font-size:.85em;display:block;overflow:hidden}.publish-list{margin:.3rem 0 0;padding:0;list-style:none}.publish-list li{align-items:center;gap:8px;margin-top:.3rem;display:flex}.publish-list li.in-use .slot{color:var(--green)}.publish-list .slot{color:var(--muted);flex:none;min-width:4.5em;font-size:12px}.publish-list input{flex:auto;min-width:0}.said{color:var(--accent);margin:.3rem 0 0}.directory-list li.offline .recent-label{opacity:.55}.directory-list li.offline .detail{color:var(--warn)}.share-line{align-items:center;gap:8px;margin:.4rem 0;display:flex}.share-what{color:var(--muted);letter-spacing:.06em;text-transform:uppercase;flex:none;font-size:12px}.share-line input{flex:auto;min-width:0}#share-phone{color:var(--fg);font-size:1.05em}#share-phone b{color:var(--accent)}.admin-table{border-collapse:collapse;width:100%;min-height:5.5em;max-height:14rem;margin:.4rem 0;font-size:.85em;display:block;overflow-y:auto}.admin-table th{text-align:left;opacity:.6;padding:.2rem .4rem .2rem 0;font-weight:400}.admin-table td{white-space:nowrap;text-overflow:ellipsis;max-width:12rem;padding:.2rem .4rem .2rem 0;overflow:hidden}.admin-table td.network-public{color:var(--warning,#e0b341)}.admin-table td.network-private{color:var(--success,#7fd18b)}.admin-table tr.ended{opacity:.45}body.route-directory .player-only,body.route-party .player-only{display:none}.party-room .party-title{overflow-wrap:anywhere;margin:0 0 4px;font-size:16px}.party-room-actions{flex-wrap:wrap;gap:6px;margin-block:6px;display:flex}.party-chat{overflow-anchor:none;border:1px solid var(--edge);border-radius:3px;max-block-size:18rem;margin:8px 0;padding:6px;font-size:12px;list-style:none;overflow-y:auto}.party-chat li{overflow-wrap:anywhere;padding:2px 0}.party-chat li b{color:var(--accent);margin-inline-end:6px;font-weight:600}.party-chat .hint{margin:0}body.tv .party-chat{max-block-size:none;overflow:visible}.directory-list li{align-items:stretch;gap:.4rem;display:flex}.directory-list li>:first-child{flex:auto;min-width:0}.directory-list li>button:first-child{text-align:left;width:100%}.directory-list li>.button,.directory-list li>.ghost{white-space:nowrap;flex:none;align-items:center;display:flex}.directory-list .follow{white-space:nowrap;width:auto;color:var(--muted);flex:none;padding-inline:.6rem}.directory-list .follow[data-following=yes]{border-color:var(--accent);color:var(--accent)}.toggle{color:var(--muted);cursor:pointer;align-items:center;gap:.35rem;display:inline-flex}.toggle input{accent-color:var(--accent)}.recent-label{border:1px solid var(--line);border-radius:4px;flex:auto;min-width:0;padding:.4rem .5rem}.pager{border-top:1px solid var(--edge);justify-content:space-between;align-items:center;gap:8px;margin-top:6px;padding-top:6px;display:flex}.pager .pager-where{color:var(--muted);font-variant-numeric:tabular-nums}.pager button:disabled{opacity:.35;cursor:default}body.tv{font-size:19px}body.tv .playlist,body.tv #catalogs-entries,body.tv .directory-list,body.tv .admin-table{max-height:none;overflow-y:visible}body.tv #app{max-width:1400px}body.tv #panels-panel{width:min(80vw,58rem);max-height:none;overflow:visible}body.tv .row,body.tv .folder{border-radius:4px;padding:5px 10px}body.tv .row:focus-visible,body.tv .folder:focus-visible{outline:2px solid var(--green);outline-offset:-2px;background:#142019}body.tv button,body.tv .button,body.tv .directory-list button{min-height:2.4em;padding:8px 16px}body.tv .row-copy{min-height:0;padding:0 8px}body.tv .icon{min-width:2.4em;height:2.4em}body.tv .directory-list li+li{margin-top:.6rem}body.tv .server-lives li>.button{padding:6px 14px;font-size:.9em}body.tv input,body.tv .filter{padding:8px 10px;font-size:1em}.embed{aspect-ratio:16/9;border:1px solid var(--edge);background:#000;border-radius:4px;width:100%;max-height:46vh;margin-bottom:8px;overflow:hidden}.embed iframe{border:0;width:100%;height:100%;display:block}.way-in{color:var(--fg);padding:0 8px}.way-in svg{width:18px;height:18px}.way-in:disabled{opacity:.4;cursor:not-allowed}.way-in:disabled:hover{color:var(--muted);border-color:var(--edge)}.way-in-here{align-items:center;gap:4px;display:inline-flex}.transcript-list,.trollbox-list,.log-list{overflow-anchor:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-links a{z-index:1000;background:var(--panel);color:var(--fg);border:2px solid var(--accent);padding:12px;position:fixed;top:8px;left:8px;transform:translateY(-200%)}.skip-links a:focus{transform:none}:where(button,a,input,select,textarea,[tabindex]):focus-visible{outline:2px solid var(--accent);outline-offset:3px}.row-main{min-width:0;min-height:24px;color:inherit;text-align:left;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:0;flex:1;align-items:baseline;gap:8px;padding:2px;display:flex}.row-play-glyph{min-height:24px;color:var(--accent);flex:none;align-items:center;display:inline-flex}.row>.row-copy,.row>.row-live,.row>.golive{margin-top:2px}.row-main:focus-visible{outline-offset:-2px}.row-main .name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.row-main .row-label{align-items:flex-start}.row-copy:focus-visible,.row:focus-within .row-copy{opacity:1}.panel-tools button{min-width:24px;min-height:24px}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}@media (forced-colors:active){button,input,select,textarea,.button{border:1px solid buttontext}:focus-visible{outline:2px solid highlight!important}a{color:linktext}}.audio-translation{flex-wrap:wrap;align-items:center;gap:8px 16px;margin-top:10px;display:flex}.audio-translation .transcript-switch{margin:0}.audio-language{align-items:center;gap:8px;min-width:0;display:flex}.audio-language select{min-width:0;max-width:230px}.audio-translation>.hint{flex-basis:100%;margin:0}.audio-translation details{flex-basis:100%}.audio-translation summary{cursor:pointer;color:var(--muted);padding:4px 0}.background-level{align-items:center;gap:8px;margin-top:6px;font-size:12px;display:flex}.background-level input{flex:1;min-width:0;max-width:180px}.background-level output{min-width:4ch}#translation-purchase{color:var(--fg);background:var(--panel);border:1px solid var(--edge);border-radius:8px;width:min(480px,100vw - 32px);max-height:85vh;padding:20px;overflow:auto}#translation-purchase::backdrop{background:#000a}#streaming-publish::backdrop{background:#000a}#streaming-publish{color:var(--fg);background:var(--panel);border:1px solid var(--edge);border-radius:8px;width:min(480px,100vw - 32px);max-height:85vh;padding:20px;overflow:auto}#streaming-publish label{margin:12px 0 4px;display:block}#streaming-publish input[type=text],#streaming-publish select{width:100%}#streaming-publish p{margin:12px 0;line-height:1.5}.purchase-heading{justify-content:space-between;align-items:center;gap:16px;display:flex}.purchase-heading h2{margin:0;font-size:18px}#translation-purchase p{margin:12px 0;line-height:1.5}#translation-purchase label{margin-top:12px;display:block}#translation-purchase select{width:100%;min-height:36px;margin-top:4px}.purchase-actions{flex-wrap:wrap;align-items:center;gap:12px;margin-top:16px;display:flex}#translation-balance:empty{display:none}.purchase-terms{margin-top:16px}#transcript-panel>.panel-heading{max-width:calc(100% - 140px)}body.classroom-embed{background:#101015;margin:0;padding:0}.classroom-embed #app{width:100%;max-width:none;margin:0;padding:8px}.classroom-embed #app>:not(.classroom-player):not(#transport):not(#trollbox-panel),.classroom-embed .skip-links,.classroom-embed .classroom-player>.panel-heading,.classroom-embed .classroom-player>.panel-tools,.classroom-embed .classroom-player>.audio-translation,.classroom-embed #link-form,.classroom-embed #link-note,.classroom-embed #download-now,.classroom-embed #copy-now,.classroom-embed #go-live-now,.classroom-embed #prev,.classroom-embed #next{display:none!important}.classroom-embed .classroom-player{border:0;margin:0;padding:0}.classroom-embed #video{object-fit:contain;width:100%;max-height:calc(100dvh - 260px)}.classroom-embed #transcript-panel{margin:8px 0 0}.classroom-caption-controls{flex-wrap:wrap;align-items:center;gap:8px 16px;display:flex}.classroom-embed #transcript-list{max-height:5em;overflow:auto}.classroom-embed #transport{margin-top:8px;position:static}.classroom-embed #title-line{margin-top:8px;font-size:1rem}.classroom-embed #album-line,.classroom-embed #meta-blurb{display:none!important}.classroom-embed #trollbox-panel{margin:12px 0 0}.classroom-embed #trollbox-panel>.panel-tools{display:none}.classroom-embed #trollbox-list{max-height:10em;overflow:auto}.classroom-embed #video{max-height:40dvh}.classroom-sign-in{width:min(480px,100vw - 32px);max-height:85dvh;color:var(--fg);background:var(--panel);border:1px solid var(--edge);border-radius:8px;padding:16px;overflow:auto}.classroom-sign-in::backdrop{background:#0009}.ui-language{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;font-size:12px;display:inline-flex}.ui-language select{min-width:0;max-width:12em}.bar{flex-wrap:wrap}[dir=rtl] .transcript-list li,[dir=rtl] .row-main{text-align:start}[dir=rtl] .transcript-switch+.transcript-switch{margin-left:0;margin-right:12px}.scrub,.transport,.spectrum,.time,input[type=url],input[type=email],input[type=tel]{direction:ltr}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function u(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}o=l(i.map(i=>{if(i=t(i,a),i=u(i),i in n)return;n[i]=!0;let o=i.endsWith(`.css`);for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}let s=document.createElement(`link`);if(s.rel=o?`stylesheet`:e,o||(s.as=`script`),s.crossOrigin=``,s.href=i,c&&s.setAttribute(`nonce`,c),document.head.appendChild(s),o)return new Promise((e,t)=>{s.addEventListener(`load`,e),s.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};function i(e,t){if(!e||e.length===0||!Number.isFinite(t)||t<=0)return[];let n=new Set,r=e.filter(e=>!!e&&typeof e.title==`string`).map(e=>({start:Math.floor(e.start),title:e.title.trim()})).filter(e=>Number.isFinite(e.start)&&e.start>=0).filter(e=>e.start<t).filter(e=>e.title!==``).sort((e,t)=>e.start-t.start).filter(e=>!n.has(e.start)&&(n.add(e.start),!0));return r.map((e,n)=>({...e,end:r[n+1]?.start??t,position:e.start/t}))}function a(e,t){if(!Number.isFinite(t))return null;let n=null;for(let r of e)if(r.start<=t)n=r;else break;return n}var o=`profullstack.player.prefs`,s=`profullstack.player.positions`,c=60,l={volume:1,muted:!1,rate:1};function u(e){if(e!==void 0)return e;try{return typeof window>`u`?null:window.localStorage}catch{return null}}function d(e,t){if(!e)return null;try{let n=e.getItem(t);return n===null?null:JSON.parse(n)}catch{return null}}function f(e,t,n){if(e)try{e.setItem(t,JSON.stringify(n))}catch{}}function p(e,t,n,r){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,e)):r}function m(e){let t=d(u(e),o);return t?{volume:p(t.volume,0,1,l.volume),muted:typeof t.muted==`boolean`?t.muted:l.muted,rate:p(t.rate,.25,4,l.rate)}:{...l}}function h(e,t){f(u(t),o,e)}function g(e){let t=d(e,s);if(!t||typeof t!=`object`)return{};let n={};for(let[e,r]of Object.entries(t)){if(!r||typeof r!=`object`)continue;let t=r;typeof t.t==`number`&&Number.isFinite(t.t)&&(n[e]={t:t.t,d:typeof t.d==`number`&&Number.isFinite(t.d)?t.d:0,at:typeof t.at==`number`&&Number.isFinite(t.at)?t.at:0})}return n}function ee(e,t){return g(u(t))[e]??null}function _(e,t,n,r=Date.now){let i=u(n);if(!i)return;let a=g(i);a[e]={t:t.t,d:t.d,at:r()};let o=Object.entries(a).sort(([,e],[,t])=>t.at-e.at).slice(0,c);f(i,s,Object.fromEntries(o))}function v(e,t){let n=u(t);if(!n)return;let r=g(n);if(!(e in r))return;let i=Object.entries(r).filter(([t])=>t!==e);f(n,s,Object.fromEntries(i))}var y=15,b=20;function x(e,t){return!e||!Number.isFinite(t)||t<=0||Number.isFinite(e.d)&&e.d>0&&Math.abs(e.d-t)>1?!1:e.t>=y&&e.t<=t-b}function S(e){if(!Number.isFinite(e)||e<0)return`--:--`;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${String(n)}:${a(r)}:${a(i)}`:`${String(r)}:${a(i)}`}function C(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();if(t===``)return null;if(t.includes(`:`)){let e=t.split(`:`);if(e.length>3)return null;let n=0;for(let t of e){if(!/^\d+$/.test(t))return null;n=n*60+Number(t)}return n}if(/^\d+s?$/.test(t))return Number(t.replace(`s`,``));let n=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(t);if(!n||n[1]===void 0&&n[2]===void 0&&n[3]===void 0)return null;let r=Number(n[1]??0),i=Number(n[2]??0),a=Number(n[3]??0);return r*3600+i*60+a}function w(e){return!Number.isFinite(e)||e<=0?`0`:String(Math.floor(e))}var T=[[/\bAFT[A-Z0-9]+\b/i,`firetv`],[/\bKF[A-Z]+\b/,`silk`],[/\bSilk\b/i,`silk`],[/\bAndroid TV\b/i,`androidtv`],[/\bGoogleTV\b/i,`googletv`],[/\bTizen\b/i,`tizen`],[/\bWeb0S\b/i,`webos`],[/\bRoku\b/i,`roku`],[/AppleTV/i,`appletv`],[/\bCrKey\b/i,`chromecast`],[/\bSMART-TV\b/i,`smarttv`],[/\bSmartTV\b/i,`smarttv`]];function E(e){if(!e)return null;for(let[t,n]of T)if(t.test(e))return n;return null}function D(e){return E(e)!==null}function te(e){return e?{hideAfterMs:6e3,seekStep:10,alwaysShowFocus:!0}:{hideAfterMs:2800,seekStep:5,alwaysShowFocus:!1}}var O=[[/\.m3u8$/i,`hls`],[/\.(ts|mts|m2ts|mpegts)$/i,`mpegts`],[/\.(mp3|m4a|aac|oga|ogg|opus|wav|flac)$/i,`audio`],[/\.(mp4|m4v|webm|mov|ogv)$/i,`mp4`]],ne=[[/mpegurl/i,`hls`],[/mp2t|mpeg-?ts/i,`mpegts`],[/^audio\//i,`audio`],[/^video\//i,`mp4`]];function k(e){if(e.kind)return e.kind;if(e.mimeType){for(let[t,n]of ne)if(t.test(e.mimeType))return n}let t=A(e.src);for(let[e,n]of O)if(e.test(t))return n;return`unknown`}function A(e){try{return new URL(e,`https://placeholder.invalid`).pathname}catch{return e.split(/[?#]/)[0]??e}}function re(e=globalThis,t=null){let n=e.MediaSource!==void 0,r=!1;try{let e=t??(typeof document>`u`?null:document.createElement(`video`));r=e?e.canPlayType(`application/vnd.apple.mpegurl`)!==``||e.canPlayType(`application/x-mpegURL`)!==``:!1}catch{r=!1}return{mediaSource:n,nativeHls:r}}function ie(e,t){let n=k(e);switch(n){case`hls`:return t.mediaSource?{engine:`hls`,kind:n}:t.nativeHls?{engine:`native`,kind:n}:{engine:`native`,kind:n,unplayable:`This browser cannot play HLS streams.`};case`mpegts`:return t.mediaSource?{engine:`mpegts`,kind:n}:{engine:`mpegts`,kind:n,unplayable:`This browser cannot play transport streams.`};default:return{engine:`native`,kind:n}}}function ae(e){return e===`audio`}async function oe(e,t){let n=t.capabilities??re(),i=ie({src:t.src,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},n),a=()=>void 0,o={media:e,src:t.src,isTv:t.isTv??!1,live:t.live??i.kind===`mpegts`,onError:t.onError??a,onNotice:t.onNotice??a,...t.headers?{headers:t.headers}:{},...t.onReady?{onReady:t.onReady}:{}};if(i.unplayable)return t.onError?.(i.unplayable),{destroy:a,engine:i.engine,kind:i.kind,levels:()=>[],unplayable:i.unplayable};let s,c=t.engines?.[i.engine];if(c)s=await c(o);else if(i.engine===`hls`){let{createHlsEngine:e}=await r(async()=>{let{createHlsEngine:e}=await import(`./hls-OR5FY6YP-bdUZBB11.js`);return{createHlsEngine:e}},[]);s=await e(o)}else if(i.engine===`mpegts`){let{createMpegtsEngine:e}=await r(async()=>{let{createMpegtsEngine:e}=await import(`./mpegts-7CN75AI2-iUctLWip.js`);return{createMpegtsEngine:e}},[]);s=await e(o,{withCredentials:t.withCredentials??!1,unplayableAdvice:t.unplayableAdvice??``})}else{let{createNativeEngine:e}=await r(async()=>{let{createNativeEngine:e}=await import(`./native-C7JTKWJH-BUyIoj0P.js`);return{createNativeEngine:e}},[]);s=await e(o)}return{destroy:()=>{s.destroy()},engine:i.engine,kind:i.kind,levels:s.levels,...s.setLevel?{setLevel:s.setLevel}:{},...s.currentLevel?{currentLevel:s.currentLevel}:{}}}var j=300,se=120,ce=.4;function M(e,t,n,r){return n<=0||e===t?(r(t),Promise.resolve()):new Promise(i=>{let a=Date.now(),o=n*1e3,s=()=>{let n=Math.min(1,(Date.now()-a)/o);r(e+(t-e)*n),n<1?setTimeout(s,16):i()};s()})}var N=e=>Math.min(1,Math.max(0,e));function P(e){return e.volume>0?e.volume:1}function F(e){return e&&e.tagName===`VIDEO`?e:null}function I(e){return e?typeof document<`u`&&document.pictureInPictureElement===e||e.webkitPresentationMode===`picture-in-picture`:!1}async function L(e){let t=e,n=e.requestPictureInPicture;if(typeof n==`function`){await n.call(e);return}if(typeof t.webkitSetPresentationMode==`function`){t.webkitSetPresentationMode(`picture-in-picture`);return}throw Error(`picture-in-picture is not available here`)}var le=/\.(mp3|m4a|aac|ogg|oga|opus|wav|flac)(\?|#|$)/i;function ue(e){let t=typeof e==`string`?{url:e}:e;return{url:t.url,kind:t.kind??(le.test(t.url)?`audio`:`video`)}}function de(e,t,n,r=()=>Date.now()){let i=Math.max(5,n.everySeconds??j)*1e3,a=Math.max(5,n.maxSeconds??se)*1e3,o=Math.max(0,n.fadeSeconds??ce),s=n.revealStage!==!1;function c(){if(!s||typeof window>`u`)return;let t=e.getBoundingClientRect();if(Math.min(t.bottom,window.innerHeight)-Math.max(t.top,0)>=t.height*.6)return;let n=!window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;e.scrollIntoView({block:`center`,behavior:n?`smooth`:`auto`})}async function l(e){if(e)try{await L(e)}catch(e){n.onError?.(e)}}let u=0,d=null,f=0,p=!1,m=!1,h=!n.preroll,g=document.createElement(`div`);g.className=`pux-ad`,g.hidden=!0,Object.assign(g.style,{position:`absolute`,inset:`0`,zIndex:`3`,display:`grid`,placeItems:`center`,background:`#000`});let ee=getComputedStyle(e).position;(!ee||ee===`static`)&&(e.style.position=`relative`);let _=document.createElement(`video`);_.className=`pux-ad__video`,_.playsInline=!0,_.preload=`auto`,Object.assign(_.style,{width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`});let v=document.createElement(`audio`);v.className=`pux-ad__audio`,v.preload=`auto`;let y=_;for(let e of[_,v])e.muted=t.muted,e.volume=P(t);let b=document.createElement(`span`);b.className=`pux-ad__badge`,b.textContent=`Ad`,Object.assign(b.style,{position:`absolute`,top:`0.75rem`,left:`0.75rem`,padding:`0.15rem 0.5rem`,borderRadius:`0.25rem`,background:`rgb(0 0 0 / 0.65)`,color:`#fff`,font:`600 0.75rem/1.4 system-ui, sans-serif`,letterSpacing:`0.04em`,textTransform:`uppercase`});let x=document.createElement(`button`);x.type=`button`,x.className=`pux-ad__skip`,x.hidden=!0,Object.assign(x.style,{position:`absolute`,right:`1rem`,bottom:`1rem`,padding:`0.5rem 0.9rem`,border:`1px solid rgb(255 255 255 / 0.4)`,borderRadius:`0.3rem`,background:`rgb(0 0 0 / 0.6)`,color:`#fff`,font:`500 0.85rem/1 system-ui, sans-serif`,cursor:`pointer`}),g.append(_,v,b,x),e.append(g);function S(){if(m||p)return;let e=r();if(t.paused){d=null;return}d!==null&&(u+=e-d),d=e,u>=i&&C()}async function C(){if(p||m)return;p=!0,u=0,d=null;let r=null;try{r=await n.next()}catch(e){n.onError?.(e)}if(!r||m){p=!1;return}let i=ue(r),s=i.url;y=i.kind===`audio`?v:_;let h=f++,ee=!t.paused,b=i.kind!==`audio`&&I(t),S=P(t);await M(S,0,o,e=>{t.volume=N(e)}),t.pause(),y.src=s,y.currentTime=0,y.muted=t.muted,y.volume=0,g.style.opacity=`0`,c(),g.hidden=!1,g.classList.toggle(`pux-ad--audio`,i.kind===`audio`);let C=i.kind===`audio`;g.style.background=C?`rgb(0 0 0 / 0.35)`:`#000`,_.style.display=C?`none`:``,e.classList.add(`pux-player--ad`),n.onBreakStart?.({url:s,index:h});let w=!1,T=e=>{p&&(w=e,M(1,0,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)}).then(async()=>{b&&I(y)&&await l(F(t)),E(),n.onBreakEnd?.({url:s,index:h,skipped:w}),!m&&(t.volume=0,ee&&t.play().catch(()=>{}),M(0,S,o,e=>{t.volume=N(e)}))}))};function E(){clearTimeout(ne),clearInterval(A),y.removeEventListener(`ended`,D),y.removeEventListener(`error`,te),x.removeEventListener(`click`,O),y.pause(),y.removeAttribute(`src`),y.load(),g.hidden=!0,g.classList.remove(`pux-ad--audio`),x.hidden=!0,e.classList.remove(`pux-player--ad`),p=!1}let D=()=>T(!1),te=()=>{n.onError?.(Error(`advert failed to play: ${s}`)),T(!1)},O=()=>T(!0);y.addEventListener(`ended`,D),y.addEventListener(`error`,te),x.addEventListener(`click`,O);let ne=setTimeout(()=>T(!1),a),k=n.skipAfter,A=0;if(typeof k==`number`&&k>=0){let e=k;x.hidden=!1;let t=()=>{let t=Math.ceil(e-y.currentTime);t>0?(x.disabled=!0,x.textContent=`Skip in ${t}`):(x.disabled=!1,x.textContent=`Skip ad`)};t(),A=setInterval(t,250)}try{await y.play(),b&&await l(y),await M(0,1,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)})}catch(e){n.onError?.(e),t.volume=N(S),T(!1)}}let w=()=>S(),T=()=>{d=r(),h||(h=!0,C())},E=()=>{S(),d=null},D=()=>{for(let e of[_,v])e.muted=t.muted,e.volume=P(t)};return t.addEventListener(`timeupdate`,w),t.addEventListener(`play`,T),t.addEventListener(`pause`,E),t.addEventListener(`volumechange`,D),{play(){return C()},destroy(){m=!0,I(y)&&l(F(t)),t.removeEventListener(`timeupdate`,w),t.removeEventListener(`play`,T),t.removeEventListener(`pause`,E),t.removeEventListener(`volumechange`,D),_.pause(),v.pause(),g.remove()},get playing(){return p}}}var fe=[1,1.25,1.5,1.75,2,.75],pe=5e3,R=10,z={play:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg>`,pause:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 5h4v14H6zM14 5h4v14h-4z"/></svg>`,replay:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/></svg>`,back10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,fwd10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,volume:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4z"/></svg>`,muted:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3z"/><path d="M15 9l6 6m0-6l-6 6" stroke="currentColor" stroke-width="2" fill="none"/></svg>`,pip:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 5h18v14H3z" fill="none" stroke="currentColor" stroke-width="2"/><path d="M12 12h7v5h-7z"/></svg>`,link:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 16a4 4 0 0 1 0-5.7l2-2a4 4 0 0 1 5.7 5.7l-1 1-1.4-1.4 1-1a2 2 0 0 0-2.9-2.9l-2 2A2 2 0 0 0 9.4 14.6L8 16z"/><path d="M16 8a4 4 0 0 1 0 5.7l-2 2A4 4 0 0 1 8.3 10l1-1 1.4 1.4-1 1a2 2 0 0 0 2.9 2.9l2-2A2 2 0 0 0 14.6 9.4L16 8z"/></svg>`,enterFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 9V4h5v2H6v3H4zm11-5h5v5h-2V6h-3V4zM4 15h2v3h3v2H4v-5zm14 0h2v5h-5v-2h3v-3z"/></svg>`,exitFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 4v3H6v2H4V4h5zm6 0h5v5h-2V7h-3V4zM4 15h2v3h3v2H4v-5zm14 3v-3h2v5h-5v-2h3z"/></svg>`};function B(e,t,n={}){let r=document.createElement(e);r.className=t;for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function V(e,t,n,r){let i=B(`button`,e,{type:`button`,"aria-label":t,title:t,"data-control":r});return i.innerHTML=n,i}function me(e){let t=e.error,n=t?.message??``;if(/URL safety check/i.test(n))return`This was blocked before it could load. That is a configuration problem on our side, not on yours — please report it.`;switch(t?.code){case 1:return`Playback was stopped before it started.`;case 2:return`The connection dropped while loading. Check your network and try again.`;case 3:return`This could not be decoded by your browser.`;case 4:return`This is missing, or in a format your browser cannot play.`;default:return`This could not be played.`}}function he(e,t){let{src:n,mediaId:r,startAt:o=null,shareUrl:s=null,storage:c,now:u=Date.now,userAgent:d=typeof navigator>`u`?``:navigator.userAgent}=t,f=D(d),p=te(f),g=t.capabilities??re(),y=ie({src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},g),b=t.audio??(typeof HTMLAudioElement<`u`&&t.media instanceof HTMLAudioElement||ae(y.kind)),C=t.live??y.kind===`mpegts`,w=t.media??document.createElement(b?`audio`:`video`);t.media||e.append(w),!b&&t.poster&&w instanceof HTMLVideoElement&&(w.poster=t.poster),w instanceof HTMLVideoElement&&(w.playsInline=!0),w.controls=!1,e.classList.add(`pux-player`),f&&e.classList.add(`pux-player--tv`),b&&e.classList.add(`pux-player--audio`),e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`);let T=V(`pux-player__overlay`,`Play`,z.play,`overlay`),E=B(`div`,`pux-player__spinner`,{"aria-hidden":`true`}),O=B(`div`,`pux-player__notice`,{role:`status`,"aria-live":`polite`});O.hidden=!0;let ne=B(`span`,`pux-player__notice-text`),k=B(`button`,`pux-player__notice-action`,{type:`button`});k.hidden=!0,O.append(ne,k);let A=B(`div`,`pux-player__bar`),j=B(`div`,`pux-player__scrub`,{role:`slider`,tabindex:`0`,"aria-label":`Seek`,"aria-valuemin":`0`,"aria-valuenow":`0`}),se=B(`div`,`pux-player__track`),ce=B(`div`,`pux-player__buffered`),M=B(`div`,`pux-player__played`),N=B(`div`,`pux-player__marks`,{"aria-hidden":`true`}),P=B(`div`,`pux-player__handle`,{"aria-hidden":`true`}),F=B(`div`,`pux-player__tooltip`,{"aria-hidden":`true`});se.append(ce,M,N,P),j.append(se,F);let I=B(`div`,`pux-player__row`),L=V(`pux-player__btn`,`Play`,z.play,`play`),le=V(`pux-player__btn`,`Back ${String(R)} seconds`,z.back10,`back`),ue=V(`pux-player__btn`,`Forward ${String(R)} seconds`,z.fwd10,`forward`),he=B(`div`,`pux-player__volume`),H=V(`pux-player__btn`,`Mute`,z.volume,`mute`),U=B(`input`,`pux-player__volume-input`,{type:`range`,min:`0`,max:`1`,step:`0.05`,"aria-label":`Volume`,"data-control":`volume`});he.append(H,U);let ge=B(`div`,`pux-player__live`,{"data-control":`live`});ge.textContent=`LIVE`;let _e=B(`div`,`pux-player__time`),ve=B(`div`,`pux-player__chapter`),ye=B(`div`,`pux-player__spacer`),W=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Playback speed`,title:`Playback speed`,"data-control":`rate`}),G=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Quality`,title:`Quality`,"data-control":`quality`});G.hidden=!0;let be=V(`pux-player__btn`,`Copy link at this time`,z.link,`share`),K=V(`pux-player__btn`,`Picture in picture`,z.pip,`pip`),q=V(`pux-player__btn`,`Fullscreen`,z.enterFullscreen,`fullscreen`);I.append(L,le,ue,he,ge,_e,ve,ye,W,G,be,K,q),A.append(j,I),e.append(T,E,O,A),f&&(U.hidden=!0,K.hidden=!0),b&&(q.hidden=!0,K.hidden=!0,T.hidden=!0),s||(be.hidden=!0),(typeof document>`u`||!document.pictureInPictureEnabled)&&(K.hidden=!0);let xe=[],Se=t.chapters??[],Ce=[],we=null,Te=null,Ee=0,De=!1,Oe=!1,J=null,ke=[];function Y(e,t,n,r){e.addEventListener(t,n,r),Ce.push(()=>e.removeEventListener(t,n,r))}function X(e,t){ne.textContent=e,O.hidden=!1,Te&&clearTimeout(Te),t?(k.hidden=!1,k.textContent=t.label,k.onclick=()=>{t.run(),Ae()}):(k.hidden=!0,k.onclick=null),Te=setTimeout(Ae,t?9e3:4e3)}function Ae(){O.hidden=!0,k.onclick=null}function je(){e.classList.toggle(`pux-player--live`,C),j.hidden=C,le.hidden=C,ue.hidden=C,W.hidden=C,be.hidden=C||!s,ge.hidden=!C,_e.hidden=C,ve.hidden=C}function Me(){N.replaceChildren();for(let e of xe){let t=B(`button`,`pux-player__mark`,{type:`button`,"aria-label":`${e.title}, ${S(e.start)}`,title:e.title});t.style.left=`${String(e.position*100)}%`,t.addEventListener(`click`,t=>{t.stopPropagation(),w.currentTime=e.start}),N.append(t)}}function Ne(){xe=C?[]:i(Se,w.duration),Me(),Z()}function Z(){if(C)return;let e=w.duration,t=w.currentTime,n=Number.isFinite(e)&&e>0,r=n?Math.min(1,Math.max(0,t/e)):0;if(M.style.width=`${String(r*100)}%`,P.style.left=`${String(r*100)}%`,w.buffered.length>0&&n){let n=0;for(let e=0;e<w.buffered.length;e+=1)if(w.buffered.start(e)<=t&&w.buffered.end(e)>=t){n=w.buffered.end(e);break}ce.style.width=`${String(Math.min(1,n/e)*100)}%`}_e.textContent=`${S(t)} / ${S(e)}`,j.setAttribute(`aria-valuenow`,String(Math.floor(t))),n&&j.setAttribute(`aria-valuemax`,String(Math.floor(e))),j.setAttribute(`aria-valuetext`,n?`${S(t)} of ${S(e)}`:S(t));let i=a(xe,t);ve.textContent=i?i.title:``}function Pe(){let t=!w.paused&&!w.ended,n=w.ended,r=n?z.replay:t?z.pause:z.play,i=n?`Play again`:t?`Pause`:`Play`;L.innerHTML=r,L.setAttribute(`aria-label`,i),L.title=i,T.innerHTML=r,T.setAttribute(`aria-label`,i),e.classList.toggle(`pux-player--playing`,t),e.classList.toggle(`pux-player--ended`,n),t||Q(!1)}function Fe(){let e=w.muted||w.volume===0;H.innerHTML=e?z.muted:z.volume,H.setAttribute(`aria-label`,e?`Unmute`:`Mute`),H.setAttribute(`aria-pressed`,e?`true`:`false`),U.value=String(e?0:w.volume)}function Ie(){W.textContent=`${String(w.playbackRate)}\xD7`,W.setAttribute(`aria-label`,`Playback speed, ${String(w.playbackRate)} times`)}function Le(){if(G.hidden=ke.length<2||!J?.setLevel,G.hidden)return;let e=J?.currentLevel?.()??-1,t=ke.find(t=>t.index===e);G.textContent=e===-1?`Auto`:t?.label??`Auto`}function Q(t=!0){e.classList.add(`pux-player--controls`),we&&clearTimeout(we),t&&(we=setTimeout(()=>{w.paused||e.classList.remove(`pux-player--controls`)},p.hideAfterMs))}function Re(){Ye?.playing||(w.paused||w.ended?w.play().catch(()=>void 0):w.pause())}function $(e){if(C)return;let t=Number.isFinite(w.duration)?w.duration:1/0;w.currentTime=Math.min(t,Math.max(0,w.currentTime+e)),Z(),Q()}function ze(e){C||!Number.isFinite(w.duration)||w.duration<=0||(w.currentTime=Math.min(1,Math.max(0,e))*w.duration,Z())}function Be(e){let t=se.getBoundingClientRect();return t.width===0?0:(e-t.left)/t.width}function Ve(e){let t=fe[(fe.indexOf(w.playbackRate)+e+fe.length)%fe.length]??1;w.playbackRate=t}function He(){if(!J?.setLevel)return;let e=[-1,...ke.map(e=>e.index)],t=J.currentLevel?.()??-1,n=e[(e.indexOf(t)+1)%e.length]??-1;J.setLevel(n),Le(),Q()}async function Ue(){try{if(document.fullscreenElement){await document.exitFullscreen();return}await e.requestFullscreen()}catch{w.webkitEnterFullscreen?.()}}async function We(){try{document.pictureInPictureElement?await document.exitPictureInPicture():w instanceof HTMLVideoElement&&await w.requestPictureInPicture()}catch{X(`Picture in picture is not available here.`)}}async function Ge(){if(!s)return;let e=Math.floor(w.currentTime),t=s(e);try{await navigator.clipboard.writeText(t),X(`Link copied, starting at ${S(e)}.`)}catch{X(t)}}Y(w,`loadedmetadata`,()=>{if(Ne(),Z(),C)return;let e=typeof o==`number`&&o>0?o:null;if(e!==null&&Number.isFinite(w.duration)&&e<w.duration){w.currentTime=e;return}if(!r)return;let t=ee(r,c);x(t,w.duration)&&t&&(w.currentTime=t.t,X(`Resumed at ${S(t.t)}.`,{label:`Start over`,run:()=>{w.currentTime=0,v(r,c)}}))});function Ke(){!C&&r&&Number.isFinite(w.duration)&&w.duration>0&&!w.ended&&_(r,{t:w.currentTime,d:w.duration},c,u)}Y(w,`timeupdate`,()=>{De||Z(),!(u()-Ee<pe)&&(Ee=u(),Ke())}),Y(w,`progress`,Z),Y(w,`seeked`,Z),Y(w,`seeking`,Z),Y(w,`durationchange`,Ne),Y(w,`play`,Pe),Y(w,`pause`,()=>{Pe(),Ke()}),Y(w,`ended`,()=>{Pe(),r&&v(r,c)}),Y(w,`volumechange`,()=>{Fe(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`ratechange`,()=>{Ie(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`waiting`,()=>e.classList.add(`pux-player--buffering`)),Y(w,`playing`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`canplay`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`error`,()=>{e.classList.remove(`pux-player--buffering`),e.classList.add(`pux-player--failed`),X(me(w))}),Y(T,`click`,Re),Y(L,`click`,Re),Y(le,`click`,()=>{$(-R)}),Y(ue,`click`,()=>{$(R)}),Y(H,`click`,()=>{w.muted=!w.muted}),Y(U,`input`,()=>{w.volume=Number(U.value),w.muted=Number(U.value)===0}),Y(W,`click`,()=>{Ve(1)}),Y(G,`click`,He),Y(be,`click`,()=>void Ge()),Y(K,`click`,()=>void We()),Y(q,`click`,()=>void Ue()),Y(document,`fullscreenchange`,()=>{let t=document.fullscreenElement===e;e.classList.toggle(`pux-player--fullscreen`,t),q.innerHTML=t?z.exitFullscreen:z.enterFullscreen,q.setAttribute(`aria-label`,t?`Exit fullscreen`:`Fullscreen`)}),Y(j,`pointerdown`,e=>{let t=e;De=!0,j.setPointerCapture(t.pointerId),ze(Be(t.clientX))}),Y(j,`pointermove`,e=>{let t=Be(e.clientX);Number.isFinite(w.duration)&&w.duration>0&&(F.textContent=S(Math.max(0,Math.min(1,t))*w.duration),F.style.left=`${String(Math.max(0,Math.min(1,t))*100)}%`),De&&ze(t)});let qe=e=>{if(!De)return;De=!1;let t=e;j.hasPointerCapture(t.pointerId)&&j.releasePointerCapture(t.pointerId)};Y(j,`pointerup`,qe),Y(j,`pointercancel`,qe),Y(e,`pointermove`,()=>{Q()}),Y(e,`pointerleave`,()=>{w.paused||e.classList.remove(`pux-player--controls`)}),Y(e,`focusin`,()=>{Q()}),Y(e,`keydown`,e=>{let t=e.key,n=e.target,r=n?I.contains(n):!1;if(!(r&&[`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(t)))switch(t){case` `:case`k`:case`Enter`:if(t===`Enter`&&n?.closest(`button`))return;e.preventDefault(),Re();break;case`ArrowLeft`:e.preventDefault(),$(-p.seekStep);break;case`ArrowRight`:e.preventDefault(),$(p.seekStep);break;case`j`:$(-R);break;case`l`:$(R);break;case`ArrowUp`:e.preventDefault(),w.volume=Math.min(1,w.volume+.1),w.muted=!1,Q();break;case`ArrowDown`:e.preventDefault(),w.volume=Math.max(0,w.volume-.1),Q();break;case`m`:w.muted=!w.muted,Q();break;case`f`:q.hidden||Ue();break;case`p`:K.hidden||We();break;case`Home`:e.preventDefault(),C||(w.currentTime=0);break;case`End`:e.preventDefault(),!C&&Number.isFinite(w.duration)&&(w.currentTime=w.duration);break;case`<`:case`,`:C||(Ve(-1),Q());break;case`>`:case`.`:C||(Ve(1),Q());break;default:/^[0-9]$/.test(t)&&!r&&!C&&(e.preventDefault(),ze(Number(t)/10))}}),Y(window,`pagehide`,Ke);let Je=m(c);w.volume=Je.volume,w.muted=t.autoplay?!0:Je.muted,w.playbackRate=Je.rate===0?l.rate:Je.rate,je(),Pe(),Fe(),Ie(),Z(),Ne(),Q(!1),y.unplayable&&(e.classList.add(`pux-player--failed`),X(y.unplayable));let Ye=t.ads?de(e,w,t.ads,u):null,Xe=Ze();async function Ze(){if(!y.unplayable)try{let r=await oe(w,{src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{},live:C,isTv:f,capabilities:g,withCredentials:t.withCredentials??!1,...t.headers?{headers:t.headers}:{},unplayableAdvice:t.unplayableAdvice??``,...t.engines?{engines:t.engines}:{},onError:t=>{e.classList.add(`pux-player--failed`),X(t)},onNotice:e=>{e===null?Ae():X(e)},onReady:e=>{Oe||(e.live!==C&&(C=e.live,je(),Ne()),ke=e.levels,Le())}});if(J=r,Oe){r.destroy(),J=null;return}Le(),t.autoplay&&w.play().catch(()=>void 0)}catch{e.classList.add(`pux-player--failed`),X(`The player could not be loaded. Please reload the page.`)}}return{media:w,destroy(){if(!Oe){Oe=!0,Ke(),Ye?.destroy(),we&&clearTimeout(we),Te&&clearTimeout(Te);for(let e of Ce)e();Xe.then(()=>{J?.destroy(),J=null}),T.remove(),E.remove(),O.remove(),A.remove(),t.media||w.remove(),e.classList.remove(`pux-player`,`pux-player--tv`,`pux-player--audio`,`pux-player--live`,`pux-player--controls`,`pux-player--playing`,`pux-player--ended`,`pux-player--buffering`,`pux-player--failed`,`pux-player--fullscreen`)}},setChapters(e){Se=e,Ne()}}}export{S as a,r as c,k as i,oe as n,w as o,he as r,C as s,de as t};
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function u(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}o=l(i.map(i=>{if(i=t(i,a),i=u(i),i in n)return;n[i]=!0;let o=i.endsWith(`.css`);for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}let s=document.createElement(`link`);if(s.rel=o?`stylesheet`:e,o||(s.as=`script`),s.crossOrigin=``,s.href=i,c&&s.setAttribute(`nonce`,c),document.head.appendChild(s),o)return new Promise((e,t)=>{s.addEventListener(`load`,e),s.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};function i(e,t){if(!e||e.length===0||!Number.isFinite(t)||t<=0)return[];let n=new Set,r=e.filter(e=>!!e&&typeof e.title==`string`).map(e=>({start:Math.floor(e.start),title:e.title.trim()})).filter(e=>Number.isFinite(e.start)&&e.start>=0).filter(e=>e.start<t).filter(e=>e.title!==``).sort((e,t)=>e.start-t.start).filter(e=>!n.has(e.start)&&(n.add(e.start),!0));return r.map((e,n)=>({...e,end:r[n+1]?.start??t,position:e.start/t}))}function a(e,t){if(!Number.isFinite(t))return null;let n=null;for(let r of e)if(r.start<=t)n=r;else break;return n}var o=`profullstack.player.prefs`,s=`profullstack.player.positions`,c=60,l={volume:1,muted:!1,rate:1};function u(e){if(e!==void 0)return e;try{return typeof window>`u`?null:window.localStorage}catch{return null}}function d(e,t){if(!e)return null;try{let n=e.getItem(t);return n===null?null:JSON.parse(n)}catch{return null}}function f(e,t,n){if(e)try{e.setItem(t,JSON.stringify(n))}catch{}}function p(e,t,n,r){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,e)):r}function m(e){let t=d(u(e),o);return t?{volume:p(t.volume,0,1,l.volume),muted:typeof t.muted==`boolean`?t.muted:l.muted,rate:p(t.rate,.25,4,l.rate)}:{...l}}function h(e,t){f(u(t),o,e)}function g(e){let t=d(e,s);if(!t||typeof t!=`object`)return{};let n={};for(let[e,r]of Object.entries(t)){if(!r||typeof r!=`object`)continue;let t=r;typeof t.t==`number`&&Number.isFinite(t.t)&&(n[e]={t:t.t,d:typeof t.d==`number`&&Number.isFinite(t.d)?t.d:0,at:typeof t.at==`number`&&Number.isFinite(t.at)?t.at:0})}return n}function ee(e,t){return g(u(t))[e]??null}function _(e,t,n,r=Date.now){let i=u(n);if(!i)return;let a=g(i);a[e]={t:t.t,d:t.d,at:r()};let o=Object.entries(a).sort(([,e],[,t])=>t.at-e.at).slice(0,c);f(i,s,Object.fromEntries(o))}function v(e,t){let n=u(t);if(!n)return;let r=g(n);if(!(e in r))return;let i=Object.entries(r).filter(([t])=>t!==e);f(n,s,Object.fromEntries(i))}var y=15,b=20;function x(e,t){return!e||!Number.isFinite(t)||t<=0||Number.isFinite(e.d)&&e.d>0&&Math.abs(e.d-t)>1?!1:e.t>=y&&e.t<=t-b}function S(e){if(!Number.isFinite(e)||e<0)return`--:--`;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${String(n)}:${a(r)}:${a(i)}`:`${String(r)}:${a(i)}`}function C(e){if(typeof e!=`string`)return null;let t=e.trim().toLowerCase();if(t===``)return null;if(t.includes(`:`)){let e=t.split(`:`);if(e.length>3)return null;let n=0;for(let t of e){if(!/^\d+$/.test(t))return null;n=n*60+Number(t)}return n}if(/^\d+s?$/.test(t))return Number(t.replace(`s`,``));let n=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(t);if(!n||n[1]===void 0&&n[2]===void 0&&n[3]===void 0)return null;let r=Number(n[1]??0),i=Number(n[2]??0),a=Number(n[3]??0);return r*3600+i*60+a}function w(e){return!Number.isFinite(e)||e<=0?`0`:String(Math.floor(e))}var T=[[/\bAFT[A-Z0-9]+\b/i,`firetv`],[/\bKF[A-Z]+\b/,`silk`],[/\bSilk\b/i,`silk`],[/\bAndroid TV\b/i,`androidtv`],[/\bGoogleTV\b/i,`googletv`],[/\bTizen\b/i,`tizen`],[/\bWeb0S\b/i,`webos`],[/\bRoku\b/i,`roku`],[/AppleTV/i,`appletv`],[/\bCrKey\b/i,`chromecast`],[/\bSMART-TV\b/i,`smarttv`],[/\bSmartTV\b/i,`smarttv`]];function E(e){if(!e)return null;for(let[t,n]of T)if(t.test(e))return n;return null}function D(e){return E(e)!==null}function te(e){return e?{hideAfterMs:6e3,seekStep:10,alwaysShowFocus:!0}:{hideAfterMs:2800,seekStep:5,alwaysShowFocus:!1}}var O=[[/\.m3u8$/i,`hls`],[/\.(ts|mts|m2ts|mpegts)$/i,`mpegts`],[/\.(mp3|m4a|aac|oga|ogg|opus|wav|flac)$/i,`audio`],[/\.(mp4|m4v|webm|mov|ogv)$/i,`mp4`]],ne=[[/mpegurl/i,`hls`],[/mp2t|mpeg-?ts/i,`mpegts`],[/^audio\//i,`audio`],[/^video\//i,`mp4`]];function k(e){if(e.kind)return e.kind;if(e.mimeType){for(let[t,n]of ne)if(t.test(e.mimeType))return n}let t=A(e.src);for(let[e,n]of O)if(e.test(t))return n;return`unknown`}function A(e){try{return new URL(e,`https://placeholder.invalid`).pathname}catch{return e.split(/[?#]/)[0]??e}}function re(e=globalThis,t=null){let n=e.MediaSource!==void 0,r=!1;try{let e=t??(typeof document>`u`?null:document.createElement(`video`));r=e?e.canPlayType(`application/vnd.apple.mpegurl`)!==``||e.canPlayType(`application/x-mpegURL`)!==``:!1}catch{r=!1}return{mediaSource:n,nativeHls:r}}function ie(e,t){let n=k(e);switch(n){case`hls`:return t.mediaSource?{engine:`hls`,kind:n}:t.nativeHls?{engine:`native`,kind:n}:{engine:`native`,kind:n,unplayable:`This browser cannot play HLS streams.`};case`mpegts`:return t.mediaSource?{engine:`mpegts`,kind:n}:{engine:`mpegts`,kind:n,unplayable:`This browser cannot play transport streams.`};default:return{engine:`native`,kind:n}}}function ae(e){return e===`audio`}async function oe(e,t){let n=t.capabilities??re(),i=ie({src:t.src,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},n),a=()=>void 0,o={media:e,src:t.src,isTv:t.isTv??!1,live:t.live??i.kind===`mpegts`,onError:t.onError??a,onNotice:t.onNotice??a,...t.headers?{headers:t.headers}:{},...t.onReady?{onReady:t.onReady}:{}};if(i.unplayable)return t.onError?.(i.unplayable),{destroy:a,engine:i.engine,kind:i.kind,levels:()=>[],unplayable:i.unplayable};let s,c=t.engines?.[i.engine];if(c)s=await c(o);else if(i.engine===`hls`){let{createHlsEngine:e}=await r(async()=>{let{createHlsEngine:e}=await import(`./hls-OR5FY6YP-CxI-FwpW.js`);return{createHlsEngine:e}},[]);s=await e(o)}else if(i.engine===`mpegts`){let{createMpegtsEngine:e}=await r(async()=>{let{createMpegtsEngine:e}=await import(`./mpegts-7CN75AI2-D-6xFZI-.js`);return{createMpegtsEngine:e}},[]);s=await e(o,{withCredentials:t.withCredentials??!1,unplayableAdvice:t.unplayableAdvice??``})}else{let{createNativeEngine:e}=await r(async()=>{let{createNativeEngine:e}=await import(`./native-C7JTKWJH-BUyIoj0P.js`);return{createNativeEngine:e}},[]);s=await e(o)}return{destroy:()=>{s.destroy()},engine:i.engine,kind:i.kind,levels:s.levels,...s.setLevel?{setLevel:s.setLevel}:{},...s.currentLevel?{currentLevel:s.currentLevel}:{}}}var j=300,se=120,ce=.4;function M(e,t,n,r){return n<=0||e===t?(r(t),Promise.resolve()):new Promise(i=>{let a=Date.now(),o=n*1e3,s=()=>{let n=Math.min(1,(Date.now()-a)/o);r(e+(t-e)*n),n<1?setTimeout(s,16):i()};s()})}var N=e=>Math.min(1,Math.max(0,e));function P(e){return e.volume>0?e.volume:1}function F(e){return e&&e.tagName===`VIDEO`?e:null}function I(e){return e?typeof document<`u`&&document.pictureInPictureElement===e||e.webkitPresentationMode===`picture-in-picture`:!1}async function L(e){let t=e,n=e.requestPictureInPicture;if(typeof n==`function`){await n.call(e);return}if(typeof t.webkitSetPresentationMode==`function`){t.webkitSetPresentationMode(`picture-in-picture`);return}throw Error(`picture-in-picture is not available here`)}var le=/\.(mp3|m4a|aac|ogg|oga|opus|wav|flac)(\?|#|$)/i;function ue(e){let t=typeof e==`string`?{url:e}:e;return{url:t.url,kind:t.kind??(le.test(t.url)?`audio`:`video`)}}function de(e,t,n,r=()=>Date.now()){let i=Math.max(5,n.everySeconds??j)*1e3,a=Math.max(5,n.maxSeconds??se)*1e3,o=Math.max(0,n.fadeSeconds??ce),s=n.revealStage!==!1;function c(){if(!s||typeof window>`u`)return;let t=e.getBoundingClientRect();if(Math.min(t.bottom,window.innerHeight)-Math.max(t.top,0)>=t.height*.6)return;let n=!window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;e.scrollIntoView({block:`center`,behavior:n?`smooth`:`auto`})}async function l(e){if(e)try{await L(e)}catch(e){n.onError?.(e)}}let u=0,d=null,f=0,p=!1,m=!1,h=!n.preroll,g=document.createElement(`div`);g.className=`pux-ad`,g.hidden=!0,Object.assign(g.style,{position:`absolute`,inset:`0`,zIndex:`3`,display:`grid`,placeItems:`center`,background:`#000`});let ee=getComputedStyle(e).position;(!ee||ee===`static`)&&(e.style.position=`relative`);let _=document.createElement(`video`);_.className=`pux-ad__video`,_.playsInline=!0,_.preload=`auto`,Object.assign(_.style,{width:`100%`,height:`100%`,objectFit:`contain`,background:`#000`});let v=document.createElement(`audio`);v.className=`pux-ad__audio`,v.preload=`auto`;let y=_;for(let e of[_,v])e.muted=t.muted,e.volume=P(t);let b=document.createElement(`span`);b.className=`pux-ad__badge`,b.textContent=`Ad`,Object.assign(b.style,{position:`absolute`,top:`0.75rem`,left:`0.75rem`,padding:`0.15rem 0.5rem`,borderRadius:`0.25rem`,background:`rgb(0 0 0 / 0.65)`,color:`#fff`,font:`600 0.75rem/1.4 system-ui, sans-serif`,letterSpacing:`0.04em`,textTransform:`uppercase`});let x=document.createElement(`button`);x.type=`button`,x.className=`pux-ad__skip`,x.hidden=!0,Object.assign(x.style,{position:`absolute`,right:`1rem`,bottom:`1rem`,padding:`0.5rem 0.9rem`,border:`1px solid rgb(255 255 255 / 0.4)`,borderRadius:`0.3rem`,background:`rgb(0 0 0 / 0.6)`,color:`#fff`,font:`500 0.85rem/1 system-ui, sans-serif`,cursor:`pointer`}),g.append(_,v,b,x),e.append(g);function S(){if(m||p)return;let e=r();if(t.paused){d=null;return}d!==null&&(u+=e-d),d=e,u>=i&&C()}async function C(){if(p||m)return;p=!0,u=0,d=null;let r=null;try{r=await n.next()}catch(e){n.onError?.(e)}if(!r||m){p=!1;return}let i=ue(r),s=i.url;y=i.kind===`audio`?v:_;let h=f++,ee=!t.paused,b=i.kind!==`audio`&&I(t),S=P(t);await M(S,0,o,e=>{t.volume=N(e)}),t.pause(),y.src=s,y.currentTime=0,y.muted=t.muted,y.volume=0,g.style.opacity=`0`,c(),g.hidden=!1,g.classList.toggle(`pux-ad--audio`,i.kind===`audio`);let C=i.kind===`audio`;g.style.background=C?`rgb(0 0 0 / 0.35)`:`#000`,_.style.display=C?`none`:``,e.classList.add(`pux-player--ad`),n.onBreakStart?.({url:s,index:h});let w=!1,T=e=>{p&&(w=e,M(1,0,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)}).then(async()=>{b&&I(y)&&await l(F(t)),E(),n.onBreakEnd?.({url:s,index:h,skipped:w}),!m&&(t.volume=0,ee&&t.play().catch(()=>{}),M(0,S,o,e=>{t.volume=N(e)}))}))};function E(){clearTimeout(ne),clearInterval(A),y.removeEventListener(`ended`,D),y.removeEventListener(`error`,te),x.removeEventListener(`click`,O),y.pause(),y.removeAttribute(`src`),y.load(),g.hidden=!0,g.classList.remove(`pux-ad--audio`),x.hidden=!0,e.classList.remove(`pux-player--ad`),p=!1}let D=()=>T(!1),te=()=>{n.onError?.(Error(`advert failed to play: ${s}`)),T(!1)},O=()=>T(!0);y.addEventListener(`ended`,D),y.addEventListener(`error`,te),x.addEventListener(`click`,O);let ne=setTimeout(()=>T(!1),a),k=n.skipAfter,A=0;if(typeof k==`number`&&k>=0){let e=k;x.hidden=!1;let t=()=>{let t=Math.ceil(e-y.currentTime);t>0?(x.disabled=!0,x.textContent=`Skip in ${t}`):(x.disabled=!1,x.textContent=`Skip ad`)};t(),A=setInterval(t,250)}try{await y.play(),b&&await l(y),await M(0,1,o,e=>{g.style.opacity=String(e),y.volume=N(S*e)})}catch(e){n.onError?.(e),t.volume=N(S),T(!1)}}let w=()=>S(),T=()=>{d=r(),h||(h=!0,C())},E=()=>{S(),d=null},D=()=>{for(let e of[_,v])e.muted=t.muted,e.volume=P(t)};return t.addEventListener(`timeupdate`,w),t.addEventListener(`play`,T),t.addEventListener(`pause`,E),t.addEventListener(`volumechange`,D),{play(){return C()},destroy(){m=!0,I(y)&&l(F(t)),t.removeEventListener(`timeupdate`,w),t.removeEventListener(`play`,T),t.removeEventListener(`pause`,E),t.removeEventListener(`volumechange`,D),_.pause(),v.pause(),g.remove()},get playing(){return p}}}var fe=[1,1.25,1.5,1.75,2,.75],pe=5e3,R=10,z={play:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg>`,pause:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 5h4v14H6zM14 5h4v14h-4z"/></svg>`,replay:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/></svg>`,back10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,fwd10:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z"/><text x="12" y="17" font-size="8" text-anchor="middle" fill="currentColor">10</text></svg>`,volume:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4z"/></svg>`,muted:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 9v6h4l5 5V4L7 9H3z"/><path d="M15 9l6 6m0-6l-6 6" stroke="currentColor" stroke-width="2" fill="none"/></svg>`,pip:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 5h18v14H3z" fill="none" stroke="currentColor" stroke-width="2"/><path d="M12 12h7v5h-7z"/></svg>`,link:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 16a4 4 0 0 1 0-5.7l2-2a4 4 0 0 1 5.7 5.7l-1 1-1.4-1.4 1-1a2 2 0 0 0-2.9-2.9l-2 2A2 2 0 0 0 9.4 14.6L8 16z"/><path d="M16 8a4 4 0 0 1 0 5.7l-2 2A4 4 0 0 1 8.3 10l1-1 1.4 1.4-1 1a2 2 0 0 0 2.9 2.9l2-2A2 2 0 0 0 14.6 9.4L16 8z"/></svg>`,enterFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 9V4h5v2H6v3H4zm11-5h5v5h-2V6h-3V4zM4 15h2v3h3v2H4v-5zm14 0h2v5h-5v-2h3v-3z"/></svg>`,exitFullscreen:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 4v3H6v2H4V4h5zm6 0h5v5h-2V7h-3V4zM4 15h2v3h3v2H4v-5zm14 3v-3h2v5h-5v-2h3z"/></svg>`};function B(e,t,n={}){let r=document.createElement(e);r.className=t;for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function V(e,t,n,r){let i=B(`button`,e,{type:`button`,"aria-label":t,title:t,"data-control":r});return i.innerHTML=n,i}function me(e){let t=e.error,n=t?.message??``;if(/URL safety check/i.test(n))return`This was blocked before it could load. That is a configuration problem on our side, not on yours — please report it.`;switch(t?.code){case 1:return`Playback was stopped before it started.`;case 2:return`The connection dropped while loading. Check your network and try again.`;case 3:return`This could not be decoded by your browser.`;case 4:return`This is missing, or in a format your browser cannot play.`;default:return`This could not be played.`}}function he(e,t){let{src:n,mediaId:r,startAt:o=null,shareUrl:s=null,storage:c,now:u=Date.now,userAgent:d=typeof navigator>`u`?``:navigator.userAgent}=t,f=D(d),p=te(f),g=t.capabilities??re(),y=ie({src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{}},g),b=t.audio??(typeof HTMLAudioElement<`u`&&t.media instanceof HTMLAudioElement||ae(y.kind)),C=t.live??y.kind===`mpegts`,w=t.media??document.createElement(b?`audio`:`video`);t.media||e.append(w),!b&&t.poster&&w instanceof HTMLVideoElement&&(w.poster=t.poster),w instanceof HTMLVideoElement&&(w.playsInline=!0),w.controls=!1,e.classList.add(`pux-player`),f&&e.classList.add(`pux-player--tv`),b&&e.classList.add(`pux-player--audio`),e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`);let T=V(`pux-player__overlay`,`Play`,z.play,`overlay`),E=B(`div`,`pux-player__spinner`,{"aria-hidden":`true`}),O=B(`div`,`pux-player__notice`,{role:`status`,"aria-live":`polite`});O.hidden=!0;let ne=B(`span`,`pux-player__notice-text`),k=B(`button`,`pux-player__notice-action`,{type:`button`});k.hidden=!0,O.append(ne,k);let A=B(`div`,`pux-player__bar`),j=B(`div`,`pux-player__scrub`,{role:`slider`,tabindex:`0`,"aria-label":`Seek`,"aria-valuemin":`0`,"aria-valuenow":`0`}),se=B(`div`,`pux-player__track`),ce=B(`div`,`pux-player__buffered`),M=B(`div`,`pux-player__played`),N=B(`div`,`pux-player__marks`,{"aria-hidden":`true`}),P=B(`div`,`pux-player__handle`,{"aria-hidden":`true`}),F=B(`div`,`pux-player__tooltip`,{"aria-hidden":`true`});se.append(ce,M,N,P),j.append(se,F);let I=B(`div`,`pux-player__row`),L=V(`pux-player__btn`,`Play`,z.play,`play`),le=V(`pux-player__btn`,`Back ${String(R)} seconds`,z.back10,`back`),ue=V(`pux-player__btn`,`Forward ${String(R)} seconds`,z.fwd10,`forward`),he=B(`div`,`pux-player__volume`),H=V(`pux-player__btn`,`Mute`,z.volume,`mute`),U=B(`input`,`pux-player__volume-input`,{type:`range`,min:`0`,max:`1`,step:`0.05`,"aria-label":`Volume`,"data-control":`volume`});he.append(H,U);let ge=B(`div`,`pux-player__live`,{"data-control":`live`});ge.textContent=`LIVE`;let _e=B(`div`,`pux-player__time`),ve=B(`div`,`pux-player__chapter`),ye=B(`div`,`pux-player__spacer`),W=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Playback speed`,title:`Playback speed`,"data-control":`rate`}),G=B(`button`,`pux-player__btn pux-player__btn--text`,{type:`button`,"aria-label":`Quality`,title:`Quality`,"data-control":`quality`});G.hidden=!0;let be=V(`pux-player__btn`,`Copy link at this time`,z.link,`share`),K=V(`pux-player__btn`,`Picture in picture`,z.pip,`pip`),q=V(`pux-player__btn`,`Fullscreen`,z.enterFullscreen,`fullscreen`);I.append(L,le,ue,he,ge,_e,ve,ye,W,G,be,K,q),A.append(j,I),e.append(T,E,O,A),f&&(U.hidden=!0,K.hidden=!0),b&&(q.hidden=!0,K.hidden=!0,T.hidden=!0),s||(be.hidden=!0),(typeof document>`u`||!document.pictureInPictureEnabled)&&(K.hidden=!0);let xe=[],Se=t.chapters??[],Ce=[],we=null,Te=null,Ee=0,De=!1,Oe=!1,J=null,ke=[];function Y(e,t,n,r){e.addEventListener(t,n,r),Ce.push(()=>e.removeEventListener(t,n,r))}function X(e,t){ne.textContent=e,O.hidden=!1,Te&&clearTimeout(Te),t?(k.hidden=!1,k.textContent=t.label,k.onclick=()=>{t.run(),Ae()}):(k.hidden=!0,k.onclick=null),Te=setTimeout(Ae,t?9e3:4e3)}function Ae(){O.hidden=!0,k.onclick=null}function je(){e.classList.toggle(`pux-player--live`,C),j.hidden=C,le.hidden=C,ue.hidden=C,W.hidden=C,be.hidden=C||!s,ge.hidden=!C,_e.hidden=C,ve.hidden=C}function Me(){N.replaceChildren();for(let e of xe){let t=B(`button`,`pux-player__mark`,{type:`button`,"aria-label":`${e.title}, ${S(e.start)}`,title:e.title});t.style.left=`${String(e.position*100)}%`,t.addEventListener(`click`,t=>{t.stopPropagation(),w.currentTime=e.start}),N.append(t)}}function Ne(){xe=C?[]:i(Se,w.duration),Me(),Z()}function Z(){if(C)return;let e=w.duration,t=w.currentTime,n=Number.isFinite(e)&&e>0,r=n?Math.min(1,Math.max(0,t/e)):0;if(M.style.width=`${String(r*100)}%`,P.style.left=`${String(r*100)}%`,w.buffered.length>0&&n){let n=0;for(let e=0;e<w.buffered.length;e+=1)if(w.buffered.start(e)<=t&&w.buffered.end(e)>=t){n=w.buffered.end(e);break}ce.style.width=`${String(Math.min(1,n/e)*100)}%`}_e.textContent=`${S(t)} / ${S(e)}`,j.setAttribute(`aria-valuenow`,String(Math.floor(t))),n&&j.setAttribute(`aria-valuemax`,String(Math.floor(e))),j.setAttribute(`aria-valuetext`,n?`${S(t)} of ${S(e)}`:S(t));let i=a(xe,t);ve.textContent=i?i.title:``}function Pe(){let t=!w.paused&&!w.ended,n=w.ended,r=n?z.replay:t?z.pause:z.play,i=n?`Play again`:t?`Pause`:`Play`;L.innerHTML=r,L.setAttribute(`aria-label`,i),L.title=i,T.innerHTML=r,T.setAttribute(`aria-label`,i),e.classList.toggle(`pux-player--playing`,t),e.classList.toggle(`pux-player--ended`,n),t||Q(!1)}function Fe(){let e=w.muted||w.volume===0;H.innerHTML=e?z.muted:z.volume,H.setAttribute(`aria-label`,e?`Unmute`:`Mute`),H.setAttribute(`aria-pressed`,e?`true`:`false`),U.value=String(e?0:w.volume)}function Ie(){W.textContent=`${String(w.playbackRate)}\xD7`,W.setAttribute(`aria-label`,`Playback speed, ${String(w.playbackRate)} times`)}function Le(){if(G.hidden=ke.length<2||!J?.setLevel,G.hidden)return;let e=J?.currentLevel?.()??-1,t=ke.find(t=>t.index===e);G.textContent=e===-1?`Auto`:t?.label??`Auto`}function Q(t=!0){e.classList.add(`pux-player--controls`),we&&clearTimeout(we),t&&(we=setTimeout(()=>{w.paused||e.classList.remove(`pux-player--controls`)},p.hideAfterMs))}function Re(){Ye?.playing||(w.paused||w.ended?w.play().catch(()=>void 0):w.pause())}function $(e){if(C)return;let t=Number.isFinite(w.duration)?w.duration:1/0;w.currentTime=Math.min(t,Math.max(0,w.currentTime+e)),Z(),Q()}function ze(e){C||!Number.isFinite(w.duration)||w.duration<=0||(w.currentTime=Math.min(1,Math.max(0,e))*w.duration,Z())}function Be(e){let t=se.getBoundingClientRect();return t.width===0?0:(e-t.left)/t.width}function Ve(e){let t=fe[(fe.indexOf(w.playbackRate)+e+fe.length)%fe.length]??1;w.playbackRate=t}function He(){if(!J?.setLevel)return;let e=[-1,...ke.map(e=>e.index)],t=J.currentLevel?.()??-1,n=e[(e.indexOf(t)+1)%e.length]??-1;J.setLevel(n),Le(),Q()}async function Ue(){try{if(document.fullscreenElement){await document.exitFullscreen();return}await e.requestFullscreen()}catch{w.webkitEnterFullscreen?.()}}async function We(){try{document.pictureInPictureElement?await document.exitPictureInPicture():w instanceof HTMLVideoElement&&await w.requestPictureInPicture()}catch{X(`Picture in picture is not available here.`)}}async function Ge(){if(!s)return;let e=Math.floor(w.currentTime),t=s(e);try{await navigator.clipboard.writeText(t),X(`Link copied, starting at ${S(e)}.`)}catch{X(t)}}Y(w,`loadedmetadata`,()=>{if(Ne(),Z(),C)return;let e=typeof o==`number`&&o>0?o:null;if(e!==null&&Number.isFinite(w.duration)&&e<w.duration){w.currentTime=e;return}if(!r)return;let t=ee(r,c);x(t,w.duration)&&t&&(w.currentTime=t.t,X(`Resumed at ${S(t.t)}.`,{label:`Start over`,run:()=>{w.currentTime=0,v(r,c)}}))});function Ke(){!C&&r&&Number.isFinite(w.duration)&&w.duration>0&&!w.ended&&_(r,{t:w.currentTime,d:w.duration},c,u)}Y(w,`timeupdate`,()=>{De||Z(),!(u()-Ee<pe)&&(Ee=u(),Ke())}),Y(w,`progress`,Z),Y(w,`seeked`,Z),Y(w,`seeking`,Z),Y(w,`durationchange`,Ne),Y(w,`play`,Pe),Y(w,`pause`,()=>{Pe(),Ke()}),Y(w,`ended`,()=>{Pe(),r&&v(r,c)}),Y(w,`volumechange`,()=>{Fe(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`ratechange`,()=>{Ie(),h({volume:w.volume,muted:w.muted,rate:w.playbackRate},c)}),Y(w,`waiting`,()=>e.classList.add(`pux-player--buffering`)),Y(w,`playing`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`canplay`,()=>e.classList.remove(`pux-player--buffering`)),Y(w,`error`,()=>{e.classList.remove(`pux-player--buffering`),e.classList.add(`pux-player--failed`),X(me(w))}),Y(T,`click`,Re),Y(L,`click`,Re),Y(le,`click`,()=>{$(-R)}),Y(ue,`click`,()=>{$(R)}),Y(H,`click`,()=>{w.muted=!w.muted}),Y(U,`input`,()=>{w.volume=Number(U.value),w.muted=Number(U.value)===0}),Y(W,`click`,()=>{Ve(1)}),Y(G,`click`,He),Y(be,`click`,()=>void Ge()),Y(K,`click`,()=>void We()),Y(q,`click`,()=>void Ue()),Y(document,`fullscreenchange`,()=>{let t=document.fullscreenElement===e;e.classList.toggle(`pux-player--fullscreen`,t),q.innerHTML=t?z.exitFullscreen:z.enterFullscreen,q.setAttribute(`aria-label`,t?`Exit fullscreen`:`Fullscreen`)}),Y(j,`pointerdown`,e=>{let t=e;De=!0,j.setPointerCapture(t.pointerId),ze(Be(t.clientX))}),Y(j,`pointermove`,e=>{let t=Be(e.clientX);Number.isFinite(w.duration)&&w.duration>0&&(F.textContent=S(Math.max(0,Math.min(1,t))*w.duration),F.style.left=`${String(Math.max(0,Math.min(1,t))*100)}%`),De&&ze(t)});let qe=e=>{if(!De)return;De=!1;let t=e;j.hasPointerCapture(t.pointerId)&&j.releasePointerCapture(t.pointerId)};Y(j,`pointerup`,qe),Y(j,`pointercancel`,qe),Y(e,`pointermove`,()=>{Q()}),Y(e,`pointerleave`,()=>{w.paused||e.classList.remove(`pux-player--controls`)}),Y(e,`focusin`,()=>{Q()}),Y(e,`keydown`,e=>{let t=e.key,n=e.target,r=n?I.contains(n):!1;if(!(r&&[`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(t)))switch(t){case` `:case`k`:case`Enter`:if(t===`Enter`&&n?.closest(`button`))return;e.preventDefault(),Re();break;case`ArrowLeft`:e.preventDefault(),$(-p.seekStep);break;case`ArrowRight`:e.preventDefault(),$(p.seekStep);break;case`j`:$(-R);break;case`l`:$(R);break;case`ArrowUp`:e.preventDefault(),w.volume=Math.min(1,w.volume+.1),w.muted=!1,Q();break;case`ArrowDown`:e.preventDefault(),w.volume=Math.max(0,w.volume-.1),Q();break;case`m`:w.muted=!w.muted,Q();break;case`f`:q.hidden||Ue();break;case`p`:K.hidden||We();break;case`Home`:e.preventDefault(),C||(w.currentTime=0);break;case`End`:e.preventDefault(),!C&&Number.isFinite(w.duration)&&(w.currentTime=w.duration);break;case`<`:case`,`:C||(Ve(-1),Q());break;case`>`:case`.`:C||(Ve(1),Q());break;default:/^[0-9]$/.test(t)&&!r&&!C&&(e.preventDefault(),ze(Number(t)/10))}}),Y(window,`pagehide`,Ke);let Je=m(c);w.volume=Je.volume,w.muted=t.autoplay?!0:Je.muted,w.playbackRate=Je.rate===0?l.rate:Je.rate,je(),Pe(),Fe(),Ie(),Z(),Ne(),Q(!1),y.unplayable&&(e.classList.add(`pux-player--failed`),X(y.unplayable));let Ye=t.ads?de(e,w,t.ads,u):null,Xe=Ze();async function Ze(){if(!y.unplayable)try{let r=await oe(w,{src:n,...t.kind?{kind:t.kind}:{},...t.mimeType?{mimeType:t.mimeType}:{},live:C,isTv:f,capabilities:g,withCredentials:t.withCredentials??!1,...t.headers?{headers:t.headers}:{},unplayableAdvice:t.unplayableAdvice??``,...t.engines?{engines:t.engines}:{},onError:t=>{e.classList.add(`pux-player--failed`),X(t)},onNotice:e=>{e===null?Ae():X(e)},onReady:e=>{Oe||(e.live!==C&&(C=e.live,je(),Ne()),ke=e.levels,Le())}});if(J=r,Oe){r.destroy(),J=null;return}Le(),t.autoplay&&w.play().catch(()=>void 0)}catch{e.classList.add(`pux-player--failed`),X(`The player could not be loaded. Please reload the page.`)}}return{media:w,destroy(){if(!Oe){Oe=!0,Ke(),Ye?.destroy(),we&&clearTimeout(we),Te&&clearTimeout(Te);for(let e of Ce)e();Xe.then(()=>{J?.destroy(),J=null}),T.remove(),E.remove(),O.remove(),A.remove(),t.media||w.remove(),e.classList.remove(`pux-player`,`pux-player--tv`,`pux-player--audio`,`pux-player--live`,`pux-player--controls`,`pux-player--playing`,`pux-player--ended`,`pux-player--buffering`,`pux-player--failed`,`pux-player--fullscreen`)}},setChapters(e){Se=e,Ne()}}}export{S as a,r as c,k as i,oe as n,w as o,he as r,C as s,de as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./main-
|
|
1
|
+
import{t as e}from"./main-DaqdNlZC.js";var t={...e,"No parties live right now.":`Právě neprobíhají žádné párty.`,"Could not refresh parties.":`Párty se nepodařilo aktualizovat.`,"Pick a server in the directory, or paste its link here.":`Vyberte server v seznamu nebo sem vložte jeho odkaz.`,"Interface language":`Jazyk rozhraní`,Language:`Jazyk`,"Translation language":`Jazyk překladu`,"Original (auto-detect)":`Původní (automatické rozpoznání)`,Play:`Přehrát`,Pause:`Pozastavit`,Stop:`Zastavit`,Next:`Další`,Previous:`Předchozí`,Select:`Vybrat`,"Next/Prev":`Další/Předchozí`,Quit:`Ukončit`,"Now Playing":`Právě hraje`,"Spectrum Analyser":`Spektrální analyzátor`,Playlist:`Seznam skladeb`,Files:`Soubory`,"Open files":`Otevřít soubory`,"Open folder":`Otevřít složku`,"Add to library":`Přidat do knihovny`,"Replace playlist":`Nahradit seznam`,Filter:`Filtrovat`,Search:`Hledat`,"Nothing loaded.":`Nic není načteno.`,"Empty.":`Prázdné.`,"Loading…":`Načítání…`,"Connecting…":`Připojování…`,Connected:`Připojeno`,"Not connected":`Nepřipojeno`,"No source":`Žádný zdroj`,Playing:`Přehrávání`,Stopped:`Zastaveno`,Volume:`Hlasitost`,Seek:`Pozice přehrávání`,"Full screen":`Celá obrazovka`,Download:`Stáhnout`,Share:`Sdílet`,Copy:`Kopírovat`,"Copy link":`Kopírovat odkaz`,Copied:`Zkopírováno`,Save:`Uložit`,Cancel:`Zrušit`,Close:`Zavřít`,Remove:`Odebrat`,Delete:`Smazat`,Edit:`Upravit`,Add:`Přidat`,Send:`Odeslat`,Retry:`Zkusit znovu`,Back:`Zpět`,"Next page":`Další stránka`,"Previous page":`Předchozí stránka`,"Show more":`Zobrazit více`,Panels:`Panely`,"Reset layout":`Obnovit rozložení`,Show:`Zobrazit`,Hide:`Skrýt`,Collapse:`Sbalit`,Expand:`Rozbalit`,"Move up":`Nahoru`,"Move down":`Dolů`,Install:`Nainstalovat`,"TV mode":`Režim TV`,On:`Zapnuto`,Off:`Vypnuto`,Account:`Účet`,"Sign in":`Přihlásit se`,"Sign out":`Odhlásit se`,"Create account":`Vytvořit účet`,Email:`E-mail`,Password:`Heslo`,"Forgot password?":`Zapomenuté heslo?`,"Welcome back":`Vítejte zpět`,Profile:`Profil`,Handle:`Uživatelské jméno`,"Your servers":`Vaše servery`,Server:`Server`,Connect:`Připojit`,Disconnect:`Odpojit`,Directory:`Adresář`,Favourites:`Oblíbené`,Follow:`Sledovat`,Unfollow:`Přestat sledovat`,Notifications:`Oznámení`,"Phone number":`Telefonní číslo`,"Save number":`Uložit číslo`,Transcript:`Přepis`,Captions:`Titulky`,"Translate audio":`Překládat zvuk`,"Audio language":`Jazyk zvuku`,"Audio options":`Možnosti zvuku`,"Keep background sound":`Zachovat zvuk na pozadí`,"Background level":`Hlasitost pozadí`,"Speaker voices":`Hlasy mluvčích`,"Any voice":`Libovolný hlas`,"Male voice":`Mužský hlas`,"Female voice":`Ženský hlas`,"Original audio.":`Původní zvuk.`,"Buy translated audio":`Koupit překlad zvuku`,"Audio credit":`Zvukový kredit`,"Buy pass":`Koupit přístup`,Pass:`Přístup`,"Pay with":`Zaplatit pomocí`,"Check payment":`Ověřit platbu`,"Open checkout":`Přejít k platbě`,"Free sessions":`Bezplatné relace`,"Usage rates and expiry":`Ceny a platnost`,Catalogs:`Katalogy`,"Add catalog":`Přidat katalog`,"Catalog name":`Název katalogu`,Link:`Odkaz`,"Play link":`Přehrát odkaz`,"Go live":`Vysílat živě`,Publish:`Zveřejnit`,Listen:`Poslouchat`,"Live now":`Právě živě`,Upcoming:`Připravované`,Parties:`Společná sledování`,"Join party":`Připojit se ke sledování`,"Invite code":`Kód pozvánky`,Invite:`Pozvat`,Chat:`Chat`,"Chat message":`Zpráva chatu`,People:`Lidé`,Speaker:`Mluvčí`,Speakers:`Mluvčí`,Listener:`Posluchač`,Moderator:`Moderátor`,"Raise hand":`Zvednout ruku`,"Hand raises":`Zvednuté ruce`,Questions:`Otázky`,Resources:`Materiály`,Replay:`Záznam`,Schedule:`Rozvrh`,Event:`Událost`,Host:`Pořadatel`,About:`O události`,Stage:`Pódium`,Title:`Název`,Description:`Popis`,Topic:`Téma`,Public:`Veřejné`,"Anyone with the link":`Kdokoli s odkazem`,"Invited people":`Pozvané osoby`,"Who can join":`Kdo se může připojit`,"Date and time":`Datum a čas`,"Expected length":`Očekávaná délka`,Repeat:`Opakovat`,"Does not repeat":`Neopakuje se`,"Every day":`Každý den`,"Every week":`Každý týden`,Homepage:`Webové stránky`,"Host name":`Jméno pořadatele`,"Profile photo URL":`URL profilové fotky`,"Broadcast link":`Odkaz na vysílání`,"Edit event":`Upravit událost`,"Save changes":`Uložit změny`,"Create live":`Vytvořit vysílání`,"Schedule class":`Naplánovat lekci`,"Start class":`Zahájit lekci`,"End event":`Ukončit událost`,"End session":`Ukončit relaci`,"Session ended":`Relace ukončena`,"Event ended":`Událost ukončena`,Cancelled:`Zrušeno`,"Replay available":`Záznam je k dispozici`,Join:`Připojit se`,"Create invite":`Vytvořit pozvánku`,"Invite as":`Pozvat jako`,"Watch now":`Sledovat nyní`,"Start a room":`Vytvořit místnost`,"Recent replays":`Nedávné záznamy`,"Your account":`Váš účet`,"Write with AI":`Psát pomocí AI`,"Suggested title":`Navrhovaný název`,"Suggested description":`Navrhovaný popis`,"Suggested topic":`Navrhované téma`,"Use these details":`Použít tyto údaje`,"Learn something live.":`Učte se naživo.`,"Screen share":`Sdílet obrazovku`,"Upload and broadcast":`Nahrát a vysílat`,Help:`Nápověda`,"Reload Player":`Znovu načíst přehrávač`,"Copy Bundled CLI Path":`Kopírovat cestu k přibalenému CLI`,"Developer tools":`Vývojářské nástroje`,Undo:`Zpět`,Redo:`Znovu`,Cut:`Vyjmout`,Paste:`Vložit`,"Select all":`Vybrat vše`,Status:`Stav`,"Activity log":`Protokol aktivit`,Admin:`Správa`,"Playback controls":`Ovládání přehrávání`,"Tracks and folders":`Skladby a složky`,"Original-language captions.":`Titulky v původním jazyce.`,"Skip to playback controls":`Přejít k ovládání přehrávání`,"Skip to playlist":`Přejít k seznamu skladeb`,"Skip to transcript and translated audio":`Přejít k přepisu a přeloženému zvuku`};export{t as default};
|