Support Web Video Text Tracks Format subtitles

This commit is contained in:
Schplurtz le Déboulonné 2017-08-16 00:32:41 +02:00
parent dd7064d9e4
commit 0877a1f193
5 changed files with 120 additions and 1 deletions

View File

@ -15,6 +15,7 @@ wav audio/wav
webm video/webm
ogv video/ogg
mp4 video/mp4
vtt text/vtt
tgz !application/octet-stream
tar !application/x-gtar

64
inc/code2lang.php Normal file
View File

@ -0,0 +1,64 @@
<?php
/*
* Code to language name in the language corresponding to the code.
*
* @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
*/
$code2lang['af']='Afghani';
$code2lang['ar']='Arabic';
$code2lang['be']='Беларуская';
$code2lang['bg']='Български';
$code2lang['bn']='Bengali';
$code2lang['ca']='Català';
$code2lang['cs']='Čeština';
$code2lang['da']='Dansk';
$code2lang['de']='Deutsch';
$code2lang['de-informal']='Deutsch informal';
$code2lang['el']='Ελληνικά';
$code2lang['en']='English';
$code2lang['eo']='Esperanto';
$code2lang['es']='Español';
$code2lang['et']='Eesti';
$code2lang['eu']='Euskara';
$code2lang['fa']='فارسی';
$code2lang['fi']='Suomi';
$code2lang['fr']='Français';
$code2lang['gl']='Galego';
$code2lang['he']='תירבע';
$code2lang['hi']='Hindi';
$code2lang['hr']='Hrvatski';
$code2lang['hu']='Magyar';
$code2lang['hu-formal']='Magyar (formal)';
$code2lang['id']='Bahasa Indonesia';
$code2lang['is']='Íslenska';
$code2lang['it']='Italiano';
$code2lang['ja']='日本語';
$code2lang['ka']='ქართული';
$code2lang['kk']='Қазақ';
$code2lang['km']='Khmer';
$code2lang['ko']='한국어';
$code2lang['ku']='Kurdî';
$code2lang['lt']='Lietuviškai';
$code2lang['lv']='Latviski';
$code2lang['mk']='Македонски';
$code2lang['ml']='Malayalam';
$code2lang['mr']='Marathi';
$code2lang['ne']='Nepali';
$code2lang['nl']='Nederlands';
$code2lang['pl']='Polski';
$code2lang['pt']='Português';
$code2lang['pt-br']='Português do Brasil';
$code2lang['ro']='Română';
$code2lang['ru']='Русский';
$code2lang['sk']='Slovenčina';
$code2lang['sl']='Slovenščina';
$code2lang['sq']='Shqip';
$code2lang['sr']='Српски';
$code2lang['sv']='Svenska';
$code2lang['ta']='Tamil';
$code2lang['th']='Thai';
$code2lang['tr']='Türkçe';
$code2lang['uk']='Українська';
$code2lang['vi']='Tiếng Việt';
$code2lang['zh']='中文(简体)';
$code2lang['zh-tw']='中文(繁體)';

View File

@ -278,7 +278,7 @@ function init_paths(){
*/
function init_lang($langCode) {
//prepare language array
global $lang, $config_cascade;
global $lang, $code2lang, $config_cascade;
$lang = array();
//load the language files
@ -299,6 +299,7 @@ function init_lang($langCode) {
}
}
}
require(DOKU_INC.'inc/code2lang.php');
}
/**

View File

@ -2453,4 +2453,41 @@ function media_supportedav($mime, $type=NULL){
return in_array($mime, $supportedAv);
}
/**
* Return track media files with the same base name
* but extensions that indicate kind and lang.
* ie for foo.webm search foo.sub.lang.vtt, foo.cap.lang.vtt...
*
* @param string $src - ID of media file
* @return array - array(mediaID => array( kind, srclang, lang ))
*
* @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
*/
function media_trackfiles($src){
global $code2lang;
$kinds=array(
'sub' => 'subtitles',
'cap' => 'captions',
'des' => 'descriptions',
'cha' => 'chapters',
'met' => 'metadata'
);
$files = array();
$re='/\\.(sub|cap|des|cha|met)\\.([^.]+)\\.vtt$/';
$baseid=pathinfo($src, PATHINFO_FILENAME);
$pattern=mediaFN($baseid).'.*.*.vtt';
$list=glob($pattern);
foreach($list as $track) {
if(preg_match($re, $track, $matches)){
$files[$baseid.'.'.$matches[1].'.'.$matches[2].'.vtt']=array(
$kinds[$matches[1]],
$matches[2],
$code2lang[$matches[2]]
);
}
}
return $files;
}
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

View File

@ -1777,6 +1777,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* Embed video(s) in HTML
*
* @author Anika Henke <anika@selfthinker.org>
* @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
*
* @param string $src - ID of video to embed
* @param int $width - width of the video in pixels
@ -1794,6 +1795,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$posterUrl = '';
$files = array();
$tracks = array();
$isExternal = media_isexternal($src);
if ($isExternal) {
@ -1805,6 +1807,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$extensions = array('webm', 'ogv', 'mp4');
$files = media_alternativefiles($src, $extensions);
$poster = media_alternativefiles($src, array('jpg', 'png'));
$tracks = media_trackfiles($src);
if(!empty($poster)) {
$posterUrl = ml(reset($poster), '', true, '&');
}
@ -1833,6 +1836,19 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true);
}
// output each track if any
foreach( $tracks as $trackid => $info ) {
list( $kind, $srclang, $labellang ) = $info;
$out .= "<track kind=$kind srclang=$srclang ";
if( $labellang ) {
$out .= "lang=$srclang label=\"".hsc($labellang).'" ';
}
else {
$out .= "label=$srclang ";
}
$out .= 'src="'.ml($trackid, '', true).'">'.NL;
}
// finish
$out .= $fallback;
$out .= '</video>'.NL;