src/Tweeper.php: fix rendering Instagram images in some feed readers
[tweeper.git] / src / Tweeper.php
index de1f474..2d3870f 100644 (file)
@@ -234,6 +234,34 @@ class Tweeper {
   }
 
   /**
   }
 
   /**
+   * Generate a data URL.
+   */
+  public static function generateDataURL($url) {
+    $supported_content_types = [
+      "image/gif",
+      "image/jpeg",
+      "image/png",
+    ];
+
+    $url_info = Tweeper::getUrlInfo($url);
+    if (FALSE === $url_info) {
+      trigger_error("Failed to retrieve info for URL: " . $url, E_USER_WARNING);
+      return '';
+    }
+
+    $supported = in_array($url_info['content_type'], $supported_content_types);
+    if (!$supported) {
+      trigger_error("Unsupported data URL type \"" . $url_info['content_type'] . "\" for URL: " . $url_info['url'], E_USER_WARNING);
+      return '';
+    }
+
+    $base64Data = base64_encode(file_get_contents($url));
+    $dataURL = 'data: ' . $url_info['content_type'] . ';base64,' . $base64Data;
+
+    return $dataURL;
+  }
+
+  /**
    * Mimic the message from libxml.c::php_libxml_ctx_error_level()
    */
   private static function logXmlError($error) {
    * Mimic the message from libxml.c::php_libxml_ctx_error_level()
    */
   private static function logXmlError($error) {
@@ -312,13 +340,11 @@ class Tweeper {
 
     $data = json_decode($matches[1], $assoc = TRUE);
 
 
     $data = json_decode($matches[1], $assoc = TRUE);
 
-    // The "qe" object contains elements which will result in invalid XML
-    // element names, so remove it.
+    // Remove items that may contain elements which can result in invalid XML
+    // element names (for example names starting with a number).
     unset($data["qe"]);
     unset($data["qe"]);
-
-    // The "knobs" object contains elements with undefined namespaces, so
-    // remove it to silence an error message.
-    unset($data["knobs"]);
+    unset($data["knobx"]);
+    unset($data["to_cache"]);
 
     // Stop here in case Instagram redirected to the login page, this can
     // happen when too many consecutive requests have been made from the same
 
     // Stop here in case Instagram redirected to the login page, this can
     // happen when too many consecutive requests have been made from the same