Внедрение flash-видео и swf-файлов внутрь medawiki сайта

January 13, 2008

Для своего сайта я разработал расширение для mediawiki позволяющее внедрить flv или swf-файлы в страницу.

Прежде всего я провел краткий и не утешительный анализ существующих решений в этой области. На сайте mediawiki нашлось несколько похожих решений, но:
  • Некоторые из решений предполагали вставка flv-файла загружаемого с yourtube.
  • Вставка swf-файлов выполнялась без учета версии браузера (одна баг-версия ориентировалась только на mozilla) и без возможностей передавать swf-ке произвольные параметры, управлять версией нужного для проигрывания контента flashplayer.
  • Нет возможности корректно обработать ситуацию, когда у клиента нет plashplayer.

Принятно решение на основе javascript-библиотеки swfobject (решение которым пользуются продвинутые flash/flex программеры при вставке swf-файлов внутрь своих страниц) создать расширение для mediawiki.

1. для поддержки загрузки flv и swf на сервер (посредством стандартного Special:Upload) необходимо добавить в массив $wgFileExtensions новые расширения типов.

$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' , 'swf', 'flv');

2. Даже после того как я разрешил в предыдущей строке загружать файлы с расширениями swf и flv возникли проблемы. Так при загрузке flv-файла я получал сообщение, что файл поврежден или его mime-тип неизвестен. Для этого я решил во все файлы используемые при загрузке файлов на сервер добавить поддержку нового mime-типа.
 <strong>2.1.</strong> В файле includes/mime.types проверено на наличие и добавлено если необходимо:
   application/x-shockwave-flash swf
   video/x-flv flv
 <strong>2.2.</strong> В файле includes/mime.info проверено на наличие и добавлено если необходимо:
   application/x-shockwave-flash	[MULTIMEDIA]
   video/x-flv	[MULTIMEDIA]
 <strong>2.3.</strong> В файле includes/SpecialUpload.php в функции
