From c8cb785950d69ce20ffd7e096709e0142ba655e1 Mon Sep 17 00:00:00 2001 From: Puneeth Chaganti Date: Sun, 26 May 2019 09:57:01 +0530 Subject: [PATCH] url preview: Show inline images as previews for oEmbed photo pages. --- zerver/lib/bugdown/__init__.py | 16 +++++++++++++++ zerver/lib/url_preview/oembed/__init__.py | 6 ++++++ zerver/lib/url_preview/preview.py | 2 ++ zerver/tests/test_link_embed.py | 25 +++++++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/zerver/lib/bugdown/__init__.py b/zerver/lib/bugdown/__init__.py index c86b5fe81d..3f90735e9e 100644 --- a/zerver/lib/bugdown/__init__.py +++ b/zerver/lib/bugdown/__init__.py @@ -368,7 +368,23 @@ def add_a( desc_div = markdown.util.etree.SubElement(summary_div, "desc") desc_div.set("class", "message_inline_image_desc") +def add_oembed_data(root: Element, link: str, extracted_data: Dict[str, Any]) -> bool: + type_ = extracted_data.get('type', '') + title = extracted_data.get('title', link) + + if type_ == 'photo': + image = extracted_data.get('image') + if image: + add_a(root, image, link, title=title) + return True + + return False + def add_embed(root: Element, link: str, extracted_data: Dict[str, Any]) -> None: + oembed = extracted_data.get('oembed', False) + if oembed and add_oembed_data(root, link, extracted_data): + return + container = markdown.util.etree.SubElement(root, "div") container.set("class", "message_embed") diff --git a/zerver/lib/url_preview/oembed/__init__.py b/zerver/lib/url_preview/oembed/__init__.py index 1560a89ac5..961facb188 100644 --- a/zerver/lib/url_preview/oembed/__init__.py +++ b/zerver/lib/url_preview/oembed/__init__.py @@ -11,4 +11,10 @@ def get_oembed_data(url: str, return None data['image'] = data.get('thumbnail_url') + type_ = data.get('type', '') + image = data.get('url', data.get('image')) + if type_ == 'photo' and image: + # Add a key to identify oembed metadata as opposed to other metadata + data['oembed'] = True + return data diff --git a/zerver/lib/url_preview/preview.py b/zerver/lib/url_preview/preview.py index ec8b54ffa5..63dbee8b24 100644 --- a/zerver/lib/url_preview/preview.py +++ b/zerver/lib/url_preview/preview.py @@ -81,6 +81,8 @@ def get_link_embed_data(url: str, # 2. Open Graph # 3. Meta tags data = get_oembed_data(url, maxwidth=maxwidth, maxheight=maxheight) or {} + if data.get('oembed'): + return data response = requests.get(url, stream=True, headers=HEADERS, timeout=TIMEOUT) if response.ok: og_data = OpenGraphParser(response.text).extract_data() diff --git a/zerver/tests/test_link_embed.py b/zerver/tests/test_link_embed.py index 3f1538637b..d9ef63015c 100644 --- a/zerver/tests/test_link_embed.py +++ b/zerver/tests/test_link_embed.py @@ -59,6 +59,31 @@ class OembedTestCase(ZulipTestCase): assert data is not None # allow mypy to infer data is indexable self.assertEqual(data['title'], response_data['title']) + @mock.patch('pyoembed.requests.get') + def test_photo_provider(self, get: Any) -> None: + get.return_value = response = mock.Mock() + response.headers = {'content-type': 'application/json'} + response.ok = True + response_data = { + 'type': 'photo', + 'thumbnail_url': 'https://scontent.cdninstagram.com/t51.2885-15/n.jpg', + 'url': 'https://scontent.cdninstagram.com/t51.2885-15/n.jpg', + 'thumbnail_width': 640, + 'thumbnail_height': 426, + 'title': 'NASA', + 'html': '

test

', + 'version': '1.0', + 'width': 658, + 'height': 400} + response.text = ujson.dumps(response_data) + url = 'http://imgur.com/photo/158727223' + data = get_oembed_data(url) + self.assertIsInstance(data, dict) + self.assertIn('title', data) + assert data is not None # allow mypy to infer data is indexable + self.assertEqual(data['title'], response_data['title']) + self.assertTrue(data['oembed']) + @mock.patch('pyoembed.requests.get') def test_error_request(self, get: Any) -> None: get.return_value = response = mock.Mock()