@reacttv/embed-kit 0.4.6

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.
Files changed (114) hide show
  1. package/README.md +65 -0
  2. package/dist/elements/_base/EmbedVideoElement.d.ts +84 -0
  3. package/dist/elements/_base/EmbedVideoElement.d.ts.map +1 -0
  4. package/dist/elements/_base/EmbedVideoElement.js +246 -0
  5. package/dist/elements/_base/EmbedVideoElement.js.map +1 -0
  6. package/dist/elements/_base/createIframe.d.ts +7 -0
  7. package/dist/elements/_base/createIframe.d.ts.map +1 -0
  8. package/dist/elements/_base/createIframe.js +14 -0
  9. package/dist/elements/_base/createIframe.js.map +1 -0
  10. package/dist/elements/_base/index.d.ts +5 -0
  11. package/dist/elements/_base/index.d.ts.map +1 -0
  12. package/dist/elements/_base/index.js +5 -0
  13. package/dist/elements/_base/index.js.map +1 -0
  14. package/dist/elements/_base/loadScript.d.ts +21 -0
  15. package/dist/elements/_base/loadScript.d.ts.map +1 -0
  16. package/dist/elements/_base/loadScript.js +24 -0
  17. package/dist/elements/_base/loadScript.js.map +1 -0
  18. package/dist/elements/_base/player.types.d.ts +59 -0
  19. package/dist/elements/_base/player.types.d.ts.map +1 -0
  20. package/dist/elements/_base/player.types.js +16 -0
  21. package/dist/elements/_base/player.types.js.map +1 -0
  22. package/dist/elements/dailymotion/constants.d.ts +15 -0
  23. package/dist/elements/dailymotion/constants.d.ts.map +1 -0
  24. package/dist/elements/dailymotion/constants.js +15 -0
  25. package/dist/elements/dailymotion/constants.js.map +1 -0
  26. package/dist/elements/dailymotion/player.d.ts +2 -0
  27. package/dist/elements/dailymotion/player.d.ts.map +1 -0
  28. package/dist/elements/dailymotion/player.js +268 -0
  29. package/dist/elements/dailymotion/player.js.map +1 -0
  30. package/dist/elements/dailymotion/player.types.d.ts +144 -0
  31. package/dist/elements/dailymotion/player.types.d.ts.map +1 -0
  32. package/dist/elements/dailymotion/player.types.js +4 -0
  33. package/dist/elements/dailymotion/player.types.js.map +1 -0
  34. package/dist/elements/tiktok/constants.d.ts +19 -0
  35. package/dist/elements/tiktok/constants.d.ts.map +1 -0
  36. package/dist/elements/tiktok/constants.js +19 -0
  37. package/dist/elements/tiktok/constants.js.map +1 -0
  38. package/dist/elements/tiktok/player.d.ts +2 -0
  39. package/dist/elements/tiktok/player.d.ts.map +1 -0
  40. package/dist/elements/tiktok/player.js +224 -0
  41. package/dist/elements/tiktok/player.js.map +1 -0
  42. package/dist/elements/twitch/constants.d.ts +61 -0
  43. package/dist/elements/twitch/constants.d.ts.map +1 -0
  44. package/dist/elements/twitch/constants.js +61 -0
  45. package/dist/elements/twitch/constants.js.map +1 -0
  46. package/dist/elements/twitch/player.d.ts +2 -0
  47. package/dist/elements/twitch/player.d.ts.map +1 -0
  48. package/dist/elements/twitch/player.js +262 -0
  49. package/dist/elements/twitch/player.js.map +1 -0
  50. package/dist/elements/twitch/player.types.d.ts +76 -0
  51. package/dist/elements/twitch/player.types.d.ts.map +1 -0
  52. package/dist/elements/twitch/player.types.js +7 -0
  53. package/dist/elements/twitch/player.types.js.map +1 -0
  54. package/dist/elements/vimeo/constants.d.ts +27 -0
  55. package/dist/elements/vimeo/constants.d.ts.map +1 -0
  56. package/dist/elements/vimeo/constants.js +29 -0
  57. package/dist/elements/vimeo/constants.js.map +1 -0
  58. package/dist/elements/vimeo/player.d.ts +9 -0
  59. package/dist/elements/vimeo/player.d.ts.map +1 -0
  60. package/dist/elements/vimeo/player.js +217 -0
  61. package/dist/elements/vimeo/player.js.map +1 -0
  62. package/dist/elements/vimeo/player.types.d.ts +38 -0
  63. package/dist/elements/vimeo/player.types.d.ts.map +1 -0
  64. package/dist/elements/vimeo/player.types.js +6 -0
  65. package/dist/elements/vimeo/player.types.js.map +1 -0
  66. package/dist/elements/youtube/constants.d.ts +15 -0
  67. package/dist/elements/youtube/constants.d.ts.map +1 -0
  68. package/dist/elements/youtube/constants.js +15 -0
  69. package/dist/elements/youtube/constants.js.map +1 -0
  70. package/dist/elements/youtube/helpers/parseYouTubeUrl.d.ts +4 -0
  71. package/dist/elements/youtube/helpers/parseYouTubeUrl.d.ts.map +1 -0
  72. package/dist/elements/youtube/helpers/parseYouTubeUrl.js +10 -0
  73. package/dist/elements/youtube/helpers/parseYouTubeUrl.js.map +1 -0
  74. package/dist/elements/youtube/player.d.ts +2 -0
  75. package/dist/elements/youtube/player.d.ts.map +1 -0
  76. package/dist/elements/youtube/player.js +213 -0
  77. package/dist/elements/youtube/player.js.map +1 -0
  78. package/dist/elements/youtube/player.types.d.ts +79 -0
  79. package/dist/elements/youtube/player.types.d.ts.map +1 -0
  80. package/dist/elements/youtube/player.types.js +8 -0
  81. package/dist/elements/youtube/player.types.js.map +1 -0
  82. package/dist/react-embed-kit/HtmlPlayer.d.ts +23 -0
  83. package/dist/react-embed-kit/HtmlPlayer.d.ts.map +1 -0
  84. package/dist/react-embed-kit/HtmlPlayer.js +61 -0
  85. package/dist/react-embed-kit/HtmlPlayer.js.map +1 -0
  86. package/dist/react-embed-kit/ReactEmbedKit.d.ts +28 -0
  87. package/dist/react-embed-kit/ReactEmbedKit.d.ts.map +1 -0
  88. package/dist/react-embed-kit/ReactEmbedKit.js +114 -0
  89. package/dist/react-embed-kit/ReactEmbedKit.js.map +1 -0
  90. package/dist/react-embed-kit/constants.d.ts +3 -0
  91. package/dist/react-embed-kit/constants.d.ts.map +1 -0
  92. package/dist/react-embed-kit/constants.js +3 -0
  93. package/dist/react-embed-kit/constants.js.map +1 -0
  94. package/dist/react-embed-kit/embed-elements.d.ts +64 -0
  95. package/dist/react-embed-kit/embed-elements.d.ts.map +1 -0
  96. package/dist/react-embed-kit/embed-elements.js +2 -0
  97. package/dist/react-embed-kit/embed-elements.js.map +1 -0
  98. package/dist/react-embed-kit/index.d.ts +6 -0
  99. package/dist/react-embed-kit/index.d.ts.map +1 -0
  100. package/dist/react-embed-kit/index.js +4 -0
  101. package/dist/react-embed-kit/index.js.map +1 -0
  102. package/dist/react-embed-kit/providers.d.ts +22 -0
  103. package/dist/react-embed-kit/providers.d.ts.map +1 -0
  104. package/dist/react-embed-kit/providers.js +72 -0
  105. package/dist/react-embed-kit/providers.js.map +1 -0
  106. package/dist/react-embed-kit/registerEmbedElements.d.ts +11 -0
  107. package/dist/react-embed-kit/registerEmbedElements.d.ts.map +1 -0
  108. package/dist/react-embed-kit/registerEmbedElements.js +11 -0
  109. package/dist/react-embed-kit/registerEmbedElements.js.map +1 -0
  110. package/dist/react-embed-kit/test/ReactEmbedKitTestPage.d.ts +8 -0
  111. package/dist/react-embed-kit/test/ReactEmbedKitTestPage.d.ts.map +1 -0
  112. package/dist/react-embed-kit/test/ReactEmbedKitTestPage.js +126 -0
  113. package/dist/react-embed-kit/test/ReactEmbedKitTestPage.js.map +1 -0
  114. package/package.json +88 -0
