@frameset/plex-player 1.0.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.
@@ -0,0 +1,291 @@
1
+ /*!
2
+ * @frameset/plex-player v1.0.0
3
+ * Professional video player with VAST ads, Chromecast, PiP, subtitles, playlists and more. Built by FRAMESET Studio.
4
+ * (c) 2026 FRAMESET Studio
5
+ * Released under the MIT License
6
+ * https://frameset.dev/plex-player
7
+ */
8
+ 'use strict';
9
+
10
+ Object.defineProperty(exports, '__esModule', { value: true });
11
+
12
+ var vue = require('vue');
13
+ var PlexPlayer = require('../core/index.js');
14
+
15
+ /**
16
+ * @frameset/plex-player - Vue Component
17
+ * Professional Video Player by FRAMESET Studio
18
+ * https://frameset.dev
19
+ */
20
+
21
+
22
+ // Provide/inject key
23
+ const PlexPlayerKey = Symbol('PlexPlayer');
24
+
25
+ /**
26
+ * Composable to access player instance
27
+ */
28
+ function usePlexPlayer() {
29
+ return vue.inject(PlexPlayerKey, vue.ref(null));
30
+ }
31
+
32
+ /**
33
+ * PlexPlayer Vue Component
34
+ */
35
+ const PlexPlayerVue = vue.defineComponent({
36
+ name: 'PlexPlayer',
37
+ props: {
38
+ src: {
39
+ type: String,
40
+ default: ''
41
+ },
42
+ playlist: {
43
+ type: Array,
44
+ default: () => []
45
+ },
46
+ autoplay: {
47
+ type: Boolean,
48
+ default: false
49
+ },
50
+ muted: {
51
+ type: Boolean,
52
+ default: false
53
+ },
54
+ loop: {
55
+ type: Boolean,
56
+ default: false
57
+ },
58
+ volume: {
59
+ type: Number,
60
+ default: 1
61
+ },
62
+ poster: {
63
+ type: String,
64
+ default: ''
65
+ },
66
+ preload: {
67
+ type: String,
68
+ default: 'metadata'
69
+ },
70
+ keyboard: {
71
+ type: Boolean,
72
+ default: true
73
+ },
74
+ touch: {
75
+ type: Boolean,
76
+ default: true
77
+ },
78
+ pip: {
79
+ type: Boolean,
80
+ default: true
81
+ },
82
+ cast: {
83
+ type: Boolean,
84
+ default: true
85
+ },
86
+ fullscreen: {
87
+ type: Boolean,
88
+ default: true
89
+ },
90
+ controlsHideDelay: {
91
+ type: Number,
92
+ default: 3000
93
+ },
94
+ theme: {
95
+ type: Object,
96
+ default: () => ({})
97
+ },
98
+ subtitles: {
99
+ type: Object,
100
+ default: () => ({})
101
+ },
102
+ ads: {
103
+ type: Object,
104
+ default: () => ({})
105
+ },
106
+ i18n: {
107
+ type: Object,
108
+ default: () => ({})
109
+ }
110
+ },
111
+ emits: ['play', 'pause', 'ended', 'timeupdate', 'progress', 'volumechange', 'fullscreenchange', 'error', 'ready'],
112
+ setup(props, {
113
+ emit,
114
+ slots,
115
+ expose
116
+ }) {
117
+ const containerRef = vue.ref(null);
118
+ const playerRef = vue.ref(null);
119
+ const isReady = vue.ref(false);
120
+
121
+ // Provide player to child components
122
+ vue.provide(PlexPlayerKey, playerRef);
123
+ vue.onMounted(() => {
124
+ if (!containerRef.value) return;
125
+
126
+ // Create player instance
127
+ const player = new PlexPlayer({
128
+ container: containerRef.value,
129
+ autoplay: props.autoplay,
130
+ muted: props.muted,
131
+ loop: props.loop,
132
+ volume: props.volume,
133
+ poster: props.poster,
134
+ preload: props.preload,
135
+ keyboard: props.keyboard,
136
+ touch: props.touch,
137
+ pip: props.pip,
138
+ cast: props.cast,
139
+ fullscreen: props.fullscreen,
140
+ controlsHideDelay: props.controlsHideDelay,
141
+ theme: props.theme,
142
+ subtitles: props.subtitles,
143
+ ads: props.ads,
144
+ i18n: props.i18n
145
+ });
146
+ playerRef.value = player;
147
+
148
+ // Bind events
149
+ player.on('play', () => emit('play'));
150
+ player.on('pause', () => emit('pause'));
151
+ player.on('ended', () => emit('ended'));
152
+ player.on('timeupdate', data => emit('timeupdate', data.currentTime));
153
+ player.on('progress', data => emit('progress', data.buffered));
154
+ player.on('volumechange', data => emit('volumechange', data));
155
+ player.on('fullscreenchange', data => emit('fullscreenchange', data.isFullscreen));
156
+ player.on('error', error => emit('error', error));
157
+ isReady.value = true;
158
+ emit('ready', player);
159
+
160
+ // Load initial source
161
+ if (props.src) {
162
+ player.load(props.src);
163
+ } else if (props.playlist.length > 0) {
164
+ player.loadPlaylist(props.playlist);
165
+ }
166
+ });
167
+ vue.onBeforeUnmount(() => {
168
+ if (playerRef.value) {
169
+ playerRef.value.destroy();
170
+ playerRef.value = null;
171
+ }
172
+ });
173
+
174
+ // Watch for src changes
175
+ vue.watch(() => props.src, newSrc => {
176
+ if (playerRef.value && newSrc) {
177
+ playerRef.value.load(newSrc);
178
+ }
179
+ });
180
+
181
+ // Watch for playlist changes
182
+ vue.watch(() => props.playlist, newPlaylist => {
183
+ if (playerRef.value && newPlaylist?.length > 0) {
184
+ playerRef.value.loadPlaylist(newPlaylist);
185
+ }
186
+ }, {
187
+ deep: true
188
+ });
189
+
190
+ // Watch for volume changes
191
+ vue.watch(() => props.volume, newVolume => {
192
+ if (playerRef.value) {
193
+ playerRef.value.setVolume(newVolume);
194
+ }
195
+ });
196
+
197
+ // Watch for muted changes
198
+ vue.watch(() => props.muted, newMuted => {
199
+ if (playerRef.value) {
200
+ if (newMuted) {
201
+ playerRef.value.mute();
202
+ } else {
203
+ playerRef.value.unmute();
204
+ }
205
+ }
206
+ });
207
+
208
+ // Expose methods
209
+ expose({
210
+ play: () => playerRef.value?.play(),
211
+ pause: () => playerRef.value?.pause(),
212
+ togglePlay: () => playerRef.value?.togglePlay(),
213
+ seek: time => playerRef.value?.seek(time),
214
+ seekPercent: percent => playerRef.value?.seekPercent(percent),
215
+ setVolume: vol => playerRef.value?.setVolume(vol),
216
+ getVolume: () => playerRef.value?.getVolume(),
217
+ mute: () => playerRef.value?.mute(),
218
+ unmute: () => playerRef.value?.unmute(),
219
+ toggleMute: () => playerRef.value?.toggleMute(),
220
+ setPlaybackRate: rate => playerRef.value?.setPlaybackRate(rate),
221
+ enterFullscreen: () => playerRef.value?.enterFullscreen(),
222
+ exitFullscreen: () => playerRef.value?.exitFullscreen(),
223
+ toggleFullscreen: () => playerRef.value?.toggleFullscreen(),
224
+ enterPiP: () => playerRef.value?.enterPiP(),
225
+ exitPiP: () => playerRef.value?.exitPiP(),
226
+ togglePiP: () => playerRef.value?.togglePiP(),
227
+ cast: () => playerRef.value?.cast(),
228
+ getState: () => playerRef.value?.getState(),
229
+ getPlayer: () => playerRef.value,
230
+ next: () => playerRef.value?.next(),
231
+ previous: () => playerRef.value?.previous(),
232
+ playAt: index => playerRef.value?.playAt(index)
233
+ });
234
+ return () => vue.h('div', {
235
+ ref: containerRef,
236
+ class: 'plex-player-container',
237
+ style: {
238
+ width: '100%',
239
+ height: '100%',
240
+ position: 'relative'
241
+ }
242
+ }, slots.default?.());
243
+ }
244
+ });
245
+
246
+ // Composables
247
+ function usePlexPlayerState() {
248
+ const player = usePlexPlayer();
249
+ const state = vue.ref(null);
250
+ vue.watch(player, p => {
251
+ if (!p) return;
252
+ const updateState = () => {
253
+ state.value = p.getState();
254
+ };
255
+ p.on('timeupdate', updateState);
256
+ p.on('play', updateState);
257
+ p.on('pause', updateState);
258
+ p.on('volumechange', updateState);
259
+ updateState();
260
+ }, {
261
+ immediate: true
262
+ });
263
+ return state;
264
+ }
265
+ function usePlexPlayerTime() {
266
+ const player = usePlexPlayer();
267
+ const time = vue.ref({
268
+ current: 0,
269
+ duration: 0
270
+ });
271
+ vue.watch(player, p => {
272
+ if (!p) return;
273
+ p.on('timeupdate', data => {
274
+ time.value = {
275
+ current: data.currentTime,
276
+ duration: data.duration
277
+ };
278
+ });
279
+ }, {
280
+ immediate: true
281
+ });
282
+ return time;
283
+ }
284
+
285
+ exports.PlexPlayer = PlexPlayer;
286
+ exports.PlexPlayerVue = PlexPlayerVue;
287
+ exports.default = PlexPlayerVue;
288
+ exports.usePlexPlayer = usePlexPlayer;
289
+ exports.usePlexPlayerState = usePlexPlayerState;
290
+ exports.usePlexPlayerTime = usePlexPlayerTime;
291
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/vue/index.js"],"sourcesContent":["/**\r\n * @frameset/plex-player - Vue Component\r\n * Professional Video Player by FRAMESET Studio\r\n * https://frameset.dev\r\n */\r\n\r\nimport { \r\n defineComponent, \r\n ref, \r\n onMounted, \r\n onBeforeUnmount, \r\n watch,\r\n provide,\r\n inject,\r\n h\r\n} from 'vue';\r\n\r\n// Import core player\r\nimport PlexPlayer from '../core/index.js';\r\n\r\n// Provide/inject key\r\nconst PlexPlayerKey = Symbol('PlexPlayer');\r\n\r\n/**\r\n * Composable to access player instance\r\n */\r\nexport function usePlexPlayer() {\r\n return inject(PlexPlayerKey, ref(null));\r\n}\r\n\r\n/**\r\n * PlexPlayer Vue Component\r\n */\r\nexport const PlexPlayerVue = defineComponent({\r\n name: 'PlexPlayer',\r\n\r\n props: {\r\n src: {\r\n type: String,\r\n default: '',\r\n },\r\n playlist: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n autoplay: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n muted: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n loop: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n volume: {\r\n type: Number,\r\n default: 1,\r\n },\r\n poster: {\r\n type: String,\r\n default: '',\r\n },\r\n preload: {\r\n type: String,\r\n default: 'metadata',\r\n },\r\n keyboard: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n touch: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n pip: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n cast: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n fullscreen: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n controlsHideDelay: {\r\n type: Number,\r\n default: 3000,\r\n },\r\n theme: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n subtitles: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n ads: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n i18n: {\r\n type: Object,\r\n default: () => ({}),\r\n },\r\n },\r\n\r\n emits: [\r\n 'play',\r\n 'pause',\r\n 'ended',\r\n 'timeupdate',\r\n 'progress',\r\n 'volumechange',\r\n 'fullscreenchange',\r\n 'error',\r\n 'ready',\r\n ],\r\n\r\n setup(props, { emit, slots, expose }) {\r\n const containerRef = ref(null);\r\n const playerRef = ref(null);\r\n const isReady = ref(false);\r\n\r\n // Provide player to child components\r\n provide(PlexPlayerKey, playerRef);\r\n\r\n onMounted(() => {\r\n if (!containerRef.value) return;\r\n\r\n // Create player instance\r\n const player = new PlexPlayer({\r\n container: containerRef.value,\r\n autoplay: props.autoplay,\r\n muted: props.muted,\r\n loop: props.loop,\r\n volume: props.volume,\r\n poster: props.poster,\r\n preload: props.preload,\r\n keyboard: props.keyboard,\r\n touch: props.touch,\r\n pip: props.pip,\r\n cast: props.cast,\r\n fullscreen: props.fullscreen,\r\n controlsHideDelay: props.controlsHideDelay,\r\n theme: props.theme,\r\n subtitles: props.subtitles,\r\n ads: props.ads,\r\n i18n: props.i18n,\r\n });\r\n\r\n playerRef.value = player;\r\n\r\n // Bind events\r\n player.on('play', () => emit('play'));\r\n player.on('pause', () => emit('pause'));\r\n player.on('ended', () => emit('ended'));\r\n player.on('timeupdate', (data) => emit('timeupdate', data.currentTime));\r\n player.on('progress', (data) => emit('progress', data.buffered));\r\n player.on('volumechange', (data) => emit('volumechange', data));\r\n player.on('fullscreenchange', (data) => emit('fullscreenchange', data.isFullscreen));\r\n player.on('error', (error) => emit('error', error));\r\n\r\n isReady.value = true;\r\n emit('ready', player);\r\n\r\n // Load initial source\r\n if (props.src) {\r\n player.load(props.src);\r\n } else if (props.playlist.length > 0) {\r\n player.loadPlaylist(props.playlist);\r\n }\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (playerRef.value) {\r\n playerRef.value.destroy();\r\n playerRef.value = null;\r\n }\r\n });\r\n\r\n // Watch for src changes\r\n watch(() => props.src, (newSrc) => {\r\n if (playerRef.value && newSrc) {\r\n playerRef.value.load(newSrc);\r\n }\r\n });\r\n\r\n // Watch for playlist changes\r\n watch(() => props.playlist, (newPlaylist) => {\r\n if (playerRef.value && newPlaylist?.length > 0) {\r\n playerRef.value.loadPlaylist(newPlaylist);\r\n }\r\n }, { deep: true });\r\n\r\n // Watch for volume changes\r\n watch(() => props.volume, (newVolume) => {\r\n if (playerRef.value) {\r\n playerRef.value.setVolume(newVolume);\r\n }\r\n });\r\n\r\n // Watch for muted changes\r\n watch(() => props.muted, (newMuted) => {\r\n if (playerRef.value) {\r\n if (newMuted) {\r\n playerRef.value.mute();\r\n } else {\r\n playerRef.value.unmute();\r\n }\r\n }\r\n });\r\n\r\n // Expose methods\r\n expose({\r\n play: () => playerRef.value?.play(),\r\n pause: () => playerRef.value?.pause(),\r\n togglePlay: () => playerRef.value?.togglePlay(),\r\n seek: (time) => playerRef.value?.seek(time),\r\n seekPercent: (percent) => playerRef.value?.seekPercent(percent),\r\n setVolume: (vol) => playerRef.value?.setVolume(vol),\r\n getVolume: () => playerRef.value?.getVolume(),\r\n mute: () => playerRef.value?.mute(),\r\n unmute: () => playerRef.value?.unmute(),\r\n toggleMute: () => playerRef.value?.toggleMute(),\r\n setPlaybackRate: (rate) => playerRef.value?.setPlaybackRate(rate),\r\n enterFullscreen: () => playerRef.value?.enterFullscreen(),\r\n exitFullscreen: () => playerRef.value?.exitFullscreen(),\r\n toggleFullscreen: () => playerRef.value?.toggleFullscreen(),\r\n enterPiP: () => playerRef.value?.enterPiP(),\r\n exitPiP: () => playerRef.value?.exitPiP(),\r\n togglePiP: () => playerRef.value?.togglePiP(),\r\n cast: () => playerRef.value?.cast(),\r\n getState: () => playerRef.value?.getState(),\r\n getPlayer: () => playerRef.value,\r\n next: () => playerRef.value?.next(),\r\n previous: () => playerRef.value?.previous(),\r\n playAt: (index) => playerRef.value?.playAt(index),\r\n });\r\n\r\n return () => h(\r\n 'div',\r\n {\r\n ref: containerRef,\r\n class: 'plex-player-container',\r\n style: {\r\n width: '100%',\r\n height: '100%',\r\n position: 'relative',\r\n },\r\n },\r\n slots.default?.()\r\n );\r\n },\r\n});\r\n\r\n// Composables\r\nexport function usePlexPlayerState() {\r\n const player = usePlexPlayer();\r\n const state = ref(null);\r\n\r\n watch(player, (p) => {\r\n if (!p) return;\r\n\r\n const updateState = () => {\r\n state.value = p.getState();\r\n };\r\n\r\n p.on('timeupdate', updateState);\r\n p.on('play', updateState);\r\n p.on('pause', updateState);\r\n p.on('volumechange', updateState);\r\n\r\n updateState();\r\n }, { immediate: true });\r\n\r\n return state;\r\n}\r\n\r\nexport function usePlexPlayerTime() {\r\n const player = usePlexPlayer();\r\n const time = ref({ current: 0, duration: 0 });\r\n\r\n watch(player, (p) => {\r\n if (!p) return;\r\n\r\n p.on('timeupdate', (data) => {\r\n time.value = {\r\n current: data.currentTime,\r\n duration: data.duration,\r\n };\r\n });\r\n }, { immediate: true });\r\n\r\n return time;\r\n}\r\n\r\n// Named exports\r\nexport { PlexPlayer };\r\nexport default PlexPlayerVue;\r\n"],"names":["PlexPlayerKey","Symbol","usePlexPlayer","inject","ref","PlexPlayerVue","defineComponent","name","props","src","type","String","default","playlist","Array","autoplay","Boolean","muted","loop","volume","Number","poster","preload","keyboard","touch","pip","cast","fullscreen","controlsHideDelay","theme","Object","subtitles","ads","i18n","emits","setup","emit","slots","expose","containerRef","playerRef","isReady","provide","onMounted","value","player","PlexPlayer","container","on","data","currentTime","buffered","isFullscreen","error","load","length","loadPlaylist","onBeforeUnmount","destroy","watch","newSrc","newPlaylist","deep","newVolume","setVolume","newMuted","mute","unmute","play","pause","togglePlay","seek","time","seekPercent","percent","vol","getVolume","toggleMute","setPlaybackRate","rate","enterFullscreen","exitFullscreen","toggleFullscreen","enterPiP","exitPiP","togglePiP","getState","getPlayer","next","previous","playAt","index","h","class","style","width","height","position","usePlexPlayerState","state","p","updateState","immediate","usePlexPlayerTime","current","duration"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,132 @@
1
+ {
2
+ "name": "@frameset/plex-player",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Professional video player with VAST ads, Chromecast, PiP, subtitles, playlists and more. Built by FRAMESET Studio.",
6
+ "main": "dist/plex-player.cjs.js",
7
+ "module": "dist/plex-player.esm.js",
8
+ "browser": "dist/plex-player.min.js",
9
+ "types": "dist/plex-player.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/plex-player.esm.js",
13
+ "require": "./dist/plex-player.cjs.js",
14
+ "types": "./dist/plex-player.d.ts"
15
+ },
16
+ "./react": {
17
+ "import": "./dist/react/index.esm.js",
18
+ "require": "./dist/react/index.js",
19
+ "types": "./src/types/index.d.ts"
20
+ },
21
+ "./vue": {
22
+ "import": "./dist/vue/index.esm.js",
23
+ "require": "./dist/vue/index.js",
24
+ "types": "./src/types/index.d.ts"
25
+ },
26
+ "./css": "./dist/plex-player.css",
27
+ "./dist/*": "./dist/*"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "src",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "scripts": {
36
+ "build": "rollup -c",
37
+ "build:watch": "rollup -c -w",
38
+ "dev": "vite",
39
+ "preview": "vite preview",
40
+ "test": "vitest",
41
+ "lint": "eslint src/",
42
+ "prepare": "npm run build",
43
+ "prepublishOnly": "npm run build"
44
+ },
45
+ "keywords": [
46
+ "video",
47
+ "player",
48
+ "video-player",
49
+ "html5-video",
50
+ "chromecast",
51
+ "cast",
52
+ "vast",
53
+ "ads",
54
+ "advertising",
55
+ "pip",
56
+ "picture-in-picture",
57
+ "subtitles",
58
+ "vtt",
59
+ "srt",
60
+ "ass",
61
+ "playlist",
62
+ "react",
63
+ "vue",
64
+ "typescript",
65
+ "responsive",
66
+ "touch",
67
+ "mobile",
68
+ "streaming",
69
+ "media",
70
+ "frameset"
71
+ ],
72
+ "author": {
73
+ "name": "FRAMESET Studio",
74
+ "email": "hello@frameset.dev",
75
+ "url": "https://frameset.dev"
76
+ },
77
+ "license": "MIT",
78
+ "homepage": "https://frameset.dev/plex-player",
79
+ "repository": {
80
+ "type": "git",
81
+ "url": "git+https://github.com/deadseti/plex-player.git"
82
+ },
83
+ "bugs": {
84
+ "url": "https://github.com/deadseti/plex-player/issues"
85
+ },
86
+ "funding": {
87
+ "type": "github",
88
+ "url": "https://github.com/sponsors/deadseti"
89
+ },
90
+ "engines": {
91
+ "node": ">=16.0.0"
92
+ },
93
+ "peerDependencies": {
94
+ "react": ">=16.8.0",
95
+ "react-dom": ">=16.8.0",
96
+ "vue": ">=3.0.0"
97
+ },
98
+ "peerDependenciesMeta": {
99
+ "react": {
100
+ "optional": true
101
+ },
102
+ "react-dom": {
103
+ "optional": true
104
+ },
105
+ "vue": {
106
+ "optional": true
107
+ }
108
+ },
109
+ "devDependencies": {
110
+ "@babel/core": "^7.24.0",
111
+ "@babel/preset-env": "^7.24.0",
112
+ "@babel/preset-react": "^7.24.0",
113
+ "@rollup/plugin-babel": "^6.0.0",
114
+ "@rollup/plugin-commonjs": "^25.0.0",
115
+ "@rollup/plugin-node-resolve": "^15.0.0",
116
+ "@rollup/plugin-terser": "^0.4.0",
117
+ "@types/node": "^20.0.0",
118
+ "@types/react": "^18.0.0",
119
+ "@types/react-dom": "^18.0.0",
120
+ "eslint": "^8.0.0",
121
+ "postcss": "^8.0.0",
122
+ "rollup": "^4.0.0",
123
+ "rollup-plugin-copy": "^3.5.0",
124
+ "rollup-plugin-postcss": "^4.0.0",
125
+ "typescript": "^5.0.0",
126
+ "vite": "^5.0.0",
127
+ "vitest": "^1.0.0"
128
+ },
129
+ "sideEffects": [
130
+ "**/*.css"
131
+ ]
132
+ }