zulip/zerver/lib/url_preview/parsers/open_graph.py

34 lines
999 B
Python

from urllib.parse import urlparse
from zerver.lib.url_preview.types import UrlEmbedData
from .base import BaseParser
class OpenGraphParser(BaseParser):
def extract_data(self) -> UrlEmbedData:
meta = self._soup.findAll("meta")
data = UrlEmbedData()
for tag in meta:
if not tag.has_attr("property"):
continue
if not tag.has_attr("content"):
continue
if tag["property"] == "og:title":
data.title = tag["content"]
elif tag["property"] == "og:description":
data.description = tag["content"]
elif tag["property"] == "og:image":
try:
# We use urlparse and not URLValidator because we
# need to support relative URLs.
urlparse(tag["content"])
except ValueError:
continue
data.image = tag["content"]
return data