1 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/includes/utils.php mythtv-master-build-new/mythplugins/mythweb/includes/utils.php |
---|
2 | --- mythtv-master-build-old/mythplugins/mythweb/includes/utils.php 2016-11-25 11:02:01.000000000 +0100 |
---|
3 | +++ mythtv-master-build-new/mythplugins/mythweb/includes/utils.php 2016-11-25 11:04:40.046666653 +0100 |
---|
4 | @@ -246,6 +246,8 @@ |
---|
5 | case 'flvp': return "$url.flvp"; |
---|
6 | case 'flv' : return "$url.flv"; |
---|
7 | case 'mp4' : return "$url.mp4"; |
---|
8 | + case 'ogv' : return "$url.ogv"; |
---|
9 | + case 'webm': return "$url.webm"; |
---|
10 | } |
---|
11 | // No more dsmyth filters, so return the URL no matter what the browser is. |
---|
12 | return $url; |
---|
13 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/set_flvplayer.php mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/set_flvplayer.php |
---|
14 | --- mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/set_flvplayer.php 2016-11-25 11:02:02.000000000 +0100 |
---|
15 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/set_flvplayer.php 2016-11-25 11:05:17.746666670 +0100 |
---|
16 | @@ -23,6 +23,8 @@ |
---|
17 | // Bitrates |
---|
18 | setting('WebFLV_vb', null, $_POST['vbitrate'] > 0 ? $_POST['vbitrate'] : 256); |
---|
19 | setting('WebFLV_ab', null, $_POST['abitrate'] > 0 ? $_POST['abitrate'] : 64); |
---|
20 | + // HTML5 streaming on/off |
---|
21 | + setting('WebHTML5Stream_on', null, $_POST['HTML5stream'] ? 1 : 0); |
---|
22 | |
---|
23 | } |
---|
24 | |
---|
25 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/tmpl/default/set_flvplayer.php mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/tmpl/default/set_flvplayer.php |
---|
26 | --- mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/tmpl/default/set_flvplayer.php 2016-11-25 11:02:40.000000000 +0100 |
---|
27 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/tmpl/default/set_flvplayer.php 2016-11-25 11:05:17.746666670 +0100 |
---|
28 | @@ -64,6 +64,11 @@ |
---|
29 | value="<?php echo html_entities(_or(setting('WebFLV_ab'), 64)) ?>" /> |
---|
30 | kbps</td> |
---|
31 | </tr><tr> |
---|
32 | + <th><?php echo t('HTML5 Streaming') ?>:</th> |
---|
33 | + <td><input class="radio" type="checkbox" name="HTML5stream" |
---|
34 | + title="Enable HTML5 Streaming (with Flash Video as fallback)" |
---|
35 | + <?php if (setting('WebHTML5Stream_on')) echo ' CHECKED' ?>></td> |
---|
36 | +</tr><tr> |
---|
37 | <td align="right"><input type="reset" class="submit" value="<?php echo t('Reset') ?>"></td> |
---|
38 | <td align="center"><input type="submit" class="submit" name="save" value="<?php echo t('Save') ?>"></td> |
---|
39 | </tr> |
---|
40 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/tmpl/lite/set_flvplayer.php mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/tmpl/lite/set_flvplayer.php |
---|
41 | --- mythtv-master-build-old/mythplugins/mythweb/modules/mythweb/tmpl/lite/set_flvplayer.php 2016-11-25 11:02:02.000000000 +0100 |
---|
42 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/mythweb/tmpl/lite/set_flvplayer.php 2016-11-25 11:05:17.746666670 +0100 |
---|
43 | @@ -47,6 +47,11 @@ |
---|
44 | value="<?php echo html_entities(_or(setting('WebFLV_ab'), 64)) ?>" /> |
---|
45 | kbps</td> |
---|
46 | </tr><tr> |
---|
47 | + <th><?php echo t('HTML5 Streaming') ?>:</th> |
---|
48 | + <td><input class="radio" type="checkbox" name="HTML5stream" |
---|
49 | + title="Enable HTML5 Streaming (with Flash Video as fallback)" |
---|
50 | + <?php if (setting('WebHTML5Stream_on')) echo ' CHECKED' ?>></td> |
---|
51 | +</tr><tr> |
---|
52 | <td align="right"><input type="reset" class="submit" value="<?php echo t('Reset') ?>"></td> |
---|
53 | <td align="center"><input type="submit" class="submit" name="save" value="<?php echo t('Save') ?>"></td> |
---|
54 | </tr> |
---|
55 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/_shared/lang/English.lang mythtv-master-build-new/mythplugins/mythweb/modules/_shared/lang/English.lang |
---|
56 | --- mythtv-master-build-old/mythplugins/mythweb/modules/_shared/lang/English.lang 2016-11-25 11:02:40.000000000 +0100 |
---|
57 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/_shared/lang/English.lang 2016-11-25 11:57:42.000000000 +0100 |
---|
58 | @@ -32,13 +32,16 @@ |
---|
59 | "%s Songs (%s)" |
---|
60 | "(height is calculated automatically from the recording aspect ratio)" |
---|
61 | "1 - Lowest" |
---|
62 | +"1080" |
---|
63 | "4 - Highest" |
---|
64 | +"720" |
---|
65 | "Aborted" |
---|
66 | "Aborting" |
---|
67 | "Action" |
---|
68 | "Activate" |
---|
69 | "Add" |
---|
70 | "Add Album to Current Playlist" |
---|
71 | +"Add Artist to Current Playlist" |
---|
72 | "Add Mix" |
---|
73 | "Add Song to Current Playlist" |
---|
74 | "add string" |
---|
75 | @@ -49,8 +52,8 @@ |
---|
76 | "Advanced" |
---|
77 | "Advanced Options" |
---|
78 | "Advanced Search" |
---|
79 | -"airdate" |
---|
80 | "Airdate" |
---|
81 | +"airdate" |
---|
82 | "Airtime" |
---|
83 | "Album Listing" |
---|
84 | "Album Tracks" |
---|
85 | @@ -134,15 +137,15 @@ |
---|
86 | "Cancelled" |
---|
87 | "Caps Lock" |
---|
88 | "Cast" |
---|
89 | -"category" |
---|
90 | "Category" |
---|
91 | +"category" |
---|
92 | "Category Legend" |
---|
93 | "CC" |
---|
94 | "Chan. Callsign" |
---|
95 | "Chan. Name" |
---|
96 | "Chan. Number" |
---|
97 | -"channel" |
---|
98 | "Channel" |
---|
99 | +"channel" |
---|
100 | "Channel "Jump to"" |
---|
101 | "Channel Detail" |
---|
102 | "Channel Info" |
---|
103 | @@ -240,8 +243,8 @@ |
---|
104 | "End Late" |
---|
105 | "Enter" |
---|
106 | "Enter a new name for your playlist" |
---|
107 | -"enter your search terms" |
---|
108 | "Enter your search terms" |
---|
109 | +"enter your search terms" |
---|
110 | "Episode" |
---|
111 | "Episode Number" |
---|
112 | "Error" |
---|
113 | @@ -310,6 +313,7 @@ |
---|
114 | "Hosted by" |
---|
115 | "Hour" |
---|
116 | "Hour Format" |
---|
117 | +"HTML5 Streaming" |
---|
118 | "hue" |
---|
119 | "Identifiable episode" |
---|
120 | "Ignore generic shows" |
---|
121 | @@ -325,19 +329,26 @@ |
---|
122 | "info: dont record" |
---|
123 | "info: flvplayer" |
---|
124 | <p> |
---|
125 | - Flash video playback is currently only a proof-of-concept and should be |
---|
126 | - considered <b>EXTREMELY</b> experimental, which is why it has been disabled by |
---|
127 | - default. |
---|
128 | - </p> |
---|
129 | + Video streaming in mythweb is currently based on HTML5 webm/ogg and flash flv. |
---|
130 | + <strong>NOTE</strong>: Today there is no single format supported by all browsers. |
---|
131 | + By this different browsers needs different configuration<br> |
---|
132 | + mythweb provides following streaming support: |
---|
133 | + <ul> |
---|
134 | + <li><strong>Google Chrome:</strong> Highly unstable. Flash fall-back adviced. Uncheck "HTML5 Streaming"</li> |
---|
135 | + <li><strong>Mozilla Firefox:</strong> Quite stable. Enable HTML5 streaming by checking "HTML5 Streaming"</li> |
---|
136 | + <li><strong>Safari (MacOS):</strong> Only Flash fall-back possible so uncheck "HTML5 Streaming"</li> |
---|
137 | + <li><strong>Safati (iOS):</strong> Flash is not supported so no fall-back possible. Use HLS client"</li> |
---|
138 | + <li><strong>IE8 and older:</strong> Only Flash fall-back possible so uncheck "HTML5 Streaming"</li> |
---|
139 | + <li><strong>IE9 and newer:</strong> Highly unstable. Prefer Flash fall-back by unchecking "HTML5 Streaming"</li> |
---|
140 | + </ul> |
---|
141 | <p> |
---|
142 | - It currently expects that ffmpeg is installed and compiled with mp3 |
---|
143 | - support, and that the recordings files are accessible to your webserver |
---|
144 | - userid. It probably won't work with Nupplevideo files, and in the end, |
---|
145 | - it may just not work at all (or maybe even worse). |
---|
146 | + This feature expects that myth is build with libx264, libvpx and libtheora libraries. Also for |
---|
147 | + flash fallback, Adobe Flash player must be installed on client side. |
---|
148 | </p> |
---|
149 | <p> |
---|
150 | - Enable this feature at your own risk, and don't expect too much |
---|
151 | - official help until it has left the experimental phase. |
---|
152 | + Enabling HTML5 streaming may cause not stable streaming as majority browsers (except Mozzilla) |
---|
153 | + offers not good video playabck stability. By this prefered mode is Flash fall-back mode |
---|
154 | + (with "HTML5 Streaming" option disabled). |
---|
155 | </p> |
---|
156 | "info: hidden advanced schedule" |
---|
157 | The advanced scheduling options are currently hidden. |
---|
158 | @@ -358,8 +369,8 @@ |
---|
159 | "Internet Reference #" |
---|
160 | "Jump" |
---|
161 | "Jump Points" |
---|
162 | -"Jump to" |
---|
163 | "Jump To" |
---|
164 | +"Jump to" |
---|
165 | "JumpPoints Editor" |
---|
166 | "Key Bindings" |
---|
167 | "Key bindings" |
---|
168 | @@ -377,8 +388,8 @@ |
---|
169 | "Left" |
---|
170 | "left" |
---|
171 | "leftl" |
---|
172 | -"length" |
---|
173 | "Length" |
---|
174 | +"length" |
---|
175 | "Length (min)" |
---|
176 | "Length in minutes" |
---|
177 | "Listing "Jump to"" |
---|
178 | @@ -414,8 +425,8 @@ |
---|
179 | "Modify unidentified episodes" |
---|
180 | "Monday" |
---|
181 | "Mono" |
---|
182 | -"more" |
---|
183 | "More" |
---|
184 | +"more" |
---|
185 | "Move Item Down in Playlist" |
---|
186 | "Move Item Up in Playlist" |
---|
187 | "movie" |
---|
188 | @@ -423,6 +434,7 @@ |
---|
189 | "Movies" |
---|
190 | "Movies, 3½ Stars or more" |
---|
191 | "Movies, Stinkers (2 Stars or less)" |
---|
192 | +"mplexid" |
---|
193 | "Music" |
---|
194 | "Music Specials" |
---|
195 | "My Session" |
---|
196 | @@ -457,6 +469,7 @@ |
---|
197 | "New Titles, Premieres" |
---|
198 | "No" |
---|
199 | "NO DATA" |
---|
200 | +"No episodes" |
---|
201 | "No Frontends allow remote control." |
---|
202 | "No Genre" |
---|
203 | "No matches found" |
---|
204 | @@ -515,6 +528,7 @@ |
---|
205 | "Play" |
---|
206 | "Play Recording on Frontend" |
---|
207 | "Play this Album Now" |
---|
208 | +"Play this Artist Now" |
---|
209 | "Play This Playlist Now" |
---|
210 | "Play this Playlist Now" |
---|
211 | "Play this Song Now" |
---|
212 | @@ -563,8 +577,8 @@ |
---|
213 | "Priority for movies by the year of release" |
---|
214 | "Priority when shown once" |
---|
215 | "Produced by" |
---|
216 | -"profile" |
---|
217 | "Profile" |
---|
218 | +"profile" |
---|
219 | "Program Categories" |
---|
220 | "Program Detail" |
---|
221 | "Program ID" |
---|
222 | @@ -582,8 +596,8 @@ |
---|
223 | "Rating:" |
---|
224 | "Recently Added Albums" |
---|
225 | "Recently completed jobs" |
---|
226 | -"Recently Played Songs" |
---|
227 | "Recently Played Albums" |
---|
228 | +"Recently Played Songs" |
---|
229 | "recgroup" |
---|
230 | "Recommend Videos" |
---|
231 | "Recommended" |
---|
232 | @@ -688,8 +702,8 @@ |
---|
233 | "Reset template and skin to defaults" |
---|
234 | "Retry" |
---|
235 | "Return to Statistics Page" |
---|
236 | -"right" |
---|
237 | "Right" |
---|
238 | +"right" |
---|
239 | "Root Directory" |
---|
240 | "Rows to show between timeslot info" |
---|
241 | "Running" |
---|
242 | @@ -732,11 +746,10 @@ |
---|
243 | "Select the correct show" |
---|
244 | "Server returned invalid data when attempting to retrieve metadata." |
---|
245 | "Server Statistics" |
---|
246 | -"mplexid" |
---|
247 | "serviceid" |
---|
248 | "Set Host" |
---|
249 | -"settings" |
---|
250 | "Settings" |
---|
251 | +"settings" |
---|
252 | "Settings Table" |
---|
253 | "settings/stream: protocol" |
---|
254 | Many media players are incapable of playing files that are streamed from<br/> |
---|
255 | @@ -829,9 +842,9 @@ |
---|
256 | "Toggle Interactive Mode" |
---|
257 | "Too Many" |
---|
258 | "Top $1" |
---|
259 | -"Top Played Songs" |
---|
260 | "Top Played Albums" |
---|
261 | "Top Played Artist" |
---|
262 | +"Top Played Songs" |
---|
263 | "Top Rated Songs" |
---|
264 | "Total Length" |
---|
265 | "Total Recorded" |
---|
266 | @@ -849,8 +862,8 @@ |
---|
267 | "TV" |
---|
268 | "TV functions, including recorded programs." |
---|
269 | "TV.com" |
---|
270 | -"type" |
---|
271 | "Type" |
---|
272 | +"type" |
---|
273 | "Uncategorized" |
---|
274 | "Undelete" |
---|
275 | "Undelete: $1" |
---|
276 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/_shared/lang/Polish.lang mythtv-master-build-new/mythplugins/mythweb/modules/_shared/lang/Polish.lang |
---|
277 | --- mythtv-master-build-old/mythplugins/mythweb/modules/_shared/lang/Polish.lang 2016-11-25 11:02:40.000000000 +0100 |
---|
278 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/_shared/lang/Polish.lang 2016-11-25 12:00:51.000000000 +0100 |
---|
279 | @@ -44,7 +44,9 @@ |
---|
280 | "%s Songs (%s)" |
---|
281 | "(height is calculated automatically from the recording aspect ratio)" |
---|
282 | "1 - Lowest" |
---|
283 | +"1080" |
---|
284 | "4 - Highest" |
---|
285 | +"720" |
---|
286 | "Aborted" |
---|
287 | "Aborting" |
---|
288 | "Action" |
---|
289 | @@ -53,6 +55,7 @@ |
---|
290 | Uaktywnij |
---|
291 | "Add" |
---|
292 | "Add Album to Current Playlist" |
---|
293 | +"Add Artist to Current Playlist" |
---|
294 | "Add Mix" |
---|
295 | "Add Song to Current Playlist" |
---|
296 | "add string" |
---|
297 | @@ -66,8 +69,8 @@ |
---|
298 | Zaawansowane opcje |
---|
299 | "Advanced Search" |
---|
300 | Szukanie zaawansowane |
---|
301 | -"airdate" |
---|
302 | "Airdate" |
---|
303 | +"airdate" |
---|
304 | "Airtime" |
---|
305 | "Album Listing" |
---|
306 | "Album Tracks" |
---|
307 | @@ -162,10 +165,10 @@ |
---|
308 | "Caps Lock" |
---|
309 | "Cast" |
---|
310 | Obsada |
---|
311 | -"category" |
---|
312 | - kategoria |
---|
313 | "Category" |
---|
314 | Kategoria |
---|
315 | +"category" |
---|
316 | + kategoria |
---|
317 | "Category Legend" |
---|
318 | Legenda kategorie |
---|
319 | "CC" |
---|
320 | @@ -228,6 +231,7 @@ |
---|
321 | "Custom Schedule" |
---|
322 | "Custom Search" |
---|
323 | "Customize Screens" |
---|
324 | +"Damaged" |
---|
325 | "Data" |
---|
326 | Dane |
---|
327 | "Database" |
---|
328 | @@ -258,10 +262,10 @@ |
---|
329 | "DELETE this Saved Playlist" |
---|
330 | "DeleteKey" |
---|
331 | "Depending on the Search type this is where you enter actual main search commands" |
---|
332 | -"description" |
---|
333 | - opis |
---|
334 | "Description" |
---|
335 | Opis |
---|
336 | +"description" |
---|
337 | + opis |
---|
338 | "Destination" |
---|
339 | Cel |
---|
340 | "Details for: $1" |
---|
341 | @@ -379,6 +383,7 @@ |
---|
342 | Godzina |
---|
343 | "Hour Format" |
---|
344 | Format godziny |
---|
345 | +"HTML5 Streaming" |
---|
346 | "hue" |
---|
347 | kolor |
---|
348 | "Identifiable episode" |
---|
349 | @@ -392,6 +397,28 @@ |
---|
350 | "info: default recording" |
---|
351 | "info: dont record" |
---|
352 | "info: flvplayer" |
---|
353 | + <p> |
---|
354 | + Video streaming in mythweb is currently based on HTML5 webm/ogg and flash flv. |
---|
355 | + <strong>NOTE</strong>: Today there is no single format supported by all browsers.. |
---|
356 | + By this different browsers needs different configuration<br> |
---|
357 | + mythweb provides following streaming support: |
---|
358 | + <ul> |
---|
359 | + <li><strong>Google Chrome:</strong> Highly unstable. Flash fall-back adviced. Uncheck "HTML5 Streaming"</li> |
---|
360 | + <li><strong>Mozilla Firefox:</strong> v52.0 or newer is stable and plays perfectly. Enable HTML5 streaming by checking "HTML5 Streaming"</li> |
---|
361 | + <li><strong>Safari (MacOS):</strong> Only Flash fall-back possible so uncheck "HTML5 Streaming"</li> |
---|
362 | + <li><strong>Safati (iOS):</strong> Flash is not supported so no fall-back possible. Use HLS client"</li> |
---|
363 | + <li><strong>IE8 and older:</strong> Only Flash fall-back possible so uncheck "HTML5 Streaming"</li> |
---|
364 | + <li><strong>IE9 and newer:</strong> Highly unstable. Prefer Flash fall-back by unchecking "HTML5 Streaming"</li> |
---|
365 | + </ul> |
---|
366 | + <p> |
---|
367 | + This feature expects that myth is build with libx264, libvpx and libtheora libraries. Also for |
---|
368 | + flash fallback, Adobe Flash player must be installed on client side. |
---|
369 | + </p> |
---|
370 | + <p> |
---|
371 | + Enabling HTML5 streaming may cause not stable streaming as majority browsers (except Mozzilla). |
---|
372 | + offers not good video playabck stability. By this prefered mode is Flash fall-back mode. |
---|
373 | + (with "HTML5 Streaming" option disabled). |
---|
374 | + </p> |
---|
375 | "info: hidden advanced schedule" |
---|
376 | "info: record this" |
---|
377 | "info:forget old" |
---|
378 | @@ -403,10 +430,10 @@ |
---|
379 | "Jump" |
---|
380 | Skocz |
---|
381 | "Jump Points" |
---|
382 | -"Jump to" |
---|
383 | - Skocz do |
---|
384 | "Jump To" |
---|
385 | Skocz Do |
---|
386 | +"Jump to" |
---|
387 | + Skocz do |
---|
388 | "JumpPoints Editor" |
---|
389 | "Key Bindings" |
---|
390 | "Key bindings" |
---|
391 | @@ -423,13 +450,13 @@ |
---|
392 | "Last recording" |
---|
393 | "Last showing of each episode" |
---|
394 | "Later" |
---|
395 | -"left" |
---|
396 | "Left" |
---|
397 | +"left" |
---|
398 | "leftl" |
---|
399 | -"length" |
---|
400 | - dÅugoÅÄ |
---|
401 | "Length" |
---|
402 | DÅugoÅÄ |
---|
403 | +"length" |
---|
404 | + dÅugoÅÄ |
---|
405 | "Length (min)" |
---|
406 | Czas trwania (minut): |
---|
407 | "Length in minutes" |
---|
408 | @@ -463,7 +490,6 @@ |
---|
409 | "Missing Cover" |
---|
410 | "Modify priority by star rating (0.0 to 1.0 for movies only)" |
---|
411 | "Modify priority for a station on an input" |
---|
412 | -"Modify priority for all inputs on a card" |
---|
413 | "Modify priority for an input (Input priority)" |
---|
414 | "Modify priority for every card on a host" |
---|
415 | "Modify unidentified episodes" |
---|
416 | @@ -481,6 +507,7 @@ |
---|
417 | "Movies, 3½ Stars or more" |
---|
418 | Filmy 3½ gwiazdy lub wiÄcej |
---|
419 | "Movies, Stinkers (2 Stars or less)" |
---|
420 | +"mplexid" |
---|
421 | "Music" |
---|
422 | Muzyka |
---|
423 | "Music Specials" |
---|
424 | @@ -520,6 +547,7 @@ |
---|
425 | Nowe tytuÅy, premiery |
---|
426 | "No" |
---|
427 | "NO DATA" |
---|
428 | +"No episodes" |
---|
429 | "No Frontends allow remote control." |
---|
430 | "No Genre" |
---|
431 | "No matches found" |
---|
432 | @@ -579,6 +607,7 @@ |
---|
433 | "Play" |
---|
434 | "Play Recording on Frontend" |
---|
435 | "Play this Album Now" |
---|
436 | +"Play this Artist Now" |
---|
437 | "Play This Playlist Now" |
---|
438 | "Play this Playlist Now" |
---|
439 | "Play this Song Now" |
---|
440 | @@ -649,6 +678,7 @@ |
---|
441 | "Rating:" |
---|
442 | "Recently Added Albums" |
---|
443 | "Recently completed jobs" |
---|
444 | +"Recently Played Albums" |
---|
445 | "Recently Played Songs" |
---|
446 | "recgroup" |
---|
447 | "Recommend Videos" |
---|
448 | @@ -764,8 +794,8 @@ |
---|
449 | "Reset template and skin to defaults" |
---|
450 | "Retry" |
---|
451 | "Return to Statistics Page" |
---|
452 | -"right" |
---|
453 | "Right" |
---|
454 | +"right" |
---|
455 | "Root Directory" |
---|
456 | "Rows to show between timeslot info" |
---|
457 | "Running" |
---|
458 | @@ -820,7 +850,6 @@ |
---|
459 | "Server returned invalid data when attempting to retrieve metadata." |
---|
460 | "Server Statistics" |
---|
461 | "serviceid" |
---|
462 | -"mplexid" |
---|
463 | "Set Host" |
---|
464 | "Settings" |
---|
465 | Ustawienia |
---|
466 | @@ -909,20 +938,22 @@ |
---|
467 | "Time Span" |
---|
468 | "Time Stretch" |
---|
469 | "Timeslot size" |
---|
470 | -"title" |
---|
471 | - tytuÅ |
---|
472 | "Title" |
---|
473 | TytuÅ |
---|
474 | +"title" |
---|
475 | + tytuÅ |
---|
476 | "Title Match" |
---|
477 | -"Title search" |
---|
478 | "Title Search" |
---|
479 | Szukanie TytuÅu |
---|
480 | +"Title search" |
---|
481 | "Title Search:" |
---|
482 | "Title:" |
---|
483 | "Toggle Interactive Mode" |
---|
484 | "Too Many" |
---|
485 | "Top $1" |
---|
486 | Szczyt $1 |
---|
487 | +"Top Played Albums" |
---|
488 | +"Top Played Artist" |
---|
489 | "Top Played Songs" |
---|
490 | "Top Rated Songs" |
---|
491 | "Total Length" |
---|
492 | @@ -932,20 +963,21 @@ |
---|
493 | CaÅkowity Czas |
---|
494 | "Total Time: %s" |
---|
495 | "Track #%s from the album '%s'" |
---|
496 | +"Trakt.tv Home Page" |
---|
497 | "Transcode" |
---|
498 | "Transcoded" |
---|
499 | -"transcoder" |
---|
500 | "Transcoder" |
---|
501 | +"transcoder" |
---|
502 | "Tuesday" |
---|
503 | Wtorek |
---|
504 | "Tuner Busy" |
---|
505 | "TV" |
---|
506 | "TV functions, including recorded programs." |
---|
507 | "TV.com" |
---|
508 | -"type" |
---|
509 | - typ |
---|
510 | "Type" |
---|
511 | Typ |
---|
512 | +"type" |
---|
513 | + typ |
---|
514 | "Uncategorized" |
---|
515 | "Undelete" |
---|
516 | "Undelete: $1" |
---|
517 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/stream/handler.pl mythtv-master-build-new/mythplugins/mythweb/modules/stream/handler.pl |
---|
518 | --- mythtv-master-build-old/mythplugins/mythweb/modules/stream/handler.pl 2016-11-25 11:02:02.000000000 +0100 |
---|
519 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/stream/handler.pl 2016-11-25 11:04:40.046666653 +0100 |
---|
520 | @@ -12,14 +12,35 @@ |
---|
521 | |
---|
522 | require "modules/$Path[0]/tv.pl"; |
---|
523 | |
---|
524 | +# Use the MythTV Services API URL if the $filename URL is not local |
---|
525 | unless ($filename) { |
---|
526 | - print header(), |
---|
527 | - "$basename does not exist in any recognized storage group directories for this host."; |
---|
528 | - exit; |
---|
529 | + # Retrieve the backend IP and port |
---|
530 | + $sh = $dbh->prepare('SELECT data FROM settings WHERE value=?'); |
---|
531 | + $sh->execute('BackendServerIP'); |
---|
532 | + my ($backend_server_ip) = $sh->fetchrow_array; |
---|
533 | + $sh->execute('BackendStatusPort'); |
---|
534 | + my ($backend_status_port) = $sh->fetchrow_array; |
---|
535 | + $sh->finish(); |
---|
536 | + |
---|
537 | + # Reformat the recording start time |
---|
538 | + use HTTP::Date qw(time2isoz); |
---|
539 | + $starttime_isoz = time2isoz($starttime); |
---|
540 | + $starttime_isoz =~ s/ /T/g; |
---|
541 | + |
---|
542 | + # Generate the MythTV Services API URL |
---|
543 | + $filename = "http://${backend_server_ip}:${backend_status_port}/Content/GetRecording?ChanId=${chanid}&StartTime=${starttime_isoz}"; |
---|
544 | } |
---|
545 | |
---|
546 | +# HTML5 video/ogv |
---|
547 | + if ($ENV{'REQUEST_URI'} =~ /\.ogv$/i) { |
---|
548 | + require "modules/$Path[0]/stream_ogv.pl"; |
---|
549 | + } |
---|
550 | +# HTML5 video/webm |
---|
551 | + elsif ($ENV{'REQUEST_URI'} =~ /\.webm$/i) { |
---|
552 | + require "modules/$Path[0]/stream_webm.pl"; |
---|
553 | + } |
---|
554 | # ASX mode? |
---|
555 | - if ($ENV{'REQUEST_URI'} =~ /\.asx$/i) { |
---|
556 | + elsif ($ENV{'REQUEST_URI'} =~ /\.asx$/i) { |
---|
557 | require "modules/$Path[0]/stream_asx.pl"; |
---|
558 | } |
---|
559 | # Flash? |
---|
560 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/stream/stream_ogv.pl mythtv-master-build-new/mythplugins/mythweb/modules/stream/stream_ogv.pl |
---|
561 | --- mythtv-master-build-old/mythplugins/mythweb/modules/stream/stream_ogv.pl 1970-01-01 01:00:00.000000000 +0100 |
---|
562 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/stream/stream_ogv.pl 2016-11-25 11:04:40.046666653 +0100 |
---|
563 | @@ -0,0 +1,186 @@ |
---|
564 | +#!/usr/bin/perl |
---|
565 | +# |
---|
566 | +# MythWeb Streaming/Download module |
---|
567 | +# |
---|
568 | +# @url $URL$ |
---|
569 | +# @date $2016/11/23$ |
---|
570 | +# @version $v1.0$ |
---|
571 | +# @author $Piotr Oniszczuk$ |
---|
572 | +# |
---|
573 | + |
---|
574 | + use POSIX qw(ceil floor); |
---|
575 | + |
---|
576 | +# round to the nearest even integer |
---|
577 | + sub round_even { |
---|
578 | + my ($in) = @_; |
---|
579 | + my $n = floor($in); |
---|
580 | + return ($n % 2 == 0) ? $n : ceil($in); |
---|
581 | + } |
---|
582 | + |
---|
583 | + our $ffmpeg_pid; |
---|
584 | + our $ffmpeg_pgid; |
---|
585 | + |
---|
586 | +# Shutdown cleanup |
---|
587 | + $ffmpeg_pgid = setpgrp(0,0); |
---|
588 | + $SIG{'TERM'} = \&shutdown_handler; |
---|
589 | + $SIG{'PIPE'} = \&shutdown_handler; |
---|
590 | + END { |
---|
591 | + shutdown_handler(); |
---|
592 | + } |
---|
593 | + sub shutdown_handler { |
---|
594 | + kill(1, $ffmpeg_pid) if ($ffmpeg_pid); |
---|
595 | + kill(-1, $ffmpeg_pid) if ($ffmpeg_pid); |
---|
596 | + } |
---|
597 | + |
---|
598 | +# Find ffmpeg |
---|
599 | + $ffmpeg = ''; |
---|
600 | + foreach my $path (split(/:/, $ENV{'PATH'}.':/usr/local/bin:/usr/bin'), '.') { |
---|
601 | + if (-e "$path/mythffmpeg") { |
---|
602 | + $ffmpeg = "$path/mythffmpeg"; |
---|
603 | + last; |
---|
604 | + } |
---|
605 | + if (-e "$path/ffmpeg") { |
---|
606 | + $ffmpeg = "$path/ffmpeg"; |
---|
607 | + last; |
---|
608 | + } |
---|
609 | + elsif ($^O eq 'darwin' && -e "$path/ffmpeg.app") { |
---|
610 | + $ffmpeg = "$path/ffmpeg.app"; |
---|
611 | + last; |
---|
612 | + } |
---|
613 | + } |
---|
614 | + |
---|
615 | +# Load some conversion settings from the database |
---|
616 | + $sh = $dbh->prepare('SELECT data FROM settings WHERE value=? AND hostname IS NULL'); |
---|
617 | + $sh->execute('WebFLV_w'); |
---|
618 | + my ($width) = $sh->fetchrow_array; |
---|
619 | + $sh->execute('WebFLV_vb'); |
---|
620 | + my ($vbitrate) = $sh->fetchrow_array; |
---|
621 | + $sh->execute('WebFLV_ab'); |
---|
622 | + my ($abitrate) = $sh->fetchrow_array; |
---|
623 | + $sh->finish(); |
---|
624 | + |
---|
625 | +# auto-detect height based on aspect ratio |
---|
626 | + $sh = $dbh->prepare('SELECT data FROM recordedmarkup WHERE chanid=? ' . |
---|
627 | + 'AND starttime=FROM_UNIXTIME(?) AND type=30 ' . |
---|
628 | + 'AND data IS NOT NULL ORDER BY mark LIMIT 1'); |
---|
629 | + $sh->execute($chanid,$starttime); |
---|
630 | + $x = $sh->fetchrow_array; # type = 30 |
---|
631 | + $sh->finish(); |
---|
632 | + |
---|
633 | + $sh = $dbh->prepare('SELECT data FROM recordedmarkup WHERE chanid=? ' . |
---|
634 | + 'AND starttime=FROM_UNIXTIME(?) AND type=31 ' . |
---|
635 | + 'AND data IS NOT NULL ORDER BY mark LIMIT 1'); |
---|
636 | + $sh->execute($chanid,$starttime); |
---|
637 | + $y = $sh->fetchrow_array if ($x); # type = 31 |
---|
638 | + $sh->finish(); |
---|
639 | + |
---|
640 | + if (!$x || !$y || $x <= 720) { # <=720 means SD |
---|
641 | + $sh = $dbh->prepare('SELECT recordedmarkup.type, ' . |
---|
642 | + 'recordedmarkup.data '. |
---|
643 | + 'FROM recordedmarkup ' . |
---|
644 | + 'WHERE recordedmarkup.chanid = ? ' . |
---|
645 | + 'AND recordedmarkup.starttime = FROM_UNIXTIME(?) ' . |
---|
646 | + 'AND recordedmarkup.type IN (10, 11, 12, 13, 14) ' . |
---|
647 | + 'GROUP BY recordedmarkup.type ' . |
---|
648 | + 'ORDER BY SUM((SELECT IFNULL(rm.mark, recordedmarkup.mark) ' . |
---|
649 | + ' FROM recordedmarkup AS rm ' . |
---|
650 | + ' WHERE rm.chanid = recordedmarkup.chanid ' . |
---|
651 | + ' AND rm.starttime = recordedmarkup.starttime ' . |
---|
652 | + ' AND rm.type IN (10, 11, 12, 13, 14) ' . |
---|
653 | + ' AND rm.mark > recordedmarkup.mark ' . |
---|
654 | + ' ORDER BY rm.mark ASC LIMIT 1)- recordedmarkup.mark) DESC ' . |
---|
655 | + 'LIMIT 1'); |
---|
656 | + $sh->execute($chanid,$starttime); |
---|
657 | + $aspect = $sh->fetchrow_hashref; |
---|
658 | + $sh->finish(); |
---|
659 | + |
---|
660 | + if( $aspect->{'type'} == 10 ) { |
---|
661 | + $x = $y = 1; |
---|
662 | + } elsif( $aspect->{'type'}== 11 ) { |
---|
663 | + $x = 4; $y = 3; |
---|
664 | + } elsif( $aspect->{'type'}== 12 ) { |
---|
665 | + $x = 16; $y = 9; |
---|
666 | + } elsif( $aspect->{'type'}== 13 ) { |
---|
667 | + $x = 2.21; $y = 1; |
---|
668 | + } elsif( $aspect->{'type'}== 14 ) { |
---|
669 | + $x = $aspect->{'data'}; $y = 1000000; |
---|
670 | + } else { |
---|
671 | + $x = 4; $y = 3; |
---|
672 | + } |
---|
673 | + } |
---|
674 | + $height = round_even($width * ($y/$x)); |
---|
675 | + |
---|
676 | + $width = 320 unless ($width && $width > 1); |
---|
677 | + $height = 240 unless ($height && $height > 1); |
---|
678 | + $vbitrate = 256 unless ($vbitrate && $vbitrate > 1); |
---|
679 | + $abitrate = 64 unless ($abitrate && $abitrate > 1); |
---|
680 | + |
---|
681 | +# build appropriate encoder commad |
---|
682 | + my $ffmpeg_command = $ffmpeg |
---|
683 | + .' -y' |
---|
684 | + .' -i '.shell_escape("$filename") |
---|
685 | + .' -s '.shell_escape("${width}x${height}") |
---|
686 | + .' -g 30' |
---|
687 | + .' -r 24' |
---|
688 | + .' -f ogg' |
---|
689 | + .' -codec:a libvorbis' |
---|
690 | + .' -codec:v libtheora' |
---|
691 | + .' -strict -2' |
---|
692 | + .' -deinterlace' |
---|
693 | + .' -async 2' |
---|
694 | + .' -ac 2' |
---|
695 | + .' -ar 44100' |
---|
696 | + .' -b:a '.shell_escape("${abitrate}k") |
---|
697 | + .' -b:v '.shell_escape("${vbitrate}k") |
---|
698 | + .' -sn' |
---|
699 | + .' /dev/stdout 2>/dev/null |'; |
---|
700 | + |
---|
701 | +# start to encode content |
---|
702 | + $ffmpeg_pid = open(DATA, $ffmpeg_command); |
---|
703 | + unless ($ffmpeg_pid) { |
---|
704 | + print header(), |
---|
705 | + "Can't execute ffmpeg. Command was: $!\n${ffmpeg_command}"; |
---|
706 | + exit; |
---|
707 | + } |
---|
708 | + |
---|
709 | +# Guess the filesize based on duration and bitrate. This allows progressive download. Print header with |
---|
710 | +# guessed file size |
---|
711 | + my $lengthSec; |
---|
712 | + my $length; |
---|
713 | + my $range; |
---|
714 | + $dur = `$ffmpeg -i $filename 2>&1 | /usr/bin/grep "Duration" | /usr/bin/cut -d ' ' -f 4 | /bin/sed s/,//`; |
---|
715 | + if ($dur && $dur =~ /\d*:\d*:.*/) { |
---|
716 | + @times = split(':',$dur); |
---|
717 | + $lengthSec = $times[0]*3600+$times[1]*60+$times[2]; |
---|
718 | + $length = int($lengthSec); |
---|
719 | + $size = int(0.85*$lengthSec*($vbitrate*1024+$abitrate*1024)/8); |
---|
720 | + $range = $size-1; |
---|
721 | + print header(-type => 'video/ogg', |
---|
722 | + -Content_length => $size, |
---|
723 | + -Accept_Ranges => 'bytes', |
---|
724 | + -Timing_Allow_Origin => '*', |
---|
725 | + -Content_Duration => $length, |
---|
726 | + -Content_Range => 'bytes 0-'.$range.'/'.$size, |
---|
727 | + -X_Content_Duration => $length |
---|
728 | + ); |
---|
729 | + } else { |
---|
730 | + print header(-type => 'video/ogg'); |
---|
731 | + |
---|
732 | + } |
---|
733 | + |
---|
734 | + if ($ENV{'REQUEST_METHOD'} eq 'HEAD') { |
---|
735 | + exit; |
---|
736 | + } |
---|
737 | + |
---|
738 | +# send encoded data to browser |
---|
739 | + my $buffer; |
---|
740 | + while (read DATA, $buffer, 262144) { |
---|
741 | + unless (print $buffer ) { |
---|
742 | + last; |
---|
743 | + } |
---|
744 | + } |
---|
745 | + |
---|
746 | + close DATA; |
---|
747 | + |
---|
748 | + 1; |
---|
749 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/stream/stream_webm.pl mythtv-master-build-new/mythplugins/mythweb/modules/stream/stream_webm.pl |
---|
750 | --- mythtv-master-build-old/mythplugins/mythweb/modules/stream/stream_webm.pl 1970-01-01 01:00:00.000000000 +0100 |
---|
751 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/stream/stream_webm.pl 2016-11-25 11:04:40.046666653 +0100 |
---|
752 | @@ -0,0 +1,186 @@ |
---|
753 | +#!/usr/bin/perl |
---|
754 | +# |
---|
755 | +# MythWeb Streaming/Download module |
---|
756 | +# |
---|
757 | +# @url $URL$ |
---|
758 | +# @date $2016/11/23$ |
---|
759 | +# @version $v1.0$ |
---|
760 | +# @author $Piotr Oniszczuk$ |
---|
761 | +# |
---|
762 | + |
---|
763 | + use POSIX qw(ceil floor); |
---|
764 | + |
---|
765 | +# round to the nearest even integer |
---|
766 | + sub round_even { |
---|
767 | + my ($in) = @_; |
---|
768 | + my $n = floor($in); |
---|
769 | + return ($n % 2 == 0) ? $n : ceil($in); |
---|
770 | + } |
---|
771 | + |
---|
772 | + our $ffmpeg_pid; |
---|
773 | + our $ffmpeg_pgid; |
---|
774 | + |
---|
775 | +# Shutdown cleanup |
---|
776 | + $ffmpeg_pgid = setpgrp(0,0); |
---|
777 | + $SIG{'TERM'} = \&shutdown_handler; |
---|
778 | + $SIG{'PIPE'} = \&shutdown_handler; |
---|
779 | + END { |
---|
780 | + shutdown_handler(); |
---|
781 | + } |
---|
782 | + sub shutdown_handler { |
---|
783 | + kill(1, $ffmpeg_pid) if ($ffmpeg_pid); |
---|
784 | + kill(-1, $ffmpeg_pid) if ($ffmpeg_pid); |
---|
785 | + } |
---|
786 | + |
---|
787 | +# Find ffmpeg |
---|
788 | + $ffmpeg = ''; |
---|
789 | + foreach my $path (split(/:/, $ENV{'PATH'}.':/usr/local/bin:/usr/bin'), '.') { |
---|
790 | + if (-e "$path/mythffmpeg") { |
---|
791 | + $ffmpeg = "$path/mythffmpeg"; |
---|
792 | + last; |
---|
793 | + } |
---|
794 | + if (-e "$path/ffmpeg") { |
---|
795 | + $ffmpeg = "$path/ffmpeg"; |
---|
796 | + last; |
---|
797 | + } |
---|
798 | + elsif ($^O eq 'darwin' && -e "$path/ffmpeg.app") { |
---|
799 | + $ffmpeg = "$path/ffmpeg.app"; |
---|
800 | + last; |
---|
801 | + } |
---|
802 | + } |
---|
803 | + |
---|
804 | +# Load some conversion settings from the database |
---|
805 | + $sh = $dbh->prepare('SELECT data FROM settings WHERE value=? AND hostname IS NULL'); |
---|
806 | + $sh->execute('WebFLV_w'); |
---|
807 | + my ($width) = $sh->fetchrow_array; |
---|
808 | + $sh->execute('WebFLV_vb'); |
---|
809 | + my ($vbitrate) = $sh->fetchrow_array; |
---|
810 | + $sh->execute('WebFLV_ab'); |
---|
811 | + my ($abitrate) = $sh->fetchrow_array; |
---|
812 | + $sh->finish(); |
---|
813 | + |
---|
814 | +# auto-detect height based on aspect ratio |
---|
815 | + $sh = $dbh->prepare('SELECT data FROM recordedmarkup WHERE chanid=? ' . |
---|
816 | + 'AND starttime=FROM_UNIXTIME(?) AND type=30 ' . |
---|
817 | + 'AND data IS NOT NULL ORDER BY mark LIMIT 1'); |
---|
818 | + $sh->execute($chanid,$starttime); |
---|
819 | + $x = $sh->fetchrow_array; # type = 30 |
---|
820 | + $sh->finish(); |
---|
821 | + |
---|
822 | + $sh = $dbh->prepare('SELECT data FROM recordedmarkup WHERE chanid=? ' . |
---|
823 | + 'AND starttime=FROM_UNIXTIME(?) AND type=31 ' . |
---|
824 | + 'AND data IS NOT NULL ORDER BY mark LIMIT 1'); |
---|
825 | + $sh->execute($chanid,$starttime); |
---|
826 | + $y = $sh->fetchrow_array if ($x); # type = 31 |
---|
827 | + $sh->finish(); |
---|
828 | + |
---|
829 | + if (!$x || !$y || $x <= 720) { # <=720 means SD |
---|
830 | + $sh = $dbh->prepare('SELECT recordedmarkup.type, ' . |
---|
831 | + 'recordedmarkup.data '. |
---|
832 | + 'FROM recordedmarkup ' . |
---|
833 | + 'WHERE recordedmarkup.chanid = ? ' . |
---|
834 | + 'AND recordedmarkup.starttime = FROM_UNIXTIME(?) ' . |
---|
835 | + 'AND recordedmarkup.type IN (10, 11, 12, 13, 14) ' . |
---|
836 | + 'GROUP BY recordedmarkup.type ' . |
---|
837 | + 'ORDER BY SUM((SELECT IFNULL(rm.mark, recordedmarkup.mark) ' . |
---|
838 | + ' FROM recordedmarkup AS rm ' . |
---|
839 | + ' WHERE rm.chanid = recordedmarkup.chanid ' . |
---|
840 | + ' AND rm.starttime = recordedmarkup.starttime ' . |
---|
841 | + ' AND rm.type IN (10, 11, 12, 13, 14) ' . |
---|
842 | + ' AND rm.mark > recordedmarkup.mark ' . |
---|
843 | + ' ORDER BY rm.mark ASC LIMIT 1)- recordedmarkup.mark) DESC ' . |
---|
844 | + 'LIMIT 1'); |
---|
845 | + $sh->execute($chanid,$starttime); |
---|
846 | + $aspect = $sh->fetchrow_hashref; |
---|
847 | + $sh->finish(); |
---|
848 | + |
---|
849 | + if( $aspect->{'type'} == 10 ) { |
---|
850 | + $x = $y = 1; |
---|
851 | + } elsif( $aspect->{'type'}== 11 ) { |
---|
852 | + $x = 4; $y = 3; |
---|
853 | + } elsif( $aspect->{'type'}== 12 ) { |
---|
854 | + $x = 16; $y = 9; |
---|
855 | + } elsif( $aspect->{'type'}== 13 ) { |
---|
856 | + $x = 2.21; $y = 1; |
---|
857 | + } elsif( $aspect->{'type'}== 14 ) { |
---|
858 | + $x = $aspect->{'data'}; $y = 1000000; |
---|
859 | + } else { |
---|
860 | + $x = 4; $y = 3; |
---|
861 | + } |
---|
862 | + } |
---|
863 | + $height = round_even($width * ($y/$x)); |
---|
864 | + |
---|
865 | + $width = 320 unless ($width && $width > 1); |
---|
866 | + $height = 240 unless ($height && $height > 1); |
---|
867 | + $vbitrate = 256 unless ($vbitrate && $vbitrate > 1); |
---|
868 | + $abitrate = 64 unless ($abitrate && $abitrate > 1); |
---|
869 | + |
---|
870 | +# build appropriate encoder commad |
---|
871 | + my $ffmpeg_command = $ffmpeg |
---|
872 | + .' -y' |
---|
873 | + .' -i '.shell_escape("$filename") |
---|
874 | + .' -s '.shell_escape("${width}x${height}") |
---|
875 | + .' -g 30' |
---|
876 | + .' -r 24' |
---|
877 | + .' -f webm' |
---|
878 | + .' -codec:a libvorbis' |
---|
879 | + .' -codec:v libvpx' |
---|
880 | + .' -cpu-used -8' |
---|
881 | + .' -deadline realtime' |
---|
882 | + .' -strict -2' |
---|
883 | + .' -deinterlace' |
---|
884 | + .' -async 2' |
---|
885 | + .' -ac 2' |
---|
886 | + .' -ar 44100' |
---|
887 | + .' -b:a '.shell_escape("${abitrate}k") |
---|
888 | + .' -b:v '.shell_escape("${vbitrate}k") |
---|
889 | + .' -sn' |
---|
890 | + .' /dev/stdout 2>/dev/null |'; |
---|
891 | + |
---|
892 | +# start to encode content |
---|
893 | + $ffmpeg_pid = open(DATA, $ffmpeg_command); |
---|
894 | + unless ($ffmpeg_pid) { |
---|
895 | + print header(), |
---|
896 | + "Can't execute ffmpeg. Command was: $!\n${ffmpeg_command}"; |
---|
897 | + exit; |
---|
898 | + } |
---|
899 | + |
---|
900 | +# Guess the filesize based on duration and bitrate. This allows progressive download. Print header with |
---|
901 | +# guessed file size |
---|
902 | + my $lengthSec; |
---|
903 | + my $length; |
---|
904 | + my $range; |
---|
905 | + $dur = `$ffmpeg -i $filename 2>&1 | /usr/bin/grep "Duration" | /usr/bin/cut -d ' ' -f 4 | /bin/sed s/,//`; |
---|
906 | + if ($dur && $dur =~ /\d*:\d*:.*/) { |
---|
907 | + @times = split(':',$dur); |
---|
908 | + $lengthSec = $times[0]*3600+$times[1]*60+$times[2]; |
---|
909 | + $length = int($lengthSec); |
---|
910 | + $size = int(0.90*$lengthSec*($vbitrate*1024+$abitrate*1024)/8); |
---|
911 | + $range = $size-1; |
---|
912 | + print header(-type => 'video/webm', |
---|
913 | + -Content_length => $size, |
---|
914 | + -Accept_Ranges => 'bytes', |
---|
915 | + -Timing_Allow_Origin => '*', |
---|
916 | + -Content_Duration => $length, |
---|
917 | + -Content_Range => 'bytes 0-'.$range.'/'.$size, |
---|
918 | + -X_Content_Duration => $length |
---|
919 | + ); |
---|
920 | + } else { |
---|
921 | + print header(-type => 'video/webm'); |
---|
922 | + |
---|
923 | + } |
---|
924 | + |
---|
925 | + if ($ENV{'REQUEST_METHOD'} eq 'HEAD') { |
---|
926 | + exit; |
---|
927 | + } |
---|
928 | + |
---|
929 | +# send encoded data to browser |
---|
930 | + my $buffer; |
---|
931 | + while (read DATA, $buffer, 262144) { |
---|
932 | + unless (print $buffer ) { |
---|
933 | + last; |
---|
934 | + } |
---|
935 | + } |
---|
936 | + |
---|
937 | + close DATA; |
---|
938 | + |
---|
939 | + 1; |
---|
940 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/modules/tv/tmpl/default/detail.php mythtv-master-build-new/mythplugins/mythweb/modules/tv/tmpl/default/detail.php |
---|
941 | --- mythtv-master-build-old/mythplugins/mythweb/modules/tv/tmpl/default/detail.php 2016-11-25 11:02:40.000000000 +0100 |
---|
942 | +++ mythtv-master-build-new/mythplugins/mythweb/modules/tv/tmpl/default/detail.php 2016-11-25 11:05:17.746666670 +0100 |
---|
943 | @@ -37,6 +37,12 @@ |
---|
944 | <script type="text/javascript"> |
---|
945 | <!-- |
---|
946 | |
---|
947 | +// Android devices need the following to play HTML5 video. Taken from ticket #10529 |
---|
948 | + var video = document.getElementById('video'); |
---|
949 | + video.addEventListener('click', function(){ |
---|
950 | + video.play(); |
---|
951 | + }, false); |
---|
952 | + |
---|
953 | // Keep track of the autoexpire flag |
---|
954 | var autoexpire = <?php echo $program->auto_expire ? 1 : 0 ?>; |
---|
955 | |
---|
956 | @@ -665,26 +671,21 @@ |
---|
957 | |
---|
958 | <div class="x-pixmap"> |
---|
959 | <?php if (setting('WebFLV_on')) { ?> |
---|
960 | +<?php if (setting('WebHTML5Stream_on')) { ?> |
---|
961 | + <video id="video" controls="controls" preload="metadata" width="<?php echo $flv_w ?>" height="<?php echo $flv_h ?>" poster="<?php echo $program->thumb_url($flv_w,0) ?>"> |
---|
962 | + <source src="<?php echo video_url($program, 'webm'); ?>" type="video/webm" /> |
---|
963 | + <source src="<?php echo video_url($program, 'ogv'); ?>" type="video/ogg" /> |
---|
964 | +<?php } ?> |
---|
965 | <?php if (file_exists('js/libs/flowplayer/flowplayer.swf')) { ?> |
---|
966 | - |
---|
967 | - |
---|
968 | - <!-- this A tag is where your Flowplayer will be placed. it can be anywhere --> |
---|
969 | - <a href="" |
---|
970 | - style="display:block;width:<?php echo $flv_w ?>px;height:<?php echo $flv_h ?>px" |
---|
971 | - id="player"> |
---|
972 | - </a> |
---|
973 | - |
---|
974 | - <!-- this will install flowplayer inside previous A- tag. --> |
---|
975 | - <script> |
---|
976 | - flowplayer( |
---|
977 | - "player", |
---|
978 | - "<?php echo root_url ?>js/libs/flowplayer/flowplayer.swf", { |
---|
979 | - playlist: [ |
---|
980 | + <a href="" style="display:block;width:<?php echo $flv_w ?>px;height:<?php echo $flv_h ?>px" id="flash-player"></a> |
---|
981 | + <script> |
---|
982 | + flowplayer("flash-player","<?php echo root_url ?>js/libs/flowplayer/flowplayer.swf", { |
---|
983 | + playlist: [ |
---|
984 | // this first PNG clip works as a splash image |
---|
985 | { |
---|
986 | url: '<?php echo $program->thumb_url($flv_w,0) ?>', |
---|
987 | scaling: 'orig' |
---|
988 | - }, |
---|
989 | + }, |
---|
990 | // Then we have the video |
---|
991 | { |
---|
992 | url: "<?php echo video_url($program, 'flv'); ?>", |
---|
993 | @@ -694,10 +695,10 @@ |
---|
994 | // Would be nice to auto-buffer, but we don't want to |
---|
995 | // waste bandwidth and CPU on the remote machine. |
---|
996 | autoBuffering: false |
---|
997 | - } |
---|
998 | + } |
---|
999 | ]} |
---|
1000 | ); |
---|
1001 | - </script> |
---|
1002 | + </script> |
---|
1003 | <?php } elseif (file_exists('modules/tv/MFPlayer.swf')) { ?> |
---|
1004 | <script language="JavaScript" type="text/javascript"> |
---|
1005 | <!-- |
---|
1006 | @@ -813,7 +814,12 @@ |
---|
1007 | <?php } else { ?> |
---|
1008 | <a href="<?php echo $program->url ?>" title="<?php echo t('Direct Download') ?>" |
---|
1009 | ><img src="<?php echo $program->thumb_url($flv_w,0) ?>" width="<?php echo $flv_w ?>"></a> |
---|
1010 | -<?php } ?></td> |
---|
1011 | +<?php } ?> |
---|
1012 | +<?php if (setting('WebHTML5Stream_on')) { ?> |
---|
1013 | + </video> |
---|
1014 | +<?php } ?> |
---|
1015 | + |
---|
1016 | + </td> |
---|
1017 | </div> |
---|
1018 | <div class="x-links"> |
---|
1019 | <a href="<?php echo video_url($program, 'asx') ?>" title="<?php echo t('ASX Stream') ?>" |
---|
1020 | diff -Naur mythtv-master-build-old/mythplugins/mythweb/mythweb.conf.apache mythtv-master-build-new/mythplugins/mythweb/mythweb.conf.apache |
---|
1021 | --- mythtv-master-build-old/mythplugins/mythweb/mythweb.conf.apache 2016-11-25 11:02:01.000000000 +0100 |
---|
1022 | +++ mythtv-master-build-new/mythplugins/mythweb/mythweb.conf.apache 2016-11-25 11:04:40.053333319 +0100 |
---|
1023 | @@ -194,6 +194,10 @@ |
---|
1024 | # those are, so we should tell it. |
---|
1025 | AddType video/nuppelvideo .nuv |
---|
1026 | |
---|
1027 | + # Support HTML5 video formats which can be encoded and streamed "on-the-fly" |
---|
1028 | + AddType video/ogg .ogv .ogg |
---|
1029 | + AddType video/webm .webm |
---|
1030 | + |
---|
1031 | # Specify the MIME type for favicon.ico in case the server configuration |
---|
1032 | # doesn't or in case the server configuration uses the IANA-approved MIME type |
---|
1033 | # (image/vnd.microsoft.icon)--which most browsers won't recognize. |
---|