function verifyExtension( $mime, $extension ) {
  добавлена первой строка кода:
   if ($extension == 'flv') return true;
3. В папку extensions скопирована папка swfflv с кодом расширения.
 <strong>3.1.</strong> Подключено расширение внутри файла LocalSettings.php
    require_once("extensions/swfflv/setup.php" );
4. Для корректной работы расширения необходимо подключить к генерируемомому содержимомоу библиотеки swfobject и jquery.

В файле swfflv/setup.php найдите следующие строки
  1. return 
  2. '
  3. <script type="text/javascript" src="'.$path_TO.'swfobject.js"> </script>
  4. <script type="text/javascript" src="'.$path_TO.'jquery-1.2.1.pack.js"> </script>
  5. <script type="text/javascript" src="'.$path_TO.'swf_and_flv_process.js"> </script>
  6. ';
 в том случае если у вас уже используются и подключены библиотеки swfobject.js и jquery, то вы можете исправить путь к ним на корректный.
 В противном случае делать ничего не нужно.
5. Использование библиотеки. Внутри документа используйте теги swf и flv для вставки flash-содержимого.

Например:




Это пример swf-файла

<swf width="200" height="200" fio="billi" age="13" bgcolor="#ff00ff" dummy="dummy_pic1.jpg">Untitled-1.swf</swf>

Это пример flv-файла

<flv width="500" height="500" fio="mark" dummy="/blog/wp-content/uploads/mediawiki/posters/Flvswf/dummy_pic2.jpg">/blog/wp-content/uploads/mediawiki/video/Flvswf/Nes in russia get video.flv</flv>




Обратите внимание на указание для swf и flv-файлов размеров, также заглушки (dummy). Заглушка - это картинка которая будет показана в том случае если flashplayer на машине клиента не обнаружен.

Также можно использовать следующие параметры (специфические для swfobject)
  * wmode
  * quality
  * useExpressInstall
  * redirectUrl
  * xiRedirectUrl
 Все параметры, имена которых не совпадают с зарезервированными width, height, bgcolor, wmode, quality, useExpressInstall, redirectUrl, xiRedirectUrl, будут переданы как параметры внутрь swf-файла.
Не забудьте загрузить на сервер файлы Untitled-1.swf, dummy_pic1.jpg,Nes in russia get video.flv, dummy_pic2.jpg

В том случае если вы это не сделаете, то будет сгенерирована ошибка.



Если же все сделать правильно, то вы получите следующий результат:



Пример работы swfflv плагина



Это пример swf-файла
Это пример flv-файла

Исходники для swfflv плагина



https://github.com/study-and-dev-site-attachments/all-in-one/tree/master/php/swfflvz

Правки для mediawiki 13



Для того чтобы данный код заработал для mediawiki 13 необходимо после того как вы загрузили исходники плагина заменить файл setup.php на новую версию:
  1. // добавляем в список функций установки расширений свою собственную
  2. $wgExtensionFunctions[] = 'SwfAndFlvSetup';
  3.  
  4. // когда функция "установки" будет вызвана, то нужно зарегистрировать все используемые теги
  5. $wgExtensionCredits['parserhook']['SwfAndFlvSetup'] = array(
  6. 	'name'          => 'SwfAndFlvSetup',
  7. 	'author'        => 'black zorro',
  8. 	'description'   => 'embed into mediawiki pages swf and flv files',
  9. );
  10.  
  11. function SwfAndFlvSetup() {
  12. 	global $wgParser;
  13. 	$wgParser->setHook( 'swf', 'swfflvHook' );
  14. 	$wgParser->setHook( 'flv', 'swfflvHook' );
  15. }
  16.  
  17. // возможно, что на одной странице будет расположено несколько swf или flv-файлов, 
  18. // очевидно, что нет необходимости каждый раз возвращать полный фрагмент с подключением нужных js-библиотек
  19. function got_js_for_swf_flv (){
  20.   static $loaded = false;
  21.   if ( $loaded ) {
  22. 	return '';
  23.   }
  24.   $loaded = true;
  25.   global $wgScriptPath;
  26.  
  27.   $scn = getSCN ();
  28.   $path_TO = $scn . '/extensions/' . basename (dirname (__FILE__) ) . '/';
  29.  
  30.   return 
  31. '
  32. <script type="text/javascript" src="'.$path_TO.'swfobject.js"> </script>
  33. <script type="text/javascript" src="'.$path_TO.'jquery-1.2.1.pack.js"> </script>
  34. <script type="text/javascript" src="'.$path_TO.'swf_and_flv_process.js"> </script>
  35. ';
  36. }
  37.  
  38. function swfflvHook( $text, $params = array(), $parser ) {
  39.    $scn = getSCN ();
  40.    $text = trim ($text);
  41.    $attrs = '';
  42.    foreach ($params as $key => $val){
  43.       if ($key != 'dummy')
  44.         $attrs .= $key .  ':"' . $val. '", ';
  45.    }
  46.  
  47.    $title_swf = Title::newFromText( $text , NS_IMAGE );
  48.    if ( $title_swf == null ) 
  49. 	return "SWF|FLV File not found (".$text.")";
  50.  
  51.    $file_swf = wfFindFile( $title_swf );
  52.    if ( $file_swf && $file_swf->exists() ) {
  53. 	$url_file = $file_swf->getURL() ;
  54.    } else {
  55.      return "SWF|FLV File not found (".$text.")";
  56.    }
  57.  
  58.    $url_player = $scn . '/extensions/' . basename (dirname (__FILE__) ) . '/flvplayer.swf';
  59.    $dummy_url = '';
  60.  
  61.    if (isset($params['dummy'])){
  62.      $title_dummy = Title::newFromText( $params['dummy'] , NS_IMAGE );
  63.      if ( $title_dummy == null ) 
  64. 	return "SWF|FLV Dummy File not found (".$params['dummy'].")";
  65.  
  66.      $file_dummy = wfFindFile( $title_dummy );
  67.      if ( $file_dummy && $file_dummy->exists() ) {
  68. 	$dummy_url = $file_dummy->getURL() ;
  69.      } else {
  70.       return "SWF|FLV Dummy File not found (".$params['dummy'].")";
  71.      }
  72.  
  73.    }
  74.  
  75.    $filenamelen = mb_strlen($text, 'utf-8');
  76.    $kind = mb_substr ($text, $filenamelen - 3, 3, 'utf-8');  
  77.    $id = $kind.'_'.md5($text);
  78.  
  79.    $attrs .= ' __filesource:"'.$url_file.'", __flvplayer:"'.$url_player.'", __dummy:"'.$dummy_url.'" ';
  80.    $tag = '<div id="'.$id.'" style=""><!-- empty --></div><script>var '.$id. ' = {'.$attrs.'};</script>';
  81.  
  82.    $js = got_js_for_swf_flv ();
  83.    return $js . $tag;
  84. }
  85.  
  86. function getSCN (){
  87.    $scn = $_SERVER['SCRIPT_NAME'];
  88.    $scn = explode ('/', $scn);
  89.    array_pop ($scn);
  90.    $scn  = join ('/', $scn);
  91.    if (! $scn ) return '/';
  92.    return ( substr($scn, 0, 1) == '/'?'':'/' ) . $scn;
  93. }