]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' of gitorious.org:statusnet/mainline into 0.9.x
authorBrion Vibber <brion@pobox.com>
Mon, 15 Nov 2010 20:38:53 +0000 (12:38 -0800)
committerBrion Vibber <brion@pobox.com>
Mon, 15 Nov 2010 20:38:53 +0000 (12:38 -0800)
15 files changed:
README
classes/File.php
classes/File_redirection.php
extlib/Services/oEmbed.php [deleted file]
extlib/Services/oEmbed/Exception.php [deleted file]
extlib/Services/oEmbed/Exception/NoSupport.php [deleted file]
extlib/Services/oEmbed/Object.php [deleted file]
extlib/Services/oEmbed/Object/Common.php [deleted file]
extlib/Services/oEmbed/Object/Exception.php [deleted file]
extlib/Services/oEmbed/Object/Link.php [deleted file]
extlib/Services/oEmbed/Object/Photo.php [deleted file]
extlib/Services/oEmbed/Object/Rich.php [deleted file]
extlib/Services/oEmbed/Object/Video.php [deleted file]
lib/oembedhelper.php
tests/oEmbedTest.php [new file with mode: 0644]

diff --git a/README b/README
index b36d8b745402146c9c5d5c7627386fe22cd762de..6343e3e02465c778611b16261b18c7d377d4c71b 100644 (file)
--- a/README
+++ b/README
@@ -220,14 +220,12 @@ and the URLs are listed here for your convenience.
   version may render your StatusNet site unable to send or receive XMPP
   messages.
 - Facebook library. Used for the Facebook application.
-- PEAR Services_oEmbed. Used for some multimedia integration.
-- PEAR HTTP_Request is an oEmbed dependency.
-- PEAR Validate is an oEmbed dependency.
-- PEAR Net_URL2 is an oEmbed dependency.
+- PEAR Validate is used for URL and email validation.
 - Console_GetOpt for parsing command-line options.
 - libomb. a library for implementing OpenMicroBlogging 0.1, the
   predecessor to OStatus.
 - HTTP_Request2, a library for making HTTP requests.
+- PEAR Net_URL2 is an HTTP_Request2 dependency.
 
 A design goal of StatusNet is that the basic Web functionality should
 work on even the most restrictive commercial hosting services.
index 499c8d72c392f9225cf11e3ed009b40272802506..ef9dbf14aba1226c744df6f55472350852bef1d7 100644 (file)
@@ -116,10 +116,24 @@ class File extends Memcached_DataObject
     }
 
     /**
+     * Go look at a URL and possibly save data about it if it's new:
+     * - follow redirect chains and store them in file_redirection
+     * - look up oEmbed data and save it in file_oembed
+     * - if a thumbnail is available, save it in file_thumbnail
+     * - save file record with basic info
+     * - optionally save a file_to_post record
+     * - return the File object with the full reference
+     *
      * @fixme refactor this mess, it's gotten pretty scary.
-     * @param bool $followRedirects
+     * @param string $given_url the URL we're looking at
+     * @param int $notice_id (optional)
+     * @param bool $followRedirects defaults to true
+     *
+     * @return mixed File on success, -1 on some errors
+     *
+     * @throws ServerException on some errors
      */
