Kod:
<?php
// wcf imports
require_once(WCF_DIR.'lib/data/message/bbcode/BBCodeParser.class.php');
require_once(WCF_DIR.'lib/data/message/bbcode/BBCode.class.php');
/**
* Parses the [video] bbcode tag, which inserts an embedded video player.
*
* @author Nerdus
* @copyright 2010 Bergwerk <http://bergwerk.forenberg.de>
* @license Creative Commons - Attribution-Noncommercial-Share Alike 3.0 Unported <http://creativecommons.org/licenses/by-nc-sa/3.0/>
* @package com.bergwerk.wcf.data.message.bbcode.video
* @subpackage data.message.bbcode
* @category Community Framework
*/
class VideoBBCode implements BBCode {
/**
* @see BBCode::getParsedTag()
*/
public function getParsedTag($openingTag, $content, $closingTag, BBCodeParser $parser) {
$url = $content;
$video = array('', '', '');
// get default values
$title = '';
$alignment = EMBEDDED_VIDEO_DEFAULT_ALIGNMENT;
$size = EMBEDDED_VIDEO_DEFAULT_SIZE;
// remove possible url prefixes
$url = preg_replace('%^(((http://(www\.|)|www\.)|)((au|br|ca|es|fr|de|hk|ie|it|jp|mx|nl|nz|pl|ru|tr|tw|uk|v|video|vids)\.|))%i', '', $url);
// detect hoster (including a new workaround for double-prefixed ign.com urls)
$video[0] = preg_replace('%\..*$%', '', preg_replace('%^([a-z0-9]+\.(ign|photobucket)\.com)%i', '$2.com', strtolower($url)));
// parse url
switch ($video[0]) {
case 'autsch':
// http://autsch.de/35566
// http://autsch.de/42141/berraschte_katze/
$video[2] = preg_replace('%^autsch\.de\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://autsch.de/'.$video[2];
break;
case 'clipfish':
// http://www.clipfish.de/channel/207/video/2536671/jordin-spark-live-bei-energy-in-the-park-berlin-2008/
// http://www.clipfish.de/video/3303441/abstrukt-trick/28
// http://www.clipfish.de/video/277370/
$video[2] = preg_replace('%^.*video\/([a-z0-9]+)\/.*$%i', '$1', $url);
$video[1] = 'http://www.clipfish.de/video/'.$video[2].'/';
break;
case 'collegehumor':
// http://www.collegehumor.com/video:1932963
$video[2] = preg_replace('%^.*\/video\:([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.collegehumor.com/video:'.$video[2];
break;
case 'dailymotion':
// http://www.dailymotion.com/video/x56pa6_feuer-schere-messer-licht_fun
// http://www.dailymotion.com/video/xd0k3e_unicutt-tv-nightlifereport-springbr_lifestyleundefined
// -> http://www.dailymotion.com/video/xd0k3e
$video[2] = preg_replace('%^.*\/video\/([a-z0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.dailymotion.com/video/'.$video[2];
break;
case 'g4tv':
// http://g4tv.com/videos/45434/Sengoku-Basara-Samurai-Heroes-Captivate-Trailer/
$video[2] = preg_replace('%^.*\/videos\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://g4tv.com/videos/'.$video[2].'/embedded';
break;
case 'gametrailers':
// http://www.gametrailers.com/player/usermovies/208901.html?playlist=featured
// http://www.gametrailers.com/user-movie/ninja-gaiden-2-new-gameplay/208901
// http://www.gametrailers.com/player/33290.html
// http://www.gametrailers.com/video/episode-21-bonus-round/33290
$video[3] = preg_match('%^.*(\/usermovies\/|\/user-movie\/).*$%i', $url);
$video[2] = preg_replace('%^.*\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.gametrailers.com/'.($video[3] ? 'user-movie' : 'video').'/embedded/'.$video[2];
break;
case 'google':
// http://video.google.de/videoplay?docid=-8070240344560020977&hl=de&emb=1#
$video[2] = preg_replace('%^.*docid=([-0-9]+).*$%i', '$1', $url);
$video[1] = 'http://video.google.com/videoplay?docid='.$video[2];
break;
case 'ign':
// http://uk.movies.ign.com/dor/objects/14332808/centurion/videos/Centurion.html
// http://uk.video.ign.com/dor/articles/965543/ign-daily-fix-/videos/thefix_spc_042110.html;jsessionid=5lu3b5fowqh8
// -> http://movies.ign.com/dor/objects/14332808/embedded/videos/Centurion.html
$video[4] = preg_replace('%^.*\/dor\/([a-z]+)s\/[0-9]+.*$%i', '$1', $url);
$video[3] = preg_replace('%^.*\/videos\/([-0-9a-z_]+)\.html.*$%i', '$1', $url);
$video[2] = preg_replace('%^.*\/dor\/[a-z]+\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://movies.ign.com/dor/'.$video[4].'s/'.$video[2].'/embedded/videos/'.$video[3].'.html';
break;
case 'megavideo':
// http://www.megavideo.com/?v=4WX1OEGD
$video[2] = preg_replace('%^.*v=([a-z0-9_-]+).*$%i', '$1', $url);
$video[1] = 'http://www.megavideo.com/?v='.$video[2];
break;
case 'metacafe':
// http://www.metacafe.com/watch/4621570/scalado_photoflow_on_nokia_5800/
// http://www.metacafe.com/watch/2526516/unbelievable_check_this_out_man/
$video[3] = preg_replace('%^metacafe\.com\/watch\/([0-9]+)\/.*$%i', '$1', $url);
$video[2] = preg_replace('%^metacafe\.com\/watch\/[0-9]+\/([0-9a-z_-]+).*$%i', '$1', $url);
$video[1] = 'http://www.metacafe.com/watch/'.$video[3].'/'.$video[2];
break;
case 'mycarmovie':
// http://www.mycarmovie.com/sell/585713e2fbfdfa8f445c8637211f573c/
// http://mycarmovie.com/brands/448e6fba1697559d7395e37d69b79790/
// http://www.mycarmovie.com/tv/3be968b43ffe65aef8df25d278f2bfc3
// http://www.mycarmovie.com/carmovies/008fd7fa9af24923be36773170e633cb
$video[3] = preg_replace('%^mycarmovie\.com\/([0-9a-z]+)\/.*$%i', '$1', $url);
$video[2] = preg_replace('%^mycarmovie\.com\/[0-9a-z]+\/([0-9a-z]+).*$%i', '$1', $url);
$video[1] = 'http://www.mycarmovie.com/'.$video[3].'/'.$video[2];
break;
case 'myspace':
// http://vids.myspace.com/index.cfm?fuseaction=vids.individual&videoid=104346587
$video[2] = preg_replace('%^.*videoid=([a-z0-9]+).*$%i', '$1', $url);
$video[1] = 'http://vids.myspace.com/index.cfm?fuseaction=vids.individual&videoid='.$video[2];
break;
case 'myvideo':
// http://www.myvideo.de/watch/3489403/Bodo_Wartke_Liebesparade
// http://www.myvideo.de/watch/6510880
$video[2] = preg_replace('%^.*\/watch\/([0-9]+)(\/.*|)$%i', '$1', $url);
$video[1] = 'http://www.myvideo.de/watch/'.$video[2].'/';
break;
case 'paintballtube':
// http://www.paintballtube.de/video/605/LOS-Woodlands.de
$video[2] = preg_replace('%^.*\/video\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.paintballtube.de/video/'.$video[2].'/';
break;
case 'photobucket':
// http://s87.photobucket.com/albums/k136/librarypics/Anahuac2/ana-con%202009/?action=view¤t=HPIM1574.flv
$video[4] = preg_replace('%^.*\.photobucket\.com\/albums\/(.+)\/.*$%i', '$1', $url);
$video[3] = preg_replace('%^s([0-9]+)\.photobucket.*$%i', '$1', $url);
$video[2] = preg_replace('%^.*(\/|current=)([-a-z0-9]+)\.flv.*$%i', '$2', $url);
$video[1] = 'http://s'.$video[3].'.photobucket.com/albums/'.$video[4].'/?action=view¤t='.$video[2].'.flv';
break;
case 'rutube':
// http://rutube.ru/tracks/3384079.html?v=b451e7bd97148a9bc114da16d0f40598
$video[3] = preg_replace('%^rutube\.ru\/tracks\/([0-9]+)\.html.*$%i', '$1', $url);
$video[2] = preg_replace('%^.*v=([a-z0-9_-]+).*$%i', '$1', $url);
$video[1] = 'http://rutube.ru/tracks/'.$video[3].'.html?v='.$video[2];
break;
case 'screentoaster':
// http://www.screentoaster.com/watch/stWEhXS0RIR19WQF5dUllYVVFT/google_gravity
$video[2] = preg_replace('%^.*\/watch\/st([0-9a-z]+).*$%i', '$1', $url);
$video[1] = 'http://www.screentoaster.com/watch/st'.$video[2].'/embedded';
break;
case 'sevenload':
// http://de.sevenload.com/sendungen/Journal-Reporter/folgen/38PCERH-Polen-nach-dem-Tod-von-Praesident-Kaczynski
// http://de.sevenload.com/videos/K6kf6lh-Test-Drive-Unlimited-Trailer
// -> http://www.sevenload.com/videos/38PCERH-
$video[2] = preg_replace('%^.*\/([a-z0-9]+)-.*$%i', '$1', $url);
$video[1] = 'http://www.sevenload.com/videos/'.$video[2].'-';
break;
case 'spike':
// http://www.spike.com/video/embedded/2763936
$video[2] = preg_replace('%^spike\.com.*\/video\/[a-z0-9_-]+\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.spike.com/video/embedded/'.$video[2];
break;
case 'veoh':
// http://www.veoh.com/videos/v16493535wyzGAET6
// http://www.veoh.com/collection/kushtvdigitalunderground/watch/v1552357JGDgCw2s
// http://www.veoh.com/collection/Nirvana-Music-Videos/watch/v16493535wyzGAET6
// http://www.veoh.com/browse/videos/category/technology_and_gaming/watch/v19713720TSHY4QQX
$video[2] = preg_replace('%^.*\/v([a-z0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.veoh.com/videos/v'.$video[2];
break;
case 'vimeo':
// http://www.vimeo.com/4321799
$video[2] = preg_replace('%^vimeo\.com\/([0-9]+).*$%i', '$1', $url);
$video[1] = 'http://www.vimeo.com/'.$video[2];
break;
case 'wegame':
// http://www.wegame.com/watch/test-1st-video/
// http://www.wegame.com/watch/gara-illegale-degli-gnomi-ironforge-stormwind/
$video[2] = preg_replace('%^wegame\.com\/watch\/([0-9a-z_-]+).*$%i', '$1', $url);
$video[1] = 'http://www.wegame.com/watch/'.$video[2].'/';
break;
case 'youku':
// http://v.youku.com/v_show/id_XMTcxMDcyMTU2.html
$video[2] = preg_replace('%^youku\.com\/v_show\/id_([0-9a-z_-]+)\.html.*$%i', '$1', $url);
$video[1] = 'http://v.youku.com/v_show/id_'.$video[2].'.html';
break;
case 'youtube':
// http://www.youtube.com/watch?v=-zvCUmeoHpw
// playlists: http://www.youtube.com/view_play_list?p=38F2A7092BCAA098
$video[3] = (preg_replace('%^.*(watch\?v|view_play_list\?p)=([a-z0-9_-]+).*$%i', '$1', $url) == 'view_play_list?p' ? 'p' : 'v');
$video[2] = preg_replace('%^.*(watch\?v|view_play_list\?p)=([a-z0-9_-]+).*$%i', '$2', $url);
$video[1] = ($video[3] == 'p' ? 'http://www.youtube.com/view_play_list?p='.$video[2] : 'http://www.youtube.com/watch?v='.$video[2]);
break;
default:
return $openingTag['source'] . $content . $closingTag['source'];
}
// check if parsing was successful
foreach ($video as $key => $value) {
if ($key > 1 && $value === $url) return $openingTag['source'] . $content . $closingTag['source'];
}
// get attributes
if (isset($openingTag['attributes'][0]) && strlen($openingTag['attributes'][0]) > 0) $title = $openingTag['attributes'][0];
if (EMBEDDED_VIDEO_ALLOW_CUSTOM_ALIGNMENT && isset($openingTag['attributes'][1]) && strlen($openingTag['attributes'][1]) > 0) $alignment = $openingTag['attributes'][1];
if (EMBEDDED_VIDEO_ALLOW_CUSTOM_SIZE && isset($openingTag['attributes'][2]) && strlen($openingTag['attributes'][2]) > 0) $size = $openingTag['attributes'][2];
// get request info (to identify feeds and search forms)
$request = WCF::getRequest()->{WCF::getRequest()->type};
$simpleHTML = (strpos($request, 'FeedPage') !== false || strpos($request, 'SearchForm') !== false);
// display BBCode
if ($parser->getOutputType() == 'text/html') {
if (!$simpleHTML) {
// show template
WCF::getTPL()->assign(array(
'video' => $video,
'title' => $title,
'alignment' => $alignment,
'size' => $size
));
return WCF::getTPL()->fetch('videoBBCodeTag');
}
else {
// show simplified version for feeds and search forms
return WCF::getLanguage()->getDynamicVariable('wcf.bbcode.video.simpleHTML', array('url' => $video[1], 'title' => $title));
}
}
else if ($parser->getOutputType() == 'text/plain') {
return WCF::getLanguage()->getDynamicVariable('wcf.bbcode.video.text', array('url' => $video[1], 'title' => $title));
}
}
}
?>