Erstes wirklich funktionsfähige OEmbed Plugin
This commit is contained in:
parent
27d0fadcf1
commit
f11e8b9531
6 changed files with 159 additions and 20 deletions
80
serendipity_event_oembed/OEmbedDatabase.php
Normal file
80
serendipity_event_oembed/OEmbedDatabase.php
Normal file
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
@define('PLUGIN_OEMBED_DATABASEVERSION_CONFIG', "oembed_version");
|
||||
@define('PLUGIN_OEMBED_DATABASEVNAME', "oembeds");
|
||||
|
||||
class OEmbedDatabase {
|
||||
|
||||
function save_oembed($url, $oembed) {
|
||||
global $serendipity;
|
||||
|
||||
if (empty($url) || empty($oembed)) return false;
|
||||
|
||||
$urlmd5 = md5($url);
|
||||
$oetype = $oembed->type;
|
||||
$oeobj = serialize($oembed);
|
||||
$query = "insert into {$serendipity['dbPrefix']}" . PLUGIN_OEMBED_DATABASEVNAME . " (urlmd5,url,oetype,oeobj) VALUES ('$urlmd5','$url','$oetype','$oeobj')";
|
||||
return serendipity_db_query($query);
|
||||
}
|
||||
|
||||
function load_oembed($url) {
|
||||
global $serendipity;
|
||||
if (empty($url)) return null;
|
||||
|
||||
$urlmd5 = md5($url);
|
||||
$query = "select oeobj from {$serendipity['dbPrefix']}" . PLUGIN_OEMBED_DATABASEVNAME . " where urlmd5='$urlmd5'";
|
||||
|
||||
$rows = serendipity_db_query($query);
|
||||
if (!is_array($rows)) { // fresh search
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
$oeobj = null;
|
||||
foreach ($rows as $row) {
|
||||
$oeobj = $row['oeobj'];
|
||||
if (!empty($oeobj)) break;
|
||||
}
|
||||
if (!empty($oeobj)) {
|
||||
return unserialize($oeobj);
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function install(&$obj) {
|
||||
global $serendipity;
|
||||
|
||||
if (!OEmbedDatabase::table_created(PLUGIN_OEMBED_DATABASEVNAME)) {
|
||||
$md5test = md5("test");
|
||||
$md5len = strlen($md5test);
|
||||
$q = "create table {$serendipity['dbPrefix']}" . PLUGIN_OEMBED_DATABASEVNAME. " (" .
|
||||
"urlmd5 char($md5len) not null, " .
|
||||
"url varchar(3000) not null, " .
|
||||
"oetype varchar(20) not null, " .
|
||||
"oeobj text not null, " .
|
||||
"primary key (urlmd5)" .
|
||||
")";
|
||||
|
||||
$result = serendipity_db_schema_import($q);
|
||||
|
||||
if ($result !== true) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function table_created($table = PLUGIN_OEMBED_DATABASEVNAME) {
|
||||
global $serendipity;
|
||||
|
||||
$q = "select count(*) from {$serendipity['dbPrefix']}" . $table;
|
||||
$row = serendipity_db_query($q, true, 'num');
|
||||
|
||||
if (!is_numeric($row[0])) { // if the response we got back was an SQL error.. :P
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -48,6 +48,10 @@ class OEmbedProvider extends EmbedProvider{
|
|||
}
|
||||
private function provideObject($url){
|
||||
$xml=simplexml_load_string($this->provideXML($url));
|
||||
if (empty($xml)) {
|
||||
$data=$this->provide($url);
|
||||
if (!empty($$data)) $xml = json_decode($data);
|
||||
}
|
||||
//TODO $xml->type alapjan assigner
|
||||
$obj = $this->getTypeObj((string)$xml->type);
|
||||
$obj->cloneObj($xml);
|
||||
|
|
|
@ -21,7 +21,9 @@ require_once dirname(__FILE__) . '/' . 'VideoEmbed.class.php';
|
|||
|
||||
require_once dirname(__FILE__) . '/' . 'EmbedProvider.class.php';
|
||||
require_once dirname(__FILE__) . '/' . 'OEmbedProvider.class.php';
|
||||
require_once dirname(__FILE__) . '/' . 'YouTubeProvider.class.php';
|
||||
|
||||
// Will be loaded via generic oembedprovider!
|
||||
//require_once dirname(__FILE__) . '/' . 'YouTubeProvider.class.php';
|
||||
|
||||
require_once dirname(__FILE__) . '/' . 'ProviderManager.class.php';
|
||||
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
<url>http://*.flickr.com/*</url>
|
||||
<endpoint>http://www.flickr.com/services/oembed/</endpoint>
|
||||
</provider>
|
||||
<!-- down
|
||||
<provider>
|
||||
<url>http://*.pownce.com/*</url>
|
||||
<endpoint>http://api.pownce.com/2.1/oembed.{format}</endpoint>
|
||||
</provider>
|
||||
-->
|
||||
<provider>
|
||||
<url>https://*.twitter.com/*</url>
|
||||
<endpoint>https://api.twitter.com/1/statuses/oembed.{format}</endpoint>
|
||||
|
@ -16,9 +18,29 @@
|
|||
<url>http://*.vimeo.com/*</url>
|
||||
<endpoint>http://vimeo.com/api/oembed.{format}</endpoint>
|
||||
</provider>
|
||||
<!--
|
||||
<provider>
|
||||
<url>http://*.youtube.*/*</url>
|
||||
<class>YouTubeProvider</class>
|
||||
</provider>
|
||||
-->
|
||||
<provider>
|
||||
<url>http://*.youtube.com/watch?v=*</url>
|
||||
<endpoint>http://www.youtube.com/oembed</endpoint>
|
||||
</provider>
|
||||
<provider>
|
||||
<url>http://*.youtu.be/*</url>
|
||||
<endpoint>http://www.youtube.com/oembed</endpoint>
|
||||
</provider>
|
||||
|
||||
<provider>
|
||||
<url>http://official.fm/tracks/*</url>
|
||||
<endpoint>http://official.fm/services/oembed.{format}</endpoint>
|
||||
</provider>
|
||||
|
||||
<provider>
|
||||
<url>http://blip.tv/*</url>
|
||||
<endpoint>http://blip.tv/oembed</endpoint>
|
||||
</provider>
|
||||
</providers>
|
||||
|
||||
|
|
|
@ -12,13 +12,13 @@ function test($manager, $url) {
|
|||
|
||||
$manager = ProviderManager::getInstance();
|
||||
// Youtube long link
|
||||
test($manager,"http://www.youtube.com/watch?v=8UVNT4wvIGY");
|
||||
//test($manager,"http://www.youtube.com/watch?v=8UVNT4wvIGY");
|
||||
// Youtube Kurze URL
|
||||
test($manager,"http://youtu.be/8UVNT4wvIGY");
|
||||
//test($manager,"http://youtu.be/8UVNT4wvIGY");
|
||||
// Twitter
|
||||
test($manager,"https://twitter.com/#!/tagesschau/status/146562892454572032");
|
||||
//test($manager,"https://twitter.com/#!/tagesschau/status/146562892454572032");
|
||||
// flickr
|
||||
test($manager,"http://www.flickr.com/photos/gbrockhaus/2052855443/in/set-72157603214268227/");
|
||||
// vimeo
|
||||
test($manager,"http://vimeo.com/33510073");
|
||||
//test($manager,"http://vimeo.com/33510073");
|
||||
|
||||
|
|
|
@ -11,7 +11,8 @@ if (file_exists($probelang)) {
|
|||
}
|
||||
|
||||
include dirname(__FILE__) . '/lang_en.inc.php';
|
||||
include_once dirname(__FILE__) . '/oembed/config.php'; // autoload oembed classes
|
||||
require_once dirname(__FILE__) . '/oembed/config.php'; // autoload oembed classes
|
||||
require_once dirname(__FILE__) . '/OEmbedDatabase.php';
|
||||
|
||||
|
||||
class serendipity_event_oembed extends serendipity_event
|
||||
|
@ -39,11 +40,17 @@ class serendipity_event_oembed extends serendipity_event
|
|||
'frontend_display' => true,
|
||||
));
|
||||
|
||||
//$propbag->add('configuration', array('max_items','ext_vis_stat','stat_all','banned_bots'));
|
||||
$propbag->add('configuration', array('info'));
|
||||
}
|
||||
|
||||
function introspect_config_item($name, &$propbag)
|
||||
{
|
||||
switch($name) {
|
||||
case 'info':
|
||||
$propbag->add('type', 'content');
|
||||
$propbag->add('default', "Info");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function event_hook($event, &$bag, &$eventData) {
|
||||
|
@ -54,7 +61,7 @@ class serendipity_event_oembed extends serendipity_event
|
|||
if ($simplePatterns==null) {
|
||||
$simplePatterns = array(
|
||||
//'simpleTweet' => '@\(tweet\s+(\S*)\)@Usi',
|
||||
'simpleTweet' => '@\(tweet\s+(.*)\)@Usi',
|
||||
'simpleTweet' => '@\[(?:embed|tweet)\s+(.*)\]@Usi',
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -86,27 +93,51 @@ class serendipity_event_oembed extends serendipity_event
|
|||
array( $this, "oembedRewriteCallback"),
|
||||
$eventData['body']);
|
||||
}
|
||||
/*
|
||||
if (!empty($eventData['extended'])) {
|
||||
$eventData['extended'] = preg_replace_callback(
|
||||
$eventData['body'] = preg_replace_callback(
|
||||
$patterns['simpleTweet'],
|
||||
array( $this, "oembedRewriteCallback"),
|
||||
$eventData['extended']);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
function oembedRewriteCallback($match) {
|
||||
$url = $match[1];
|
||||
//$url = "http://www.flickr.com/photos/gbrockhaus/2052855443/in/set-72157603214268227/";
|
||||
//print "<br/><b>callback</b><br/>";
|
||||
print_r($match[1]);
|
||||
$obj = OEmbedDatabase::load_oembed($url);
|
||||
$html = '';
|
||||
if (empty($obj)) {
|
||||
$manager = ProviderManager::getInstance();
|
||||
try {
|
||||
$obj=$manager->provide($url,"object");
|
||||
if (!empty($obj)) {
|
||||
if ($obj->type == 'rich') return $obj->html;
|
||||
OEmbedDatabase::save_oembed($url,$obj);
|
||||
}
|
||||
return $match[0];
|
||||
}
|
||||
catch (ErrorException $e) {
|
||||
// Timeout in most cases
|
||||
//return $e;
|
||||
}
|
||||
}
|
||||
if (!empty($obj)) {
|
||||
if ($obj->type == 'rich')
|
||||
$html = $obj->html;
|
||||
elseif ($obj->type == 'video')
|
||||
$html = $obj->html;
|
||||
elseif ($obj->type == 'photo') {
|
||||
$html = '<img src="' . $obj->url . '" title="' .$obj->title . '" alt="' .$obj->title . '"/>';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$html = '<a href="' . $match[1] . '">' . $match[1] . '</a>';
|
||||
}
|
||||
return '<span class="serendipity_oembed">' . $html . '</span>';
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
OEmbedDatabase::install($this);
|
||||
}
|
||||
function install() {
|
||||
OEmbedDatabase::install($this);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue