jerrrycans commited on
Commit
0338121
·
verified ·
1 Parent(s): 456750e

Update bot/server/templates/player.html

Browse files
Files changed (1) hide show
  1. bot/server/templates/player.html +322 -154
bot/server/templates/player.html CHANGED
@@ -1,154 +1,322 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <title>Play Files</title>
5
-
6
- <meta charset="UTF-8">
7
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
- <meta http-equiv="X-Frame-Options" content="deny">
9
-
10
- <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css" />
11
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
12
-
13
- <script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
14
-
15
- <style>
16
- html, body {
17
- margin: 0;
18
- height: 100%;
19
- }
20
-
21
- #stream-media {
22
- height: 100%;
23
- width: 100%;
24
- }
25
-
26
- #error-message {
27
- color: red;
28
- font-size: 24px;
29
- text-align: center;
30
- margin-top: 20px;
31
- }
32
-
33
- .plyr__video-wrapper .plyr-download-button{
34
- position: absolute;
35
- top: 10px;
36
- left: 10px;
37
- width: 30px;
38
- height: 30px;
39
- background-color: rgba(0, 0, 0, 0.7);
40
- border-radius: 50%;
41
- text-align: center;
42
- line-height: 30px;
43
- color: white;
44
- z-index: 10;
45
- }
46
-
47
- .plyr__volume {
48
- max-width: initial;
49
- min-width: initial;
50
- width: auto;
51
- position: relative;
52
- }
53
-
54
-
55
- .plyr__video-wrapper .plyr-share-button{
56
- position: absolute;
57
- top: 50px;
58
- left: 10px;
59
- width: 30px;
60
- height: 30px;
61
- background-color: rgba(0, 0, 0, 0.7);
62
- border-radius: 50%;
63
- text-align: center;
64
- line-height: 30px;
65
- color: white;
66
- z-index: 10;
67
- }
68
-
69
- .plyr__video-wrapper .plyr-download-button:hover,
70
- .plyr__video-wrapper .plyr-share-button:hover{
71
- background-color: rgba(255, 255, 255, 0.7);
72
- color: black;
73
- }
74
-
75
- .plyr__video-wrapper .plyr-download-button:before {
76
- font-family: "Font Awesome 5 Free";
77
- content: "\f019";
78
- font-weight: bold;
79
- }
80
-
81
- .plyr__video-wrapper .plyr-share-button:before {
82
- font-family: "Font Awesome 5 Free";
83
- content: "\f064";
84
- font-weight: bold;
85
- }
86
-
87
- .plyr, .plyr__video-wrapper, .plyr__video-embed iframe {
88
- height: 100%;
89
- }
90
-
91
- </style>
92
- </head>
93
-
94
- <body>
95
- <video id="stream-media" controls preload="auto">
96
- <source src="" type="">
97
- <p class="vjs-no-js">
98
- To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video
99
- </p>
100
- </video>
101
-
102
- <div id="error-message"></div>
103
-
104
- <script>
105
- var player = new Plyr('#stream-media', {
106
- controls:['play-large', 'rewind', 'play', 'fast-forward', 'progress', 'current-time', 'mute', 'settings', 'pip', 'fullscreen'],
107
- settings:['speed','loop'],
108
- speed:{selected:1,options:[0.25,0.5,0.75,1,1.25,1.5,1.75,2]},
109
- seek: 10,
110
- keyboard: { focused: true, global: true },
111
- });
112
-
113
- var mediaLink = "{{ mediaLink }}";
114
-
115
- if (mediaLink) {
116
- document.querySelector('#stream-media source').setAttribute('src', mediaLink);
117
- player.restart();
118
-
119
- var downloadButton = document.createElement('div');
120
- downloadButton.className = 'plyr-download-button';
121
-
122
- downloadButton.onclick = function() {
123
- event.stopPropagation();
124
- var link = document.createElement('a');
125
- link.href = mediaLink;
126
- document.body.appendChild(link);
127
- link.click();
128
- document.body.removeChild(link);
129
- };
130
-
131
- player.elements.container.querySelector('.plyr__video-wrapper').appendChild(downloadButton);
132
-
133
- var shareButton = document.createElement('div');
134
- shareButton.className = 'plyr-share-button';
135
-
136
- shareButton.onclick = function() {
137
- event.stopPropagation();
138
- if (navigator.share) {
139
- navigator.share({
140
- title: "Play",
141
- url: mediaLink
142
- });
143
- }
144
- };
145
-
146
- player.elements.container.querySelector('.plyr__video-wrapper').appendChild(shareButton);
147
-
148
- } else {
149
- document.getElementById('error-message').textContent = 'Error: Media URL not provided';
150
- }
151
- </script>
152
-
153
- </body>
154
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Media Player</title>
5
+
6
+ <meta charset="UTF-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <meta http-equiv="X-Frame-Options" content="deny">
9
+
10
+ <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css" />
11
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
12
+ <link rel="preconnect" href="https://fonts.googleapis.com">
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
15
+
16
+ <script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
17
+
18
+ <style>
19
+ :root {
20
+ --primary-color: #6200ea;
21
+ --primary-light: #9d46ff;
22
+ --secondary-color: #00e5ff;
23
+ --background-dark: #121212;
24
+ --text-color: #f5f5f5;
25
+ --button-hover: rgba(255, 255, 255, 0.2);
26
+ --control-bg: rgba(0, 0, 0, 0.6);
27
+ }
28
+
29
+ * {
30
+ box-sizing: border-box;
31
+ margin: 0;
32
+ padding: 0;
33
+ }
34
+
35
+ html, body {
36
+ margin: 0;
37
+ height: 100%;
38
+ background-color: var(--background-dark);
39
+ color: var(--text-color);
40
+ font-family: 'Poppins', sans-serif;
41
+ overflow: hidden;
42
+ }
43
+
44
+ .player-container {
45
+ height: 100%;
46
+ width: 100%;
47
+ position: relative;
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ background: linear-gradient(135deg, #121212 0%, #1e1e1e 100%);
52
+ }
53
+
54
+ #stream-media {
55
+ height: 100%;
56
+ width: 100%;
57
+ max-height: 95vh;
58
+ border-radius: 8px;
59
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
60
+ }
61
+
62
+ #error-message {
63
+ color: #ff4081;
64
+ font-size: 1.2rem;
65
+ text-align: center;
66
+ padding: 20px;
67
+ background-color: rgba(0, 0, 0, 0.7);
68
+ border-radius: 8px;
69
+ position: absolute;
70
+ top: 50%;
71
+ left: 50%;
72
+ transform: translate(-50%, -50%);
73
+ max-width: 80%;
74
+ }
75
+
76
+ /* Custom Player Styling */
77
+ .plyr {
78
+ --plyr-color-main: var(--primary-color);
79
+ --plyr-control-radius: 6px;
80
+ --plyr-video-controls-background: linear-gradient(0deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 100%);
81
+ --plyr-menu-background: rgba(18, 18, 18, 0.95);
82
+ --plyr-menu-color: var(--text-color);
83
+ --plyr-menu-border-radius: 8px;
84
+ --plyr-control-icon-size: 18px;
85
+ border-radius: 12px;
86
+ overflow: hidden;
87
+ }
88
+
89
+ .plyr--video .plyr__control:hover {
90
+ background: var(--primary-light);
91
+ }
92
+
93
+ .plyr__control--overlaid {
94
+ background: var(--primary-color) !important;
95
+ padding: 20px !important;
96
+ opacity: 0.9;
97
+ transition: all 0.3s ease;
98
+ }
99
+
100
+ .plyr__control--overlaid:hover {
101
+ background: var(--primary-light) !important;
102
+ transform: scale(1.1);
103
+ }
104
+
105
+ .plyr__progress__buffer {
106
+ background-color: rgba(255, 255, 255, 0.3);
107
+ }
108
+
109
+ .plyr__control.plyr__tab-focus {
110
+ box-shadow: 0 0 0 3px var(--primary-light);
111
+ }
112
+
113
+ /* Action Buttons */
114
+ .player-action-button {
115
+ position: absolute;
116
+ width: 42px;
117
+ height: 42px;
118
+ background-color: var(--control-bg);
119
+ border-radius: 50%;
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ color: white;
124
+ z-index: 10;
125
+ cursor: pointer;
126
+ transition: all 0.2s ease;
127
+ backdrop-filter: blur(5px);
128
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
129
+ border: 1px solid rgba(255, 255, 255, 0.1);
130
+ }
131
+
132
+ .player-action-button:hover {
133
+ background-color: var(--primary-color);
134
+ transform: scale(1.05);
135
+ }
136
+
137
+ .player-action-button i {
138
+ font-size: 18px;
139
+ }
140
+
141
+ .plyr-download-button {
142
+ top: 16px;
143
+ right: 16px;
144
+ }
145
+
146
+ .plyr-share-button {
147
+ top: 16px;
148
+ right: 68px;
149
+ }
150
+
151
+ /* Loading animation */
152
+ .loading-animation {
153
+ position: absolute;
154
+ top: 50%;
155
+ left: 50%;
156
+ transform: translate(-50%, -50%);
157
+ width: 80px;
158
+ height: 80px;
159
+ z-index: 5;
160
+ }
161
+
162
+ .loading-animation:after {
163
+ content: "";
164
+ position: absolute;
165
+ width: 80px;
166
+ height: 80px;
167
+ border: 6px solid rgba(255, 255, 255, 0.1);
168
+ border-radius: 50%;
169
+ border-top-color: var(--primary-color);
170
+ animation: loading 1s ease-in-out infinite;
171
+ }
172
+
173
+ @keyframes loading {
174
+ to {
175
+ transform: rotate(360deg);
176
+ }
177
+ }
178
+
179
+ /* Responsive adjustments */
180
+ @media (max-width: 768px) {
181
+ .player-action-button {
182
+ width: 36px;
183
+ height: 36px;
184
+ }
185
+
186
+ .player-action-button i {
187
+ font-size: 16px;
188
+ }
189
+
190
+ .plyr-download-button {
191
+ top: 12px;
192
+ right: 12px;
193
+ }
194
+
195
+ .plyr-share-button {
196
+ top: 12px;
197
+ right: 56px;
198
+ }
199
+ }
200
+ </style>
201
+ </head>
202
+
203
+ <body>
204
+ <div class="player-container">
205
+ <div id="loading" class="loading-animation"></div>
206
+ <video id="stream-media" controls preload="auto">
207
+ <source src="" type="">
208
+ <p class="vjs-no-js">
209
+ To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video
210
+ </p>
211
+ </video>
212
+ <div id="error-message"></div>
213
+ </div>
214
+
215
+ <script>
216
+ document.addEventListener('DOMContentLoaded', function() {
217
+ // Initialize the player with enhanced options
218
+ var player = new Plyr('#stream-media', {
219
+ controls: [
220
+ 'play-large',
221
+ 'rewind',
222
+ 'play',
223
+ 'fast-forward',
224
+ 'progress',
225
+ 'current-time',
226
+ 'duration',
227
+ 'mute',
228
+ 'volume',
229
+ 'captions',
230
+ 'settings',
231
+ 'pip',
232
+ 'fullscreen'
233
+ ],
234
+ settings: ['captions', 'quality', 'speed', 'loop'],
235
+ speed: {selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]},
236
+ seek: 10,
237
+ keyboard: { focused: true, global: true },
238
+ tooltips: { controls: true, seek: true },
239
+ disableContextMenu: false,
240
+ autopause: true,
241
+ hideControls: true,
242
+ resetOnEnd: false,
243
+ });
244
+
245
+ var loading = document.getElementById('loading');
246
+ var mediaLink = "{{ mediaLink }}";
247
+
248
+ if (mediaLink) {
249
+ document.querySelector('#stream-media source').setAttribute('src', mediaLink);
250
+
251
+ // Add MIME type detection based on file extension
252
+ const fileExtension = mediaLink.split('.').pop().toLowerCase();
253
+ let mimeType = 'video/mp4'; // Default
254
+
255
+ if (fileExtension === 'mp4') mimeType = 'video/mp4';
256
+ else if (fileExtension === 'webm') mimeType = 'video/webm';
257
+ else if (fileExtension === 'mov') mimeType = 'video/quicktime';
258
+ else if (fileExtension === 'mp3') mimeType = 'audio/mp3';
259
+ else if (fileExtension === 'wav') mimeType = 'audio/wav';
260
+
261
+ document.querySelector('#stream-media source').setAttribute('type', mimeType);
262
+
263
+ // Hide loading animation when video is ready
264
+ player.on('ready', function() {
265
+ loading.style.display = 'none';
266
+ });
267
+
268
+ player.on('error', function() {
269
+ loading.style.display = 'none';
270
+ document.getElementById('error-message').textContent = 'Error: Unable to load media';
271
+ });
272
+
273
+ player.restart();
274
+
275
+ // Create download button
276
+ var downloadButton = document.createElement('div');
277
+ downloadButton.className = 'player-action-button plyr-download-button';
278
+ downloadButton.innerHTML = '<i class="fas fa-download"></i>';
279
+ downloadButton.title = 'Download';
280
+
281
+ downloadButton.onclick = function(event) {
282
+ event.stopPropagation();
283
+ var link = document.createElement('a');
284
+ link.href = mediaLink;
285
+ link.download = '';
286
+ document.body.appendChild(link);
287
+ link.click();
288
+ document.body.removeChild(link);
289
+ };
290
+
291
+ // Create share button
292
+ var shareButton = document.createElement('div');
293
+ shareButton.className = 'player-action-button plyr-share-button';
294
+ shareButton.innerHTML = '<i class="fas fa-share-alt"></i>';
295
+ shareButton.title = 'Share';
296
+
297
+ shareButton.onclick = function(event) {
298
+ event.stopPropagation();
299
+ if (navigator.share) {
300
+ navigator.share({
301
+ title: "Media Player",
302
+ url: mediaLink
303
+ });
304
+ }
305
+ };
306
+
307
+ // Only show share button if Web Share API is available
308
+ if (!navigator.share) {
309
+ shareButton.style.display = 'none';
310
+ }
311
+
312
+ player.elements.container.appendChild(downloadButton);
313
+ player.elements.container.appendChild(shareButton);
314
+
315
+ } else {
316
+ loading.style.display = 'none';
317
+ document.getElementById('error-message').textContent = 'Error: Media URL not provided';
318
+ }
319
+ });
320
+ </script>
321
+ </body>
322
+ </html>