Difference between revisions of "Extension:VideoSectionLink"
(ffmpeg not accepting urls as input) |
(Simple version, hardwired output file, works) |
||
Line 12: | Line 12: | ||
*/ | */ | ||
if (!defined('MEDIAWIKI')) die('Not an entry point.'); | if (!defined('MEDIAWIKI')) die('Not an entry point.'); | ||
+ | |||
+ | |||
define('VIDEOSECTIONLINK_VERSION', '0.0.1, 2008-10-31'); | define('VIDEOSECTIONLINK_VERSION', '0.0.1, 2008-10-31'); | ||
+ | |||
+ | |||
$egVideoSectionLinkMagic = 'videosection'; | $egVideoSectionLinkMagic = 'videosection'; | ||
+ | |||
$wgExtensionFunctions[] = 'efSetupVideoSectionLink'; | $wgExtensionFunctions[] = 'efSetupVideoSectionLink'; | ||
+ | |||
$wgHooks['LanguageGetMagic'][] = 'efVideoSectionLinkLanguageGetMagic'; | $wgHooks['LanguageGetMagic'][] = 'efVideoSectionLinkLanguageGetMagic'; | ||
+ | |||
+ | |||
+ | |||
$wgExtensionCredits['parserhook'][] = array( | $wgExtensionCredits['parserhook'][] = array( | ||
+ | |||
'name' => 'VideoSectionLink', | 'name' => 'VideoSectionLink', | ||
+ | |||
'author' => '[http://www.mediawiki.org/wiki/User:Jack User:Jack]', | 'author' => '[http://www.mediawiki.org/wiki/User:Jack User:Jack]', | ||
+ | |||
'description' => 'An extension to enable users to link to defined sections of video. Made with [http://www.organicdesign.co.nz/Template:Extension Template:Extension]', | 'description' => 'An extension to enable users to link to defined sections of video. Made with [http://www.organicdesign.co.nz/Template:Extension Template:Extension]', | ||
+ | |||
'url' => 'http://www.organicdesign.co.nz/Extension:VideoSectionLink', | 'url' => 'http://www.organicdesign.co.nz/Extension:VideoSectionLink', | ||
+ | |||
'version' => VIDEOSECTIONLINK_VERSION | 'version' => VIDEOSECTIONLINK_VERSION | ||
+ | |||
); | ); | ||
+ | |||
+ | |||
class VideoSectionLink { | class VideoSectionLink { | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Constructor | * Constructor | ||
+ | |||
*/ | */ | ||
+ | |||
function __construct() { | function __construct() { | ||
+ | |||
global $wgHooks, $wgParser, $egVideoSectionLinkMagic; | global $wgHooks, $wgParser, $egVideoSectionLinkMagic; | ||
+ | |||
+ | |||
# Add the parser-function | # Add the parser-function | ||
+ | |||
$wgParser->setFunctionHook($egVideoSectionLinkMagic, array($this,'magicVideosectionlink')); | $wgParser->setFunctionHook($egVideoSectionLinkMagic, array($this,'magicVideosectionlink')); | ||
+ | |||
+ | |||
+ | |||
#Add the Unknownaction hook | #Add the Unknownaction hook | ||
+ | |||
$wgHooks['UnknownAction'][] = $this; | $wgHooks['UnknownAction'][] = $this; | ||
+ | |||
+ | |||
} | } | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Expand the videosection-magic | * Expand the videosection-magic | ||
+ | |||
*/ | */ | ||
+ | |||
function magicVideosectionlink(&$parser, $url = '', $start = '',$duration = '') { | function magicVideosectionlink(&$parser, $url = '', $start = '',$duration = '') { | ||
+ | |||
+ | |||
global $egVideoSectionLinkMagic,$wgScript; | global $egVideoSectionLinkMagic,$wgScript; | ||
+ | |||
+ | |||
$text = "[{{SERVER}}" . $wgScript . "?action=videosection&url=" . urlencode($url) . "&start=" . $start . "&duration=" .$duration . " Click to download video]"; | $text = "[{{SERVER}}" . $wgScript . "?action=videosection&url=" . urlencode($url) . "&start=" . $start . "&duration=" .$duration . " Click to download video]"; | ||
− | print_r($text); | + | |
+ | #print_r($text); | ||
+ | |||
# Return result with available parser flags | # Return result with available parser flags | ||
+ | |||
return array( | return array( | ||
+ | |||
$text, | $text, | ||
+ | |||
'found' => true, | 'found' => true, | ||
+ | |||
'nowiki' => false, | 'nowiki' => false, | ||
+ | |||
'noparse' => false, | 'noparse' => false, | ||
+ | |||
'noargs' => false, | 'noargs' => false, | ||
+ | |||
'isHTML' => false | 'isHTML' => false | ||
+ | |||
); | ); | ||
+ | |||
+ | |||
} | } | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Callback method executes a shell command returning the section of the movie requested | * Callback method executes a shell command returning the section of the movie requested | ||
+ | |||
*/ | */ | ||
+ | |||
function onUnknownAction($action, $article) { | function onUnknownAction($action, $article) { | ||
+ | |||
− | global $wgOut,$action,$article,$wgRequest; | + | |
+ | global $wgOut,$action,$article,$wgRequest,$wgUploadDirectory; | ||
+ | |||
+ | |||
+ | #Get the parameters from the title | ||
+ | |||
+ | |||
+ | |||
$param1 = $wgRequest->getText('url'); | $param1 = $wgRequest->getText('url'); | ||
+ | |||
$param2 = $wgRequest->getText('start'); | $param2 = $wgRequest->getText('start'); | ||
+ | |||
$param3 = $wgRequest->getText('duration'); | $param3 = $wgRequest->getText('duration'); | ||
− | $ | + | |
− | + | ||
− | $success = shell_exec($ | + | |
− | + | #Execute the ffmpeg command | |
+ | |||
+ | |||
+ | |||
+ | $movieStr = "ffmpeg -i " . $param1 . " -ss " . $param2 . " -t " . $param3 . " -ar 22050 " . $wgUploadDirectory . "/winterfest03.mpg"; | ||
+ | |||
+ | $success = shell_exec($movieStr); | ||
+ | |||
+ | |||
+ | |||
+ | #Set headers as video | ||
+ | |||
+ | |||
+ | |||
$wgOut->disable(); | $wgOut->disable(); | ||
+ | |||
header("Content-Type: video/mpeg"); | header("Content-Type: video/mpeg"); | ||
− | + | ||
+ | $wgHfile = "Content-Disposition: attachment; filename=\"". $wgUploadDirectory . "/winterfest03.mpg\""; | ||
+ | |||
+ | header($wgHfile); | ||
+ | |||
− | # | + | |
+ | #Return the file as binary back to the client | ||
+ | |||
− | readfile(" | + | |
+ | readfile($wgUploadDirectory . "/winterfest03.mpg"); | ||
+ | |||
return true; | return true; | ||
+ | |||
} | } | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Needed in some versions to prevent Special:Version from breaking | * Needed in some versions to prevent Special:Version from breaking | ||
+ | |||
*/ | */ | ||
+ | |||
function __toString() { return __CLASS__; } | function __toString() { return __CLASS__; } | ||
+ | |||
} | } | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Called from $wgExtensionFunctions array when initialising extensions | * Called from $wgExtensionFunctions array when initialising extensions | ||
+ | |||
*/ | */ | ||
+ | |||
function efSetupVideoSectionLink() { | function efSetupVideoSectionLink() { | ||
+ | |||
global $egVideoSectionLink; | global $egVideoSectionLink; | ||
+ | |||
$egVideoSectionLink = new VideoSectionLink(); | $egVideoSectionLink = new VideoSectionLink(); | ||
+ | |||
+ | |||
} | } | ||
+ | |||
+ | |||
/** | /** | ||
+ | |||
* Needed in MediaWiki >1.8.0 for magic word hooks to work properly | * Needed in MediaWiki >1.8.0 for magic word hooks to work properly | ||
+ | |||
*/ | */ | ||
+ | |||
+ | |||
function efVideoSectionLinkLanguageGetMagic(&$magicWords, $langCode = 0) { | function efVideoSectionLinkLanguageGetMagic(&$magicWords, $langCode = 0) { | ||
+ | |||
global $egVideoSectionLinkMagic; | global $egVideoSectionLinkMagic; | ||
+ | |||
$magicWords[$egVideoSectionLinkMagic] = array($langCode, $egVideoSectionLinkMagic); | $magicWords[$egVideoSectionLinkMagic] = array($langCode, $egVideoSectionLinkMagic); | ||
+ | |||
return true; | return true; | ||
+ | |||
} | } |
Revision as of 02:36, 22 November 2008
<?php /**
Template:PhpCategory:Extensions created with Template:Extension
* VideoSectionLink extension - An extension to enable users to link to defined sections of video. Made with Template:Extension * * See http://www.mediawiki.org/wiki/Extension:VideoSectionLink for installation and usage details * * @package MediaWiki * @subpackage Extensions * @author User:Jack * @copyright © 2008 User:Jack * @licence GNU General Public Licence 2.0 or later */
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('VIDEOSECTIONLINK_VERSION', '0.0.1, 2008-10-31');
$egVideoSectionLinkMagic = 'videosection';
$wgExtensionFunctions[] = 'efSetupVideoSectionLink';
$wgHooks['LanguageGetMagic'][] = 'efVideoSectionLinkLanguageGetMagic';
$wgExtensionCredits['parserhook'][] = array(
'name' => 'VideoSectionLink',
'author' => 'User:Jack',
'description' => 'An extension to enable users to link to defined sections of video. Made with Template:Extension',
'url' => 'http://www.organicdesign.co.nz/Extension:VideoSectionLink',
'version' => VIDEOSECTIONLINK_VERSION
);
class VideoSectionLink {
/**
* Constructor
*/
function __construct() {
global $wgHooks, $wgParser, $egVideoSectionLinkMagic;
# Add the parser-function
$wgParser->setFunctionHook($egVideoSectionLinkMagic, array($this,'magicVideosectionlink'));
#Add the Unknownaction hook
$wgHooks['UnknownAction'][] = $this;
}
/**
* Expand the videosection-magic
*/
function magicVideosectionlink(&$parser, $url = , $start = ,$duration = ) {
global $egVideoSectionLinkMagic,$wgScript;
$text = "" . $wgScript . "?action=videosection&url=" . urlencode($url) . "&start=" . $start . "&duration=" .$duration . " Click to download video";
#print_r($text);
# Return result with available parser flags
return array(
$text,
'found' => true,
'nowiki' => false,
'noparse' => false,
'noargs' => false,
'isHTML' => false
);
}
/**
* Callback method executes a shell command returning the section of the movie requested
*/
function onUnknownAction($action, $article) {
global $wgOut,$action,$article,$wgRequest,$wgUploadDirectory;
#Get the parameters from the title
$param1 = $wgRequest->getText('url');
$param2 = $wgRequest->getText('start');
$param3 = $wgRequest->getText('duration');
#Execute the ffmpeg command
$movieStr = "ffmpeg -i " . $param1 . " -ss " . $param2 . " -t " . $param3 . " -ar 22050 " . $wgUploadDirectory . "/winterfest03.mpg";
$success = shell_exec($movieStr);
#Set headers as video
$wgOut->disable();
header("Content-Type: video/mpeg");
$wgHfile = "Content-Disposition: attachment; filename=\"". $wgUploadDirectory . "/winterfest03.mpg\"";
header($wgHfile);
#Return the file as binary back to the client
readfile($wgUploadDirectory . "/winterfest03.mpg");
return true;
}
/**
* Needed in some versions to prevent Special:Version from breaking
*/
function __toString() { return __CLASS__; }
}
/**
* Called from $wgExtensionFunctions array when initialising extensions
*/
function efSetupVideoSectionLink() {
global $egVideoSectionLink;
$egVideoSectionLink = new VideoSectionLink();
}
/**
* Needed in MediaWiki >1.8.0 for magic word hooks to work properly
*/
function efVideoSectionLinkLanguageGetMagic(&$magicWords, $langCode = 0) {
global $egVideoSectionLinkMagic;
$magicWords[$egVideoSectionLinkMagic] = array($langCode, $egVideoSectionLinkMagic);
return true;
}