diff --git a/serendipity_event_oembed/OEmbedDatabase.php b/serendipity_event_oembed/OEmbedDatabase.php new file mode 100644 index 00000000..685e05ed --- /dev/null +++ b/serendipity_event_oembed/OEmbedDatabase.php @@ -0,0 +1,80 @@ +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; + } + } + +} \ No newline at end of file diff --git a/serendipity_event_oembed/oembed/OEmbedProvider.class.php b/serendipity_event_oembed/oembed/OEmbedProvider.class.php index 94345e82..9942c250 100644 --- a/serendipity_event_oembed/oembed/OEmbedProvider.class.php +++ b/serendipity_event_oembed/oembed/OEmbedProvider.class.php @@ -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); diff --git a/serendipity_event_oembed/oembed/config.php b/serendipity_event_oembed/oembed/config.php index 8046154d..7ddc4bf6 100644 --- a/serendipity_event_oembed/oembed/config.php +++ b/serendipity_event_oembed/oembed/config.php @@ -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'; diff --git a/serendipity_event_oembed/oembed/providers.xml b/serendipity_event_oembed/oembed/providers.xml index f4ccfcca..d2e6af9e 100644 --- a/serendipity_event_oembed/oembed/providers.xml +++ b/serendipity_event_oembed/oembed/providers.xml @@ -4,10 +4,12 @@ http://*.flickr.com/* http://www.flickr.com/services/oembed/ + https://*.twitter.com/* https://api.twitter.com/1/statuses/oembed.{format} @@ -16,9 +18,29 @@ http://*.vimeo.com/* http://vimeo.com/api/oembed.{format} + + + http://*.youtube.com/watch?v=* + http://www.youtube.com/oembed + + + http://*.youtu.be/* + http://www.youtube.com/oembed + + + + http://official.fm/tracks/* + http://official.fm/services/oembed.{format} + + + + http://blip.tv/* + http://blip.tv/oembed + diff --git a/serendipity_event_oembed/oembed/tests/ProviderManagerTest.php b/serendipity_event_oembed/oembed/tests/ProviderManagerTest.php index e9001780..0ee1ae52 100644 --- a/serendipity_event_oembed/oembed/tests/ProviderManagerTest.php +++ b/serendipity_event_oembed/oembed/tests/ProviderManagerTest.php @@ -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"); diff --git a/serendipity_event_oembed/serendipity_event_oembed.php b/serendipity_event_oembed/serendipity_event_oembed.php index f104c8c8..443b1f4f 100644 --- a/serendipity_event_oembed/serendipity_event_oembed.php +++ b/serendipity_event_oembed/serendipity_event_oembed.php @@ -11,8 +11,9 @@ 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 "
callback
"; - print_r($match[1]); - $manager = ProviderManager::getInstance(); - $obj=$manager->provide($url,"object"); + $obj = OEmbedDatabase::load_oembed($url); + $html = ''; + if (empty($obj)) { + $manager = ProviderManager::getInstance(); + try { + $obj=$manager->provide($url,"object"); + if (!empty($obj)) { + OEmbedDatabase::save_oembed($url,$obj); + } + } + catch (ErrorException $e) { + // Timeout in most cases + //return $e; + } + } if (!empty($obj)) { - if ($obj->type == 'rich') return $obj->html; + if ($obj->type == 'rich') + $html = $obj->html; + elseif ($obj->type == 'video') + $html = $obj->html; + elseif ($obj->type == 'photo') { + $html = '' .$obj->title . ''; + } } - return $match[0]; + else { + $html = '' . $match[1] . ''; + } + return '' . $html . ''; } - + + function cleanup() { + OEmbedDatabase::install($this); + } + function install() { + OEmbedDatabase::install($this); + } + } \ No newline at end of file