snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
52
zerver/lib/url_preview/oembed.py
Normal file
52
zerver/lib/url_preview/oembed.py
Normal file
@@ -0,0 +1,52 @@
|
||||
import json
|
||||
|
||||
import requests
|
||||
from pyoembed import PyOembedException, oEmbed
|
||||
|
||||
from zerver.lib.url_preview.types import UrlEmbedData, UrlOEmbedData
|
||||
|
||||
|
||||
def get_oembed_data(url: str, maxwidth: int = 640, maxheight: int = 480) -> UrlEmbedData | None:
|
||||
# pyoembed makes its requests directly, not through OutgoingSession,
|
||||
# but they still go through Smokescreen: requests lib honors the
|
||||
# HTTP_proxy/HTTPS_proxy variables we set in every process's environment.
|
||||
try:
|
||||
data = oEmbed(url, maxwidth=maxwidth, maxheight=maxheight)
|
||||
except (PyOembedException, json.decoder.JSONDecodeError, requests.exceptions.ConnectionError):
|
||||
return None
|
||||
|
||||
oembed_resource_type = data.get("type", "")
|
||||
image = data.get("url", data.get("image"))
|
||||
thumbnail = data.get("thumbnail_url")
|
||||
html = data.get("html", "")
|
||||
if oembed_resource_type == "photo" and image:
|
||||
return UrlOEmbedData(
|
||||
image=image,
|
||||
type="photo",
|
||||
title=data.get("title"),
|
||||
description=data.get("description"),
|
||||
)
|
||||
|
||||
if oembed_resource_type == "video" and html and thumbnail:
|
||||
return UrlOEmbedData(
|
||||
image=thumbnail,
|
||||
type="video",
|
||||
html=strip_cdata(html),
|
||||
title=data.get("title"),
|
||||
description=data.get("description"),
|
||||
)
|
||||
|
||||
# Otherwise, use the title/description from pyembed as the basis
|
||||
# for our other parsers
|
||||
return UrlEmbedData(
|
||||
title=data.get("title"),
|
||||
description=data.get("description"),
|
||||
)
|
||||
|
||||
|
||||
def strip_cdata(html: str) -> str:
|
||||
# Work around a bug in SoundCloud's XML generation:
|
||||
# <html><![CDATA[<iframe ...></iframe>]]></html>
|
||||
if html.startswith("<![CDATA[") and html.endswith("]]>"):
|
||||
html = html[9:-3]
|
||||
return html
|
||||
Reference in New Issue
Block a user