Oembed Plugin

* More CURL magic (encapsulated in seperate class)
* Another wikipedia oembed service as the other didn't was right always.
* No php functions in smarty template anymore
This commit is contained in:
Grischa Brockhaus 2011-12-18 01:55:33 +01:00
parent b0c245e434
commit 0fd597cd34
4 changed files with 104 additions and 25 deletions

View file

@ -0,0 +1,79 @@
<?php
class CurlFetcher {
public function file_get_contents($fileurl, $allow_curl =TRUE) {
$max_redirects = 5;
if (defined('OEMBED_USE_CURL') && OEMBED_USE_CURL && defined('CURLOPT_URL')) {
$ch = curl_init();
$timeout = 5; // 0 wenn kein Timeout
curl_setopt($ch, CURLOPT_URL, $fileurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
//curl_setopt($ch, CURLOPT_MAXREDIRS, $max_redirects );
//$file_content = curl_exec($ch);
$file_content = CurlFetcher::curl_exec_follow($ch, $max_redirects);
curl_close($ch);
}
else {
$context = array ( 'http' => array ( 'method' => 'GET', 'max_redirects' => $max_redirects, ),);
$file_content = file_get_contents($fileurl, null, stream_context_create($context));
}
return $file_content;
}
/**
* Handling redirections with curl if safe_mode or open_basedir is enabled. The function working transparent, no problem with header and returntransfer options. You can handle the max redirection with the optional second argument (the function is set the variable to zero if max redirection exceeded).
* Second parameter values:
* - maxredirect is null or not set: redirect maximum five time, after raise PHP warning
* - maxredirect is greather then zero: no raiser error, but parameter variable set to zero
* - maxredirect is less or equal zero: no follow redirections
* (see: http://php.net/manual/en/function.curl-setopt.php)
*/
private function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
$mr = $maxredirect === null ? 5 : intval($maxredirect);
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if ($mr > 0) {
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rch);
if (!$mr) {
if ($maxredirect === null) {
trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
} else {
$maxredirect = 0;
}
return false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
return curl_exec($ch);
}
}

View file

@ -1,11 +1,11 @@
{* oembed.tpl last modified 2011-12-01 *}
<span class="serendipity_oembed">
{if $oembed.type=='rich'} {* =================================================== RICH *}
{if $oembed.provider_name|stripos:"Wikipedia" !== false}
{if $oembed.provider_name=="Wikipedia"}
<blockquote>{$oembed.html}</blockquote>
{elseif $oembed.provider_name|stripos:"IMDB" !== false} {* beautify IMDB content *}
{elseif $oembed.provider_name=="IMDB"} {* beautify IMDB content *}
<blockquote>{$oembed.html|replace:"<h2>":"<strong>"|replace:"</h2>":"</strong>"|replace:"<img":"<img align='right'"}</blockquote>
{elseif $oembed.provider-name|stripos:"Soundcloud" !== false} {* beautify SoundCloud *}
{elseif $oembed.provider-name=="Soundcloud"} {* beautify SoundCloud *}
{$oembed.html|replace:"</object>":"</object><br/>"}
{else}
{$oembed.html}
@ -17,13 +17,15 @@
{elseif $oembed.type=='photo'} {* =================================================== PHOTO *}
<img src="{$oembed.url}"{if $oembed.title} title="{$oembed.title}" alt="{$oembed.title}"{/if}/>
{elseif $oembed.type=='link'} {* =================================================== LINK *}
{if $oembed.provider_name=="Wikipedia"}<blockquote>{/if}
{if $oembed.description}
{if $oembed.title}<strong>{$oembed.title}</strong><br/>{/if}
<p>{if $oembed.thumbnail_url}<img src="{$oembed.thumbnail_url}" align="left">{/if}{$oembed.description}</p>
<p>{if $oembed.thumbnail_url}<img src="{$oembed.thumbnail_url}" align="left">{/if}{$oembed.description}{if $oembed.url}<br/>[<a href="{$oembed.url}" target="_blank">link</a>]{/if}</p>
{else}
<a href="{$oembedurl}" title="{$oembed.title}">{$oembed.author_name}</a>
{/if}
{else}
{if $oembed.provider_name=="Wikipedia"}</blockquote>{/if}
{else} {* Link type finishes *}
<a href="{$oembedurl}" target="_blank">{if $oembed.error}{$oembed.error}{else}{$oembedurl}{/if}</a>
{/if}
</span>

View file

@ -1,12 +1,14 @@
<?php
require_once dirname(__FILE__) . '/../CurlFetcher.php';
class OEmbedProvider extends EmbedProvider{
private $urlRegExp;
private $jsonEndpoint;
private $xmlEndpoint;
private $dimensionsSupported = true;
private $onlyJson = false;
public function __construct($url,$endpoint, $onlyJson=false, $maxwidth=null, $maxheight=null, $dimensionsSupported=true){
parent::__construct($url,$endpoint,$maxwidth,$maxheight);
$this->onlyJson = $onlyJson;
@ -24,8 +26,8 @@ class OEmbedProvider extends EmbedProvider{
}
if ($this->dimensionsSupported) {
if (!empty($this->maxwidth)) {
$this->jsonEndpoint.= '&maxwidth=' . $this->maxwidth;
$this->xmlEndpoint.= '&maxwidth=' . $this->maxwidth;
$this->jsonEndpoint.= '&maxwidth=' . $this->maxwidth;
$this->xmlEndpoint.= '&maxwidth=' . $this->maxwidth;
}
if (!empty($this->maxheight)) {
$this->jsonEndpoint.= '&maxwidth=' . $this->maxheight;
@ -42,22 +44,8 @@ class OEmbedProvider extends EmbedProvider{
return preg_match($this->urlRegExp,$url);
}
private function file_get_contents($fileurl) {
if (defined('OEMBED_USE_CURL') && OEMBED_USE_CURL && defined('CURLOPT_URL')) {
$ch = curl_init();
$timeout = 5; // 0 wenn kein Timeout
curl_setopt($ch, CURLOPT_URL, $fileurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_MAXREDIRS, 3 );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_content = curl_exec($ch);
curl_close($ch);
}
else {
$context = array ( 'http' => array ( 'method' => 'GET', 'max_redirects' => 3, ),);
$file_content = file_get_contents($fileurl, null, stream_context_create($context));
}
return $file_content;
$allow_curl = defined('OEMBED_USE_CURL') && OEMBED_USE_CURL && defined('CURLOPT_URL');
return CurlFetcher::file_get_contents($fileurl, $allow_curl);
}
private function provideXML($url){
return $this->file_get_contents(preg_replace("/\{url\}/",urlencode($url),$this->xmlEndpoint));

View file

@ -128,12 +128,15 @@
</provider>
<!-- noembed providers -->
<!--
<provider>
<name>Wikipedia (via noembed.com)</name>
<jsononly/>
<url>https?://*.wikipedia.org/wiki/*</url>
<endpoint>http://noembed.com/embed</endpoint>
</provider>
-->
<provider>
<name>Twitpic (via noembed.com)</name>
<jsononly/>
@ -192,4 +195,11 @@
<url>http://((www.)?audio)?boo.fm/boos/*</url>
<endpoint>http://oohembed.com/oohembed/</endpoint>
</provider>
<provider>
<name>Wikipedia (via oohembed.com)</name>
<jsononly/>
<url>https?://*.wikipedia.org/wiki/*</url>
<endpoint>http://oohembed.com/oohembed/</endpoint>
</provider>
</providers>