vidply 1.2.0 → 1.2.3
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 +974 -946
- package/dist/dev/{vidply.AudioDescriptionManager-R47Q4YR4.js → vidply.AudioDescriptionManager-JYYLK5KB.js} +275 -19
- package/dist/dev/vidply.AudioDescriptionManager-JYYLK5KB.js.map +7 -0
- package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js → vidply.CaptionStyleMenu-47RCKQF5.js} +4 -4
- package/dist/dev/{vidply.DASHRenderer-PWEMC3BT.js → vidply.DASHRenderer-VEJ4HDHO.js} +3 -3
- package/dist/dev/vidply.DASHRenderer-VEJ4HDHO.js.map +7 -0
- package/dist/dev/{vidply.FloatingPlayerManager-PKNNNAS2.js → vidply.FloatingPlayerManager-C2UVRPZY.js} +5 -5
- package/dist/dev/vidply.FloatingPlayerManager-C2UVRPZY.js.map +7 -0
- package/dist/dev/{vidply.HLSRenderer-E7RQ74HI.js → vidply.HLSRenderer-ZVBK2TNQ.js} +4 -4
- package/dist/dev/vidply.HLSRenderer-ZVBK2TNQ.js.map +7 -0
- package/dist/dev/vidply.HTML5Renderer-HLRQUOCU.js +12 -0
- package/dist/dev/{vidply.SignLanguageManager-FET5FQZ7.js → vidply.SignLanguageManager-FLUCBW5H.js} +8 -8
- package/dist/dev/vidply.SignLanguageManager-FLUCBW5H.js.map +7 -0
- package/dist/dev/{vidply.SoundCloudRenderer-RVSJZODO.js → vidply.SoundCloudRenderer-MGMAJ7NK.js} +3 -3
- package/dist/dev/vidply.SoundCloudRenderer-MGMAJ7NK.js.map +7 -0
- package/dist/dev/{vidply.TranscriptManager-5GXOQCLX.js → vidply.TranscriptManager-Y2RYXHJW.js} +10 -10
- package/dist/dev/vidply.TranscriptManager-Y2RYXHJW.js.map +7 -0
- package/dist/dev/{vidply.VimeoRenderer-ER2LSBBW.js → vidply.VimeoRenderer-RQFQD7OE.js} +3 -3
- package/dist/dev/vidply.VimeoRenderer-RQFQD7OE.js.map +7 -0
- package/dist/dev/{vidply.YouTubeRenderer-NFTOWJAB.js → vidply.YouTubeRenderer-EU2BARZF.js} +3 -3
- package/dist/dev/vidply.YouTubeRenderer-EU2BARZF.js.map +7 -0
- package/dist/dev/{vidply.chunk-BNFIUL2Z.js → vidply.chunk-6LYZYI5G.js} +3 -3
- package/dist/dev/vidply.chunk-6LYZYI5G.js.map +7 -0
- package/dist/dev/{vidply.chunk-NQPURMQY.js → vidply.chunk-A4ESEOQ2.js} +6 -6
- package/dist/dev/vidply.chunk-A4ESEOQ2.js.map +7 -0
- package/dist/dev/{vidply.chunk-W25HUCHS.js → vidply.chunk-CGYIED2I.js} +2 -2
- package/dist/dev/vidply.chunk-CGYIED2I.js.map +7 -0
- package/dist/dev/{vidply.chunk-SK4V2DAU.js → vidply.chunk-HZ7UOKOU.js} +3 -3
- package/dist/dev/{vidply.chunk-RZWZGDV7.js → vidply.chunk-I6EDRYGJ.js} +33 -6
- package/dist/dev/vidply.chunk-I6EDRYGJ.js.map +7 -0
- package/dist/dev/{vidply.chunk-64WXMTGL.js → vidply.chunk-JKMQGLCJ.js} +5 -5
- package/dist/dev/vidply.chunk-JKMQGLCJ.js.map +7 -0
- package/dist/dev/{vidply.chunk-DZSDO3B7.js → vidply.chunk-JZNZX32Z.js} +2 -2
- package/dist/dev/{vidply.chunk-VMSQAZM7.js → vidply.chunk-P25MRJ6O.js} +2 -2
- package/dist/dev/{vidply.chunk-6RQA4ROD.js → vidply.chunk-PRFNESYA.js} +2 -2
- package/dist/dev/{vidply.chunk-KI7C3QVL.js → vidply.chunk-UI3RYCVF.js} +4 -3
- package/dist/dev/vidply.chunk-UI3RYCVF.js.map +7 -0
- package/dist/dev/{vidply.chunk-JJ47NO24.js → vidply.chunk-UNFGMABP.js} +2 -2
- package/dist/dev/vidply.chunk-UNFGMABP.js.map +7 -0
- package/dist/dev/{vidply.de-4YAT7FFM.js → vidply.de-VAUVSQXC.js} +29 -2
- package/dist/dev/vidply.de-VAUVSQXC.js.map +7 -0
- package/dist/dev/{vidply.es-LEWIRUBH.js → vidply.es-G65HFWO6.js} +29 -2
- package/dist/dev/vidply.es-G65HFWO6.js.map +7 -0
- package/dist/dev/vidply.esm.js +648 -35
- package/dist/dev/vidply.esm.js.map +3 -3
- package/dist/dev/{vidply.fr-Q4GV2NOE.js → vidply.fr-MJNOZELM.js} +29 -2
- package/dist/dev/vidply.fr-MJNOZELM.js.map +7 -0
- package/dist/dev/{vidply.ja-S6ITA6WU.js → vidply.ja-INMDHIYJ.js} +29 -2
- package/dist/dev/vidply.ja-INMDHIYJ.js.map +7 -0
- package/dist/legacy/vidply.js +1062 -34
- package/dist/legacy/vidply.js.map +3 -3
- package/dist/legacy/vidply.min.js +2 -2
- package/dist/legacy/vidply.min.meta.json +127 -55
- package/dist/prod/vidply.AudioDescriptionManager-EKWUNOPE.min.js +6 -0
- package/dist/prod/{vidply.CaptionStyleMenu-M3KVQWB5.min.js → vidply.CaptionStyleMenu-JTWSNHRQ.min.js} +2 -2
- package/dist/prod/{vidply.DASHRenderer-DN3S27AV.min.js → vidply.DASHRenderer-CIDAHFWM.min.js} +2 -2
- package/dist/prod/{vidply.FloatingPlayerManager-SKAZ4J43.min.js → vidply.FloatingPlayerManager-VZXHPCPM.min.js} +2 -2
- package/dist/prod/{vidply.HLSRenderer-62HH4YTK.min.js → vidply.HLSRenderer-Q6EFYKID.min.js} +2 -2
- package/dist/prod/vidply.HTML5Renderer-XRDJUTOO.min.js +6 -0
- package/dist/prod/{vidply.SignLanguageManager-V3OBTSSF.min.js → vidply.SignLanguageManager-JUOSA5AM.min.js} +2 -2
- package/dist/prod/{vidply.SoundCloudRenderer-CXRVZIAJ.min.js → vidply.SoundCloudRenderer-7ODD46PO.min.js} +2 -2
- package/dist/prod/{vidply.TranscriptManager-SYM3DFUY.min.js → vidply.TranscriptManager-4B2QKYGQ.min.js} +2 -2
- package/dist/prod/{vidply.VimeoRenderer-72TWRYFQ.min.js → vidply.VimeoRenderer-MR3UYLY7.min.js} +2 -2
- package/dist/prod/{vidply.YouTubeRenderer-UMHEV3KD.min.js → vidply.YouTubeRenderer-ITRTC7NR.min.js} +2 -2
- package/dist/prod/{vidply.chunk-YEENJS3Q.min.js → vidply.chunk-3EEDXU4T.min.js} +2 -2
- package/dist/prod/{vidply.chunk-P4UXOHWA.min.js → vidply.chunk-5HTX5QXW.min.js} +1 -1
- package/dist/prod/{vidply.chunk-ABPXVDLZ.min.js → vidply.chunk-6OGHHIYP.min.js} +2 -2
- package/dist/prod/{vidply.chunk-UK7YGOB5.min.js → vidply.chunk-GUPGMFUZ.min.js} +2 -2
- package/dist/prod/{vidply.chunk-WX3MVEAL.min.js → vidply.chunk-MWEBITCP.min.js} +1 -1
- package/dist/prod/{vidply.chunk-2TB6MUHO.min.js → vidply.chunk-PL3P3JHR.min.js} +1 -1
- package/dist/prod/{vidply.chunk-EKEYJWMG.min.js → vidply.chunk-QQZGV7TD.min.js} +2 -2
- package/dist/prod/{vidply.chunk-Z3YDSA7O.min.js → vidply.chunk-U5IRRYG5.min.js} +1 -1
- package/dist/prod/{vidply.chunk-TM6AXJVD.min.js → vidply.chunk-VKHV4QHA.min.js} +2 -2
- package/dist/prod/{vidply.chunk-P3PQBY7N.min.js → vidply.chunk-XA4M574A.min.js} +1 -1
- package/dist/prod/{vidply.chunk-RI3X7WHK.min.js → vidply.chunk-ZPTV4JEP.min.js} +2 -2
- package/dist/prod/{vidply.de-BCHXRQ53.min.js → vidply.de-UZHFCEZU.min.js} +2 -2
- package/dist/prod/{vidply.es-PICAKMZD.min.js → vidply.es-BOISUV2S.min.js} +2 -2
- package/dist/prod/vidply.esm.min.js +2 -2
- package/dist/prod/{vidply.fr-ZILI7CDR.min.js → vidply.fr-ICSMKPFM.min.js} +2 -2
- package/dist/prod/{vidply.ja-5WQ4OK4J.min.js → vidply.ja-VQ2HKGAY.min.js} +2 -2
- package/dist/vidply.css +5852 -5796
- package/dist/vidply.esm.min.meta.json +204 -149
- package/dist/vidply.min.css +1 -1
- package/package.json +11 -11
- package/src/controls/CaptionManager.ts +598 -598
- package/src/controls/ControlBar.ts +4191 -4159
- package/src/controls/KeyboardHelp.ts +326 -0
- package/src/controls/KeyboardManager.ts +387 -383
- package/src/controls/SettingsDialog.ts +488 -488
- package/src/controls/TranscriptManager.ts +2426 -2426
- package/src/core/AudioDescriptionManager.ts +863 -774
- package/src/core/DescriptionSpeechManager.ts +232 -0
- package/src/core/FloatingPlayerManager.ts +674 -674
- package/src/core/LazyInit.ts +80 -80
- package/src/core/MediaSessionManager.ts +341 -0
- package/src/core/MetadataAlertsManager.ts +514 -514
- package/src/core/Player.ts +2973 -2872
- package/src/core/PosterManager.ts +169 -169
- package/src/core/PseudoFullscreen.ts +179 -179
- package/src/core/ResponsiveManager.ts +231 -231
- package/src/core/ResumeManager.ts +236 -236
- package/src/core/SignLanguageManager.ts +1308 -1308
- package/src/core/ThemeManager.ts +157 -157
- package/src/features/PlaylistManager.ts +1838 -1827
- package/src/i18n/i18n.ts +223 -223
- package/src/i18n/languages/de.ts +244 -217
- package/src/i18n/languages/en.ts +245 -218
- package/src/i18n/languages/es.ts +241 -214
- package/src/i18n/languages/fr.ts +241 -214
- package/src/i18n/languages/ja.ts +241 -214
- package/src/icons/Icons.ts +168 -167
- package/src/index.ts +196 -193
- package/src/renderers/DASHRenderer.ts +1077 -1077
- package/src/renderers/HLSRenderer.ts +944 -944
- package/src/renderers/HTML5Renderer.ts +389 -389
- package/src/renderers/SoundCloudRenderer.ts +437 -437
- package/src/renderers/VimeoRenderer.ts +298 -298
- package/src/renderers/YouTubeRenderer.ts +290 -290
- package/src/styles/vidply.css +5852 -5796
- package/src/types/events.ts +128 -122
- package/src/types/globals.d.ts +313 -313
- package/src/types/options.ts +199 -182
- package/src/types/renderer.ts +58 -58
- package/src/utils/DOMUtils.ts +281 -281
- package/src/utils/DownloadInfo.ts +171 -171
- package/src/utils/DraggablePanel.ts +539 -539
- package/src/utils/DraggablePanelMenu.ts +195 -195
- package/src/utils/DraggableResizable.ts +997 -997
- package/src/utils/EventEmitter.ts +59 -59
- package/src/utils/FormUtils.ts +95 -95
- package/src/utils/MenuFactory.ts +483 -483
- package/src/utils/Sanitize.ts +70 -70
- package/src/utils/SettingsMenuFactory.ts +289 -289
- package/src/utils/StorageManager.ts +287 -287
- package/src/utils/TrackLabelUtils.ts +52 -52
- package/src/utils/UrlSafe.ts +69 -69
- package/src/utils/VideoFrameCapture.ts +114 -114
- package/src/utils/WindowComponents.ts +250 -250
- package/dist/dev/vidply.AudioDescriptionManager-R47Q4YR4.js.map +0 -7
- package/dist/dev/vidply.DASHRenderer-PWEMC3BT.js.map +0 -7
- package/dist/dev/vidply.FloatingPlayerManager-PKNNNAS2.js.map +0 -7
- package/dist/dev/vidply.HLSRenderer-E7RQ74HI.js.map +0 -7
- package/dist/dev/vidply.HTML5Renderer-BU4QJJJY.js +0 -12
- package/dist/dev/vidply.SignLanguageManager-FET5FQZ7.js.map +0 -7
- package/dist/dev/vidply.SoundCloudRenderer-RVSJZODO.js.map +0 -7
- package/dist/dev/vidply.TranscriptManager-5GXOQCLX.js.map +0 -7
- package/dist/dev/vidply.VimeoRenderer-ER2LSBBW.js.map +0 -7
- package/dist/dev/vidply.YouTubeRenderer-NFTOWJAB.js.map +0 -7
- package/dist/dev/vidply.chunk-64WXMTGL.js.map +0 -7
- package/dist/dev/vidply.chunk-BNFIUL2Z.js.map +0 -7
- package/dist/dev/vidply.chunk-JJ47NO24.js.map +0 -7
- package/dist/dev/vidply.chunk-KI7C3QVL.js.map +0 -7
- package/dist/dev/vidply.chunk-NQPURMQY.js.map +0 -7
- package/dist/dev/vidply.chunk-RZWZGDV7.js.map +0 -7
- package/dist/dev/vidply.chunk-W25HUCHS.js.map +0 -7
- package/dist/dev/vidply.de-4YAT7FFM.js.map +0 -7
- package/dist/dev/vidply.es-LEWIRUBH.js.map +0 -7
- package/dist/dev/vidply.fr-Q4GV2NOE.js.map +0 -7
- package/dist/dev/vidply.ja-S6ITA6WU.js.map +0 -7
- package/dist/prod/vidply.AudioDescriptionManager-RHLIJW5C.min.js +0 -6
- package/dist/prod/vidply.HTML5Renderer-IU5T3WEW.min.js +0 -6
- /package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js.map → vidply.CaptionStyleMenu-47RCKQF5.js.map} +0 -0
- /package/dist/dev/{vidply.HTML5Renderer-BU4QJJJY.js.map → vidply.HTML5Renderer-HLRQUOCU.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-SK4V2DAU.js.map → vidply.chunk-HZ7UOKOU.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-DZSDO3B7.js.map → vidply.chunk-JZNZX32Z.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-VMSQAZM7.js.map → vidply.chunk-P25MRJ6O.js.map} +0 -0
- /package/dist/dev/{vidply.chunk-6RQA4ROD.js.map → vidply.chunk-PRFNESYA.js.map} +0 -0
package/src/utils/Sanitize.ts
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prototype-pollution defence helpers.
|
|
3
|
-
*
|
|
4
|
-
* Every time the player mixes attacker-influenced data (JSON from
|
|
5
|
-
* `data-vidply-options`, persisted values from `localStorage`,
|
|
6
|
-
* translation catalogues fetched over HTTP, theme-variable overrides)
|
|
7
|
-
* into an object with a normal prototype, the keys
|
|
8
|
-
* `__proto__`, `prototype`, and `constructor` are stripped on the way in.
|
|
9
|
-
*
|
|
10
|
-
* This module centralises that logic so the three separate copies that
|
|
11
|
-
* used to live in `core/Player.ts`, `utils/StorageManager.ts`,
|
|
12
|
-
* `i18n/i18n.ts`, and `index.ts` cannot drift apart silently.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
/** Keys that are forbidden in attacker-influenced input. Frozen so no
|
|
16
|
-
* caller can accidentally mutate the shared set at runtime. */
|
|
17
|
-
export const PROTO_FORBIDDEN_KEYS: ReadonlySet<string> = Object.freeze(
|
|
18
|
-
new Set(['__proto__', 'prototype', 'constructor'])
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
/** Return `true` if the key would risk prototype pollution. */
|
|
22
|
-
export function isForbiddenKey(key: PropertyKey): boolean {
|
|
23
|
-
return PROTO_FORBIDDEN_KEYS.has(String(key));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* One-level copy of `input` that drops forbidden keys. The result has
|
|
28
|
-
* a null prototype so further property access can't accidentally hit
|
|
29
|
-
* `Object.prototype`. The generic `T` cast matches the ergonomic
|
|
30
|
-
* pattern `shallowSanitize<MyShape>(dirty)` used by callers that know
|
|
31
|
-
* the expected shape.
|
|
32
|
-
*/
|
|
33
|
-
export function shallowSanitize<T extends Record<string, unknown>>(input: T): T {
|
|
34
|
-
const out: Record<string, unknown> = Object.create(null);
|
|
35
|
-
for (const [key, value] of Object.entries(input)) {
|
|
36
|
-
if (isForbiddenKey(key)) continue;
|
|
37
|
-
out[key] = value;
|
|
38
|
-
}
|
|
39
|
-
return out as T;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Recursive, plain-object-only sanitiser. Arrays and primitives are
|
|
44
|
-
* passed through unchanged; plain objects are copied onto a null
|
|
45
|
-
* prototype with forbidden keys filtered.
|
|
46
|
-
*
|
|
47
|
-
* This is the shape needed by the i18n layer (nested translation
|
|
48
|
-
* catalogues) and by any code that merges deeply nested options.
|
|
49
|
-
*/
|
|
50
|
-
export function deepSanitize<T = unknown>(input: unknown): T {
|
|
51
|
-
if (!input || typeof input !== 'object' || Array.isArray(input)) {
|
|
52
|
-
// For non-objects we still want a null-prototype fallback in the
|
|
53
|
-
// "expected an object but got garbage" case — matches the previous
|
|
54
|
-
// i18n behaviour so catalogue loaders stay defensive.
|
|
55
|
-
if (input && typeof input === 'object') {
|
|
56
|
-
return input as T;
|
|
57
|
-
}
|
|
58
|
-
return Object.create(null) as T;
|
|
59
|
-
}
|
|
60
|
-
const out: Record<string, unknown> = Object.create(null);
|
|
61
|
-
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
62
|
-
if (isForbiddenKey(key)) continue;
|
|
63
|
-
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
64
|
-
out[key] = deepSanitize(value);
|
|
65
|
-
} else {
|
|
66
|
-
out[key] = value;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return out as T;
|
|
70
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Prototype-pollution defence helpers.
|
|
3
|
+
*
|
|
4
|
+
* Every time the player mixes attacker-influenced data (JSON from
|
|
5
|
+
* `data-vidply-options`, persisted values from `localStorage`,
|
|
6
|
+
* translation catalogues fetched over HTTP, theme-variable overrides)
|
|
7
|
+
* into an object with a normal prototype, the keys
|
|
8
|
+
* `__proto__`, `prototype`, and `constructor` are stripped on the way in.
|
|
9
|
+
*
|
|
10
|
+
* This module centralises that logic so the three separate copies that
|
|
11
|
+
* used to live in `core/Player.ts`, `utils/StorageManager.ts`,
|
|
12
|
+
* `i18n/i18n.ts`, and `index.ts` cannot drift apart silently.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Keys that are forbidden in attacker-influenced input. Frozen so no
|
|
16
|
+
* caller can accidentally mutate the shared set at runtime. */
|
|
17
|
+
export const PROTO_FORBIDDEN_KEYS: ReadonlySet<string> = Object.freeze(
|
|
18
|
+
new Set(['__proto__', 'prototype', 'constructor'])
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
/** Return `true` if the key would risk prototype pollution. */
|
|
22
|
+
export function isForbiddenKey(key: PropertyKey): boolean {
|
|
23
|
+
return PROTO_FORBIDDEN_KEYS.has(String(key));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* One-level copy of `input` that drops forbidden keys. The result has
|
|
28
|
+
* a null prototype so further property access can't accidentally hit
|
|
29
|
+
* `Object.prototype`. The generic `T` cast matches the ergonomic
|
|
30
|
+
* pattern `shallowSanitize<MyShape>(dirty)` used by callers that know
|
|
31
|
+
* the expected shape.
|
|
32
|
+
*/
|
|
33
|
+
export function shallowSanitize<T extends Record<string, unknown>>(input: T): T {
|
|
34
|
+
const out: Record<string, unknown> = Object.create(null);
|
|
35
|
+
for (const [key, value] of Object.entries(input)) {
|
|
36
|
+
if (isForbiddenKey(key)) continue;
|
|
37
|
+
out[key] = value;
|
|
38
|
+
}
|
|
39
|
+
return out as T;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Recursive, plain-object-only sanitiser. Arrays and primitives are
|
|
44
|
+
* passed through unchanged; plain objects are copied onto a null
|
|
45
|
+
* prototype with forbidden keys filtered.
|
|
46
|
+
*
|
|
47
|
+
* This is the shape needed by the i18n layer (nested translation
|
|
48
|
+
* catalogues) and by any code that merges deeply nested options.
|
|
49
|
+
*/
|
|
50
|
+
export function deepSanitize<T = unknown>(input: unknown): T {
|
|
51
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) {
|
|
52
|
+
// For non-objects we still want a null-prototype fallback in the
|
|
53
|
+
// "expected an object but got garbage" case — matches the previous
|
|
54
|
+
// i18n behaviour so catalogue loaders stay defensive.
|
|
55
|
+
if (input && typeof input === 'object') {
|
|
56
|
+
return input as T;
|
|
57
|
+
}
|
|
58
|
+
return Object.create(null) as T;
|
|
59
|
+
}
|
|
60
|
+
const out: Record<string, unknown> = Object.create(null);
|
|
61
|
+
for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
|
|
62
|
+
if (isForbiddenKey(key)) continue;
|
|
63
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
64
|
+
out[key] = deepSanitize(value);
|
|
65
|
+
} else {
|
|
66
|
+
out[key] = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return out as T;
|
|
70
|
+
}
|