-    function processNew($given_url, $notice_id=null, $followRedirects=true) {
+    public function processNew($given_url, $notice_id=null, $followRedirects=true) {
         if (empty($given_url)) return -1;   // error, no url to process
         $given_url = File_redirection::_canonUrl($given_url);
         if (empty($given_url)) return -1;   // error, no url to process
index 68fed77e8bb3eef6402fc0b737676c193cf3b420..1976e3439cf0525bca9ab4aaa284d97c682cb8ca 100644 (file)
@@ -91,9 +91,16 @@ class File_redirection extends Memcached_DataObject
             $request->setMethod(HTTP_Request2::METHOD_HEAD);
             $response = $request->send();
 
-            if (405 == $response->getStatus()) {
+            if (405 == $response->getStatus() || 204 == $response->getStatus()) {
+                // HTTP 405 Unsupported Method
                 // Server doesn't support HEAD method? Can this really happen?
                 // We'll try again as a GET and ignore the response data.
+                //
+                // HTTP 204 No Content
+                // YFrog sends 204 responses back for our HEAD checks, which
+                // seems like it may be a logic error in their servers. If
+                // we get a 204 back, re-run it as a GET... if there's really
+                // no content it'll be cheap. :)
                 $request = self::_commonHttp($short_url, $redirs);
                 $response = $request->send();
             }
@@ -235,6 +242,18 @@ class File_redirection extends Memcached_DataObject
         return null;
     }
 
+    /**
+     * Basic attempt to canonicalize a URL, cleaning up some standard variants
+     * such as funny syntax or a missing path. Used internally when cleaning
+     * up URLs for storage and following redirect chains.
+     *
+     * Note that despite being on File_redirect, this function DOES NOT perform
+     * any dereferencing of redirects.
+     *
+     * @param string $in_url input URL
+     * @param string $default_scheme if given a bare link; defaults to 'http://'
+     * @return string
+     */
     function _canonUrl($in_url, $default_scheme = 'http://') {
         if (empty($in_url)) return false;
         $out_url = $in_url;
diff --git a/extlib/Services/oEmbed.php b/extlib/Services/oEmbed.php
deleted file mode 100644 (file)
index 0dc8f01..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-
-/**
- * An interface for oEmbed consumption
- *
- * PHP version 5.1.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Validate.php';
-require_once 'Net/URL2.php';
-require_once 'HTTP/Request.php';
-require_once 'Services/oEmbed/Exception.php';
-require_once 'Services/oEmbed/Exception/NoSupport.php';
-require_once 'Services/oEmbed/Object.php';
-
-/**
- * Base class for consuming oEmbed objects
- *
- * <code>
- * <?php
- * 
- * require_once 'Services/oEmbed.php';
- *
- * // The URL that we'd like to find out more information about.
- * $url = 'http://flickr.com/photos/joestump/2848795611/';
- *
- * // The oEmbed API URI. Not all providers support discovery yet so we're
- * // explicitly providing one here. If one is not provided Services_oEmbed
- * // attempts to discover it. If none is found an exception is thrown.
- * $oEmbed = new Services_oEmbed($url, array(
- *     Services_oEmbed::OPTION_API => 'http://www.flickr.com/services/oembed/'
- * ));
- * $object = $oEmbed->getObject();
- *
- * // All of the objects have somewhat sane __toString() methods that allow
- * // you to output them directly.
- * echo (string)$object;
- * 
- * ?>
- * </code> 
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed
-{
-    /**
-     * HTTP timeout in seconds
-     * 
-     * All HTTP requests made by Services_oEmbed will respect this timeout. 
-     * This can be passed to {@link Services_oEmbed::setOption()} or to the
-     * options parameter in {@link Services_oEmbed::__construct()}.
-     * 
-     * @var string OPTION_TIMEOUT Timeout in seconds 
-     */
-    const OPTION_TIMEOUT = 'http_timeout';
-
-    /**
-     * HTTP User-Agent 
-     *
-     * All HTTP requests made by Services_oEmbed will be sent with the 
-     * string set by this option.
-     *
-     * @var string OPTION_USER_AGENT The HTTP User-Agent string
-     */
-    const OPTION_USER_AGENT = 'http_user_agent';
-
-    /**
-     * The API's URI
-     *
-     * If the API is known ahead of time this option can be used to explicitly
-     * set it. If not present then the API is attempted to be discovered 
-     * through the auto-discovery mechanism.
-     *
-     * @var string OPTION_API
-     */
-    const OPTION_API = 'oembed_api';
-
-    /**
-     * Options for oEmbed requests
-     *
-     * @var array $options The options for making requests
-     */
-    protected $options = array(
-        self::OPTION_TIMEOUT    => 3,
-        self::OPTION_API        => null,
-        self::OPTION_USER_AGENT => 'Services_oEmbed 0.1.0'
-    );
-
-    /**
-     * URL of object to get embed information for
-     *
-     * @var object $url {@link Net_URL2} instance of URL of object
-     */
-    protected $url = null;
-
-    /**
-     * Constructor
-     *
-     * @param string $url     The URL to fetch an oEmbed for
-     * @param array  $options A list of options for the oEmbed lookup
-     *
-     * @throws {@link Services_oEmbed_Exception} if the $url is invalid
-     * @throws {@link Services_oEmbed_Exception} when no valid API is found
-     * @return void
-     */
-    public function __construct($url, array $options = array())
-    {
-        if (Validate::uri($url)) {
-            $this->url = new Net_URL2($url);
-        } else {
-            throw new Services_oEmbed_Exception('URL is invalid');
-        }
-
-        if (count($options)) {
-            foreach ($options as $key => $val) {
-                $this->setOption($key, $val);
-            }
-        }
-
-        if ($this->options[self::OPTION_API] === null) {
-            $this->options[self::OPTION_API] = $this->discover($url);
-        } 
-    }
-
-    /**
-     * Set an option for the oEmbed request
-     * 
-     * @param mixed $option The option name
-     * @param mixed $value  The option value
-     *
-     * @see Services_oEmbed::OPTION_API, Services_oEmbed::OPTION_TIMEOUT
-     * @throws {@link Services_oEmbed_Exception} on invalid option
-     * @access public
-     * @return void
-     */
-    public function setOption($option, $value)
-    {
-        switch ($option) {
-        case self::OPTION_API:
-        case self::OPTION_TIMEOUT:
-            break;
-        default:
-            throw new Services_oEmbed_Exception(
-                'Invalid option "' . $option . '"'
-            );
-        }
-
-        $func = '_set_' . $option;
-        if (method_exists($this, $func)) {
-            $this->options[$option] = $this->$func($value);
-        } else {
-            $this->options[$option] = $value;
-        }
-    }
-
-    /**
-     * Set the API option
-     * 
-     * @param string $value The API's URI
-     *
-     * @throws {@link Services_oEmbed_Exception} on invalid API URI
-     * @see Validate::uri()
-     * @return string
-     */
-    protected function _set_oembed_api($value)
-    {
-        if (!Validate::uri($value)) {
-            throw new Services_oEmbed_Exception(
-                'API URI provided is invalid'
-            );
-        }
-
-        return $value;
-    }
-
-    /**
-     * Get the oEmbed response
-     *
-     * @param array $params Optional parameters for 
-     * 
-     * @throws {@link Services_oEmbed_Exception} on cURL errors
-     * @throws {@link Services_oEmbed_Exception} on HTTP errors
-     * @throws {@link Services_oEmbed_Exception} when result is not parsable 
-     * @return object The oEmbed response as an object
-     */
-    public function getObject(array $params = array())
-    {
-        $params['url'] = $this->url->getURL();
-        if (!isset($params['format'])) {
-            $params['format'] = 'json';
-        }
-
-        $sets = array();
-        foreach ($params as $var => $val) {
-            $sets[] = $var . '=' . urlencode($val);
-        }
-
-        $url = $this->options[self::OPTION_API] . '?' . implode('&', $sets);
-
-        $ch = curl_init();
-        curl_setopt($ch, CURLOPT_URL, $url);
-        curl_setopt($ch, CURLOPT_HEADER, false);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
-        $result = curl_exec($ch);
-
-        if (curl_errno($ch)) {
-            throw new Services_oEmbed_Exception(
-                curl_error($ch), curl_errno($ch)
-            );
-        }
-
-        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        if (substr($code, 0, 1) != '2') {
-            throw new Services_oEmbed_Exception('Non-200 code returned. Got code ' . $code);
-        }
-
-        curl_close($ch);
-
-        switch ($params['format']) {
-        case 'json':
-            $res = json_decode($result);
-            if (!is_object($res)) {
-                throw new Services_oEmbed_Exception(
-                    'Could not parse JSON response'
-                );
-            }
-            break;
-        case 'xml':
-            libxml_use_internal_errors(true);
-            $res = simplexml_load_string($result);
-            if (!$res instanceof SimpleXMLElement) {
-                $errors = libxml_get_errors();
-                $err    = array_shift($errors);
-                libxml_clear_errors();
-                libxml_use_internal_errors(false);
-                throw new Services_oEmbed_Exception(
-                    $err->message, $error->code
-                );
-            }
-            break;
-        }
-
-        return Services_oEmbed_Object::factory($res);
-    }
-
-    /**
-     * Discover an oEmbed API 
-     *
-     * @param string $url The URL to attempt to discover oEmbed for
-     *
-     * @throws {@link Services_oEmbed_Exception} if the $url is invalid
-     * @return string The oEmbed API endpoint discovered
-     */
-    protected function discover($url)
-    {
-        $body = $this->sendRequest($url);
-
-        // Find all <link /> tags that have a valid oembed type set. We then
-        // extract the href attribute for each type.
-        $regexp = '#<link([^>]*)type[\s\n]*=[\s\n]*"' . 
-                  '(application/json|text/xml)\+oembed"([^>]*)>#im';
-
-        $m = $ret = array();
-        if (!preg_match_all($regexp, $body, $m)) {
-            throw new Services_oEmbed_Exception_NoSupport(
-                'No valid oEmbed links found on page'
-            );
-        }
-
-        foreach ($m[0] as $i => $link) {
-            $h = array();
-            if (preg_match('/[\s\n]+href[\s\n]*=[\s\n]*"([^"]+)"/im', $link, $h)) {
-                $ret[$m[2][$i]] = $h[1];
-            }
-        } 
-
-        return (isset($ret['application/json']) ? $ret['application/json'] : array_pop($ret));
-    }
-
-    /**
-     * Send a GET request to the provider
-     * 
-     * @param mixed $url The URL to send the request to
-     *
-     * @throws {@link Services_oEmbed_Exception} on HTTP errors
-     * @return string The contents of the response
-     */
-    private function sendRequest($url)
-    {
-        $ch = curl_init();
-        curl_setopt($ch, CURLOPT_URL, $url);
-        curl_setopt($ch, CURLOPT_HEADER, false);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
-        curl_setopt($ch, CURLOPT_USERAGENT, $this->options[self::OPTION_USER_AGENT]);
-        $result = curl_exec($ch);
-        if (curl_errno($ch)) {
-            throw new Services_oEmbed_Exception(
-                curl_error($ch), curl_errno($ch)
-            );
-        }
-
-        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        if (substr($code, 0, 1) != '2') {
-            throw new Services_oEmbed_Exception('Non-200 code returned. Got code ' . $code);
-        }
-
-        return $result;
-    }
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Exception.php b/extlib/Services/oEmbed/Exception.php
deleted file mode 100644 (file)
index 446ac2a..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * Base exception class for {@link Services_oEmbed}
- *
- * PHP version 5.1.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'PEAR/Exception.php';
-
-/**
- * Base exception class for {@link Services_oEmbed}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Exception extends PEAR_Exception
-{
-
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Exception/NoSupport.php b/extlib/Services/oEmbed/Exception/NoSupport.php
deleted file mode 100644 (file)
index 384c719..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/**
- * Exception class when no oEmbed support is discovered
- *
- * PHP version 5.2.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-/**
- * Exception class when no oEmbed support is discovered
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Exception_NoSupport extends Services_oEmbed_Exception
-{
-    
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object.php b/extlib/Services/oEmbed/Object.php
deleted file mode 100644 (file)
index 9eedd7e..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-
-/**
- * An interface for oEmbed consumption
- *
- * PHP version 5.1.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Object/Exception.php';
-
-/**
- * Base class for consuming oEmbed objects
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-abstract class Services_oEmbed_Object 
-{
-    
-    /**
-     * Valid oEmbed object types
-     *
-     * @var array $types Array of valid object types
-     * @see Services_oEmbed_Object::factory()
-     */
-    static protected $types = array(
-        'photo' => 'Photo',
-        'video' => 'Video',
-        'link'  => 'Link',
-        'rich'  => 'Rich'
-    );
-
-    /**
-     * Create an oEmbed object from result
-     *
-     * @param object $object Raw object returned from API
-     *
-     * @throws {@link Services_oEmbed_Object_Exception} on object error
-     * @return object Instance of object driver
-     * @see Services_oEmbed_Object_Link, Services_oEmbed_Object_Photo
-     * @see Services_oEmbed_Object_Rich, Services_oEmbed_Object_Video
-     */
-    static public function factory($object)
-    {
-        if (!isset($object->type)) {
-            throw new Services_oEmbed_Object_Exception(
-                'Object has no type'
-            );
-        }
-
-        $type = (string)$object->type;
-        if (!isset(self::$types[$type])) {
-            throw new Services_oEmbed_Object_Exception(
-                'Object type is unknown or invalid: ' . $type
-            );
-        }
-
-        $file = 'Services/oEmbed/Object/' . self::$types[$type] . '.php';
-        include_once $file;
-
-        $class = 'Services_oEmbed_Object_' . self::$types[$type];
-        if (!class_exists($class)) {
-            throw new Services_oEmbed_Object_Exception(
-                'Object class is invalid or not present'
-            );
-        }
-
-        $instance = new $class($object);
-        return $instance;
-    }
-
-    /**
-     * Instantiation is not allowed
-     *
-     * @return void
-     */
-    private function __construct()
-    {
-    
-    }
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Common.php b/extlib/Services/oEmbed/Object/Common.php
deleted file mode 100644 (file)
index f568ec8..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-/**
- * Base class for oEmbed objects
- *
- * PHP version 5.1.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-/**
- * Base class for oEmbed objects
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-abstract class Services_oEmbed_Object_Common
-{
-    /**
-     * Raw object returned from API
-     *
-     * @var object $object The raw object from the API
-     */
-    protected $object = null;
-
-    /**
-     * Required fields per the specification
-     *
-     * @var array $required Array of required fields
-     * @link http://oembed.com
-     */
-    protected $required = array();
-
-    /**
-     * Constructor
-     *
-     * @param object $object Raw object returned from the API
-     *
-     * @throws {@link Services_oEmbed_Object_Exception} on missing fields
-     * @return void
-     */
-    public function __construct($object)
-    {
-        $this->object = $object;
-
-        $this->required[] = 'version';
-        foreach ($this->required as $field) {
-            if (!isset($this->$field)) {
-                throw new Services_oEmbed_Object_Exception(
-                    'Object is missing required ' . $field . ' attribute'
-                );
-            }
-        }
-    }
-
-    /**
-     * Get object variable
-     *
-     * @param string $var Variable to get
-     *
-     * @see Services_oEmbed_Object_Common::$object
-     * @return mixed Attribute's value or null if it's not set/exists
-     */
-    public function __get($var)
-    {
-        if (property_exists($this->object, $var)) {
-            return $this->object->$var;
-        }
-
-        return null;
-    }
-
-    /**
-     * Is variable set?
-     *
-     * @param string $var Variable name to check
-     * 
-     * @return boolean True if set, false if not
-     * @see Services_oEmbed_Object_Common::$object
-     */
-    public function __isset($var)
-    {
-        if (property_exists($this->object, $var)) {
-            return (isset($this->object->$var));
-        }
-
-        return false;
-    }
-
-    /**
-     * Require a sane __toString for all objects
-     *
-     * @return string
-     */
-    abstract public function __toString();
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Exception.php b/extlib/Services/oEmbed/Object/Exception.php
deleted file mode 100644 (file)
index 6025ffd..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * Exception for {@link Services_oEmbed_Object}
- *
- * PHP version 5.1.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Exception.php';
-
-/**
- * Exception for {@link Services_oEmbed_Object}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Object_Exception extends Services_oEmbed_Exception
-{
-
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Link.php b/extlib/Services/oEmbed/Object/Link.php
deleted file mode 100644 (file)
index 9b627a8..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/**
- * Link object for {@link Services_oEmbed}
- *
- * PHP version 5.2.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Object/Common.php';
-
-/**
- * Link object for {@link Services_oEmbed}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Object_Link extends Services_oEmbed_Object_Common
-{
-    /**
-     * Output a sane link
-     *
-     * @return string An HTML link of the object
-     */
-    public function __toString()
-    {
-        return '<a href="' . $this->url . '">' . $this->title . '</a>';
-    }
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Photo.php b/extlib/Services/oEmbed/Object/Photo.php
deleted file mode 100644 (file)
index 5fbf429..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/**
- * Photo object for {@link Services_oEmbed}
- *
- * PHP version 5.2.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Object/Common.php';
-
-/**
- * Photo object for {@link Services_oEmbed}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Object_Photo extends Services_oEmbed_Object_Common
-{
-    /**
-     * Required fields for photo objects
-     *
-     * @var array $required Required fields
-     */
-    protected $required = array(
-        'url', 'width', 'height'
-    );
-    /**
-     * Output a valid HTML tag for image
-     *
-     * @return string HTML <img /> tag for Photo
-     */
-    public function __toString()
-    {
-        $img = '<img src="' . $this->url . '" width="' . $this->width . '" ' .
-               'height="' . $this->height . '"';
-
-        if (isset($this->title)) {
-            $img .= ' alt="' . $this->title . '"';
-        }
-
-        return $img . ' />';
-    }
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Rich.php b/extlib/Services/oEmbed/Object/Rich.php
deleted file mode 100644 (file)
index dbf6933..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * Photo object for {@link Services_oEmbed}
- *
- * PHP version 5.2.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Object/Common.php';
-
-/**
- * Photo object for {@link Services_oEmbed}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Object_Rich extends Services_oEmbed_Object_Common
-{
-    /**
-     * Required fields for rich objects
-     *
-     * @var array $required Required fields
-     */
-    protected $required = array(
-        'html', 'width', 'height'
-    );
-    /**
-     * Output a the HTML tag for rich object
-     *
-     * @return string HTML for rich object
-     */
-    public function __toString()
-    {
-        return $this->html;        
-    }
-}
-
-?>
diff --git a/extlib/Services/oEmbed/Object/Video.php b/extlib/Services/oEmbed/Object/Video.php
deleted file mode 100644 (file)
index 7461081..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * Photo object for {@link Services_oEmbed}
- *
- * PHP version 5.2.0+
- *
- * Copyright (c) 2008, Digg.com, Inc.
- * 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without 
- * modification, are permitted provided that the following conditions are met:
- *
- *  - Redistributions of source code must retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright notice,
- *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution.
- *  - Neither the name of Digg.com, Inc. nor the names of its contributors 
- *    may be used to endorse or promote products derived from this software 
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   SVN: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-
-require_once 'Services/oEmbed/Object/Common.php';
-
-/**
- * Photo object for {@link Services_oEmbed}
- * 
- * @category  Services
- * @package   Services_oEmbed
- * @author    Joe Stump <joe@joestump.net> 
- * @copyright 2008 Digg.com, Inc.
- * @license   http://tinyurl.com/42zef New BSD License
- * @version   Release: @version@
- * @link      http://code.google.com/p/digg
- * @link      http://oembed.com
- */
-class Services_oEmbed_Object_Video extends Services_oEmbed_Object_Common
-{
-    /**
-     * Required fields for video objects
-     *
-     * @var array $required Required fields
-     */
-    protected $required = array(
-        'html', 'width', 'height'
-    );
-    /**
-     * Output a valid embed tag for video
-     *
-     * @return string HTML for video
-     */
-    public function __toString()
-    {
-        return $this->html;        
-    }
-}
-
-?>
index ef2b59214c4ebb170bc9f72eef72ae2799ac2840..84cf1058676a97e9ed6a523b484a1b2ddeb6ec5c 100644 (file)
 if (!defined('STATUSNET')) {
     exit(1);
 }
-require_once INSTALLDIR.'/extlib/Services/oEmbed.php';
 
 
 /**
- * Utility class to wrap Services_oEmbed:
+ * Utility class to wrap basic oEmbed lookups.
  *
  * Blacklisted hosts will use an alternate lookup method:
  *  - Twitpic
@@ -70,7 +69,6 @@ class oEmbedHelper
      */
     public static function getObject($url, $params=array())
     {
-        common_log(LOG_INFO, 'QQQ: wtf? ' . $url);
         $host = parse_url($url, PHP_URL_HOST);
         if (substr($host, 0, 4) == 'www.') {
             $host = substr($host, 4);
@@ -87,45 +85,132 @@ class oEmbedHelper
         // 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, 'QQQ: going to: ' . $api);
         } else {
-            $api = false;
-            common_log(LOG_INFO, 'QQQ: no map for ' . $host);
+            try {
+                $api = self::discover($url);
+            } catch (Exception $e) {
+                // Discovery failed... fall back to oohembed if enabled.
+                $oohembed = common_config('oohembed', 'endpoint');
+                if ($oohembed) {
+                    $api = $oohembed;
+                } else {
+                    throw $e;
+                }
+            }
         }
         return self::getObjectFrom($api, $url, $params);
     }
 
     /**
-     * Actually do an oEmbed lookup to a particular API endpoint,
-     * or to the autodiscovered target, or to oohembed.
+     * Perform basic discovery.
+     * @return string
+     */
+    static function discover($url)
+    {
+        // @fixme ideally skip this for non-HTML stuff!
+        $body = self::http($url);
+        return self::discoverFromHTML($url, $body);
+    }
+
+    /**
+     * Partially ripped from OStatus' FeedDiscovery class.
+     *
+     * @param string $url source URL, used to resolve relative links
+     * @param string $body HTML body text
+     * @return mixed string with URL or false if no target found
+     */
+    static function discoverFromHTML($url, $body)
+    {
+        // 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();
+        }
+
+        // Ok... now on to the links!
+        $feeds = array(
+            'application/json+oembed' => false,
+        );
+
+        $nodes = $dom->getElementsByTagName('link');
+        for ($i = 0; $i < $nodes->length; $i++) {
+            $node = $nodes->item($i);
+            if ($node->hasAttributes()) {
+                $rel = $node->attributes->getNamedItem('rel');
+                $type = $node->attributes->getNamedItem('type');
+                $href = $node->attributes->getNamedItem('href');
+                if ($rel && $type && $href) {
+                    $rel = array_filter(explode(" ", $rel->value));
+                    $type = trim($type->value);
+                    $href = trim($href->value);
+
+                    if (in_array('alternate', $rel) && array_key_exists($type, $feeds) && empty($feeds[$type])) {
+                        // Save the first feed found of each type...
+                        $feeds[$type] = $href;
+                    }
+                }
+            }
+        }
+
+        // Return the highest-priority feed found
+        foreach ($feeds as $type => $url) {
+            if ($url) {
+                return $url;
+            }
+        }
+
+        throw new oEmbedHelper_DiscoveryException();
+    }
+
+    /**
+     * Actually do an oEmbed lookup to a particular API endpoint.
      *
-     * @param mixed $api string or false: oEmbed API endpoint URL
+     * @param string $api oEmbed API endpoint URL
      * @param string $url target URL to look up info about
      * @param array $params
      * @return object
      */
-    static protected function getObjectFrom($api, $url, $params=array())
+    static function getObjectFrom($api, $url, $params=array())
     {
-        $options = array();
-        if ($api) {
-            $options[Services_oEmbed::OPTION_API] = $api;
+        $params['url'] = $url;
+        $params['format'] = 'json';
+        $data = self::json($api, $params);
+        return self::normalize($data);
+    }
+
+    /**
+     * Normalize oEmbed format.
+     *
+     * @param object $orig
+     * @return object
+     */
+    static function normalize($orig)
+    {
+        $data = clone($orig);
+
+        if (empty($data->type)) {
+            throw new Exception('Invalid oEmbed data: no type field.');
         }
 
-        try {
-            $oEmbed = new Services_oEmbed_Tweaked($url, $options);
-        } catch (Services_oEmbed_Exception_NoSupport $e) {
-            // Discovery failed... fall back to oohembed if enabled.
-            $oohembed = common_config('oohembed', 'endpoint');
-            if ($oohembed) {
-                $options[Services_oEmbed::OPTION_API] = $oohembed;
-                $oEmbed = new Services_oEmbed_Tweaked($url, $options);
-            } else {
-                throw $e;
+        if ($data->type == 'image') {
+            // YFrog does this.
+            $data->type = 'photo';
+        }
+
+        if (isset($data->thumbnail_url)) {
+            if (!isset($data->thumbnail_width)) {
+                // !?!?!
+                $data->thumbnail_width = common_config('attachments', 'thumb_width');
+                $data->thumbnail_height = common_config('attachments', 'thumb_height');
             }
         }
 
-        // And.... let's go look it up!
-        return $oEmbed->getObject($params);
+        return $data;
     }
 
     /**
@@ -212,35 +297,22 @@ class oEmbedHelper
     }
 }
 
-class Services_oEmbed_Tweaked extends Services_oEmbed
+class oEmbedHelper_Exception extends Exception
+{
+}
+
+class oEmbedHelper_BadHtmlException extends oEmbedHelper_Exception
 {
-    protected function discover($url)
+    function __construct($previous=null)
     {
-        $api = parent::discover($url);
-        if (strpos($api, '?') !== false) {
-            // Services_oEmbed doesn't expect to find existing params
-            // on its API endpoint, which may surprise you since the
-            // spec says discovery URLs should include parameters... :)
-            //
-            // Appending a '&' on the end keeps the later-appended '?'
-            // from breaking whatever the first parameters was.
-            return $api . '&';
-        }
-        return $api;
+        return parent::__construct('Bad HTML in discovery data.', 0, $previous);
     }
+}
 
-    public function getObject(array $params = array())
+class oEmbedHelper_DiscoveryException extends oEmbedHelper_Exception
+{
+    function __construct($previous=null)
     {
-        $api = $this->options[self::OPTION_API];
-        if (strpos($api, '?') !== false) {
-            // The Services_oEmbed code appends a '?' on the end, which breaks
-            // the next parameter which may be something important like
-            // maxwidth.
-            //
-            // Sticking this bogus entry into our parameters gets us past it.
-            $params = array_merge(array('statusnet' => 1), $params);
-        }
-        return parent::getObject($params);
+        return parent::__construct('No oEmbed discovery data.', 0, $previous);
     }
-
-}
\ No newline at end of file
+}
diff --git a/tests/oEmbedTest.php b/tests/oEmbedTest.php
new file mode 100644 (file)
index 0000000..d009630
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
+    print "This script must be run from the command line\n";
+    exit();
+}
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+define('STATUSNET', true);
+
+require_once INSTALLDIR . '/lib/common.php';
+
+class oEmbedTest extends PHPUnit_Framework_TestCase
+{
+
+    public function setup()
+    {
+        $this->old_oohembed = common_config('oohembed', 'endpoint');
+    }
+
+    public function tearDown()
+    {
+        $GLOBALS['config']['oohembed']['endpoint'] = $this->old_oohembed;
+    }
+
+    /**
+     * Test with oohembed DISABLED.
+     *
+     * @dataProvider discoverableSources
+     */
+    public function testoEmbed($url, $expectedType)
+    {
+        $GLOBALS['config']['oohembed']['endpoint'] = false;
+        $this->_doTest($url, $expectedType);
+    }
+
+    /**
+     * Test with oohembed ENABLED.
+     *
+     * @dataProvider fallbackSources
+     */
+    public function testoohEmbed($url, $expectedType)
+    {
+        $GLOBALS['config']['oohembed']['endpoint'] = $this->_endpoint();
+        $this->_doTest($url, $expectedType);
+    }
+
+    /**
+     * Get default oohembed endpoint.
+     *
+     * @return string
+     */
+    function _endpoint()
+    {
+        $default = array();
+        $_server = 'localhost'; $_path = '';
+        require INSTALLDIR . '/lib/default.php';
+        return $default['oohembed']['endpoint'];
+    }
+
+    /**
+     * Actually run an individual test.
+     *
+     * @param string $url
+     * @param string $expectedType
+     */
+    function _doTest($url, $expectedType)
+    {
+        try {
+            $data = oEmbedHelper::getObject($url);
+            $this->assertEquals($expectedType, $data->type);
+        } catch (Exception $e) {
+            if ($expectedType == 'none') {
+                $this->assertEquals($expectedType, 'none', 'Should not have data for this URL.');
+            } else {
+                throw $e;
+            }
+        }
+    }
+
+    /**
+     * Sample oEmbed targets for sites we know ourselves...
+     * @return array
+     */
+    static public function knownSources()
+    {
+        $sources = array(
+            array('http://www.flickr.com/photos/brionv/5172500179/', 'photo'),
+            array('http://yfrog.com/fy42747177j', 'photo'),
+            array('http://twitpic.com/36adw6', 'photo'),
+        );
+        return $sources;
+    }
+
+    /**
+     * Sample oEmbed targets that can be found via discovery.
+     * Includes also knownSources() output.
+     *
+     * @return array
+     */
+    static public function discoverableSources()
+    {
+        $sources = array(
+            array('http://identi.ca/attachment/34437400', 'photo'),
+
+            array('http://www.youtube.com/watch?v=eUgLR232Cnw', 'video'),
+            array('http://vimeo.com/9283184', 'video'),
+
+            // Will fail discovery:
+            array('http://leuksman.com/log/2010/10/29/statusnet-0-9-6-release/', 'none'),
+        );
+        return array_merge(self::knownSources(), $sources);
+    }
+
+    /**
+     * Sample oEmbed targets that can be found via oohembed.com.
+     * Includes also discoverableSources() output.
+     *
+     * @return array
+     */
+    static public function fallbackSources()
+    {
+        $sources = array(
+            array('http://en.wikipedia.org/wiki/File:Wiki.png', 'link'), // @fixme in future there may be a native provider -- will change to 'photo'
+        );
+        return array_merge(self::discoverableSources(), $sources);
+    }
+}