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 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 installation version > `26.1.5.8388`
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
- console.log('getInstallUrl()? ', VideoPlayer.getInstallUrl());
24
+ // This check if the extension is installed and populate the variables.
20
25
  const vp = await VideoPlayer.init();
21
- console.log('isInstalled()? ', vp.isInstalled());
22
- console.log('getDirectPlayer()? ', vp.getDirectPlayer());
23
- console.log('getIPTVPlayer()? ', vp.getIPTVPlayer());
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{#i=!1;#t=!1;#e=!1;constructor(i){"init"===i?this.#i=!0:console.warn("Use: const videoplayer = await VideoPlayer.init();")}static getInstallUrl(){return"https://sharkiller.dev/videoplayer/"}static async init(){const i=new VideoPlayer("init");return await i.checkExtension(),i}async checkExtension(){if(this.#s())try{const i=await fetch("isInstalled.mpd",{method:"HEAD",redirect:"follow"});if(i.redirected&&i.url.endsWith("/pages/player.html")){const t=/^(.*\/)pages\/player\.html$/i.exec(i.url);this.#e=t[1],this.#t=!0}}catch(i){}}#s(){return this.#i||console.warn("VideoPlayer class not initialized! Use first: const videoplayer = await VideoPlayer.init();"),this.#i}isInstalled(){return!!this.#s()&&this.#t}getDirectPlayer(){return this.#s()&&this.#t?this.#e+"pages/player.html":(console.warn("VideoPlayer extension is not installed! Check isInstalled() first."),!1)}getIPTVPlayer(){return this.#s()&&this.#t?this.#e+"iptv/player.html":(console.warn("VideoPlayer extension is not installed! Check isInstalled() first."),!1)}}window.VideoPlayer=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,MAAOoB,GAAQ,CACrB,CAEA,EAAAV,GAII,OAHKN,MAAKL,GACNM,QAAQC,KAAK,+FAEVF,MAAKL,CAChB,CAMA,WAAAC,GACI,QAAKI,MAAKM,KAGHN,MAAKJ,CAChB,CAMA,eAAAqB,GACI,OAAKjB,MAAKM,KAAqBN,MAAKJ,EAI7BI,MAAKH,EAAgB,qBAHxBI,QAAQC,KAAK,uEACN,EAGf,CAMA,aAAAgB,GACI,OAAKlB,MAAKM,KAAqBN,MAAKJ,EAI7BI,MAAKH,EAAgB,oBAHxBI,QAAQC,KAAK,uEACN,EAGf,EAIJiB,OAAOzB,YAAcA","ignoreList":[]}
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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "videoplayer-extension",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "A helper library for VideoPlayer Browser Extension",
5
5
  "main": "index.js",
6
6
  "module": "index.js",