prismcast 1.7.0 → 1.9.0
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/README.md +6 -6
- package/dist/app.js +24 -13
- package/dist/app.js.map +1 -1
- package/dist/browser/cdp.d.ts +4 -6
- package/dist/browser/cdp.js +13 -17
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/index.js +3 -3
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/login.js +11 -8
- package/dist/browser/login.js.map +1 -1
- package/dist/browser/precaching.d.ts +1 -1
- package/dist/browser/precaching.js +23 -23
- package/dist/browser/precaching.js.map +1 -1
- package/dist/browser/tuning/directv.js +4 -7
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.js +1 -1
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.js +1 -1
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.js +3 -3
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/sling.js +2 -2
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/channels/index.d.ts +2 -0
- package/dist/channels/index.js +438 -252
- package/dist/channels/index.js.map +1 -1
- package/dist/config/health.d.ts +3 -3
- package/dist/config/health.js +13 -18
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.js +11 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/persistence.d.ts +59 -0
- package/dist/config/persistence.js +127 -0
- package/dist/config/persistence.js.map +1 -0
- package/dist/config/profiles.js +10 -10
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/servicePacks.d.ts +46 -0
- package/dist/config/{providerPacks.js → servicePacks.js} +28 -31
- package/dist/config/servicePacks.js.map +1 -0
- package/dist/config/services.d.ts +202 -0
- package/dist/config/services.js +758 -0
- package/dist/config/services.js.map +1 -0
- package/dist/config/sites.js +61 -61
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +89 -27
- package/dist/config/userChannels.js +400 -184
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +13 -9
- package/dist/config/userConfig.js +78 -60
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +31 -15
- package/dist/config/userProfiles.js +154 -123
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.d.ts +1 -1
- package/dist/hdhr/channelMap.js +4 -7
- package/dist/hdhr/channelMap.js.map +1 -1
- package/dist/hdhr/discover.js +7 -15
- package/dist/hdhr/discover.js.map +1 -1
- package/dist/hdhr/index.js +6 -9
- package/dist/hdhr/index.js.map +1 -1
- package/dist/native/index.d.ts +2 -2
- package/dist/native/index.js +17 -27
- package/dist/native/index.js.map +1 -1
- package/dist/native/intercept.js +86 -89
- package/dist/native/intercept.js.map +1 -1
- package/dist/native/probe.js +2 -2
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +2 -2
- package/dist/native/proxy.js +4 -4
- package/dist/native/proxy.js.map +1 -1
- package/dist/routes/assets.js +29 -51
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/auth.js +3 -3
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/channels.js +5 -11
- package/dist/routes/channels.js.map +1 -1
- package/dist/routes/components.d.ts +0 -8
- package/dist/routes/components.js +0 -19
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/index.d.ts +1 -1
- package/dist/routes/config/channels/index.js +1 -1
- package/dist/routes/config/channels/index.js.map +1 -1
- package/dist/routes/config/channels/routes.js +748 -420
- package/dist/routes/config/channels/routes.js.map +1 -1
- package/dist/routes/config/channels/table.d.ts +21 -6
- package/dist/routes/config/channels/table.js +456 -193
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/index.d.ts +2 -2
- package/dist/routes/config/index.js +3 -3
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/{providers.js → services.js} +47 -42
- package/dist/routes/config/services.js.map +1 -0
- package/dist/routes/config/settings.js +88 -49
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.js +5 -7
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/health.js +1 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/icons.d.ts +16 -0
- package/dist/routes/icons.js +44 -0
- package/dist/routes/icons.js.map +1 -0
- package/dist/routes/index.js +2 -2
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/logs.js +4 -4
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/playlist.d.ts +6 -4
- package/dist/routes/playlist.js +98 -45
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.js +94 -55
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/scripts/channels.js +620 -478
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/config.js +884 -964
- package/dist/routes/root/scripts/config.js.map +1 -1
- package/dist/routes/root/scripts/shared.js +468 -188
- package/dist/routes/root/scripts/shared.js.map +1 -1
- package/dist/routes/root/scripts/status.js +252 -207
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.js +57 -8
- package/dist/routes/root/styles.js.map +1 -1
- package/dist/routes/services.d.ts +6 -0
- package/dist/routes/{providers.js → services.js} +43 -43
- package/dist/routes/services.js.map +1 -0
- package/dist/routes/ui.d.ts +1 -1
- package/dist/routes/ui.js +3 -1
- package/dist/routes/ui.js.map +1 -1
- package/dist/service/commands.js +8 -43
- package/dist/service/commands.js.map +1 -1
- package/dist/service/generators.d.ts +1 -1
- package/dist/service/generators.js +143 -41
- package/dist/service/generators.js.map +1 -1
- package/dist/streaming/codec.d.ts +20 -0
- package/dist/streaming/codec.js +68 -0
- package/dist/streaming/codec.js.map +1 -0
- package/dist/streaming/fmp4Segmenter.d.ts +2 -2
- package/dist/streaming/fmp4Segmenter.js.map +1 -1
- package/dist/streaming/hls.d.ts +4 -4
- package/dist/streaming/hls.js +35 -29
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.js +3 -3
- package/dist/streaming/hlsResume.js.map +1 -1
- package/dist/streaming/monitor.d.ts +2 -2
- package/dist/streaming/monitor.js +19 -13
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/preroll.d.ts +15 -14
- package/dist/streaming/preroll.js +32 -12
- package/dist/streaming/preroll.js.map +1 -1
- package/dist/streaming/registry.d.ts +2 -2
- package/dist/streaming/registry.js +4 -8
- package/dist/streaming/registry.js.map +1 -1
- package/dist/streaming/setup.d.ts +4 -4
- package/dist/streaming/setup.js +28 -34
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.js +8 -10
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +4 -3
- package/dist/streaming/statusEmitter.js +3 -3
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +18 -11
- package/dist/types/config.d.ts +3 -2
- package/dist/types/index.d.ts +4 -3
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/profiles.d.ts +9 -9
- package/dist/types/selection.d.ts +1 -1
- package/dist/types/shared.d.ts +1 -1
- package/dist/types/streaming.d.ts +8 -16
- package/dist/types/streaming.js +5 -1
- package/dist/types/streaming.js.map +1 -1
- package/dist/upgrade/commands.js +1 -16
- package/dist/upgrade/commands.js.map +1 -1
- package/dist/utils/chromeFetch.js +1 -1
- package/dist/utils/cliOutput.d.ts +10 -0
- package/dist/utils/cliOutput.js +17 -0
- package/dist/utils/cliOutput.js.map +1 -0
- package/dist/utils/debugFilter.js +3 -3
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/fileLogger.js +4 -3
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +21 -4
- package/dist/utils/format.js +45 -7
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js +17 -27
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/morganStream.js +2 -2
- package/dist/utils/morganStream.js.map +1 -1
- package/dist/utils/platform.js +3 -2
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/retry.js +2 -4
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/streamContext.d.ts +7 -0
- package/dist/utils/streamContext.js +10 -1
- package/dist/utils/streamContext.js.map +1 -1
- package/dist/utils/version.js +4 -4
- package/dist/utils/version.js.map +1 -1
- package/package.json +5 -7
- package/dist/config/providerPacks.d.ts +0 -46
- package/dist/config/providerPacks.js.map +0 -1
- package/dist/config/providers.d.ts +0 -175
- package/dist/config/providers.js +0 -678
- package/dist/config/providers.js.map +0 -1
- package/dist/routes/config/providers.js.map +0 -1
- package/dist/routes/providers.d.ts +0 -6
- package/dist/routes/providers.js.map +0 -1
- /package/dist/routes/config/{providers.d.ts → services.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,oBAAoB;IAElC,OAAO;QACL,UAAU;QACV,+BAA+B;QAC/B,sBAAsB;QACtB,wBAAwB;QACxB,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/routes/root/scripts/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -252,9 +252,17 @@ export function generateLandingPageStyles() {
|
|
|
252
252
|
// Responsive: hide Key and all optional columns on phones.
|
|
253
253
|
"@media (max-width: 768px) { .channel-table .col-key, .channel-table td:nth-child(1), .channel-table th:nth-child(1) { display: none; } " +
|
|
254
254
|
OPTIONAL_COLUMNS.map((col) => ".channel-table ." + col.cssClass).join(", ") + " { display: none; } }",
|
|
255
|
-
// User channel row tinting to
|
|
255
|
+
// User-created channel row tinting. Applies only to pure user-created channels (no predefined baseline). Overrides of predefined channels use the
|
|
256
|
+
// .channel-override treatment below instead, matching the settings form's "modified from defaults" visual language.
|
|
256
257
|
".channel-table tr.user-channel { background: var(--user-channel-tint); }",
|
|
257
258
|
".channel-table tr.user-channel:hover { background: var(--user-channel-tint-hover); }",
|
|
259
|
+
// Predefined channel override indicator. Left-border accent + blue dot on the first cell matches the settings form's .form-group.modified treatment
|
|
260
|
+
// (border + dot = "modified from defaults"). The border targets td:first-child because border-collapse: separate prevents borders on <tr> elements. The
|
|
261
|
+
// dot is a ::before pseudo-element on the same cell so it's always the first visual element in the row, right next to the border. No background tint — the
|
|
262
|
+
// border and dot are the sole differentiators, exactly like modified settings.
|
|
263
|
+
".channel-table tr.channel-override td:first-child { border-left: 3px solid var(--interactive-primary); }",
|
|
264
|
+
".channel-table tr.channel-override td:first-child::before { content: ''; display: inline-block; width: 8px; height: 8px; " +
|
|
265
|
+
"background: var(--interactive-primary); border-radius: 50%; margin-right: 6px; vertical-align: middle; }",
|
|
258
266
|
// Disabled predefined channel row styling and hide-disabled toggle.
|
|
259
267
|
".channel-table tr.channel-disabled { opacity: 0.5; }",
|
|
260
268
|
".channel-table tr.channel-disabled td { color: var(--text-tertiary); }",
|
|
@@ -265,9 +273,52 @@ export function generateLandingPageStyles() {
|
|
|
265
273
|
".channel-table tr.channel-unavailable td { color: var(--text-tertiary); }",
|
|
266
274
|
".channel-table tr.channel-unavailable.channel-disabled { opacity: 0.5; }",
|
|
267
275
|
".channel-table.hide-disabled tr.channel-unavailable { display: none; }",
|
|
276
|
+
// Tag pills — rounded labels for tag display in the channel table, tag manager modal, and edit form. The pill shape provides clear visual identity and
|
|
277
|
+
// scannability across all surfaces where tags appear.
|
|
278
|
+
".tag-badge { display: inline-block; padding: 1px 7px; margin: 1px 2px; font-size: 11px; border-radius: 10px; " +
|
|
279
|
+
"background: var(--surface-elevated); border: 1px solid var(--border-default); color: var(--text-secondary); font-weight: 500; }",
|
|
280
|
+
".tag-badge-deleted { opacity: 0.5; text-decoration: line-through; }",
|
|
281
|
+
// Tag checkbox grid in the channel edit form. Each tag is a pill-styled checkbox label.
|
|
282
|
+
".tag-checkbox-grid { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }",
|
|
283
|
+
".tag-checkbox-label { cursor: pointer; display: inline-flex; align-items: center; gap: 3px; }",
|
|
284
|
+
".tag-checkbox-label input { margin: 0; }",
|
|
285
|
+
".tag-checkbox-label .tag-badge { cursor: pointer; }",
|
|
286
|
+
// Inline tag edit portal — shared dropdown portaled to <body> via JS. The td has the dropdown class so the document click handler recognizes it as a dropdown
|
|
287
|
+
// context. The display override preserves table-cell layout (the .dropdown class defaults to display: inline-block for div-based dropdowns).
|
|
288
|
+
"td.dropdown { display: table-cell; }",
|
|
289
|
+
".inline-tag-menu { min-width: 140px; }",
|
|
290
|
+
".tag-editable { cursor: pointer; }",
|
|
291
|
+
".tag-editable:hover { background: var(--surface-hover); }",
|
|
292
|
+
".tag-rename-input { font-size: 11px; padding: 1px 4px; border: 1px solid var(--interactive-primary); border-radius: 10px; " +
|
|
293
|
+
"outline: none; width: 120px; }",
|
|
294
|
+
// Tag manager modal — list of tags with add/delete/restore actions. Hint and error styling use shared wizard classes.
|
|
295
|
+
".tag-manager-add { display: flex; gap: 8px; margin-bottom: 8px; }",
|
|
296
|
+
".tag-manager-add input { flex: 1; padding: 4px 8px; font-size: 13px; border: 1px solid var(--form-input-border); border-radius: 4px; }",
|
|
297
|
+
".tag-manager-list { display: flex; flex-direction: column; gap: 4px; }",
|
|
298
|
+
".tag-manager-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; }",
|
|
299
|
+
".tag-manager-item .btn-icon { margin-left: auto; }",
|
|
300
|
+
".tag-manager-section-label { font-size: 11px; text-transform: uppercase; color: var(--text-tertiary); margin-top: 12px; margin-bottom: 4px; " +
|
|
301
|
+
"letter-spacing: 0.5px; }",
|
|
302
|
+
".tag-annotation { font-size: 10px; color: var(--text-tertiary); }",
|
|
303
|
+
// Tag column filter. Rows hidden by the tag filter are completely removed from view. This is a transient client-side filter, not a persistent setting.
|
|
304
|
+
".channel-table tr.tag-filtered { display: none; }",
|
|
305
|
+
// Tag filter dropdown button in the column header. Sized to sit inline with the column label.
|
|
306
|
+
".btn-tag-filter { padding: 0 3px; margin-left: 4px; vertical-align: middle; opacity: 0.6; }",
|
|
307
|
+
".btn-tag-filter svg { width: 12px; height: 12px; }",
|
|
308
|
+
".btn-tag-filter:hover { opacity: 1; }",
|
|
309
|
+
// Playlist hint icon. Appears next to the tag filter funnel when the filter is active, providing the corresponding playlist URL for Channels DVR.
|
|
310
|
+
".btn-playlist-hint { padding: 0 3px; margin-left: 2px; vertical-align: middle; opacity: 0.6; color: var(--accent); }",
|
|
311
|
+
".btn-playlist-hint svg { width: 12px; height: 12px; }",
|
|
312
|
+
".btn-playlist-hint:hover { opacity: 1; }",
|
|
313
|
+
".playlist-hint-content { padding: 10px 14px; max-width: 420px; }",
|
|
314
|
+
".playlist-hint-content p { margin: 0 0 8px; font-size: 12px; color: var(--text-secondary); line-height: 1.4; }",
|
|
315
|
+
".playlist-hint-url { display: flex; align-items: center; gap: 8px; }",
|
|
316
|
+
".playlist-hint-url code { flex: 1; font-size: 12px; padding: 5px 8px; background: var(--surface-sunken); border: 1px solid var(--border-default); " +
|
|
317
|
+
"border-radius: var(--radius-sm); word-break: break-all; color: var(--text-primary); }",
|
|
318
|
+
// Quick Actions tag section label.
|
|
319
|
+
".quick-action-section-label { font-size: 11px; text-transform: uppercase; color: var(--text-tertiary); padding: 4px 12px 2px; letter-spacing: 0.5px; }",
|
|
268
320
|
// Inline editable cells. Cursor and hover indicate clickability. The inline input replaces the cell content during editing.
|
|
269
321
|
".editable-cell { cursor: pointer; }",
|
|
270
|
-
".editable-cell:hover { background: var(--surface-hover); }",
|
|
271
322
|
".editable-cell input.inline-edit { width: 100%; padding: 2px 4px; font-size: 13px; border: 1px solid var(--interactive-primary); " +
|
|
272
323
|
"border-radius: 3px; outline: none; background: var(--form-input-bg); color: var(--text-primary); box-sizing: border-box; }",
|
|
273
324
|
".no-provider-label { color: var(--text-tertiary); font-size: 12px; }",
|
|
@@ -275,7 +326,6 @@ export function generateLandingPageStyles() {
|
|
|
275
326
|
// Provider filter toolbar layout.
|
|
276
327
|
".provider-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 10px; }",
|
|
277
328
|
".provider-toolbar .toolbar-group { display: flex; align-items: center; gap: 6px; }",
|
|
278
|
-
".provider-toolbar .toolbar-label { font-size: 13px; color: var(--text-secondary); white-space: nowrap; }",
|
|
279
329
|
// Provider dropdown multi-select.
|
|
280
330
|
".provider-dropdown-menu { min-width: 200px; max-height: 70vh; overflow-y: auto; }",
|
|
281
331
|
".provider-option { display: flex; align-items: center; gap: 6px; padding: 5px 12px; font-size: 13px; cursor: pointer; color: var(--text-primary); }",
|
|
@@ -325,15 +375,15 @@ export function generateLandingPageStyles() {
|
|
|
325
375
|
// JS tooltip styling. The tooltip element is appended to <body> and positioned via getBoundingClientRect() so it's immune to overflow and stacking contexts.
|
|
326
376
|
// Only activated when the primary input can't hover (hover: none), targeting iPadOS where Safari doesn't show native title tooltips. On pure-touch
|
|
327
377
|
// devices without a trackpad, the JS loads but mouseenter never fires so the tooltip stays hidden. Desktop (hover: hover) skips initialization entirely.
|
|
328
|
-
".btn-icon-tooltip { position:
|
|
378
|
+
".btn-icon-tooltip { position: absolute; padding: 4px 8px; border-radius: var(--radius-sm); background: var(--surface-overlay); color: var(--text-primary); ",
|
|
329
379
|
"font-size: 12px; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity 0.5s; z-index: 10000; ",
|
|
330
380
|
"box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); }",
|
|
331
381
|
".btn-icon-tooltip.visible { opacity: 1; transition: opacity 0.1s; }",
|
|
332
382
|
// Channel toolbar with dropdown menus. Each dropdown button has an inline SVG icon + label + chevron.
|
|
333
383
|
".channel-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 10px; margin-bottom: 10px; }",
|
|
334
384
|
".channel-toolbar .toolbar-group { display: flex; align-items: center; gap: 6px; }",
|
|
335
|
-
".toolbar-
|
|
336
|
-
".toolbar-
|
|
385
|
+
".toolbar-icon-btn { display: inline-flex; align-items: center; gap: 5px; }",
|
|
386
|
+
".toolbar-icon-btn svg { flex-shrink: 0; vertical-align: middle; }",
|
|
337
387
|
".channel-summary { text-align: center; font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; }",
|
|
338
388
|
// Dropdown menu used by the Import button in the channel toolbar.
|
|
339
389
|
".dropdown { position: relative; display: inline-block; }",
|
|
@@ -391,7 +441,7 @@ export function generateLandingPageStyles() {
|
|
|
391
441
|
// Other landing page styles.
|
|
392
442
|
".endpoint code { font-size: 13px; }",
|
|
393
443
|
// Modified value indicator styling.
|
|
394
|
-
".form-group.modified { border-left: 3px solid var(--interactive-primary); padding-left: 12px; }",
|
|
444
|
+
".form-group.modified, .form-row.modified { border-left: 3px solid var(--interactive-primary); padding-left: 12px; }",
|
|
395
445
|
".modified-dot { display: inline-block; width: 8px; height: 8px; background: var(--interactive-primary); border-radius: 50%; margin-right: 6px; ",
|
|
396
446
|
"vertical-align: middle; }",
|
|
397
447
|
// Per-setting reset button styling.
|
|
@@ -466,7 +516,6 @@ export function generateLandingPageStyles() {
|
|
|
466
516
|
".btn-copy-inline { background: var(--surface-elevated); border: 1px solid var(--border-default); padding: 2px 8px; font-size: 12px; ",
|
|
467
517
|
"border-radius: var(--radius-sm); cursor: pointer; color: var(--text-secondary); margin-left: 6px; vertical-align: middle; }",
|
|
468
518
|
".btn-copy-inline:hover { background: var(--surface-hover); color: var(--text-primary); }",
|
|
469
|
-
".copy-feedback-inline { color: var(--stream-healthy); font-size: 12px; margin-left: 8px; display: none; }",
|
|
470
519
|
// Version display styles.
|
|
471
520
|
".version-container { display: inline-flex; align-items: center; gap: 6px; }",
|
|
472
521
|
".version { font-size: 13px; color: var(--text-muted); font-weight: 400; text-decoration: none; transition: color 0.2s; }",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/routes/root/styles.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/routes/root/styles.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { getChannelListing, getChannelLogo, isPredefinedChannel } from "../config/userChannels.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getChannelServiceLabel, getResolvedChannel, getServiceGroup, getServiceTagForChannel, isServiceTagEnabled, resolveServiceKey } from "../config/services.js";
|
|
3
3
|
import { getCurrentBrowser, minimizeBrowserWindow, registerManagedPage, unregisterManagedPage } from "../browser/index.js";
|
|
4
4
|
import { getProviderBySlug, normalizeChannelName } from "../browser/channelSelection.js";
|
|
5
5
|
import { CONFIG } from "../config/index.js";
|
|
6
6
|
import { LOG } from "../utils/index.js";
|
|
7
|
-
/* The
|
|
8
|
-
* navigates to the
|
|
9
|
-
* page is always closed in a finally block to prevent resource leaks. Concurrent requests for the same
|
|
7
|
+
/* The services endpoint exposes channel discovery for each registered service. A GET request to /services/:slug/channels creates a temporary browser page,
|
|
8
|
+
* navigates to the service's guide, runs the service's discoverChannels implementation, and returns a sorted JSON array of discovered channels. The temporary
|
|
9
|
+
* page is always closed in a finally block to prevent resource leaks. Concurrent requests for the same service are coalesced — only one discovery walk runs at a
|
|
10
10
|
* time, and subsequent requests piggyback on the in-flight result. A refresh=true request aborts any in-flight discovery and starts fresh.
|
|
11
11
|
*/
|
|
12
12
|
// Sentinel error used to identify aborted discoveries in the retry loop. Distinguishes abort rejections from genuine discovery failures so the loop only retries
|
|
@@ -21,7 +21,7 @@ const inflight = new Map();
|
|
|
21
21
|
/**
|
|
22
22
|
* Logs a discovery failure and sends a 500 error response.
|
|
23
23
|
* @param res - The Express response object.
|
|
24
|
-
* @param label - The
|
|
24
|
+
* @param label - The service's display label for log messages.
|
|
25
25
|
* @param error - The error that caused the failure.
|
|
26
26
|
*/
|
|
27
27
|
function sendDiscoveryError(res, label, error) {
|
|
@@ -30,7 +30,7 @@ function sendDiscoveryError(res, label, error) {
|
|
|
30
30
|
res.status(500).json({ error: "Channel discovery failed: " + message + "." });
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* Runs
|
|
33
|
+
* Runs service channel discovery in a temporary browser page. Opens a new page, navigates to the service's guide URL, runs the discovery function, and returns
|
|
34
34
|
* the sorted results. The page is always closed in a finally block. If the abort signal fires (from a refresh=true request), the page is closed mid-discovery,
|
|
35
35
|
* causing Puppeteer operations to throw and the promise to reject with a DiscoveryAbortError.
|
|
36
36
|
* @param provider - The provider module to discover channels for.
|
|
@@ -59,8 +59,8 @@ async function runDiscovery(provider, signal) {
|
|
|
59
59
|
if (signal.aborted) {
|
|
60
60
|
throw new DiscoveryAbortError();
|
|
61
61
|
}
|
|
62
|
-
// Navigate to the
|
|
63
|
-
// We use networkidle2 rather than load because SPA-based
|
|
62
|
+
// Navigate to the service's guide URL unless the provider handles its own navigation (e.g., Hulu and Sling set up response interception before navigating).
|
|
63
|
+
// We use networkidle2 rather than load because SPA-based services (e.g., Hulu) have heavy async initialization that can prevent the load event from firing
|
|
64
64
|
// reliably. Network idle ensures all initial API data has arrived before the discovery function reads the DOM.
|
|
65
65
|
if (!provider.handlesOwnNavigation) {
|
|
66
66
|
await page.goto(provider.guideUrl, { timeout: CONFIG.streaming.navigationTimeout, waitUntil: "networkidle2" });
|
|
@@ -94,28 +94,28 @@ async function runDiscovery(provider, signal) {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* Annotates discovered channels with lineup state by matching each channel's channelSelector against the
|
|
98
|
-
* uses the existing
|
|
97
|
+
* Annotates discovered channels with lineup state by matching each channel's channelSelector against the service variants for the browsed service. This
|
|
98
|
+
* uses the existing service group system to find which canonical channel each discovered channel corresponds to, avoiding fragile name-to-key normalization
|
|
99
99
|
* (predefined keys are hand-crafted and may not match generateChannelKey output).
|
|
100
100
|
*
|
|
101
|
-
* For each canonical in the listing, we check for a variant matching the browsed
|
|
101
|
+
* For each canonical in the listing, we check for a variant matching the browsed service (via getServiceGroup) and extract its channelSelector via
|
|
102
102
|
* getResolvedChannel. This builds a channelSelector → lineup state map that the discovered channels are matched against.
|
|
103
103
|
*
|
|
104
|
-
* @param channels - The raw discovered channels from the
|
|
105
|
-
* @param
|
|
104
|
+
* @param channels - The raw discovered channels from the service.
|
|
105
|
+
* @param serviceSlug - The slug of the service being browsed (e.g., "spectrum", "hulu").
|
|
106
106
|
* @returns Annotated channels with lineup state where applicable.
|
|
107
107
|
*/
|
|
108
|
-
function annotateWithLineupState(channels,
|
|
109
|
-
// Build a channelSelector → lineup state mapping for the browsed
|
|
110
|
-
// to this
|
|
108
|
+
function annotateWithLineupState(channels, serviceSlug) {
|
|
109
|
+
// Build a channelSelector → lineup state mapping for the browsed service. For each canonical entry in the listing, we find the variant that corresponds
|
|
110
|
+
// to this service (if one exists) and index by that variant's channelSelector. This ensures matching works even when predefined keys don't match the
|
|
111
111
|
// normalized channel name (e.g., "axstv" vs generateChannelKey("AXS TV") → "axs-tv").
|
|
112
112
|
//
|
|
113
|
-
// When two canonicals share the same channelSelector for a
|
|
113
|
+
// When two canonicals share the same channelSelector for a service (East/Pacific pairs like "Disney Channel"), the map stores an array of states. The
|
|
114
114
|
// annotation step then uses the discovery entry's stationId to disambiguate which canonical to assign.
|
|
115
115
|
const listing = getChannelListing();
|
|
116
116
|
const bySelector = new Map();
|
|
117
117
|
// Appends a lineup state to the map under the normalized key. Normalization (lowercase, collapsed whitespace) ensures matching is resilient to casing
|
|
118
|
-
// differences between predefined channelSelectors and
|
|
118
|
+
// differences between predefined channelSelectors and service discovery output (e.g., "Cartoon Network (East)" vs "cartoon network (east)").
|
|
119
119
|
function indexState(key, state) {
|
|
120
120
|
const normalized = normalizeChannelName(key);
|
|
121
121
|
const existing = bySelector.get(normalized);
|
|
@@ -128,35 +128,35 @@ function annotateWithLineupState(channels, providerSlug) {
|
|
|
128
128
|
}
|
|
129
129
|
for (const entry of listing) {
|
|
130
130
|
const canonicalKey = entry.key;
|
|
131
|
-
const resolvedKey =
|
|
132
|
-
const currentTag =
|
|
133
|
-
const
|
|
131
|
+
const resolvedKey = resolveServiceKey(canonicalKey);
|
|
132
|
+
const currentTag = getServiceTagForChannel(resolvedKey);
|
|
133
|
+
const currentService = getChannelServiceLabel(entry.channel);
|
|
134
134
|
const displayName = entry.channel.name ?? canonicalKey;
|
|
135
135
|
const source = isPredefinedChannel(canonicalKey) ? "predefined" : "user";
|
|
136
|
-
// Check the
|
|
137
|
-
const group =
|
|
138
|
-
// Determine whether the channel has at least one enabled
|
|
139
|
-
// the group's variants. This uses the existing
|
|
140
|
-
const canonicalTag =
|
|
141
|
-
let hasAlternatives = (canonicalTag !==
|
|
136
|
+
// Check the service group for variants. Used both for channelSelector matching and for computing hasAlternatives.
|
|
137
|
+
const group = getServiceGroup(canonicalKey);
|
|
138
|
+
// Determine whether the channel has at least one enabled service besides the browsed service. Check the canonical's own tag first, then iterate
|
|
139
|
+
// the group's variants. This uses the existing service tag and filter infrastructure.
|
|
140
|
+
const canonicalTag = getServiceTagForChannel(canonicalKey);
|
|
141
|
+
let hasAlternatives = (canonicalTag !== serviceSlug) && isServiceTagEnabled(canonicalTag);
|
|
142
142
|
if (!hasAlternatives && group) {
|
|
143
143
|
for (const variant of group.variants) {
|
|
144
|
-
const variantTag =
|
|
145
|
-
if ((variantTag !==
|
|
144
|
+
const variantTag = getServiceTagForChannel(variant.key);
|
|
145
|
+
if ((variantTag !== serviceSlug) && isServiceTagEnabled(variantTag)) {
|
|
146
146
|
hasAlternatives = true;
|
|
147
147
|
break;
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
const state = {
|
|
152
|
-
canonicalKey,
|
|
152
|
+
canonicalKey, currentService, currentTag, displayName, enabled: entry.enabled, hasAlternatives,
|
|
153
153
|
logoUrl: getChannelLogo(canonicalKey),
|
|
154
154
|
source, stationId: entry.channel.stationId
|
|
155
155
|
};
|
|
156
|
-
// Find the variant matching the browsed
|
|
156
|
+
// Find the variant matching the browsed service and store by its channelSelector.
|
|
157
157
|
if (group) {
|
|
158
158
|
for (const variant of group.variants) {
|
|
159
|
-
if (
|
|
159
|
+
if (getServiceTagForChannel(variant.key) === serviceSlug) {
|
|
160
160
|
const variantChannel = getResolvedChannel(variant.key);
|
|
161
161
|
if (variantChannel?.channelSelector) {
|
|
162
162
|
indexState(variantChannel.channelSelector, state);
|
|
@@ -165,8 +165,8 @@ function annotateWithLineupState(channels, providerSlug) {
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
|
-
// Also match the canonical itself if its
|
|
169
|
-
if ((currentTag ===
|
|
168
|
+
// Also match the canonical itself if its service tag matches (single-service channels or canonicals that point directly to this service).
|
|
169
|
+
if ((currentTag === serviceSlug) && entry.channel.channelSelector) {
|
|
170
170
|
indexState(entry.channel.channelSelector, state);
|
|
171
171
|
}
|
|
172
172
|
// Index by display name when it differs from the channelSelector, so discovered channels whose names don't match any predefined channelSelector can still
|
|
@@ -176,7 +176,7 @@ function annotateWithLineupState(channels, providerSlug) {
|
|
|
176
176
|
indexState(displayName, state);
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
-
// Annotate each discovered channel by matching its channelSelector against the
|
|
179
|
+
// Annotate each discovered channel by matching its channelSelector against the service-specific lookup. When the channelSelector doesn't match (e.g.,
|
|
180
180
|
// Xfinity uses callSigns like "ESPND" while predefined variants use display names like "ESPN"), the display name is tried as a fallback. When multiple
|
|
181
181
|
// canonicals share the same key (East/Pacific pairs), the discovery entry's stationId disambiguates which canonical to assign.
|
|
182
182
|
return channels.map((ch) => {
|
|
@@ -194,18 +194,18 @@ function annotateWithLineupState(channels, providerSlug) {
|
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
196
|
/**
|
|
197
|
-
* Creates the
|
|
197
|
+
* Creates the service channel discovery endpoint.
|
|
198
198
|
* @param app - The Express application.
|
|
199
199
|
*/
|
|
200
|
-
export function
|
|
201
|
-
app.get("/
|
|
200
|
+
export function setupServicesEndpoint(app) {
|
|
201
|
+
app.get("/services/:slug/channels", async (req, res) => {
|
|
202
202
|
const slug = req.params.slug;
|
|
203
203
|
const provider = getProviderBySlug(slug);
|
|
204
204
|
if (!provider) {
|
|
205
|
-
res.status(404).json({ error: "Unknown
|
|
205
|
+
res.status(404).json({ error: "Unknown service: " + slug + "." });
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
|
-
// When refresh=true is requested, clear the
|
|
208
|
+
// When refresh=true is requested, clear the service's caches (unified channel cache, row caches, fully-enumerated flags, etc.) so the discovery walk runs
|
|
209
209
|
// against fresh data. This also resets warm tuning state (watch URLs, GUIDs), but the discovery walk repopulates the unified cache before returning — any
|
|
210
210
|
// subsequent tune resolves from the freshly populated cache as normal. If a discovery is already in flight, abort it first — clearing the cache while a
|
|
211
211
|
// discovery is progressively populating it would corrupt its state.
|
|
@@ -219,7 +219,7 @@ export function setupProvidersEndpoint(app) {
|
|
|
219
219
|
}
|
|
220
220
|
provider.strategy.clearCache?.();
|
|
221
221
|
}
|
|
222
|
-
// Check for cached discovery results before creating a browser page. When a prior tune or discovery call has already enumerated the
|
|
222
|
+
// Check for cached discovery results before creating a browser page. When a prior tune or discovery call has already enumerated the service's lineup, the
|
|
223
223
|
// cache is warm and we can return immediately without any browser interaction. Skipped when refresh=true since we just cleared the caches above.
|
|
224
224
|
if (!refresh) {
|
|
225
225
|
const cached = provider.getCachedChannels();
|
|
@@ -228,7 +228,7 @@ export function setupProvidersEndpoint(app) {
|
|
|
228
228
|
return;
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
|
-
// Coalesce concurrent requests. If a discovery is already in flight for this
|
|
231
|
+
// Coalesce concurrent requests. If a discovery is already in flight for this service, piggyback on the existing promise instead of spawning a redundant
|
|
232
232
|
// browser page. If the in-flight discovery was aborted (by a refresh=true request that arrived after we checked above), the promise rejects with a
|
|
233
233
|
// DiscoveryAbortError and we retry against whatever new entry replaced it in the map.
|
|
234
234
|
let entry = inflight.get(slug);
|
|
@@ -266,4 +266,4 @@ export function setupProvidersEndpoint(app) {
|
|
|
266
266
|
}
|
|
267
267
|
});
|
|
268
268
|
}
|
|
269
|
-
//# sourceMappingURL=
|
|
269
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/routes/services.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/ui.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { generateAlert, generateBadge, generateButton,
|
|
1
|
+
export { generateAlert, generateBadge, generateButton, generatePanelHeader, generateSection, generateSelect, generateSimpleAlert, generateStatusIndicator, generateTextInput } from "./components.js";
|
|
2
2
|
export type { AlertType, BadgeVariant, ButtonOptions, ButtonSize, ButtonVariant, SelectOption, SelectOptions, TextInputOptions } from "./components.js";
|
|
3
3
|
/**
|
|
4
4
|
* Options for configuring the tab script behavior.
|
package/dist/routes/ui.js
CHANGED
|
@@ -7,7 +7,7 @@ import { generateThemeStyles } from "./theme.js";
|
|
|
7
7
|
* configuration page by extracting common CSS and JavaScript patterns. All styles use CSS custom properties from theme.ts for automatic dark mode support.
|
|
8
8
|
*/
|
|
9
9
|
// Re-export components for convenience.
|
|
10
|
-
export { generateAlert, generateBadge, generateButton,
|
|
10
|
+
export { generateAlert, generateBadge, generateButton, generatePanelHeader, generateSection, generateSelect, generateSimpleAlert, generateStatusIndicator, generateTextInput } from "./components.js";
|
|
11
11
|
/**
|
|
12
12
|
* Generates the base CSS styles shared across PrismCast pages. These styles provide consistent typography, layout, and basic component styling using CSS custom
|
|
13
13
|
* properties for theme support.
|
|
@@ -120,6 +120,8 @@ export function generateBaseStyles() {
|
|
|
120
120
|
".form-warning { color: var(--status-warning-text); font-size: 12px; margin-top: 5px; padding: 6px 10px; background: var(--status-warning-bg); ",
|
|
121
121
|
"border-radius: var(--radius-sm); }",
|
|
122
122
|
".hint { color: var(--text-secondary); font-size: 12px; margin-top: 1px; margin-bottom: 15px; }",
|
|
123
|
+
".predefined-hint { padding: 8px 12px; background: var(--bg-offset); border-radius: var(--radius-sm); border-left: 3px solid var(--accent); }",
|
|
124
|
+
".predefined-hint a { color: var(--accent); }",
|
|
123
125
|
// Env badge in form labels.
|
|
124
126
|
".env-badge { display: inline-block; background: var(--badge-env-bg); color: var(--badge-env-text); padding: 2px 8px; ",
|
|
125
127
|
"border-radius: var(--radius-sm); font-size: 11px; font-weight: 600; margin-left: 10px; }",
|
package/dist/routes/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AAEH,wCAAwC;AACxC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"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"}
|
package/dist/service/commands.js
CHANGED
|
@@ -2,30 +2,16 @@
|
|
|
2
2
|
*
|
|
3
3
|
* commands.ts: Service command handlers for PrismCast CLI.
|
|
4
4
|
*/
|
|
5
|
-
import { DEFAULTS,
|
|
5
|
+
import { DEFAULTS, readConfig } from "../config/userConfig.js";
|
|
6
6
|
import { SERVICE_NAME, getNodeExecutablePath, getPlatform, getPrismCastEntryPoint, getServiceFilePath } from "../utils/platform.js";
|
|
7
7
|
import { collectServiceEnvironment, detectStalePaths, getServiceGenerator, getServicePaths } from "./generators.js";
|
|
8
|
+
import { print, printError } from "../utils/cliOutput.js";
|
|
9
|
+
import { formatDuration } from "../utils/format.js";
|
|
8
10
|
import { getDataDir } from "../config/paths.js";
|
|
9
11
|
import path from "node:path";
|
|
10
12
|
/* These handlers implement the `prismcast service` subcommands for installing, uninstalling, and checking the status of PrismCast as a system service. Each handler
|
|
11
13
|
* prints its output directly to the console and exits with an appropriate status code.
|
|
12
14
|
*/
|
|
13
|
-
/**
|
|
14
|
-
* Prints a message to stdout.
|
|
15
|
-
* @param message - The message to print.
|
|
16
|
-
*/
|
|
17
|
-
function print(message) {
|
|
18
|
-
// eslint-disable-next-line no-console
|
|
19
|
-
console.log(message);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Prints an error message to stderr.
|
|
23
|
-
* @param message - The error message to print.
|
|
24
|
-
*/
|
|
25
|
-
function printError(message) {
|
|
26
|
-
// eslint-disable-next-line no-console
|
|
27
|
-
console.error(message);
|
|
28
|
-
}
|
|
29
15
|
/**
|
|
30
16
|
* Prints a stale path warning block to stderr. Called by handleStatus() when the service file references paths that no longer exist on disk.
|
|
31
17
|
*/
|
|
@@ -44,24 +30,6 @@ function printStalePathWarning() {
|
|
|
44
30
|
}
|
|
45
31
|
printError("Run 'prismcast service restart' to update the service file.");
|
|
46
32
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Formats a duration in seconds to a human-readable string.
|
|
49
|
-
* @param seconds - The duration in seconds.
|
|
50
|
-
* @returns Formatted duration (e.g., "45s", "2m 15s", "1h 23m").
|
|
51
|
-
*/
|
|
52
|
-
function formatDuration(seconds) {
|
|
53
|
-
if (seconds < 60) {
|
|
54
|
-
return String(seconds) + "s";
|
|
55
|
-
}
|
|
56
|
-
if (seconds < 3600) {
|
|
57
|
-
const minutes = Math.floor(seconds / 60);
|
|
58
|
-
const secs = seconds % 60;
|
|
59
|
-
return secs > 0 ? String(minutes) + "m " + String(secs) + "s" : String(minutes) + "m";
|
|
60
|
-
}
|
|
61
|
-
const hours = Math.floor(seconds / 3600);
|
|
62
|
-
const minutes = Math.floor((seconds % 3600) / 60);
|
|
63
|
-
return minutes > 0 ? String(hours) + "h " + String(minutes) + "m" : String(hours) + "h";
|
|
64
|
-
}
|
|
65
33
|
/**
|
|
66
34
|
* Fetches active stream information from the running server.
|
|
67
35
|
* @param port - The server port to connect to.
|
|
@@ -69,10 +37,7 @@ function formatDuration(seconds) {
|
|
|
69
37
|
*/
|
|
70
38
|
async function fetchActiveStreams(port) {
|
|
71
39
|
try {
|
|
72
|
-
const
|
|
73
|
-
const timeoutId = setTimeout(() => { controller.abort(); }, 3000);
|
|
74
|
-
const response = await fetch("http://127.0.0.1:" + String(port) + "/streams", { signal: controller.signal });
|
|
75
|
-
clearTimeout(timeoutId);
|
|
40
|
+
const response = await fetch("http://127.0.0.1:" + String(port) + "/streams", { signal: AbortSignal.timeout(3000) });
|
|
76
41
|
if (!response.ok) {
|
|
77
42
|
return null;
|
|
78
43
|
}
|
|
@@ -87,7 +52,7 @@ async function fetchActiveStreams(port) {
|
|
|
87
52
|
* @returns The server port.
|
|
88
53
|
*/
|
|
89
54
|
async function getServerPort() {
|
|
90
|
-
const result = await
|
|
55
|
+
const result = await readConfig();
|
|
91
56
|
return result.config.server?.port ?? DEFAULTS.server.port;
|
|
92
57
|
}
|
|
93
58
|
/**
|
|
@@ -228,8 +193,8 @@ export async function handleUninstall() {
|
|
|
228
193
|
* @returns Exit code (0 for success, 1 for error).
|
|
229
194
|
*/
|
|
230
195
|
async function restartService(generator, action) {
|
|
231
|
-
// Compare the paths in the existing service file against the current runtime paths to determine whether regeneration is needed. All supported platforms (launchd
|
|
232
|
-
// systemd, Windows) store paths in their service files, so getServicePaths() only returns null for corrupt or
|
|
196
|
+
// Compare the paths in the existing service file against the current runtime paths to determine whether regeneration is needed. All supported platforms (launchd
|
|
197
|
+
// plist, systemd unit, Windows batch script) store paths in their service files, so getServicePaths() only returns null for corrupt or unparseable files.
|
|
233
198
|
const existingPaths = getServicePaths();
|
|
234
199
|
const currentNodePath = getNodeExecutablePath();
|
|
235
200
|
const currentEntryPoint = getPrismCastEntryPoint();
|
|
@@ -419,7 +384,7 @@ export async function handleStatus() {
|
|
|
419
384
|
}
|
|
420
385
|
}
|
|
421
386
|
const suffix = stream.showName ? " - " + stream.showName : "";
|
|
422
|
-
print(" • " + name + " (" + formatDuration(stream.duration) + ")" + suffix);
|
|
387
|
+
print(" • " + name + " (" + formatDuration(stream.duration, "s") + ")" + suffix);
|
|
423
388
|
}
|
|
424
389
|
}
|
|
425
390
|
}
|