]> git.mxchange.org Git - friendica.git/blobdiff - src/ParseUrl.php
Add Base Module class
[friendica.git] / src / ParseUrl.php
index 1674d5691459efde1a0df655dffc91d85f61b5ea..35557067d7474ca4d7d85d522c0b1847fc33977a 100644 (file)
@@ -1,38 +1,34 @@
 <?php
-
 /**
  * @file include/ParseUrl.php
  * @brief Get informations about a given URL
  */
-
 namespace Friendica;
 
 use Friendica\Core\Config;
+use Friendica\Object\Image;
+use Friendica\Util\XML;
 
-use xml;
 use dba;
-
 use DomXPath;
 use DOMDocument;
 
-require_once("include/network.php");
-require_once("include/Photo.php");
-require_once("include/oembed.php");
-require_once("include/xml.php");
+require_once "include/network.php";
+require_once "include/oembed.php";
 
 /**
  * @brief Class with methods for extracting certain content from an url
  */
-class ParseUrl {
-
+class ParseUrl
+{
        /**
         * @brief Search for chached embeddable data of an url otherwise fetch it
         *
-        * @param type $url The url of the page which should be scraped
+        * @param type $url         The url of the page which should be scraped
         * @param type $no_guessing If true the parse doens't search for
-        *    preview pictures
-        * @param type $do_oembed The false option is used by the function fetch_oembed()
-        *    to avoid endless loops
+        *                          preview pictures
+        * @param type $do_oembed   The false option is used by the function fetch_oembed()
+        *                          to avoid endless loops
         *
         * @return array which contains needed data for embedding
         *    string 'url' => The url of the parsed page
@@ -47,14 +43,18 @@ class ParseUrl {
         * @see ParseUrl::getSiteinfo() for more information about scraping
         * embeddable content
         */
-       public static function getSiteinfoCached($url, $no_guessing = false, $do_oembed = true) {
-
+       public static function getSiteinfoCached($url, $no_guessing = false, $do_oembed = true)
+       {
                if ($url == "") {
                        return false;
                }
 
-               $r = q("SELECT * FROM `parsed_url` WHERE `url` = '%s' AND `guessing` = %d AND `oembed` = %d",
-                       dbesc(normalise_link($url)), intval(!$no_guessing), intval($do_oembed));
+               $r = q(
+                       "SELECT * FROM `parsed_url` WHERE `url` = '%s' AND `guessing` = %d AND `oembed` = %d",
+                       dbesc(normalise_link($url)),
+                       intval(!$no_guessing),
+                       intval($do_oembed)
+               );
 
                if ($r) {
                        $data = $r[0]["content"];
@@ -67,9 +67,14 @@ class ParseUrl {
 
                $data = self::getSiteinfo($url, $no_guessing, $do_oembed);
 
-               dba::insert('parsed_url', array('url' => normalise_link($url), 'guessing' => !$no_guessing,
+               dba::insert(
+                       'parsed_url',
+                       array(
+                               'url' => normalise_link($url), 'guessing' => !$no_guessing,
                                'oembed' => $do_oembed, 'content' => serialize($data),
-                               'created' => datetime_convert()), true);
+                               'created' => datetime_convert()),
+                       true
+               );
 
                return $data;
        }
@@ -83,12 +88,12 @@ class ParseUrl {
         * like \<title\>Awesome Title\</title\> or
         * \<meta name="description" content="An awesome description"\>
         *
-        * @param type $url The url of the page which should be scraped
+        * @param type $url         The url of the page which should be scraped
         * @param type $no_guessing If true the parse doens't search for
-        *    preview pictures
-        * @param type $do_oembed The false option is used by the function fetch_oembed()
-        *    to avoid endless loops
-        * @param type $count Internal counter to avoid endless loops
+        *                          preview pictures
+        * @param type $do_oembed   The false option is used by the function fetch_oembed()
+        *                          to avoid endless loops
+        * @param type $count       Internal counter to avoid endless loops
         *
         * @return array which contains needed data for embedding
         *    string 'url' => The url of the parsed page
@@ -113,8 +118,8 @@ class ParseUrl {
         * </body>
         * @endverbatim
         */
-       public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1) {
-
+       public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1)
+       {
                $a = get_app();
 
                $siteinfo = array();
@@ -139,64 +144,34 @@ class ParseUrl {
                $siteinfo["url"] = $url;
                $siteinfo["type"] = "link";
 
-               $check_cert = Config::get("system", "verifyssl");
-
-               $stamp1 = microtime(true);
-
-               $ch = curl_init();
-               curl_setopt($ch, CURLOPT_URL, $url);
-               curl_setopt($ch, CURLOPT_HEADER, 1);
-               curl_setopt($ch, CURLOPT_TIMEOUT, 10);
-               curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-               curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent());
-               curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-               if ($check_cert) {
-                       @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-               }
-
-               $range = intval(Config::get('system', 'curl_range_bytes', 0));
-
-               if ($range > 0) {
-                       curl_setopt($ch, CURLOPT_RANGE, '0-' . $range);
-               }
-
-               $header = curl_exec($ch);
-               $curl_info = @curl_getinfo($ch);
-               curl_close($ch);
-
-               $a->save_timestamp($stamp1, "network");
-
-               if ((($curl_info["http_code"] == "301") || ($curl_info["http_code"] == "302") || ($curl_info["http_code"] == "303") || ($curl_info["http_code"] == "307"))
-                       && (($curl_info["redirect_url"] != "") || ($curl_info["location"] != ""))) {
-                       if ($curl_info["redirect_url"] != "") {
-                               $siteinfo = self::getSiteinfo($curl_info["redirect_url"], $no_guessing, $do_oembed, ++$count);
-                       } else {
-                               $siteinfo = self::getSiteinfo($curl_info["location"], $no_guessing, $do_oembed, ++$count);
-                       }
+               $data = z_fetch_url($url);
+               if (!$data['success']) {
                        return($siteinfo);
                }
 
                // If the file is too large then exit
-               if ($curl_info["download_content_length"] > 1000000) {
+               if ($data["info"]["download_content_length"] > 1000000) {
                        return($siteinfo);
                }
 
                // If it isn't a HTML file then exit
-               if (($curl_info["content_type"] != "") && !strstr(strtolower($curl_info["content_type"]), "html")) {
+               if (($data["info"]["content_type"] != "") && !strstr(strtolower($data["info"]["content_type"]), "html")) {
                        return($siteinfo);
                }
 
-               if ($do_oembed) {
+               $header = $data["header"];
+               $body = $data["body"];
 
+               if ($do_oembed) {
                        $oembed_data = oembed_fetch_url($url);
 
-                       if (!in_array($oembed_data->type, array("error", "rich"))) {
+                       if (!in_array($oembed_data->type, array("error", "rich", ""))) {
                                $siteinfo["type"] = $oembed_data->type;
                        }
 
                        if (($oembed_data->type == "link") && ($siteinfo["type"] != "photo")) {
                                if (isset($oembed_data->title)) {
-                                       $siteinfo["title"] = $oembed_data->title;
+                                       $siteinfo["title"] = trim($oembed_data->title);
                                }
                                if (isset($oembed_data->description)) {
                                        $siteinfo["text"] = trim($oembed_data->description);
@@ -217,14 +192,6 @@ class ParseUrl {
                        $charset = "utf-8";
                }
 
-               $pos = strpos($header, "\r\n\r\n");
-
-               if ($pos) {
-                       $body = trim(substr($header, $pos));
-               } else {
-                       $body = $header;
-               }
-
                if (($charset != "") && (strtoupper($charset) != "UTF-8")) {
                        logger("parseurl_getsiteinfo: detected charset ".$charset, LOGGER_DEBUG);
                        //$body = mb_convert_encoding($body, "UTF-8", $charset);
@@ -236,17 +203,17 @@ class ParseUrl {
                $doc = new DOMDocument();
                @$doc->loadHTML($body);
 
-               xml::deleteNode($doc, "style");
-               xml::deleteNode($doc, "script");
-               xml::deleteNode($doc, "option");
-               xml::deleteNode($doc, "h1");
-               xml::deleteNode($doc, "h2");
-               xml::deleteNode($doc, "h3");
-               xml::deleteNode($doc, "h4");
-               xml::deleteNode($doc, "h5");
-               xml::deleteNode($doc, "h6");
-               xml::deleteNode($doc, "ol");
-               xml::deleteNode($doc, "ul");
+               XML::deleteNode($doc, "style");
+               XML::deleteNode($doc, "script");
+               XML::deleteNode($doc, "option");
+               XML::deleteNode($doc, "h1");
+               XML::deleteNode($doc, "h2");
+               XML::deleteNode($doc, "h3");
+               XML::deleteNode($doc, "h4");
+               XML::deleteNode($doc, "h5");
+               XML::deleteNode($doc, "h6");
+               XML::deleteNode($doc, "ol");
+               XML::deleteNode($doc, "ul");
 
                $xpath = new DomXPath($doc);
 
@@ -277,7 +244,7 @@ class ParseUrl {
 
                $list = $xpath->query("//title");
                if ($list->length > 0) {
-                       $siteinfo["title"] = $list->item(0)->nodeValue;
+                       $siteinfo["title"] = trim($list->item(0)->nodeValue);
                }
 
                //$list = $xpath->query("head/meta[@name]");
@@ -295,10 +262,10 @@ class ParseUrl {
                        if ($attr["content"] != "") {
                                switch (strtolower($attr["name"])) {
                                        case "fulltitle":
-                                               $siteinfo["title"] = $attr["content"];
+                                               $siteinfo["title"] = trim($attr["content"]);
                                                break;
                                        case "description":
-                                               $siteinfo["text"] = $attr["content"];
+                                               $siteinfo["text"] = trim($attr["content"]);
                                                break;
                                        case "thumbnail":
                                                $siteinfo["image"] = $attr["content"];
@@ -315,16 +282,16 @@ class ParseUrl {
                                                }
                                                break;
                                        case "twitter:description":
-                                               $siteinfo["text"] = $attr["content"];
+                                               $siteinfo["text"] = trim($attr["content"]);
                                                break;
                                        case "twitter:title":
-                                               $siteinfo["title"] = $attr["content"];
+                                               $siteinfo["title"] = trim($attr["content"]);
                                                break;
                                        case "dc.title":
-                                               $siteinfo["title"] = $attr["content"];
+                                               $siteinfo["title"] = trim($attr["content"]);
                                                break;
                                        case "dc.description":
-                                               $siteinfo["text"] = $attr["content"];
+                                               $siteinfo["text"] = trim($attr["content"]);
                                                break;
                                        case "keywords":
                                                $keywords = explode(",", $attr["content"]);
@@ -366,10 +333,10 @@ class ParseUrl {
                                                $siteinfo["image"] = $attr["content"];
                                                break;
                                        case "og:title":
-                                               $siteinfo["title"] = $attr["content"];
+                                               $siteinfo["title"] = trim($attr["content"]);
                                                break;
                                        case "og:description":
-                                               $siteinfo["text"] = $attr["content"];
+                                               $siteinfo["text"] = trim($attr["content"]);
                                                break;
                                }
                        }
@@ -386,7 +353,7 @@ class ParseUrl {
                                }
 
                                $src = self::completeUrl($attr["src"], $url);
-                               $photodata = get_photo_info($src);
+                               $photodata = Image::getInfoFromURL($src);
 
                                if (($photodata) && ($photodata[0] > 150) && ($photodata[1] > 150)) {
                                        if ($photodata[0] > 300) {
@@ -401,14 +368,13 @@ class ParseUrl {
                                                                        "width" => $photodata[0],
                                                                        "height" => $photodata[1]);
                                }
-
-                               }
+                       }
                } elseif ($siteinfo["image"] != "") {
                        $src = self::completeUrl($siteinfo["image"], $url);
 
                        unset($siteinfo["image"]);
 
-                       $photodata = get_photo_info($src);
+                       $photodata = Image::getInfoFromURL($src);
 
                        if (($photodata) && ($photodata[0] > 10) && ($photodata[1] > 10)) {
                                $siteinfo["images"][] = array("src" => $src,
@@ -470,7 +436,8 @@ class ParseUrl {
         * @param string $string Tags
         * @return array with formatted Hashtags
         */
-       public static function convertTagsToArray($string) {
+       public static function convertTagsToArray($string)
+       {
                $arr_tags = str_getcsv($string);
                if (count($arr_tags)) {
                        // add the # sign to every tag
@@ -486,9 +453,11 @@ class ParseUrl {
         *  This method is used as callback function
         *
         * @param string $tag The pure tag name
-        * @param int $k Counter for internal use
+        * @param int    $k   Counter for internal use
+        * @return void
         */
-       private static function arrAddHashes(&$tag, $k) {
+       private static function arrAddHashes(&$tag, $k)
+       {
                $tag = "#" . $tag;
        }
 
@@ -499,14 +468,15 @@ class ParseUrl {
         * can miss the scheme so we need to add the correct
         * scheme
         *
-        * @param string $url The url which possibly does have
-        *    a missing scheme (a link to an image)
+        * @param string $url    The url which possibly does have
+        *                       a missing scheme (a link to an image)
         * @param string $scheme The url with a correct scheme
-        *    (e.g. the url from the webpage which does contain the image)
+        *                       (e.g. the url from the webpage which does contain the image)
         *
         * @return string The url with a scheme
         */
-       private static function completeUrl($url, $scheme) {
+       private static function completeUrl($url, $scheme)
+       {
                $urlarr = parse_url($url);
 
                // If the url does allready have an scheme
@@ -523,7 +493,7 @@ class ParseUrl {
                        $complete .= ":".$schemearr["port"];
                }
 
-               if (strpos($urlarr["path"],"/") !== 0) {
+               if (strpos($urlarr["path"], "/") !== 0) {
                        $complete .= "/";
                }