@@ -0,0 +1,224 @@
1
+ import { createIframe, EmbedVideoElement } from "../_base/index.js";
2
+ import { REGEX_PLAYER, REGEX_VM, REGEX_VIDEO, REGEX_EMBED, REGEX_SHARE } from "./constants.js";
3
+ const EMBED_ORIGIN = "https://www.tiktok.com";
4
+ const EMBED_BASE = "https://www.tiktok.com/player/v1/";
5
+ /** TikTok onStateChange values: -1 init, 0 ended, 1 playing, 2 paused, 3 buffering */
6
+ const STATE_ENDED = 0;
7
+ const STATE_PLAYING = 1;
8
+ const STATE_PAUSED = 2;
9
+ const STATE_BUFFERING = 3;
10
+ function post(iframe, type, value) {
11
+ if (!iframe.contentWindow)
12
+ return;
13
+ const message = {
14
+ "x-tiktok-player": true,
15
+ type,
16
+ ...(value !== undefined ? { value } : {}),
17
+ };
18
+ iframe.contentWindow.postMessage(message, "*");
19
+ }
20
+ function parseTiktokId(src) {
21
+ return (src.match(REGEX_PLAYER)?.[1] ??
22
+ src.match(REGEX_VIDEO)?.[1] ??
23
+ src.match(REGEX_EMBED)?.[1] ??
24
+ src.match(REGEX_SHARE)?.[1] ??
25
+ src.match(REGEX_VM)?.[1]);
26
+ }
27
+ /**
28
+ * TikTok embed player as a subclass of EmbedVideoElement.
29
+ * Implements the subset directly via postMessage to the TikTok iframe.
30
+ */
31
+ class TikTokEmbedPlayer extends EmbedVideoElement {
32
+ tiktokPlayerState = { destroyed: false };
33
+ load() {
34
+ if (this.iframe?.parentNode) {
35
+ this.iframe.remove();
36
+ this.iframe = null;
37
+ }
38
+ window.removeEventListener("message", this.handleMessage);
39
+ this.handleMessage = () => { };
40
+ const attributes = this.getAttributes();
41
+ const videoId = parseTiktokId(attributes.src ?? "");
42
+ if (!videoId)
43
+ return;
44
+ const params = new URLSearchParams({
45
+ controls: this.options.controls ? "1" : "0",
46
+ });
47
+ if (this.options.autoplay)
48
+ params.set("autoplay", "1");
49
+ const iframe = createIframe(`${EMBED_BASE}${videoId}?${params.toString()}`);
50
+ this.getEmbedContainer().appendChild(iframe);
51
+ this.iframe = iframe;
52
+ const handleMessage = (event) => {
53
+ if (this.tiktokPlayerState.destroyed)
54
+ return;
55
+ if (event.origin !== EMBED_ORIGIN ||
56
+ event.source !== iframe.contentWindow)
57
+ return;
58
+ const data = event.data;
59
+ if (!data || typeof data !== "object" || !("type" in data))
60
+ return;
61
+ switch (data.type) {
62
+ case "onPlayerReady":
63
+ this.setInitialPlayerState();
64
+ this.dispatchReadyEvent();
65
+ break;
66
+ case "onStateChange":
67
+ if (typeof data.value === "number") {
68
+ if (data.value === STATE_PAUSED) {
69
+ this.playerState.isPaused = true;
70
+ this.dispatchPauseEvent();
71
+ }
72
+ else if (data.value === STATE_PLAYING) {
73
+ this.playerState.isPaused = false;
74
+ this.dispatchPlayEvent();
75
+ }
76
+ else if (data.value === STATE_BUFFERING) {
77
+ this.dispatchBufferingEvent();
78
+ }
79
+ else if (data.value === STATE_ENDED) {
80
+ this.dispatchEndedEvent();
81
+ }
82
+ }
83
+ break;
84
+ case "onCurrentTime": {
85
+ const t = data.value;
86
+ if (t) {
87
+ if (typeof t.currentTime === "number")
88
+ this.playerState.currentTime = t.currentTime;
89
+ if (typeof t.duration === "number") {
90
+ if (t.duration !== this.playerState.duration) {
91
+ this.playerState.duration = t.duration;
92
+ this.dispatchDurationChangeEvent(t.duration);
93
+ }
94
+ }
95
+ this.dispatchProgressEvent(this.playerState.currentTime);
96
+ }
97
+ break;
98
+ }
99
+ case "onError":
100
+ case "error": {
101
+ this.playerState.error = {
102
+ code: 0,
103
+ message: "TikTok embed error",
104
+ };
105
+ this.dispatchErrorEvent(this.playerState.error);
106
+ break;
107
+ }
108
+ }
109
+ };
110
+ this.handleMessage = handleMessage;
111
+ window.addEventListener("message", handleMessage);
112
+ }
113
+ setInitialPlayerState() {
114
+ const attributes = this.getAttributes();
115
+ if (attributes.volume) {
116
+ const vol = parseFloat(attributes.volume);
117
+ this.volume = vol;
118
+ }
119
+ if (attributes.muted) {
120
+ this.muted = attributes.muted === "true";
121
+ }
122
+ if (attributes.playing) {
123
+ this.playing = attributes.playing === "true";
124
+ }
125
+ }
126
+ connectedCallback() {
127
+ this.loadInitialOptions();
128
+ const src = this.getAttribute("src");
129
+ if (!src)
130
+ return;
131
+ if (!parseTiktokId(src))
132
+ return;
133
+ this.load();
134
+ }
135
+ play() {
136
+ if (this.iframe)
137
+ post(this.iframe, "play");
138
+ return Promise.resolve();
139
+ }
140
+ pause() {
141
+ if (this.iframe)
142
+ post(this.iframe, "pause");
143
+ return Promise.resolve();
144
+ }
145
+ destroy() {
146
+ this.tiktokPlayerState.destroyed = true;
147
+ window.removeEventListener("message", this.handleMessage);
148
+ if (this.iframe?.parentNode)
149
+ this.iframe.remove();
150
+ this.iframe = null;
151
+ }
152
+ get playing() {
153
+ return !this.paused;
154
+ }
155
+ set playing(value) {
156
+ if (value) {
157
+ this.play();
158
+ }
159
+ else {
160
+ this.pause();
161
+ }
162
+ }
163
+ set controls(value) {
164
+ this.options.controls = value;
165
+ this.load();
166
+ }
167
+ seek(seconds) {
168
+ if (this.iframe)
169
+ post(this.iframe, "seekTo", seconds);
170
+ this.playerState.currentTime = seconds;
171
+ }
172
+ mute() {
173
+ this.playerState.muted = true;
174
+ if (this.iframe)
175
+ post(this.iframe, "mute");
176
+ this.dispatchMuteChangeEvent(true);
177
+ }
178
+ unmute() {
179
+ this.playerState.muted = false;
180
+ if (this.iframe)
181
+ post(this.iframe, "unMute");
182
+ this.dispatchMuteChangeEvent(false);
183
+ }
184
+ get paused() {
185
+ return this.playerState.isPaused;
186
+ }
187
+ get currentTime() {
188
+ return this.playerState.currentTime;
189
+ }
190
+ set currentTime(seconds) {
191
+ this.seek(seconds);
192
+ }
193
+ get duration() {
194
+ return this.playerState.duration;
195
+ }
196
+ get muted() {
197
+ return this.playerState.muted;
198
+ }
199
+ set muted(value) {
200
+ if (value) {
201
+ this.mute();
202
+ }
203
+ else {
204
+ this.unmute();
205
+ }
206
+ }
207
+ get volume() {
208
+ return ((this.playerState.volume ?? 1) * 100);
209
+ }
210
+ set volume(vol) {
211
+ const v = vol <= 1
212
+ ? Math.max(0, Math.min(1, vol))
213
+ : Math.max(0, Math.min(1, vol / 100));
214
+ this.playerState.volume = v;
215
+ }
216
+ get error() {
217
+ return this.playerState.error;
218
+ }
219
+ }
220
+ if (globalThis.customElements &&
221
+ !globalThis.customElements.get("tiktok-video")) {
222
+ globalThis.customElements.define("tiktok-video", TikTokEmbedPlayer);
223
+ }
224
+ //# sourceMappingURL=player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.js","sourceRoot":"","sources":["../../../src/elements/tiktok/player.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Provider constants: test URLs and IDs for Twitch.
3
+ * Use these in tests and test pages so videos stay valid in one place.
4
+ */
5
+ /** Embed origin for postMessage validation. */
6
+ export declare const EMBED_ORIGIN = "https://player.twitch.tv";
7
+ /** postMessage namespace for embed lifecycle events (ready, seek, play, etc.). */
8
+ export declare const NS_EMBED = "twitch-embed";
9
+ /** postMessage namespace for player control and UPDATE_STATE. */
10
+ export declare const NS_PLAYER_PROXY = "twitch-embed-player-proxy";
11
+ /**
12
+ * Playback state strings from Twitch embed UPDATE_STATE.params.playback.
13
+ * @see https://github.com/muxinc/media-elements/blob/main/packages/twitch-video-element/twitch-video-element.js
14
+ */
15
+ export declare const PlaybackState: {
16
+ readonly BUFFERING: "Buffering";
17
+ readonly ENDED: "Ended";
18
+ readonly IDLE: "Idle";
19
+ readonly PAUSED: "Paused";
20
+ readonly PLAYING: "Playing";
21
+ readonly READY: "Ready";
22
+ };
23
+ /**
24
+ * Numeric command codes for postMessage to the embed (namespace twitch-embed-player-proxy).
25
+ * @see https://github.com/twitchdev/issues/issues/125
26
+ */
27
+ export declare const PlayerCommands: {
28
+ readonly DISABLE_CAPTIONS: 0;
29
+ readonly ENABLE_CAPTIONS: 1;
30
+ readonly PAUSE: 2;
31
+ readonly PLAY: 3;
32
+ readonly SEEK: 4;
33
+ readonly SET_CHANNEL: 5;
34
+ readonly SET_CHANNEL_ID: 6;
35
+ readonly SET_COLLECTION: 7;
36
+ readonly SET_QUALITY: 8;
37
+ readonly SET_VIDEO: 9;
38
+ readonly SET_MUTED: 10;
39
+ readonly SET_VOLUME: 11;
40
+ };
41
+ /** Regex to match twitch.tv/videos/{id} URLs. */
42
+ export declare const REGEX_VIDEO: RegExp;
43
+ /** Regex to match clips.twitch.tv/{slug} URLs. */
44
+ export declare const REGEX_CLIPS_HOST: RegExp;
45
+ /** Regex to match twitch.tv/.../clip/{slug} URLs. */
46
+ export declare const REGEX_CLIP: RegExp;
47
+ /** Regex to match twitch.tv/{channel} URLs. */
48
+ export declare const REGEX_CHANNEL: RegExp;
49
+ /** Video ID for createPlayer and video embeds. */
50
+ export declare const VIDEO_ID = "2398764730";
51
+ /** Full video URL for src attribute. */
52
+ export declare const VIDEO_SOURCE_URL = "https://www.twitch.tv/videos/2398764730";
53
+ /** Clip slug for clip embeds. */
54
+ export declare const CLIP_SLUG = "BrightResourcefulLeopardSeemsGood-CVvpRL5aVhKwP6_U";
55
+ /** Full clip URL for src attribute. */
56
+ export declare const CLIP_SOURCE_URL = "https://clips.twitch.tv/BrightResourcefulLeopardSeemsGood-CVvpRL5aVhKwP6_U";
57
+ /** Channel name for livestream embeds. */
58
+ export declare const CHANNEL_NAME = "ashesofowls";
59
+ /** Full livestream URL for src attribute. */
60
+ export declare const CHANNEL_SOURCE_URL = "https://www.twitch.tv/ashesofowls";
61
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/elements/twitch/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,eAAO,MAAM,YAAY,6BAA6B,CAAC;AAEvD,kFAAkF;AAClF,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AAEvC,iEAAiE;AACjE,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAajB,CAAC;AAEX,iDAAiD;AACjD,eAAO,MAAM,WAAW,QAA8B,CAAC;AAEvD,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,qDAAqD;AACrD,eAAO,MAAM,UAAU,QAA4C,CAAC;AAEpE,+CAA+C;AAC/C,eAAO,MAAM,aAAa,QAA2C,CAAC;AAEtE,kDAAkD;AAClD,eAAO,MAAM,QAAQ,eAAe,CAAC;AAErC,wCAAwC;AACxC,eAAO,MAAM,gBAAgB,4CAA6C,CAAC;AAE3E,iCAAiC;AACjC,eAAO,MAAM,SAAS,uDAAuD,CAAC;AAE9E,uCAAuC;AACvC,eAAO,MAAM,eAAe,+EAAyC,CAAC;AAEtE,0CAA0C;AAC1C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,sCAA0C,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Provider constants: test URLs and IDs for Twitch.
3
+ * Use these in tests and test pages so videos stay valid in one place.
4
+ */
5
+ /** Embed origin for postMessage validation. */
6
+ export const EMBED_ORIGIN = "https://player.twitch.tv";
7
+ /** postMessage namespace for embed lifecycle events (ready, seek, play, etc.). */
8
+ export const NS_EMBED = "twitch-embed";
9
+ /** postMessage namespace for player control and UPDATE_STATE. */
10
+ export const NS_PLAYER_PROXY = "twitch-embed-player-proxy";
11
+ /**
12
+ * Playback state strings from Twitch embed UPDATE_STATE.params.playback.
13
+ * @see https://github.com/muxinc/media-elements/blob/main/packages/twitch-video-element/twitch-video-element.js
14
+ */
15
+ export const PlaybackState = {
16
+ BUFFERING: "Buffering",
17
+ ENDED: "Ended",
18
+ IDLE: "Idle",
19
+ PAUSED: "Paused",
20
+ PLAYING: "Playing",
21
+ READY: "Ready",
22
+ };
23
+ /**
24
+ * Numeric command codes for postMessage to the embed (namespace twitch-embed-player-proxy).
25
+ * @see https://github.com/twitchdev/issues/issues/125
26
+ */
27
+ export const PlayerCommands = {
28
+ DISABLE_CAPTIONS: 0,
29
+ ENABLE_CAPTIONS: 1,
30
+ PAUSE: 2,
31
+ PLAY: 3,
32
+ SEEK: 4,
33
+ SET_CHANNEL: 5,
34
+ SET_CHANNEL_ID: 6,
35
+ SET_COLLECTION: 7,
36
+ SET_QUALITY: 8,
37
+ SET_VIDEO: 9,
38
+ SET_MUTED: 10,
39
+ SET_VOLUME: 11,
40
+ };
41
+ /** Regex to match twitch.tv/videos/{id} URLs. */
42
+ export const REGEX_VIDEO = /twitch\.tv\/videos\/(\d+)/;
43
+ /** Regex to match clips.twitch.tv/{slug} URLs. */
44
+ export const REGEX_CLIPS_HOST = /clips\.twitch\.tv\/([\w-]+)/;
45
+ /** Regex to match twitch.tv/.../clip/{slug} URLs. */
46
+ export const REGEX_CLIP = /twitch\.tv\/(?:[\w-]+\/)?clip\/([\w-]+)/;
47
+ /** Regex to match twitch.tv/{channel} URLs. */
48
+ export const REGEX_CHANNEL = /twitch\.tv\/([a-zA-Z0-9_]+)(?:\/|$|\?)/;
49
+ /** Video ID for createPlayer and video embeds. */
50
+ export const VIDEO_ID = "2398764730";
51
+ /** Full video URL for src attribute. */
52
+ export const VIDEO_SOURCE_URL = `https://www.twitch.tv/videos/${VIDEO_ID}`;
53
+ /** Clip slug for clip embeds. */
54
+ export const CLIP_SLUG = "BrightResourcefulLeopardSeemsGood-CVvpRL5aVhKwP6_U";
55
+ /** Full clip URL for src attribute. */
56
+ export const CLIP_SOURCE_URL = `https://clips.twitch.tv/${CLIP_SLUG}`;
57
+ /** Channel name for livestream embeds. */
58
+ export const CHANNEL_NAME = "ashesofowls";
59
+ /** Full livestream URL for src attribute. */
60
+ export const CHANNEL_SOURCE_URL = `https://www.twitch.tv/${CHANNEL_NAME}`;
61
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/elements/twitch/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEvD,kFAAkF;AAClF,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;AAEvC,iEAAiE;AACjE,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACN,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;IAClB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;CACN,CAAC;AAEX,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEvD,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAE9D,qDAAqD;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,yCAAyC,CAAC;AAEpE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAEtE,kDAAkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAErC,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,gCAAgC,QAAQ,EAAE,CAAC;AAE3E,iCAAiC;AACjC,MAAM,CAAC,MAAM,SAAS,GAAG,oDAAoD,CAAC;AAE9E,uCAAuC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,SAAS,EAAE,CAAC;AAEtE,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,YAAY,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.d.ts","sourceRoot":"","sources":["../../../src/elements/twitch/player.ts"],"names":[],"mappings":""}
@@ -0,0 +1,262 @@
1
+ import { createIframe, EmbedVideoElement } from "../_base/index.js";
2
+ import { EMBED_ORIGIN, NS_EMBED, NS_PLAYER_PROXY, PlaybackState, PlayerCommands, REGEX_CHANNEL, REGEX_CLIPS_HOST, REGEX_CLIP, REGEX_VIDEO, } from "./constants.js";
3
+ const parseTwitchUrl = (url) => {
4
+ const videoId = url.match(REGEX_VIDEO)?.[1];
5
+ const clipSlug = url.match(REGEX_CLIPS_HOST)?.[1] || url.match(REGEX_CLIP)?.[1];
6
+ const channelName = url.match(REGEX_CHANNEL)?.[1];
7
+ return { videoId, clipSlug, channelName };
8
+ };
9
+ const getTwitchEmbedSrc = (url) => {
10
+ const { videoId, clipSlug, channelName } = parseTwitchUrl(url);
11
+ if (videoId) {
12
+ return `https://player.twitch.tv/?video=${encodeURIComponent(videoId)}`;
13
+ }
14
+ if (channelName) {
15
+ return `https://player.twitch.tv/?channel=${encodeURIComponent(channelName)}`;
16
+ }
17
+ if (clipSlug) {
18
+ return `https://clips.twitch.tv/embed?clip=${encodeURIComponent(clipSlug)}`;
19
+ }
20
+ return "";
21
+ };
22
+ const generateIframeSrc = ({ url, controls, autoplay }) => `${getTwitchEmbedSrc(url)}&parent=${encodeURIComponent(window.location.hostname)}&controls=${controls}&autoplay=${autoplay}`;
23
+ /**
24
+ * Twitch embed player as a subclass of EmbedVideoElement.
25
+ */
26
+ class TwitchEmbedPlayer extends EmbedVideoElement {
27
+ twitchPlayerState = { destroyed: false };
28
+ load() {
29
+ if (this.iframe?.parentNode) {
30
+ this.iframe.remove();
31
+ this.iframe = null;
32
+ }
33
+ window.removeEventListener("message", this.handleMessage);
34
+ this.handleMessage = () => { };
35
+ const attributes = this.getAttributes();
36
+ const embedSrc = getTwitchEmbedSrc(attributes.src ?? "");
37
+ if (!embedSrc)
38
+ return;
39
+ const iframeSrc = generateIframeSrc({
40
+ url: attributes.src,
41
+ controls: this.options.controls,
42
+ autoplay: this.options.autoplay,
43
+ });
44
+ const iframe = createIframe(iframeSrc);
45
+ const send = (command, params) => {
46
+ if (this.twitchPlayerState.destroyed || !iframe.contentWindow)
47
+ return;
48
+ iframe.contentWindow.postMessage({ eventName: command, params, namespace: NS_PLAYER_PROXY }, EMBED_ORIGIN);
49
+ };
50
+ const handleMessage = (event) => {
51
+ if (this.twitchPlayerState.destroyed)
52
+ return;
53
+ if (event.source !== iframe.contentWindow || event.origin !== EMBED_ORIGIN)
54
+ return;
55
+ const message = event.data;
56
+ if (message.namespace === NS_EMBED) {
57
+ if (message.eventName === "ready") {
58
+ if (this.options.captions) {
59
+ send(PlayerCommands.ENABLE_CAPTIONS);
60
+ }
61
+ else {
62
+ send(PlayerCommands.DISABLE_CAPTIONS);
63
+ }
64
+ this.setInitialPlayerState();
65
+ this.dispatchReadyEvent();
66
+ }
67
+ if (message.eventName === "error") {
68
+ const msg = message.params?.message ?? "Twitch embed error";
69
+ this.playerState.error = { code: 0, message: msg };
70
+ this.dispatchErrorEvent(this.playerState.error);
71
+ }
72
+ if (message.eventName === "seek") {
73
+ this.playerState.currentTime = message.params.position;
74
+ this.dispatchProgressEvent(message.params.position);
75
+ }
76
+ if (message.eventName === "play" ||
77
+ message.eventName === "playing" ||
78
+ message.eventName === "video.play") {
79
+ this.playerState.isPaused = false;
80
+ this.dispatchPlayEvent();
81
+ }
82
+ }
83
+ if (message.namespace === NS_PLAYER_PROXY && message.eventName === "UPDATE_STATE") {
84
+ const p = message.params;
85
+ const isPaused = p.playback === PlaybackState.PAUSED;
86
+ if (isPaused && !this.playerState.isPaused) {
87
+ this.playerState.isPaused = true;
88
+ this.dispatchPauseEvent();
89
+ }
90
+ else if (!isPaused && this.playerState.isPaused) {
91
+ this.playerState.isPaused = false;
92
+ this.dispatchPlayEvent();
93
+ }
94
+ if (p.playback === PlaybackState.BUFFERING) {
95
+ this.dispatchBufferingEvent();
96
+ }
97
+ if (p.playback === PlaybackState.ENDED) {
98
+ this.dispatchEndedEvent();
99
+ }
100
+ this.playerState.currentTime = p.currentTime;
101
+ if (p.duration !== this.playerState.duration) {
102
+ this.playerState.duration = p.duration;
103
+ this.dispatchDurationChangeEvent(p.duration);
104
+ }
105
+ if (typeof p.muted === "boolean") {
106
+ if (p.muted !== this.playerState.muted) {
107
+ this.playerState.muted = p.muted;
108
+ this.dispatchMuteChangeEvent(p.muted);
109
+ }
110
+ }
111
+ if (typeof p.volume === "number" && !Number.isNaN(p.volume)) {
112
+ if (p.volume !== this.playerState.volume) {
113
+ this.playerState.volume = p.volume;
114
+ this.dispatchVolumeChangeEvent(p.volume);
115
+ }
116
+ }
117
+ this.dispatchProgressEvent(p.currentTime);
118
+ }
119
+ };
120
+ this.iframe = iframe;
121
+ this.handleMessage = handleMessage;
122
+ this.getEmbedContainer().appendChild(iframe);
123
+ window.addEventListener("message", handleMessage);
124
+ }
125
+ setInitialPlayerState() {
126
+ const attributes = this.getAttributes();
127
+ if (attributes.volume) {
128
+ this.volume = parseFloat(attributes.volume);
129
+ }
130
+ if (attributes.muted) {
131
+ this.muted = attributes.muted === "true";
132
+ }
133
+ if (attributes.playing) {
134
+ this.playing = attributes.playing === "true";
135
+ }
136
+ }
137
+ connectedCallback() {
138
+ this.loadInitialOptions();
139
+ const src = this.getAttribute("src");
140
+ if (!src)
141
+ return;
142
+ if (!getTwitchEmbedSrc(src))
143
+ return;
144
+ this.load();
145
+ }
146
+ play() {
147
+ if (this.iframe?.contentWindow) {
148
+ this.iframe.contentWindow.postMessage({
149
+ eventName: PlayerCommands.PLAY,
150
+ params: undefined,
151
+ namespace: NS_PLAYER_PROXY,
152
+ }, EMBED_ORIGIN);
153
+ }
154
+ return Promise.resolve();
155
+ }
156
+ pause() {
157
+ if (this.iframe?.contentWindow) {
158
+ this.iframe.contentWindow.postMessage({
159
+ eventName: PlayerCommands.PAUSE,
160
+ params: undefined,
161
+ namespace: NS_PLAYER_PROXY,
162
+ }, EMBED_ORIGIN);
163
+ }
164
+ return Promise.resolve();
165
+ }
166
+ destroy() {
167
+ this.twitchPlayerState.destroyed = true;
168
+ window.removeEventListener("message", this.handleMessage);
169
+ if (this.iframe?.parentNode)
170
+ this.iframe.remove();
171
+ this.iframe = null;
172
+ }
173
+ get playing() {
174
+ return !this.paused;
175
+ }
176
+ set playing(value) {
177
+ if (value) {
178
+ this.play();
179
+ }
180
+ else {
181
+ this.pause();
182
+ }
183
+ }
184
+ set controls(value) {
185
+ this.options.controls = value;
186
+ this.load();
187
+ }
188
+ seek(seconds) {
189
+ if (this.iframe?.contentWindow) {
190
+ this.iframe.contentWindow.postMessage({
191
+ eventName: PlayerCommands.SEEK,
192
+ params: seconds,
193
+ namespace: NS_PLAYER_PROXY,
194
+ }, EMBED_ORIGIN);
195
+ }
196
+ this.playerState.currentTime = seconds;
197
+ }
198
+ mute() {
199
+ this.playerState.muted = true;
200
+ if (this.iframe?.contentWindow) {
201
+ this.iframe.contentWindow.postMessage({
202
+ eventName: PlayerCommands.SET_MUTED,
203
+ params: true,
204
+ namespace: NS_PLAYER_PROXY,
205
+ }, EMBED_ORIGIN);
206
+ }
207
+ }
208
+ unmute() {
209
+ this.playerState.muted = false;
210
+ if (this.iframe?.contentWindow) {
211
+ this.iframe.contentWindow.postMessage({
212
+ eventName: PlayerCommands.SET_MUTED,
213
+ params: false,
214
+ namespace: NS_PLAYER_PROXY,
215
+ }, EMBED_ORIGIN);
216
+ }
217
+ }
218
+ get paused() {
219
+ return this.playerState.isPaused;
220
+ }
221
+ get currentTime() {
222
+ return this.playerState.currentTime;
223
+ }
224
+ set currentTime(seconds) {
225
+ this.seek(seconds);
226
+ }
227
+ get duration() {
228
+ return this.playerState.duration;
229
+ }
230
+ get muted() {
231
+ return this.playerState.muted;
232
+ }
233
+ set muted(value) {
234
+ if (value) {
235
+ this.mute();
236
+ }
237
+ else {
238
+ this.unmute();
239
+ }
240
+ }
241
+ get volume() {
242
+ return this.playerState.volume ?? 1;
243
+ }
244
+ set volume(vol) {
245
+ const v = Math.max(0, Math.min(1, vol));
246
+ this.playerState.volume = v;
247
+ if (this.iframe?.contentWindow) {
248
+ this.iframe.contentWindow.postMessage({
249
+ eventName: PlayerCommands.SET_VOLUME,
250
+ params: v,
251
+ namespace: NS_PLAYER_PROXY,
252
+ }, EMBED_ORIGIN);
253
+ }
254
+ }
255
+ get error() {
256
+ return this.playerState.error;
257
+ }
258
+ }
259
+ if (globalThis.customElements && !globalThis.customElements.get("twitch-video")) {
260
+ globalThis.customElements.define("twitch-video", TwitchEmbedPlayer);
261
+ }
262
+ //# sourceMappingURL=player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.js","sourceRoot":"","sources":["../../../src/elements/twitch/player.ts"],"names":[],"mappings":"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"}