]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Oembed slimmed to only do discovery (soon we get og: discovery too)
authorMikael Nordfeldth <mmn@hethane.se>
Mon, 30 Nov 2015 01:06:04 +0000 (02:06 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Mon, 30 Nov 2015 01:06:04 +0000 (02:06 +0100)
lib/default.php
plugins/Oembed/OembedPlugin.php
plugins/Oembed/classes/File_oembed.php
plugins/Oembed/lib/oembedhelper.php

index 490553f80b21ea1163cd4e995f8a284b18d985a6..7894dbb6745e4027be32f9351119f171fce0cce2 100644 (file)
@@ -276,10 +276,6 @@ $default =
               'maxpeople' => 500, // maximum no. of people with the same tag by the same user
               'allow_tagging' => array('all' => true), // equivalent to array('local' => true, 'remote' => true)
               'desclimit' => null),
-        'oembed' =>
-        array('endpoint' => null,   // 'https://noembed.com/embed/' for proxied oEmbed data
-              'order' => array('built-in', 'well-known', 'service', 'discovery'),
-        ),
         'search' =>
         array('type' => 'like'),
         'sessions' =>
index 5e715e895b78463c25f225d5466bb297d317038e..c51e0bfad1626e983e0a5bf8f1581b37856628bf 100644 (file)
@@ -35,6 +35,24 @@ class OembedPlugin extends Plugin
         $m->connect('main/oembed', array('action' => 'oembed'));
     }
 
