~tsileo/microblog.pub

be0f5c04b22388681f864c76a7875b99249e36bb — Thomas Sileo 8 months ago 08cdcd6
Dedup inline attachments (when already inlined)
2 files changed, 25 insertions(+), 1 deletions(-)

M templates/utils.html
M utils/template_filters.py
M templates/utils.html => templates/utils.html +1 -1
@@ 245,7 245,7 @@
	<h3 class="l">Attachments</h3>
	<ul style="padding:0;list-style-type: none;">
	{% endif %}
	{% for a in obj.attachment %}
	{% for a in (obj | iter_note_attachments) %}
    {% if (a.mediaType and a.mediaType.startswith("image/")) or (a.type and a.type == 'Image') %}
    <a href="{{ a.url | get_attachment_url(None) }}">
        <img src="{{a.url | get_attachment_url(720) }}" title="{{ a.name }}" alt="{{ a.name }}" class="img-attachment"></a>

M utils/template_filters.py => utils/template_filters.py +24 -0
@@ 2,6 2,7 @@ import logging
import urllib
from datetime import datetime
from datetime import timezone
from functools import lru_cache
from urllib.parse import urlparse

import bleach


@@ 345,6 346,7 @@ def get_attachment_url(url, size):


@filters.app_template_filter()
@lru_cache(maxsize=256)
def update_inline_imgs(content):
    soup = BeautifulSoup(content, "html5lib")
    imgs = soup.find_all("img")


@@ 418,6 420,28 @@ def has_actor_type(doc):
    return False


@lru_cache(maxsize=256)
def _get_inlined_imgs(content):
    imgs = []
    if not content:
        return imgs

    soup = BeautifulSoup(content, "html5lib")
    for img in soup.find_all("img"):
        src = img.attrs.get("src")
        if src:
            imgs.append(src)

    return imgs


@filters.app_template_filter()
def iter_note_attachments(note):
    attachments = note.get("attachment", [])
    imgs = _get_inlined_imgs(note.get("content"))
    return [a for a in attachments if a.get("url") not in imgs]


@filters.app_template_filter()
def not_only_imgs(attachment):
    for a in attachment: