Download and store user avatars locally if small
This commit is contained in:
parent
24a4fbe1f8
commit
2eb07a5f5f
|
@ -107,6 +107,10 @@ class Settings(BaseSettings):
|
||||||
#: is necessary for compatibility with Mastodon’s image proxy.
|
#: is necessary for compatibility with Mastodon’s image proxy.
|
||||||
MEDIA_MAX_IMAGE_FILESIZE_MB: int = 10
|
MEDIA_MAX_IMAGE_FILESIZE_MB: int = 10
|
||||||
|
|
||||||
|
#: Maximum filesize for Avatars. Remote avatars larger than this size will
|
||||||
|
#: not be fetched and served from media, but served through the image proxy.
|
||||||
|
AVATAR_MAX_IMAGE_FILESIZE_KB: int = 1000
|
||||||
|
|
||||||
#: Maximum filesize for Emoji. Attempting to upload Local Emoji larger than this size will be
|
#: Maximum filesize for Emoji. Attempting to upload Local Emoji larger than this size will be
|
||||||
#: blocked. Remote Emoji larger than this size will not be fetched and served from media, but
|
#: blocked. Remote Emoji larger than this size will not be fetched and served from media, but
|
||||||
#: served through the image proxy.
|
#: served through the image proxy.
|
||||||
|
|
|
@ -5,12 +5,14 @@ from urllib.parse import urlparse
|
||||||
import httpx
|
import httpx
|
||||||
import urlman
|
import urlman
|
||||||
from asgiref.sync import async_to_sync, sync_to_async
|
from asgiref.sync import async_to_sync, sync_to_async
|
||||||
|
from django.conf import settings
|
||||||
from django.db import IntegrityError, models
|
from django.db import IntegrityError, models
|
||||||
from django.template.defaultfilters import linebreaks_filter
|
from django.template.defaultfilters import linebreaks_filter
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.functional import lazy
|
from django.utils.functional import lazy
|
||||||
|
|
||||||
from core.exceptions import ActorMismatchError
|
from core.exceptions import ActorMismatchError
|
||||||
|
from core.files import get_remote_file
|
||||||
from core.html import sanitize_post, strip_html
|
from core.html import sanitize_post, strip_html
|
||||||
from core.ld import canonicalise, format_ld_date, get_list, media_type_from_filename
|
from core.ld import canonicalise, format_ld_date, get_list, media_type_from_filename
|
||||||
from core.models import Config
|
from core.models import Config
|
||||||
|
@ -42,6 +44,16 @@ class IdentityStates(StateGraph):
|
||||||
return cls.updated
|
return cls.updated
|
||||||
# Run the actor fetch and progress to updated if it succeeds
|
# Run the actor fetch and progress to updated if it succeeds
|
||||||
if await identity.fetch_actor():
|
if await identity.fetch_actor():
|
||||||
|
# Also stash their icon if we can
|
||||||
|
if identity.icon_uri:
|
||||||
|
file, mimetype = await get_remote_file(
|
||||||
|
identity.icon_uri,
|
||||||
|
timeout=settings.SETUP.REMOTE_TIMEOUT,
|
||||||
|
max_size=settings.SETUP.AVATAR_MAX_IMAGE_FILESIZE_KB * 1024,
|
||||||
|
)
|
||||||
|
if file:
|
||||||
|
identity.icon = file
|
||||||
|
await sync_to_async(identity.save)()
|
||||||
return cls.updated
|
return cls.updated
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
Loading…
Reference in New Issue