+    public function onGetRemoteUrlMetadataFromDom($url, DOMDocument $dom, stdClass &$metadata)
+    {
+        try {
+            common_log(LOG_INFO, 'Trying to discover an oEmbed endpoint using link headers.');
+            $api = oEmbedHelper::oEmbedEndpointFromHTML($dom);
+            common_log(LOG_INFO, 'Found API endpoint ' . $api . ' for URL ' . $url);
+            $params = array(
+                'maxwidth' => common_config('thumbnail', 'width'),
+                'maxheight' => common_config('thumbnail', 'height'),
+            );
+            $metadata = oEmbedHelper::getOembedFrom($api, $url, $params);
+
+        } catch (Exception $e) {
+            common_log(LOG_INFO, 'Could not find an oEmbed endpoint using link headers.');
+            // Just ignore it!
+        }
+    }
+
     public function onEndShowHeadElements(Action $action)
     {
         switch ($action->getActionName()) {
index e557e70ddb452fd6dc8a930b3f495b0612f9f69d..c7650a1ff379228869739ad510c800a8da895db9 100644 (file)
@@ -68,12 +68,8 @@ class File_oembed extends Managed_DataObject
     }
 
     static function _getOembed($url) {
-        $parameters = array(
-            'maxwidth' => common_config('thumbnail', 'width'),
-            'maxheight' => common_config('thumbnail', 'height'),
-        );
         try {
-            return oEmbedHelper::getObject($url, $parameters);
+            return oEmbedHelper::getObject($url);
         } catch (Exception $e) {
             common_log(LOG_INFO, "Error during oembed lookup for $url - " . $e->getMessage());
             return false;
index cd564b8339052439bd9d583ee5272bea2c84a43c..7abd76109a0e488f4cd8cb31fc6f5b063fcb8a01 100644 (file)
@@ -17,9 +17,7 @@
  * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 
 /**
@@ -47,8 +45,6 @@ class oEmbedHelper
         'revision3.com' => 'https://revision3.com/api/oembed/',
         'vimeo.com' => 'https://vimeo.com/api/oembed.json',
     );
-    protected static $functionMap = array(
-    );
 
     /**
      * Perform or fake an oEmbed lookup for the given resource.
@@ -71,88 +67,31 @@ class oEmbedHelper
      */
     public static function getObject($url, $params=array())
     {
-        $host = parse_url($url, PHP_URL_HOST);
-        if (substr($host, 0, 4) == 'www.') {
-            $host = substr($host, 4);
-        }
+        common_log(LOG_INFO, 'Checking for remote URL metadata for ' . $url);
 
-        common_log(LOG_INFO, 'Checking for oEmbed data for ' . $url);
+        // TODO: Make this class something like UrlMetadata, or use a dataobject?
+        $metadata = new stdClass();
 
-        // You can fiddle with the order of discovery -- either skipping
-        // some types or re-ordering them.
+        if (Event::handle('GetRemoteUrlMetadata', array($url, &$metadata))) {
+            // If that event didn't return anything, try downloading the body and parse it
+            $body = HTTPClient::quickGet($url);
 
-        $order = common_config('oembed', 'order');
+            // DOMDocument::loadHTML may throw warnings on unrecognized elements,
+            // and notices on unrecognized namespaces.
+            $old = error_reporting(error_reporting() & ~(E_WARNING | E_NOTICE));
+            $dom = new DOMDocument();
+            $ok = $dom->loadHTML($body);
+            unset($body);   // storing the DOM in memory is enough...
+            error_reporting($old);
 
-        foreach ($order as $method) {
-
-            switch ($method) {
-            case 'built-in':
-                common_log(LOG_INFO, 'Considering built-in oEmbed methods...');
-                // Blacklist: systems with no oEmbed API of their own, which are
-                // either missing from or broken on noembed.com's proxy.
-                // we know how to look data up in another way...
-                if (array_key_exists($host, self::$functionMap)) {
-                    common_log(LOG_INFO, 'We have a built-in method for ' . $host);
-                    $func = self::$functionMap[$host];
-                    return call_user_func($func, $url, $params);
-                }
-                break;
-            case 'well-known':
-                common_log(LOG_INFO, 'Considering well-known oEmbed endpoints...');
-                // Whitelist: known API endpoints for sites that don't provide discovery...
-                if (array_key_exists($host, self::$apiMap)) {
-                    $api = self::$apiMap[$host];
-                    common_log(LOG_INFO, 'Using well-known endpoint "' . $api . '" for "' . $host . '"');
-                    break 2;
-                }
-                break;
-            case 'discovery':
-                try {
-                    common_log(LOG_INFO, 'Trying to discover an oEmbed endpoint using link headers.');
-                    $api = self::discover($url);
-                    common_log(LOG_INFO, 'Found API endpoint ' . $api . ' for URL ' . $url);
-                    break 2;
-                } catch (Exception $e) {
-                    common_log(LOG_INFO, 'Could not find an oEmbed endpoint using link headers.');
-                    // Just ignore it!
-                }
-                break;
-            case 'service':
-                $api = common_config('oembed', 'endpoint');
-                common_log(LOG_INFO, 'Using service API endpoint ' . $api);
-                break;
+            if (!$ok) {
+                throw new oEmbedHelper_BadHtmlException();
             }
-        }
-
-        if (empty($api)) {
-            // TRANS: Server exception thrown in oEmbed action if no API endpoint is available.
-            throw new ServerException(_('No oEmbed API endpoint available.'));
-        }
-
-        return self::getObjectFrom($api, $url, $params);
-    }
-
-    /**
-     * Perform basic discovery.
-     * @return string
-     */
-    static function discover($url)
-    {
-        // @fixme ideally skip this for non-HTML stuff!
-        $body = HTTPClient::quickGet($url);
-
-        // DOMDocument::loadHTML may throw warnings on unrecognized elements,
-        // and notices on unrecognized namespaces.
-        $old = error_reporting(error_reporting() & ~(E_WARNING | E_NOTICE));
-        $dom = new DOMDocument();
-        $ok = $dom->loadHTML($body);
-        error_reporting($old);
 
-        if (!$ok) {
-            throw new oEmbedHelper_BadHtmlException();
+            Event::handle('GetRemoteUrlMetadataFromDom', array($url, $dom, &$metadata));
         }
 
-        return self::discoverFromHTML($url, $dom);
+        return self::normalize($metadata);
     }
 
     /**
@@ -162,7 +101,7 @@ class oEmbedHelper
      * @param string $body HTML body text
      * @return mixed string with URL or false if no target found
      */
-    static function discoverFromHTML($url, DOMDocument $dom)
+    static function oEmbedEndpointFromHTML(DOMDocument $dom)
     {
         // Ok... now on to the links!
         $feeds = array(
@@ -207,16 +146,19 @@ class oEmbedHelper
      * @param array $params
      * @return object
      */
-    static function getObjectFrom($api, $url, $params=array())
+    static function getOembedFrom($api, $url, $params=array())
     {
+        if (empty($api)) {
+            // TRANS: Server exception thrown in oEmbed action if no API endpoint is available.
+            throw new ServerException(_('No oEmbed API endpoint available.'));
+        }
         $params['url'] = $url;
         $params['format'] = 'json';
         $key=common_config('oembed','apikey');
         if(isset($key)) {
             $params['key'] = common_config('oembed','apikey');
         }
-        $data = self::json($api, $params);
-        return self::normalize($data);
+        return HTTPClient::quickGetJson($api, $params);
     }
 
     /**
@@ -225,14 +167,11 @@ class oEmbedHelper
      * @param object $orig
      * @return object
      */
-    static function normalize($orig)
+    static function normalize(stdClass $data)
     {
-        $data = clone($orig);
-
         if (empty($data->type)) {
             throw new Exception('Invalid oEmbed data: no type field.');
         }
-
         if ($data->type == 'image') {
             // YFrog does this.
             $data->type = 'photo';
@@ -248,19 +187,6 @@ class oEmbedHelper
 
         return $data;
     }
-
-    /**
-     * Fetch some URL and return JSON data.
-     *
-     * @param string $url
-     * @param array $params query-string params
-     * @return object
-     */
-    static protected function json($url, $params=array())
-    {
-        $data = HTTPClient::quickGet($url, null, $params);
-        return json_decode($data);
-    }
 }
 
 class oEmbedHelper_Exception extends Exception