@scarlett-player/embed 0.1.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 +315 -0
- package/dist/embed.js +4628 -0
- package/dist/embed.js.map +1 -0
- package/dist/embed.umd.cjs +2 -0
- package/dist/embed.umd.cjs.map +1 -0
- package/dist/hls-BI8mYU47.js +32970 -0
- package/dist/hls-BI8mYU47.js.map +1 -0
- package/iframe.html +101 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# @scarlett-player/embed
|
|
2
|
+
|
|
3
|
+
Standalone, CDN-ready embed package for Scarlett Player. Drop in a single `<script>` tag and start streaming.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Zero Dependencies** - Self-contained bundle with everything included
|
|
8
|
+
- **Auto-initialization** - Finds and initializes players automatically
|
|
9
|
+
- **Data Attributes** - Configure players via HTML attributes
|
|
10
|
+
- **Global API** - Programmatic control via `window.ScarlettPlayer`
|
|
11
|
+
- **Multi-tenant Ready** - Brand customization via data attributes
|
|
12
|
+
- **iframe Support** - Helper page for URL-based iframe embeds
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
### CDN Usage (Recommended for Embeds)
|
|
17
|
+
|
|
18
|
+
```html
|
|
19
|
+
<!-- UMD Bundle (works everywhere) -->
|
|
20
|
+
<script src="https://cdn.example.com/scarlett-player/embed.umd.cjs"></script>
|
|
21
|
+
|
|
22
|
+
<!-- ES Module (for modern browsers) -->
|
|
23
|
+
<script type="module" src="https://cdn.example.com/scarlett-player/embed.js"></script>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### NPM Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @scarlett-player/embed
|
|
30
|
+
# or
|
|
31
|
+
pnpm add @scarlett-player/embed
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
### 1. Declarative (Data Attributes)
|
|
37
|
+
|
|
38
|
+
The simplest way to embed a player. Just add the script and use data attributes:
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<!DOCTYPE html>
|
|
42
|
+
<html>
|
|
43
|
+
<head>
|
|
44
|
+
<script src="https://cdn.example.com/scarlett-player/embed.umd.cjs"></script>
|
|
45
|
+
</head>
|
|
46
|
+
<body>
|
|
47
|
+
<!-- Basic player -->
|
|
48
|
+
<div
|
|
49
|
+
data-scarlett-player
|
|
50
|
+
data-src="https://example.com/stream.m3u8"
|
|
51
|
+
></div>
|
|
52
|
+
|
|
53
|
+
<!-- Customized player -->
|
|
54
|
+
<div
|
|
55
|
+
data-scarlett-player
|
|
56
|
+
data-src="https://example.com/stream.m3u8"
|
|
57
|
+
data-autoplay
|
|
58
|
+
data-muted
|
|
59
|
+
data-poster="https://example.com/poster.jpg"
|
|
60
|
+
data-brand-color="#e50914"
|
|
61
|
+
data-aspect-ratio="16:9"
|
|
62
|
+
></div>
|
|
63
|
+
</body>
|
|
64
|
+
</html>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### Available Data Attributes
|
|
68
|
+
|
|
69
|
+
| Attribute | Type | Default | Description |
|
|
70
|
+
|-----------|------|---------|-------------|
|
|
71
|
+
| `data-src` | string | **required** | Video source URL (HLS .m3u8) |
|
|
72
|
+
| `data-autoplay` | boolean | `false` | Auto-play on load |
|
|
73
|
+
| `data-muted` | boolean | `false` | Start muted |
|
|
74
|
+
| `data-poster` | string | - | Poster image URL |
|
|
75
|
+
| `data-controls` | boolean | `true` | Show/hide UI controls |
|
|
76
|
+
| `data-brand-color` | string | - | Accent color (e.g., `#e50914`) |
|
|
77
|
+
| `data-primary-color` | string | - | Primary UI color |
|
|
78
|
+
| `data-background-color` | string | - | Control bar background |
|
|
79
|
+
| `data-hide-delay` | number | `3000` | Auto-hide delay (ms) |
|
|
80
|
+
| `data-width` | string | - | Player width (e.g., `100%`, `640px`) |
|
|
81
|
+
| `data-height` | string | - | Player height |
|
|
82
|
+
| `data-aspect-ratio` | string | - | Aspect ratio (e.g., `16:9`, `4:3`) |
|
|
83
|
+
| `data-keyboard` | boolean | `true` | Enable keyboard shortcuts |
|
|
84
|
+
| `data-loop` | boolean | `false` | Loop playback |
|
|
85
|
+
| `data-playback-rate` | number | `1.0` | Playback speed |
|
|
86
|
+
| `data-start-time` | number | `0` | Start position (seconds) |
|
|
87
|
+
| `data-class` | string | - | Custom CSS class(es) |
|
|
88
|
+
|
|
89
|
+
### 2. Programmatic API
|
|
90
|
+
|
|
91
|
+
For dynamic player creation:
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<script src="https://cdn.example.com/scarlett-player/embed.umd.cjs"></script>
|
|
95
|
+
|
|
96
|
+
<div id="my-player"></div>
|
|
97
|
+
|
|
98
|
+
<script>
|
|
99
|
+
// Create player programmatically
|
|
100
|
+
const player = ScarlettPlayer.create({
|
|
101
|
+
container: '#my-player',
|
|
102
|
+
src: 'https://example.com/stream.m3u8',
|
|
103
|
+
autoplay: true,
|
|
104
|
+
muted: true,
|
|
105
|
+
brandColor: '#e50914',
|
|
106
|
+
aspectRatio: '16:9',
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Access player methods
|
|
110
|
+
player.play();
|
|
111
|
+
player.pause();
|
|
112
|
+
player.setVolume(0.5);
|
|
113
|
+
</script>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
#### Global API Methods
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// Initialize all players on page
|
|
120
|
+
ScarlettPlayer.initAll();
|
|
121
|
+
|
|
122
|
+
// Create single player
|
|
123
|
+
ScarlettPlayer.create(options);
|
|
124
|
+
|
|
125
|
+
// Check version
|
|
126
|
+
console.log(ScarlettPlayer.version);
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 3. iframe Embed
|
|
130
|
+
|
|
131
|
+
For secure, sandboxed embeds:
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<!-- Basic iframe embed -->
|
|
135
|
+
<iframe
|
|
136
|
+
src="https://cdn.example.com/scarlett-player/iframe.html?src=https://example.com/stream.m3u8"
|
|
137
|
+
width="640"
|
|
138
|
+
height="360"
|
|
139
|
+
frameborder="0"
|
|
140
|
+
allowfullscreen
|
|
141
|
+
allow="autoplay; fullscreen; picture-in-picture"
|
|
142
|
+
></iframe>
|
|
143
|
+
|
|
144
|
+
<!-- With customization -->
|
|
145
|
+
<iframe
|
|
146
|
+
src="https://cdn.example.com/scarlett-player/iframe.html?src=https://example.com/stream.m3u8&autoplay=true&muted=true&brand-color=%23e50914"
|
|
147
|
+
width="100%"
|
|
148
|
+
height="100%"
|
|
149
|
+
frameborder="0"
|
|
150
|
+
allowfullscreen
|
|
151
|
+
allow="autoplay; fullscreen; picture-in-picture"
|
|
152
|
+
></iframe>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### iframe URL Parameters
|
|
156
|
+
|
|
157
|
+
All data attributes work as URL parameters (use kebab-case):
|
|
158
|
+
- `src` (required)
|
|
159
|
+
- `autoplay`, `muted`, `loop`
|
|
160
|
+
- `poster`
|
|
161
|
+
- `brand-color`, `primary-color`, `background-color`
|
|
162
|
+
- `hide-delay`, `playback-rate`, `start-time`
|
|
163
|
+
- `controls` (set to `false` to hide)
|
|
164
|
+
|
|
165
|
+
## Multi-Tenant Branding
|
|
166
|
+
|
|
167
|
+
Perfect for The Stream Platform's white-label needs:
|
|
168
|
+
|
|
169
|
+
```html
|
|
170
|
+
<!-- Client A: Red branding -->
|
|
171
|
+
<div
|
|
172
|
+
data-scarlett-player
|
|
173
|
+
data-src="https://example.com/client-a/stream.m3u8"
|
|
174
|
+
data-brand-color="#e50914"
|
|
175
|
+
data-primary-color="#ffffff"
|
|
176
|
+
></div>
|
|
177
|
+
|
|
178
|
+
<!-- Client B: Blue branding -->
|
|
179
|
+
<div
|
|
180
|
+
data-scarlett-player
|
|
181
|
+
data-src="https://example.com/client-b/stream.m3u8"
|
|
182
|
+
data-brand-color="#1e90ff"
|
|
183
|
+
data-primary-color="#f0f0f0"
|
|
184
|
+
></div>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Build Output
|
|
188
|
+
|
|
189
|
+
After building, you'll get:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
dist/
|
|
193
|
+
├── embed.js # ES module
|
|
194
|
+
├── embed.umd.cjs # UMD bundle (for script tags)
|
|
195
|
+
├── embed.d.ts # TypeScript definitions
|
|
196
|
+
├── embed.js.map # Source map
|
|
197
|
+
└── embed.umd.cjs.map # Source map for UMD
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Development
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Install dependencies
|
|
204
|
+
pnpm install
|
|
205
|
+
|
|
206
|
+
# Build the package
|
|
207
|
+
pnpm build
|
|
208
|
+
|
|
209
|
+
# Run in dev mode
|
|
210
|
+
pnpm dev
|
|
211
|
+
|
|
212
|
+
# Type checking
|
|
213
|
+
pnpm typecheck
|
|
214
|
+
|
|
215
|
+
# Clean build artifacts
|
|
216
|
+
pnpm clean
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## TypeScript Support
|
|
220
|
+
|
|
221
|
+
Full TypeScript support when using as a module:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { create, type EmbedPlayerOptions } from '@scarlett-player/embed';
|
|
225
|
+
|
|
226
|
+
const options: EmbedPlayerOptions = {
|
|
227
|
+
container: '#player',
|
|
228
|
+
src: 'https://example.com/stream.m3u8',
|
|
229
|
+
autoplay: true,
|
|
230
|
+
brandColor: '#e50914',
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const player = create(options);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Browser Support
|
|
237
|
+
|
|
238
|
+
- Modern browsers (ES2020+)
|
|
239
|
+
- Chrome/Edge 90+
|
|
240
|
+
- Firefox 88+
|
|
241
|
+
- Safari 14+
|
|
242
|
+
- iOS Safari 14+
|
|
243
|
+
- Android Chrome 90+
|
|
244
|
+
|
|
245
|
+
## Keyboard Shortcuts
|
|
246
|
+
|
|
247
|
+
When `data-keyboard` is enabled (default):
|
|
248
|
+
|
|
249
|
+
- `Space` / `K` - Play/Pause
|
|
250
|
+
- `M` - Mute/Unmute
|
|
251
|
+
- `F` - Fullscreen
|
|
252
|
+
- `←` / `→` - Seek -5s / +5s
|
|
253
|
+
- `↑` / `↓` - Volume +10% / -10%
|
|
254
|
+
|
|
255
|
+
## Examples
|
|
256
|
+
|
|
257
|
+
### Responsive Player
|
|
258
|
+
|
|
259
|
+
```html
|
|
260
|
+
<div
|
|
261
|
+
data-scarlett-player
|
|
262
|
+
data-src="https://example.com/stream.m3u8"
|
|
263
|
+
data-width="100%"
|
|
264
|
+
data-aspect-ratio="16:9"
|
|
265
|
+
></div>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Auto-play with Muted (Mobile-friendly)
|
|
269
|
+
|
|
270
|
+
```html
|
|
271
|
+
<div
|
|
272
|
+
data-scarlett-player
|
|
273
|
+
data-src="https://example.com/stream.m3u8"
|
|
274
|
+
data-autoplay
|
|
275
|
+
data-muted
|
|
276
|
+
></div>
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Custom Branding
|
|
280
|
+
|
|
281
|
+
```html
|
|
282
|
+
<div
|
|
283
|
+
data-scarlett-player
|
|
284
|
+
data-src="https://example.com/stream.m3u8"
|
|
285
|
+
data-brand-color="#ff6b6b"
|
|
286
|
+
data-primary-color="#ffffff"
|
|
287
|
+
data-background-color="rgba(0, 0, 0, 0.8)"
|
|
288
|
+
data-hide-delay="5000"
|
|
289
|
+
></div>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Controls Hidden (Audio-only)
|
|
293
|
+
|
|
294
|
+
```html
|
|
295
|
+
<div
|
|
296
|
+
data-scarlett-player
|
|
297
|
+
data-src="https://example.com/audio.m3u8"
|
|
298
|
+
data-controls="false"
|
|
299
|
+
data-autoplay
|
|
300
|
+
data-height="50px"
|
|
301
|
+
></div>
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## License
|
|
305
|
+
|
|
306
|
+
MIT
|
|
307
|
+
|
|
308
|
+
## Documentation
|
|
309
|
+
|
|
310
|
+
For detailed implementation docs including Laravel integration, see:
|
|
311
|
+
- [Embed Implementation Guide](../../.claude/docs/embed-implementation.md)
|
|
312
|
+
|
|
313
|
+
## Support
|
|
314
|
+
|
|
315
|
+
For issues and questions, visit: https://github.com/Hackney-Enterprises-Inc/scarlett-player
|