mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 06:53:25 +00:00
youtube: Request medium-quality preview images.
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
import assert from "minimalistic-assert";
|
||||||
|
|
||||||
import {$t} from "./i18n.ts";
|
import {$t} from "./i18n.ts";
|
||||||
import * as thumbnail from "./thumbnail.ts";
|
import * as thumbnail from "./thumbnail.ts";
|
||||||
import {user_settings} from "./user_settings.ts";
|
import {user_settings} from "./user_settings.ts";
|
||||||
@@ -52,6 +54,18 @@ export function postprocess_content(html: string): string {
|
|||||||
elt.removeAttribute("target");
|
elt.removeAttribute("target");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update older, smaller default.jpg YouTube preview images
|
||||||
|
// with higher-quality preview images (320px wide)
|
||||||
|
if (elt.parentElement?.classList.contains("youtube-video")) {
|
||||||
|
const img = elt.querySelector("img");
|
||||||
|
assert(img instanceof HTMLImageElement);
|
||||||
|
const img_src = img.src;
|
||||||
|
if (img_src.endsWith("/default.jpg")) {
|
||||||
|
const mq_src = img_src.replace(/\/default.jpg$/, "/mqdefault.jpg");
|
||||||
|
img.src = mq_src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (elt.parentElement?.classList.contains("message_inline_image")) {
|
if (elt.parentElement?.classList.contains("message_inline_image")) {
|
||||||
// For inline images we want to handle the tooltips explicitly, and disable
|
// For inline images we want to handle the tooltips explicitly, and disable
|
||||||
// the browser's built in handling of the title attribute.
|
// the browser's built in handling of the title attribute.
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ const dom = new JSDOM("", {url: "http://zulip.zulipdev.com/"});
|
|||||||
global.DOMParser = dom.window.DOMParser;
|
global.DOMParser = dom.window.DOMParser;
|
||||||
global.HTMLAnchorElement = dom.window.HTMLAnchorElement;
|
global.HTMLAnchorElement = dom.window.HTMLAnchorElement;
|
||||||
global.HTMLElement = dom.window.HTMLElement;
|
global.HTMLElement = dom.window.HTMLElement;
|
||||||
|
global.HTMLImageElement = dom.window.HTMLImageElement;
|
||||||
global.Window = dom.window.Window;
|
global.Window = dom.window.Window;
|
||||||
Object.defineProperty(global, "navigator", {
|
Object.defineProperty(global, "navigator", {
|
||||||
value: {
|
value: {
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ run_test("postprocess_content", () => {
|
|||||||
'<div class="message_inline_image">' +
|
'<div class="message_inline_image">' +
|
||||||
'<a href="http://zulip.zulipdev.com/user_uploads/w/ha/tever/inline.png" title="inline image">upload</a> ' +
|
'<a href="http://zulip.zulipdev.com/user_uploads/w/ha/tever/inline.png" title="inline image">upload</a> ' +
|
||||||
'<a role="button">button</a> ' +
|
'<a role="button">button</a> ' +
|
||||||
|
"</div>" +
|
||||||
|
'<div class="youtube-video message_inline_image">' +
|
||||||
|
'<a class="" href="https://www.youtube.com/watch?v=tyKJueEk0XM">' +
|
||||||
|
'<img src="https://i.ytimg.com/vi/tyKJueEk0XM/default.jpg">' +
|
||||||
|
"</a>" +
|
||||||
"</div>",
|
"</div>",
|
||||||
),
|
),
|
||||||
'<a href="http://example.com" target="_blank" rel="noopener noreferrer" title="http://example.com/">good</a> ' +
|
'<a href="http://example.com" target="_blank" rel="noopener noreferrer" title="http://example.com/">good</a> ' +
|
||||||
@@ -34,6 +39,11 @@ run_test("postprocess_content", () => {
|
|||||||
'<div class="message_inline_image">' +
|
'<div class="message_inline_image">' +
|
||||||
'<a href="http://zulip.zulipdev.com/user_uploads/w/ha/tever/inline.png" target="_blank" rel="noopener noreferrer" aria-label="inline image">upload</a> ' +
|
'<a href="http://zulip.zulipdev.com/user_uploads/w/ha/tever/inline.png" target="_blank" rel="noopener noreferrer" aria-label="inline image">upload</a> ' +
|
||||||
'<a role="button">button</a> ' +
|
'<a role="button">button</a> ' +
|
||||||
|
"</div>" +
|
||||||
|
'<div class="youtube-video message_inline_image">' +
|
||||||
|
'<a class="" href="https://www.youtube.com/watch?v=tyKJueEk0XM" target="_blank" rel="noopener noreferrer">' +
|
||||||
|
'<img src="https://i.ytimg.com/vi/tyKJueEk0XM/mqdefault.jpg" loading="lazy">' +
|
||||||
|
"</a>" +
|
||||||
"</div>",
|
"</div>",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -879,7 +879,7 @@ class InlineInterestingLinkProcessor(markdown.treeprocessors.Treeprocessor):
|
|||||||
yt_id = self.youtube_id(url)
|
yt_id = self.youtube_id(url)
|
||||||
|
|
||||||
if yt_id is not None:
|
if yt_id is not None:
|
||||||
return f"https://i.ytimg.com/vi/{yt_id}/default.jpg"
|
return f"https://i.ytimg.com/vi/{yt_id}/mqdefault.jpg"
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def vimeo_id(self, url: str) -> str | None:
|
def vimeo_id(self, url: str) -> str | None:
|
||||||
|
|||||||
@@ -994,7 +994,7 @@ class PreviewTestCase(ZulipTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
msg.refresh_from_db()
|
msg.refresh_from_db()
|
||||||
expected_content = f"""<p><a href="https://www.youtube.com/watch?v=eSJTXC7Ixgg">YouTube - Clearer Code at Scale - Static Types at Zulip and Dropbox</a></p>\n<div class="youtube-video message_inline_image"><a data-id="eSJTXC7Ixgg" href="https://www.youtube.com/watch?v=eSJTXC7Ixgg"><img src="{get_camo_url("https://i.ytimg.com/vi/eSJTXC7Ixgg/default.jpg")}"></a></div>"""
|
expected_content = f"""<p><a href="https://www.youtube.com/watch?v=eSJTXC7Ixgg">YouTube - Clearer Code at Scale - Static Types at Zulip and Dropbox</a></p>\n<div class="youtube-video message_inline_image"><a data-id="eSJTXC7Ixgg" href="https://www.youtube.com/watch?v=eSJTXC7Ixgg"><img src="{get_camo_url("https://i.ytimg.com/vi/eSJTXC7Ixgg/mqdefault.jpg")}"></a></div>"""
|
||||||
self.assertEqual(expected_content, msg.rendered_content)
|
self.assertEqual(expected_content, msg.rendered_content)
|
||||||
|
|
||||||
@responses.activate
|
@responses.activate
|
||||||
@@ -1034,5 +1034,5 @@ class PreviewTestCase(ZulipTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
msg.refresh_from_db()
|
msg.refresh_from_db()
|
||||||
expected_content = f"""<p><a href="https://www.youtube.com/watch?v=eSJTXC7Ixgg">YouTube link</a></p>\n<div class="youtube-video message_inline_image"><a data-id="eSJTXC7Ixgg" href="https://www.youtube.com/watch?v=eSJTXC7Ixgg"><img src="{get_camo_url("https://i.ytimg.com/vi/eSJTXC7Ixgg/default.jpg")}"></a></div>"""
|
expected_content = f"""<p><a href="https://www.youtube.com/watch?v=eSJTXC7Ixgg">YouTube link</a></p>\n<div class="youtube-video message_inline_image"><a data-id="eSJTXC7Ixgg" href="https://www.youtube.com/watch?v=eSJTXC7Ixgg"><img src="{get_camo_url("https://i.ytimg.com/vi/eSJTXC7Ixgg/mqdefault.jpg")}"></a></div>"""
|
||||||
self.assertEqual(expected_content, msg.rendered_content)
|
self.assertEqual(expected_content, msg.rendered_content)
|
||||||
|
|||||||
@@ -735,7 +735,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p>Check out the debate: <a href="http://www.youtube.com/watch?v=hx1mjT73xYE">http://www.youtube.com/watch?v=hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="http://www.youtube.com/watch?v=hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/default.jpg")}"></a></div>""",
|
f"""<p>Check out the debate: <a href="http://www.youtube.com/watch?v=hx1mjT73xYE">http://www.youtube.com/watch?v=hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="http://www.youtube.com/watch?v=hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = "http://www.youtube.com/watch?v=hx1mjT73xYE"
|
msg = "http://www.youtube.com/watch?v=hx1mjT73xYE"
|
||||||
@@ -743,7 +743,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="http://www.youtube.com/watch?v=hx1mjT73xYE">http://www.youtube.com/watch?v=hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="http://www.youtube.com/watch?v=hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/default.jpg")}"></a></div>""",
|
f"""<p><a href="http://www.youtube.com/watch?v=hx1mjT73xYE">http://www.youtube.com/watch?v=hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="http://www.youtube.com/watch?v=hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = "https://youtu.be/hx1mjT73xYE"
|
msg = "https://youtu.be/hx1mjT73xYE"
|
||||||
@@ -751,7 +751,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="https://youtu.be/hx1mjT73xYE">https://youtu.be/hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="https://youtu.be/hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/default.jpg")}"></a></div>""",
|
f"""<p><a href="https://youtu.be/hx1mjT73xYE">https://youtu.be/hx1mjT73xYE</a></p>\n<div class="youtube-video message_inline_image"><a data-id="hx1mjT73xYE" href="https://youtu.be/hx1mjT73xYE"><img src="{get_camo_url("https://i.ytimg.com/vi/hx1mjT73xYE/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = "https://www.youtube.com/playlist?list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo"
|
msg = "https://www.youtube.com/playlist?list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo"
|
||||||
@@ -767,7 +767,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo">https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo</a></p>\n<div class="youtube-video message_inline_image"><a data-id="O5nskjZ_GoI" href="https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo"><img src="{get_camo_url("https://i.ytimg.com/vi/O5nskjZ_GoI/default.jpg")}"></a></div>""",
|
f"""<p><a href="https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo">https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo</a></p>\n<div class="youtube-video message_inline_image"><a data-id="O5nskjZ_GoI" href="https://www.youtube.com/watch?v=O5nskjZ_GoI&list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo"><img src="{get_camo_url("https://i.ytimg.com/vi/O5nskjZ_GoI/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = "http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw"
|
msg = "http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw"
|
||||||
@@ -775,7 +775,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw">http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw</a></p>\n<div class="youtube-video message_inline_image"><a data-id="nOJgD4fcZhI" href="http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw"><img src="{get_camo_url("https://i.ytimg.com/vi/nOJgD4fcZhI/default.jpg")}"></a></div>""",
|
f"""<p><a href="http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw">http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw</a></p>\n<div class="youtube-video message_inline_image"><a data-id="nOJgD4fcZhI" href="http://www.youtube.com/watch_videos?video_ids=nOJgD4fcZhI,i96UO8-GFvw"><img src="{get_camo_url("https://i.ytimg.com/vi/nOJgD4fcZhI/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_inline_image_preview(self) -> None:
|
def test_inline_image_preview(self) -> None:
|
||||||
@@ -1135,7 +1135,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<div class="spoiler-block"><div class="spoiler-header">\n<p>Check out this PyCon video</p>\n</div><div class="spoiler-content" aria-hidden="true">\n<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/default.jpg")}"></a></div></div></div>""",
|
f"""<div class="spoiler-block"><div class="spoiler-header">\n<p>Check out this PyCon video</p>\n</div><div class="spoiler-content" aria-hidden="true">\n<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/mqdefault.jpg")}"></a></div></div></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test YouTube URLs in normal messages.
|
# Test YouTube URLs in normal messages.
|
||||||
@@ -1144,7 +1144,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">YouTube link</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/default.jpg")}"></a></div>""",
|
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">YouTube link</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
msg = "https://www.youtube.com/watch?v=0c46YHS3RY8\n\nSample text\n\nhttps://www.youtube.com/watch?v=lXFO2ULktEI"
|
msg = "https://www.youtube.com/watch?v=0c46YHS3RY8\n\nSample text\n\nhttps://www.youtube.com/watch?v=lXFO2ULktEI"
|
||||||
@@ -1152,7 +1152,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/default.jpg")}"></a></div><p>Sample text</p>\n<p><a href="https://www.youtube.com/watch?v=lXFO2ULktEI">https://www.youtube.com/watch?v=lXFO2ULktEI</a></p>\n<div class="youtube-video message_inline_image"><a data-id="lXFO2ULktEI" href="https://www.youtube.com/watch?v=lXFO2ULktEI"><img src="{get_camo_url("https://i.ytimg.com/vi/lXFO2ULktEI/default.jpg")}"></a></div>""",
|
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/mqdefault.jpg")}"></a></div><p>Sample text</p>\n<p><a href="https://www.youtube.com/watch?v=lXFO2ULktEI">https://www.youtube.com/watch?v=lXFO2ULktEI</a></p>\n<div class="youtube-video message_inline_image"><a data-id="lXFO2ULktEI" href="https://www.youtube.com/watch?v=lXFO2ULktEI"><img src="{get_camo_url("https://i.ytimg.com/vi/lXFO2ULktEI/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test order of YouTube inline previews in same paragraph.
|
# Test order of YouTube inline previews in same paragraph.
|
||||||
@@ -1160,7 +1160,7 @@ class MarkdownEmbedsTest(ZulipTestCase):
|
|||||||
converted = markdown_convert_wrapper(msg)
|
converted = markdown_convert_wrapper(msg)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
converted,
|
converted,
|
||||||
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a><br>\n<a href="https://www.youtube.com/watch?v=lXFO2ULktEI">https://www.youtube.com/watch?v=lXFO2ULktEI</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/default.jpg")}"></a></div><div class="youtube-video message_inline_image"><a data-id="lXFO2ULktEI" href="https://www.youtube.com/watch?v=lXFO2ULktEI"><img src="{get_camo_url("https://i.ytimg.com/vi/lXFO2ULktEI/default.jpg")}"></a></div>""",
|
f"""<p><a href="https://www.youtube.com/watch?v=0c46YHS3RY8">https://www.youtube.com/watch?v=0c46YHS3RY8</a><br>\n<a href="https://www.youtube.com/watch?v=lXFO2ULktEI">https://www.youtube.com/watch?v=lXFO2ULktEI</a></p>\n<div class="youtube-video message_inline_image"><a data-id="0c46YHS3RY8" href="https://www.youtube.com/watch?v=0c46YHS3RY8"><img src="{get_camo_url("https://i.ytimg.com/vi/0c46YHS3RY8/mqdefault.jpg")}"></a></div><div class="youtube-video message_inline_image"><a data-id="lXFO2ULktEI" href="https://www.youtube.com/watch?v=lXFO2ULktEI"><img src="{get_camo_url("https://i.ytimg.com/vi/lXFO2ULktEI/mqdefault.jpg")}"></a></div>""",
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_twitter_id_extraction(self) -> None:
|
def test_twitter_id_extraction(self) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user