]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Oembed/OembedPlugin.php
Oembed bugs with thumbnail generation.
[quix0rs-gnu-social.git] / plugins / Oembed / OembedPlugin.php
index 361e4b54b863fc9bf68d264c4fbd6f1cbdabd507..6950fb0a9a453e06abb3ed07e110c47cc23d9d26 100644 (file)
@@ -73,18 +73,20 @@ class OembedPlugin extends Plugin
             $metadata = OpenGraphHelper::ogFromHtml($dom);
         }
 
-        // sometimes sites serve the path, not the full URL, for images
-        // let's "be liberal in what you accept from others"!
-        // add protocol and host if the thumbnail_url starts with /
-        if(substr($metadata->thumbnail_url,0,1) == '/') {
-            $thumbnail_url_parsed = parse_url($metadata->url);
-            $metadata->thumbnail_url = $thumbnail_url_parsed['scheme']."://".$thumbnail_url_parsed['host'].$metadata->thumbnail_url;
-        } 
+        if (isset($metadata->thumbnail_url)) {
+            // sometimes sites serve the path, not the full URL, for images
+            // let's "be liberal in what you accept from others"!
+            // add protocol and host if the thumbnail_url starts with /
+            if(substr($metadata->thumbnail_url,0,1) == '/') {
+                $thumbnail_url_parsed = parse_url($metadata->url);
+                $metadata->thumbnail_url = $thumbnail_url_parsed['scheme']."://".$thumbnail_url_parsed['host'].$metadata->thumbnail_url;
+            }
         
-        // some wordpress opengraph implementations sometimes return a white blank image
-        // no need for us to save that!
-        if($metadata->thumbnail_url == 'https://s0.wp.com/i/blank.jpg') {
-            unset($metadata->thumbnail_url);
+            // some wordpress opengraph implementations sometimes return a white blank image
+            // no need for us to save that!
+            if($metadata->thumbnail_url == 'https://s0.wp.com/i/blank.jpg') {
+                unset($metadata->thumbnail_url);
+            }
         }
 
     }
@@ -141,6 +143,11 @@ class OembedPlugin extends Plugin
         return true;
     }
 
+    public function onEndShowStylesheets(Action $action) {
+        $action->cssLink($this->path('css/oembed.css'));
+        return true;
+    }
+
     /**
      * Save embedding information for a File, if applicable.
      *
@@ -222,6 +229,70 @@ class OembedPlugin extends Plugin
         }
         return true;
     }
+
+    public function onStartShowAttachmentRepresentation(HTMLOutputter $out, File $file)
+    {
+        try {
+            $oembed = File_oembed::getByFile($file);
+        } catch (NoResultException $e) {
+            return true;
+        }
+
+        // Show thumbnail as usual if it's a photo.
+        if ($oembed->type === 'photo') {
+            return true;
+        }
+
+        $out->elementStart('article', ['class'=>'h-entry oembed']);
+        $out->elementStart('header');
+        try  {
+            $thumb = $file->getThumbnail(128, 128);
+            $out->element('img', $thumb->getHtmlAttrs(['class'=>'u-photo oembed']));
+            unset($thumb);
+        } catch (Exception $e) {
+            $out->element('div', ['class'=>'error'], $e->getMessage());
+        }
+        $out->elementStart('h5', ['class'=>'p-name oembed']);
+        $out->element('a', ['class'=>'u-url', 'href'=>$file->getUrl()], common_strip_html($oembed->title));
+        $out->elementEnd('h5');
+        $out->elementStart('div', ['class'=>'p-author oembed']);
+        if (!empty($oembed->author_name)) {
+            // TRANS: text before the author name of oEmbed attachment representation
+            // FIXME: The whole "By x from y" should be i18n because of different language constructions.
+            $out->text(_('By '));
+            $attrs = ['class'=>'h-card p-author'];
+            if (!empty($oembed->author_url)) {
+                $attrs['href'] = $oembed->author_url;
+                $tag = 'a';
+            } else {
+                $tag = 'span';
+            }
+            $out->element($tag, $attrs, $oembed->author_name);
+        }
+        if (!empty($oembed->provider)) {
+            // TRANS: text between the oEmbed author name and provider url
+            // FIXME: The whole "By x from y" should be i18n because of different language constructions.
+            $out->text(_(' from '));
+            $attrs = ['class'=>'h-card'];
+            if (!empty($oembed->provider_url)) {
+                $attrs['href'] = $oembed->provider_url;
+                $tag = 'a';
+            } else {
+                $tag = 'span';
+            }
+            $out->element($tag, $attrs, $oembed->provider);
+        }
+        $out->elementEnd('div');
+        $out->elementEnd('header');
+        $out->elementStart('div', ['class'=>'p-summary oembed']);
+        $out->raw(common_purify($oembed->html));
+        $out->elementEnd('div');
+        $out->elementStart('footer');
+        $out->elementEnd('footer');
+        $out->elementEnd('article');
+
+        return false;
+    }
     
     public function onShowUnsupportedAttachmentRepresentation(HTMLOutputter $out, File $file)
     {
@@ -267,7 +338,7 @@ class OembedPlugin extends Plugin
             // and File_thumbnail tables respectively. If not, we're not going to do anything.
             $file_oembed = File_oembed::getByFile($file);
             $thumbnail   = File_thumbnail::byFile($file);
-        } catch (Exception $e) {
+        } catch (NoResultException $e) {
             // Not Oembed data, or at least nothing we either can or want to use.
             return true;
         }
@@ -323,8 +394,10 @@ class OembedPlugin extends Plugin
             throw new UnsupportedMediaException(_('Image file had impossible geometry (0 width or height)'));
         }
 
+        $ext = File::guessMimeExtension($info['mime']);
+
         // We'll trust sha256 (File::FILEHASH_ALG) not to have collision issues any time soon :)
-        $filename = hash(File::FILEHASH_ALG, $imgData) . '.' . common_supported_mime_to_ext($info['mime']);
+        $filename = 'oembed-'.hash(File::FILEHASH_ALG, $imgData) . ".{$ext}";
         $fullpath = File_thumbnail::path($filename);
         // Write the file to disk. Throw Exception on failure
         if (!file_exists($fullpath) && file_put_contents($fullpath, $imgData) === false) {