daydreamer-json commited on
Commit
573d850
·
verified ·
1 Parent(s): 542c147
Files changed (1) hide show
  1. vidstack.html +73 -27
vidstack.html CHANGED
@@ -5,6 +5,7 @@
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <link rel="preconnect" href="https://rsms.me/">
7
  <link rel="stylesheet" href="https://rsms.me/inter/inter.css">
 
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet">
@@ -30,12 +31,37 @@
30
  }
31
  #player {
32
  flex-grow: 1;
 
 
33
  height: 100%;
34
  width: 100%;
35
  font-family: 'Inter', 'Noto Sans JP', sans-serif;
36
  }
37
  media-player {
38
  --video-font-family: 'Inter', 'Noto Sans JP', sans-serif !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
40
  footer.copyrightDisp {
41
  position: fixed;
@@ -53,6 +79,7 @@
53
  <div class="wrapper">
54
  <media-player
55
  title=""
 
56
  aspect-ratio="16/9"
57
  crossorigin
58
  id="player"
@@ -62,40 +89,59 @@
62
  <media-community-skin></media-community-skin>
63
  </media-player>
64
  </div>
65
- <!-- <footer class="copyrightDisp">
66
- Resources are created for research purposes.<br>
67
- (C) 2023 Tappei Nagatsuki, KADOKAWA, daydreamer-json
68
- </footer> -->
69
  <script>
70
  window.addEventListener('load', function(){
71
  document.oncontextmenu = function () {return false;}
72
  const player = document.querySelector('media-player');
73
- const pageUrlLocationHref = new URL(location.href);
74
- const pageSearchParams = pageUrlLocationHref.searchParams;
75
- if (pageSearchParams.has("url") === true) {
76
- player.onAttach(() => {
77
- const outletElement = document.querySelector('#player-media-outlet-el');
78
- const sourceElement = document.createElement("source");
79
- sourceElement.src = pageSearchParams.get("url");
80
- outletElement.appendChild(sourceElement);
81
- player.title = pageSearchParams.get("url").match(/^(?:[^:\/?#]+:)?(?:\/\/[^\/?#]*)?(?:([^?#]*\/)([^\/?#]*))?(\?[^#]*)?(?:#.*)?$/)[2].match(/^(.+?)(\.[^.]+)?$/)[1];
82
- })
83
- } else {
84
- const promptedUrl = prompt("Please input source URL");
85
- if (promptedUrl === "") {
86
- alert("Source not found");
87
  } else {
88
- player.onAttach(() => {
89
- const outletElement = document.querySelector('#player-media-outlet-el');
90
- const sourceElement = document.createElement("source");
91
- sourceElement.src = promptedUrl;
92
- outletElement.appendChild(sourceElement);
93
- player.title = pageSearchParams.get("url").match(".+/(.+?)\.[a-z]+([\?#;].*)?$")[1];
94
- })
95
  }
96
- }
97
-
 
 
 
 
 
 
 
 
 
 
 
 
98
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  </script>
100
  </body>
101
  </html>
 
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <link rel="preconnect" href="https://rsms.me/">
7
  <link rel="stylesheet" href="https://rsms.me/inter/inter.css">
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/daydreamer-json/SomeFontRepo@main/somefontrepo.css">
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet">
 
31
  }
32
  #player {
33
  flex-grow: 1;
34
+ top: 0;
35
+ left: 0;
36
  height: 100%;
37
  width: 100%;
38
  font-family: 'Inter', 'Noto Sans JP', sans-serif;
39
  }
40
  media-player {
41
  --video-font-family: 'Inter', 'Noto Sans JP', sans-serif !important;
42
+ --media-buffering-size: 84px;
43
+ --media-buffering-transition: opacity 200ms ease;
44
+ --media-buffering-animation: media-buffering-spin 1.2s linear infinite;
45
+ --media-buffering-track-color: #f5f5f5;
46
+ --media-buffering-track-opacity: 0;
47
+ --media-buffering-track-width: 8;
48
+ --media-buffering-track-fill-color: #ffffff;
49
+ --media-buffering-track-fill-opacity: 0.75;
50
+ --media-buffering-track-fill-width: 9;
51
+ --media-buffering-track-fill-offset: 50;
52
+ /* --media-cue-bg: rgba(0, 0, 0, 0.8); */
53
+ --media-cue-bg: rgba(0, 0, 0, 0);
54
+ /* --media-cue-backdrop: blur(8px); */
55
+ --media-cue-backdrop: none;
56
+ }
57
+ media-captions {
58
+ /* font-family: 'SDK_JP_Web', sans-serif; */
59
+ font-family: 'Inter', 'Noto Sans JP', sans-serif;
60
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75), -1px 1px 0 rgba(0, 0, 0, 0.75), 1px -1px 0 rgba(0, 0, 0, 0.75), -1px -1px 0 rgba(0, 0, 0, 0.75);
61
+ }
62
+ media-player:not([data-can-play]) .media-buffering-indicator,
63
+ media-player[data-waiting] .media-buffering-indicator {
64
+ opacity: 1;
65
  }
66
  footer.copyrightDisp {
67
  position: fixed;
 
79
  <div class="wrapper">
80
  <media-player
81
  title=""
82
+ poster="https://singlecolorimage.com/get/000000/640x360"
83
  aspect-ratio="16/9"
84
  crossorigin
85
  id="player"
 
89
  <media-community-skin></media-community-skin>
90
  </media-player>
91
  </div>
 
 
 
 
92
  <script>
93
  window.addEventListener('load', function(){
94
  document.oncontextmenu = function () {return false;}
95
  const player = document.querySelector('media-player');
96
+ player.onAttach(() => {
97
+ const pageUrlLocationHref = new URL(location.href);
98
+ const pageSearchParams = pageUrlLocationHref.searchParams;
99
+ if (pageSearchParams.has("url") === true && pageSearchParams.get("url") !== "") {
100
+ attachSourceToPlayer(pageSearchParams.get("url"));
101
+ if (pageSearchParams.has("subtitle") === true && pageSearchParams.get("subtitle") !== "") {
102
+ attachSubtitleSourceToPlayer(pageSearchParams.get("subtitle"));
103
+ }
 
 
 
 
 
 
104
  } else {
105
+ const promptedUrl = prompt("Please input source URL");
106
+ if (promptedUrl === "") {
107
+ alert("Source not found");
108
+ } else {
109
+ attachSourceToPlayer(promptedUrl);
110
+ }
 
111
  }
112
+ })
113
+ player.addEventListener('provider-change', (event) => {
114
+ const provider = event.detail;
115
+ if (provider?.type === 'hls') {
116
+ provider.library = 'https://cdn.jsdelivr.net/npm/[email protected]/dist/hls.min.js';
117
+ provider.config = {
118
+ "debug": true,
119
+ "enableWorker": true,
120
+ "lowLatencyMode": true,
121
+ "backBufferLength": 90
122
+ };
123
+ window.provider = provider;
124
+ }
125
+ });
126
  });
127
+ function attachSourceToPlayer (url) {
128
+ // Attach source URL to Vidstack Player
129
+ const outletElement = document.querySelector('#player-media-outlet-el');
130
+ const sourceElement = document.createElement("source");
131
+ sourceElement.src = url;
132
+ outletElement.appendChild(sourceElement);
133
+ // Extract and set source title from URL
134
+ // Search "filename.ext" from path string and extract "filename" (exclude ext)
135
+ player.title = url.match(/^(?:[^:\/?#]+:)?(?:\/\/[^\/?#]*)?(?:([^?#]*\/)([^\/?#]*))?(\?[^#]*)?(?:#.*)?$/)[2].match(/^(.+?)(\.[^.]+)?$/)[1];
136
+ }
137
+ function attachSubtitleSourceToPlayer (url) {
138
+ const outletElement = document.querySelector('#player-media-outlet-el');
139
+ const trackElement = document.createElement("track");
140
+ trackElement.src = url;
141
+ trackElement.kind = "subtitles";
142
+ trackElement.label = "Subtitle";
143
+ outletElement.appendChild(trackElement);
144
+ }
145
  </script>
146
  </body>
147
  </html>