angrybeanie_wagtail/env/lib/python3.12/site-packages/wagtail/embeds/finders/embedly.py

77 lines
2 KiB
Python
Raw Normal View History

2025-07-25 21:32:16 +10:00
from django.utils.html import format_html
from wagtail.embeds.exceptions import EmbedException, EmbedNotFoundException
from .base import EmbedFinder
class EmbedlyException(EmbedException):
pass
class AccessDeniedEmbedlyException(EmbedlyException):
pass
class EmbedlyFinder(EmbedFinder):
key = None
def __init__(self, key=None):
if key:
self.key = key
def get_key(self):
return self.key
def accept(self, url):
# We don't really know what embedly supports so accept everything
return True
def find_embed(self, url, max_width=None, key=None):
from embedly import Embedly
# Get embedly key
if key is None:
key = self.get_key()
# Get embedly client
client = Embedly(key=key)
# Call embedly
if max_width is not None:
oembed = client.oembed(url, maxwidth=max_width, better=False)
else:
oembed = client.oembed(url, better=False)
# Check for error
if oembed.get("error"):
if oembed["error_code"] in [401, 403]:
raise AccessDeniedEmbedlyException
elif oembed["error_code"] == 404:
raise EmbedNotFoundException
else:
raise EmbedlyException
# Convert photos into HTML
if oembed["type"] == "photo":
html = format_html('<img src="{}" alt="">', oembed["url"])
else:
html = oembed.get("html")
# Return embed as a dict
return {
"title": oembed["title"] if "title" in oembed else "",
"author_name": oembed["author_name"] if "author_name" in oembed else "",
"provider_name": oembed["provider_name"]
if "provider_name" in oembed
else "",
"type": oembed["type"],
"thumbnail_url": oembed.get("thumbnail_url"),
"width": oembed.get("width"),
"height": oembed.get("height"),
"html": html,
}
embed_finder_class = EmbedlyFinder