videoplayer-extension 1.0.0 → 1.1.1
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 +63 -6
- package/index.js +7 -0
- package/index.min.js +1 -1
- package/index.min.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,21 +6,78 @@ https://sharkiller.dev/videoplayer/
|
|
|
6
6
|
|
|
7
7
|
https://github.com/sharkiller/Reproductor-MPD-M3U8
|
|
8
8
|
|
|
9
|
+
### How to use
|
|
10
|
+
|
|
11
|
+
https://github.com/sharkiller/Reproductor-MPD-M3U8/wiki/Embed-player
|
|
12
|
+
|
|
9
13
|
### Required
|
|
10
14
|
|
|
11
|
-
⚠️ This validate VideoPlayer Extension
|
|
15
|
+
⚠️ This validate VideoPlayer Extension and get the path of the players on different browsers.
|
|
12
16
|
|
|
13
|
-
## Direct Usage
|
|
17
|
+
## Direct Usage Example
|
|
14
18
|
```html
|
|
19
|
+
<!-- Use unpkg, or you can host the script on your own. -->
|
|
15
20
|
<script src="https://unpkg.com/videoplayer-extension@latest/index.min.js"></script>
|
|
16
21
|
|
|
17
22
|
<script>
|
|
18
23
|
(async () => {
|
|
19
|
-
|
|
24
|
+
// This check if the extension is installed and populate the variables.
|
|
20
25
|
const vp = await VideoPlayer.init();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
|
|
27
|
+
// Ask if the extension could be found
|
|
28
|
+
if ( vp.isInstalled() ) {
|
|
29
|
+
// Firefox: moz-extension://{RANDOM-UUID}/pages/player.html
|
|
30
|
+
// Chrome: chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/pages/player.html
|
|
31
|
+
let direct_player_url = vp.getDirectPlayer();
|
|
32
|
+
|
|
33
|
+
// Firefox: moz-extension://{RANDOM-UUID}/iptv/player.html
|
|
34
|
+
// Chrome: chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/iptv/player.html
|
|
35
|
+
let iptv_player_url = vp.getIPTVPlayer();
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Your code when the extension is found.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
// Example
|
|
42
|
+
const extension_url = new URL(direct_player_url);
|
|
43
|
+
|
|
44
|
+
const media_url = new URL('https://livesim.dashif.org/livesim2/testpic4_8s/Manifest.mpd');
|
|
45
|
+
media_url.searchParams.set('title', 'Stream Test Example');
|
|
46
|
+
// HTTP Headers example
|
|
47
|
+
media_url.searchParams.set('headers', btoa(JSON.stringify({
|
|
48
|
+
'User-Agent': 'VideoPlayer Extension',
|
|
49
|
+
'referer': 'https://sharkiller.dev/videoplayer/',
|
|
50
|
+
})));
|
|
51
|
+
// ClearKey example
|
|
52
|
+
media_url.searchParams.set('ck', btoa(JSON.stringify({
|
|
53
|
+
"11223344556677889900aabbccddeeff":"11223344556677889900aabbccddeeff",
|
|
54
|
+
"223344556677889900aabbccddeeff11":"223344556677889900aabbccddeeff11",
|
|
55
|
+
"3344556677889900aabbccddeeff1122":"3344556677889900aabbccddeeff1122"
|
|
56
|
+
})));
|
|
57
|
+
|
|
58
|
+
// Or you can assign, to the extension hash, your full media url directly
|
|
59
|
+
extension_url.hash = media_url.href;
|
|
60
|
+
|
|
61
|
+
const iframe = document.querySelector('iframe.example');
|
|
62
|
+
iframe.setAttribute('src', extension_url.href);
|
|
63
|
+
iframe.style.display = 'block';
|
|
64
|
+
|
|
65
|
+
} else {
|
|
66
|
+
// Return https://sharkiller.dev/videoplayer/ to let users install the extension.
|
|
67
|
+
let install_url = VideoPlayer.getInstallUrl();
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Your code when the extension cannot be found.
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
// Example
|
|
74
|
+
const div = document.querySelector('div.install');
|
|
75
|
+
div.innerHTML = `Install the extension: <a href="${install_url}" target="_blank">${install_url}</a>`;
|
|
76
|
+
div.style.display = 'block';
|
|
77
|
+
}
|
|
24
78
|
})();
|
|
25
79
|
</script>
|
|
80
|
+
|
|
81
|
+
<div class="install" style="display: none"></div>
|
|
82
|
+
<iframe class="example" allow="encrypted-media *; autoplay" width="1280" height="720" style="display: none"></iframe>
|
|
26
83
|
```
|
package/index.js
CHANGED
|
@@ -49,6 +49,13 @@ class VideoPlayer {
|
|
|
49
49
|
const result = regex.exec(response.url);
|
|
50
50
|
this.#extensionUrl = result[1];
|
|
51
51
|
this.#isInstalled = true;
|
|
52
|
+
}else{
|
|
53
|
+
// Fallback old Chrome versions
|
|
54
|
+
const response = await fetch('chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/play-on.png', {method: 'HEAD'});
|
|
55
|
+
if (response.ok && response.status === 200 ) {
|
|
56
|
+
this.#extensionUrl = 'chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/';
|
|
57
|
+
this.#isInstalled = true;
|
|
58
|
+
}
|
|
52
59
|
}
|
|
53
60
|
} catch (error) {}
|
|
54
61
|
}
|
package/index.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
class VideoPlayer{#
|
|
1
|
+
class VideoPlayer{#e=!1;#i=!1;#t=!1;constructor(e){"init"===e?this.#e=!0:console.warn("Use: const videoplayer = await VideoPlayer.init();")}static getInstallUrl(){return"https://sharkiller.dev/videoplayer/"}static async init(){const e=new VideoPlayer("init");return await e.checkExtension(),e}async checkExtension(){if(this.#s())try{const e=await fetch("isInstalled.mpd",{method:"HEAD",redirect:"follow"});if(e.redirected&&e.url.endsWith("/pages/player.html")){const i=/^(.*\/)pages\/player\.html$/i.exec(e.url);this.#t=i[1],this.#i=!0}else{const e=await fetch("chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/play-on.png",{method:"HEAD"});e.ok&&200===e.status&&(this.#t="chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/",this.#i=!0)}}catch(e){}}#s(){return this.#e||console.warn("VideoPlayer class not initialized! Use first: const videoplayer = await VideoPlayer.init();"),this.#e}isInstalled(){return!!this.#s()&&this.#i}getDirectPlayer(){return this.#s()&&this.#i?this.#t+"pages/player.html":(console.warn("VideoPlayer extension is not installed! Check isInstalled() first."),!1)}getIPTVPlayer(){return this.#s()&&this.#i?this.#t+"iptv/player.html":(console.warn("VideoPlayer extension is not installed! Check isInstalled() first."),!1)}}window.VideoPlayer=VideoPlayer;
|
|
2
2
|
//# sourceMappingURL=index.min.js.map
|
package/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["VideoPlayer","initialized","isInstalled","extensionUrl","constructor","init","this","console","warn","getInstallUrl","videoplayer","checkExtension","isInitialized","response","fetch","method","redirect","redirected","url","endsWith","result","exec","error","getDirectPlayer","getIPTVPlayer","window"],"sources":["index.js"],"sourcesContent":["/**\r\n * Check if the VideoPlayer Extension is installed\r\n * @classDesc Use the static init() method to initialize the class.\r\n * @author Sharkiller\r\n * @hideconstructor\r\n */\r\nclass VideoPlayer {\r\n\r\n #initialized = false;\r\n #isInstalled = false;\r\n #extensionUrl = false;\r\n\r\n constructor(init) {\r\n if(init === 'init'){\r\n this.#initialized = true;\r\n }else{\r\n console.warn(\"Use: const videoplayer = await VideoPlayer.init();\");\r\n }\r\n }\r\n\r\n /**\r\n * Return installation link for the VideoPlayer Extension.\r\n * @returns {string}\r\n */\r\n static getInstallUrl() {\r\n return 'https://sharkiller.dev/videoplayer/';\r\n }\r\n\r\n /**\r\n * Initializes the VideoPlayer detector.\r\n * Must be called before using any instance methods.\r\n * @returns {Promise<VideoPlayer>}\r\n */\r\n static async init() {\r\n const videoplayer = new VideoPlayer('init');\r\n await videoplayer.checkExtension();\r\n return videoplayer;\r\n }\r\n\r\n async checkExtension() {\r\n if (!this.#isInitialized()) {\r\n return;\r\n }\r\n try {\r\n const response = await fetch('isInstalled.mpd', {method: 'HEAD', redirect: 'follow'});\r\n\r\n if (response.redirected && response.url.endsWith('/pages/player.html') ) {\r\n const regex = /^(.*\\/)pages\\/player\\.html$/i;\r\n const result = regex.exec(response.url);\r\n this.#extensionUrl = result[1];\r\n this.#isInstalled = true;\r\n }\r\n } catch (error) {}\r\n }\r\n\r\n #isInitialized() {\r\n if (!this.#initialized) {\r\n console.warn(\"VideoPlayer class not initialized! Use first: const videoplayer = await VideoPlayer.init();\");\r\n }\r\n return this.#initialized;\r\n }\r\n\r\n /**\r\n * Returns TRUE if the VideoPlayer is installed or FALSE if not.\r\n * @returns {boolean}\r\n */\r\n isInstalled() {\r\n if (!this.#isInitialized()) {\r\n return false;\r\n }\r\n return this.#isInstalled;\r\n }\r\n\r\n /**\r\n * Return the full extension path to the Direct Player extension.\r\n * @returns {string|false}\r\n */\r\n getDirectPlayer() {\r\n if (!this.#isInitialized() || !this.#isInstalled) {\r\n console.warn(\"VideoPlayer extension is not installed! Check isInstalled() first.\");\r\n return false;\r\n }\r\n return this.#extensionUrl + 'pages/player.html';\r\n }\r\n\r\n /**\r\n * Return the full extension path to the IPTV Player extension.\r\n * @returns {string|false}\r\n */\r\n getIPTVPlayer() {\r\n if (!this.#isInitialized() || !this.#isInstalled) {\r\n console.warn(\"VideoPlayer extension is not installed! Check isInstalled() first.\");\r\n return false;\r\n }\r\n return this.#extensionUrl + 'iptv/player.html';\r\n }\r\n\r\n}\r\n\r\nwindow.VideoPlayer = VideoPlayer;"],"mappings":"AAMA,MAAMA,YAEFC,IAAe,EACfC,IAAe,EACfC,IAAgB,EAEhB,WAAAC,CAAYC,GACI,SAATA,EACCC,MAAKL,GAAe,EAEpBM,QAAQC,KAAK,qDAErB,CAMA,oBAAOC,GACH,MAAO,qCACX,CAOA,iBAAaJ,GACT,MAAMK,EAAc,IAAIV,YAAY,QAEpC,aADMU,EAAYC,iBACXD,CACX,CAEA,oBAAMC,GACF,GAAKL,MAAKM,IAGV,IACI,MAAMC,QAAiBC,MAAM,kBAAmB,CAACC,OAAQ,OAAQC,SAAU,WAE3E,GAAIH,EAASI,YAAcJ,EAASK,IAAIC,SAAS,sBAAwB,CACrE,MACMC,EADQ,+BACOC,KAAKR,EAASK,KACnCZ,MAAKH,EAAgBiB,EAAO,GAC5Bd,MAAKJ,GAAe,CACxB,CACJ,CAAE,
|
|
1
|
+
{"version":3,"names":["VideoPlayer","initialized","isInstalled","extensionUrl","constructor","init","this","console","warn","getInstallUrl","videoplayer","checkExtension","isInitialized","response","fetch","method","redirect","redirected","url","endsWith","result","exec","ok","status","error","getDirectPlayer","getIPTVPlayer","window"],"sources":["index.js"],"sourcesContent":["/**\r\n * Check if the VideoPlayer Extension is installed\r\n * @classDesc Use the static init() method to initialize the class.\r\n * @author Sharkiller\r\n * @hideconstructor\r\n */\r\nclass VideoPlayer {\r\n\r\n #initialized = false;\r\n #isInstalled = false;\r\n #extensionUrl = false;\r\n\r\n constructor(init) {\r\n if(init === 'init'){\r\n this.#initialized = true;\r\n }else{\r\n console.warn(\"Use: const videoplayer = await VideoPlayer.init();\");\r\n }\r\n }\r\n\r\n /**\r\n * Return installation link for the VideoPlayer Extension.\r\n * @returns {string}\r\n */\r\n static getInstallUrl() {\r\n return 'https://sharkiller.dev/videoplayer/';\r\n }\r\n\r\n /**\r\n * Initializes the VideoPlayer detector.\r\n * Must be called before using any instance methods.\r\n * @returns {Promise<VideoPlayer>}\r\n */\r\n static async init() {\r\n const videoplayer = new VideoPlayer('init');\r\n await videoplayer.checkExtension();\r\n return videoplayer;\r\n }\r\n\r\n async checkExtension() {\r\n if (!this.#isInitialized()) {\r\n return;\r\n }\r\n try {\r\n const response = await fetch('isInstalled.mpd', {method: 'HEAD', redirect: 'follow'});\r\n\r\n if (response.redirected && response.url.endsWith('/pages/player.html') ) {\r\n const regex = /^(.*\\/)pages\\/player\\.html$/i;\r\n const result = regex.exec(response.url);\r\n this.#extensionUrl = result[1];\r\n this.#isInstalled = true;\r\n }else{\r\n // Fallback old Chrome versions\r\n const response = await fetch('chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/play-on.png', {method: 'HEAD'});\r\n if (response.ok && response.status === 200 ) {\r\n this.#extensionUrl = 'chrome-extension://opmeopcambhfimffbomjgemehjkbbmji/';\r\n this.#isInstalled = true;\r\n }\r\n }\r\n } catch (error) {}\r\n }\r\n\r\n #isInitialized() {\r\n if (!this.#initialized) {\r\n console.warn(\"VideoPlayer class not initialized! Use first: const videoplayer = await VideoPlayer.init();\");\r\n }\r\n return this.#initialized;\r\n }\r\n\r\n /**\r\n * Returns TRUE if the VideoPlayer is installed or FALSE if not.\r\n * @returns {boolean}\r\n */\r\n isInstalled() {\r\n if (!this.#isInitialized()) {\r\n return false;\r\n }\r\n return this.#isInstalled;\r\n }\r\n\r\n /**\r\n * Return the full extension path to the Direct Player extension.\r\n * @returns {string|false}\r\n */\r\n getDirectPlayer() {\r\n if (!this.#isInitialized() || !this.#isInstalled) {\r\n console.warn(\"VideoPlayer extension is not installed! Check isInstalled() first.\");\r\n return false;\r\n }\r\n return this.#extensionUrl + 'pages/player.html';\r\n }\r\n\r\n /**\r\n * Return the full extension path to the IPTV Player extension.\r\n * @returns {string|false}\r\n */\r\n getIPTVPlayer() {\r\n if (!this.#isInitialized() || !this.#isInstalled) {\r\n console.warn(\"VideoPlayer extension is not installed! Check isInstalled() first.\");\r\n return false;\r\n }\r\n return this.#extensionUrl + 'iptv/player.html';\r\n }\r\n\r\n}\r\n\r\nwindow.VideoPlayer = VideoPlayer;"],"mappings":"AAMA,MAAMA,YAEFC,IAAe,EACfC,IAAe,EACfC,IAAgB,EAEhB,WAAAC,CAAYC,GACI,SAATA,EACCC,MAAKL,GAAe,EAEpBM,QAAQC,KAAK,qDAErB,CAMA,oBAAOC,GACH,MAAO,qCACX,CAOA,iBAAaJ,GACT,MAAMK,EAAc,IAAIV,YAAY,QAEpC,aADMU,EAAYC,iBACXD,CACX,CAEA,oBAAMC,GACF,GAAKL,MAAKM,IAGV,IACI,MAAMC,QAAiBC,MAAM,kBAAmB,CAACC,OAAQ,OAAQC,SAAU,WAE3E,GAAIH,EAASI,YAAcJ,EAASK,IAAIC,SAAS,sBAAwB,CACrE,MACMC,EADQ,+BACOC,KAAKR,EAASK,KACnCZ,MAAKH,EAAgBiB,EAAO,GAC5Bd,MAAKJ,GAAe,CACxB,KAAK,CAED,MAAMW,QAAiBC,MAAM,kEAAmE,CAACC,OAAQ,SACrGF,EAASS,IAA0B,MAApBT,EAASU,SACxBjB,MAAKH,EAAgB,uDACrBG,MAAKJ,GAAe,EAE5B,CACJ,CAAE,MAAOsB,GAAQ,CACrB,CAEA,EAAAZ,GAII,OAHKN,MAAKL,GACNM,QAAQC,KAAK,+FAEVF,MAAKL,CAChB,CAMA,WAAAC,GACI,QAAKI,MAAKM,KAGHN,MAAKJ,CAChB,CAMA,eAAAuB,GACI,OAAKnB,MAAKM,KAAqBN,MAAKJ,EAI7BI,MAAKH,EAAgB,qBAHxBI,QAAQC,KAAK,uEACN,EAGf,CAMA,aAAAkB,GACI,OAAKpB,MAAKM,KAAqBN,MAAKJ,EAI7BI,MAAKH,EAAgB,oBAHxBI,QAAQC,KAAK,uEACN,EAGf,EAIJmB,OAAO3B,YAAcA","ignoreList":[]}
|