Skip to content

Commit f00cc1d

Browse files
authored
Merge pull request #1164 from thunderstore-io/improve-thumbnail-handling
Improve thumbnail handling(TS-2541)
2 parents 71512ba + abb8f22 commit f00cc1d

File tree

17 files changed

+256
-19
lines changed

17 files changed

+256
-19
lines changed

django/thunderstore/community/templates/community/community_list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% extends 'base.html' %}
22
{% load cache %}
3-
{% load thumbnail %}
3+
{% load cached_thumbnail %}
44

55
{% block title %}All communities{% endblock %}
66

@@ -18,7 +18,7 @@ <h3 class="col-12 mt-4">All communities</h3>
1818
<div class="p-0 bg-light">
1919
<a href="{{ object.full_url }}">
2020
{% if object.cover_image %}
21-
<img class="w-100" src="{% thumbnail object.cover_image 360x480 crop %}" alt="{{ object.name }} icon">
21+
<img class="w-100" src="{% thumbnail_url object.cover_image 360 480 %}" alt="{{ object.name }} icon">
2222
{% else %}
2323
<img class="w-100" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAHgAQMAAACyyGUjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAADUExURSMfNp+RXmQAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAtSURBVHja7cExAQAAAMKg9U9tDQ8gAAAAAAAAAAAAAAAAAAAAAAAAAAAADtUAVkAAAQ2c1aEAAAAASUVORK5CYII=" alt="{{ object.name }} icon">
2424
{% endif %}

django/thunderstore/community/templates/community/includes/package_header.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
{% load thumbnail %}
1+
{% load cached_thumbnail %}
22

33
<div class="card-header">
44
<div class="media">
5-
<img class="align-self-center mr-3" src="{% thumbnail object.package.icon 128x128 %}" alt="{{ object.package }} icon">
5+
<img class="align-self-center mr-3" src="{% thumbnail_url object.package.icon 128 128 %}" alt="{{ object.package }} icon">
66
<div class="media-body">
77
<h1 class="mt-0">{{ object.package.display_name }}</h1>
88
<p>{{ object.package.description }}</p>

django/thunderstore/community/templates/community/packagelisting_changelog.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% extends 'base.html' %}
2-
{% load thumbnail %}
2+
{% load cached_thumbnail %}
33
{% load markdownify %}
44
{% load cache_until %}
55
{% load community_url %}
@@ -11,7 +11,7 @@
1111
<meta property="og:title" content="{{ object.package.display_name }} changelog" />
1212
<meta property="og:type" content="website" />
1313
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
14-
<meta property="og:image" content="{% thumbnail object.package.icon 256x256 %}" />
14+
<meta property="og:image" content="{% thumbnail_url object.package.icon 256 256 %}" />
1515
<meta property="og:image:width" content="256" />
1616
<meta property="og:image:height" content="256" />
1717

django/thunderstore/community/templates/community/packagelisting_detail.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% extends 'base.html' %}
2-
{% load thumbnail %}
2+
{% load cached_thumbnail %}
33
{% load arrow %}
44
{% load markdownify %}
55
{% load cache_until %}
@@ -13,7 +13,7 @@
1313
<meta property="og:title" content="{{ object.package.display_name }} v{{ object.package.version_number }}" />
1414
<meta property="og:type" content="website" />
1515
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
16-
<meta property="og:image" content="{% thumbnail object.package.icon 256x256 %}" />
16+
<meta property="og:image" content="{% thumbnail_url object.package.icon 256 256 %}" />
1717
<meta property="og:image:width" content="256" />
1818
<meta property="og:image:height" content="256" />
1919

django/thunderstore/community/templates/community/packagelisting_list.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% extends 'base.html' %}
2-
{% load thumbnail %}
2+
{% load cached_thumbnail %}
33
{% load arrow %}
44
{% load cache_until %}
55
{% load qurl %}
@@ -160,7 +160,7 @@ <h3 class="col-12 mt-4">{{ page_title }}</h3>
160160
</div>
161161
{% endif %}
162162
<a href="{{ object.get_full_url }}">
163-
<img class="w-100" src="{% thumbnail object.package.icon 256x256 crop %}" alt="{{ object.package }} icon">
163+
<img class="w-100" src="{% thumbnail_url object.package.icon 256 256 %}" alt="{{ object.package }} icon">
164164
</a>
165165
</div>
166166
<div class="bg-light p-2">

django/thunderstore/community/templates/community/packagelisting_versions.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% extends 'base.html' %}
2-
{% load thumbnail %}
2+
{% load cached_thumbnail %}
33
{% load cache_until %}
44
{% load community_url %}
55

@@ -10,7 +10,7 @@
1010
<meta property="og:title" content="{{ object.package.display_name }} version history" />
1111
<meta property="og:type" content="website" />
1212
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
13-
<meta property="og:image" content="{% thumbnail object.package.icon 256x256 %}" />
13+
<meta property="og:image" content="{% thumbnail_url object.package.icon 256 256 %}" />
1414
<meta property="og:image:width" content="256" />
1515
<meta property="og:image:height" content="256" />
1616

django/thunderstore/core/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from thunderstore.frontend.views import (
1313
ManifestV1ValidatorView,
1414
MarkdownPreviewView,
15+
ThumbnailServeView,
1516
ads_txt_view,
1617
robots_txt_view,
1718
)
@@ -56,6 +57,11 @@
5657
name="tools.manifest-v1-validator",
5758
),
5859
path("legal/", include((legal_urls, "contracts"), namespace="contracts")),
60+
path(
61+
"thumbnail-serve/<path:path>/",
62+
ThumbnailServeView.as_view(),
63+
name="cdn_thumb_serve",
64+
),
5965
]
6066

6167
schema_view = get_schema_view(

django/thunderstore/frontend/services/__init__.py

Whitespace-only changes.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from dataclasses import dataclass
2+
from typing import Optional
3+
4+
from django.conf import settings
5+
from easy_thumbnails.files import get_thumbnailer
6+
7+
from thunderstore.core.utils import capture_exception
8+
9+
10+
@dataclass
11+
class Thumbnail:
12+
storage_path: Optional[str] = None
13+
url: Optional[str] = None
14+
15+
16+
def get_or_create_thumbnail(
17+
asset_path: str, width: int, height: int
18+
) -> Optional[Thumbnail]:
19+
try:
20+
thumbnailer = get_thumbnailer(asset_path)
21+
22+
thumbnail_options = {
23+
"size": (width, height),
24+
"crop": True,
25+
"quality": settings.THUMBNAIL_QUALITY,
26+
}
27+
28+
thumbnail_name = thumbnailer.get_thumbnail_name(thumbnail_options)
29+
if thumbnailer.source_storage.exists(thumbnail_name):
30+
url = thumbnailer.source_storage.url(thumbnail_name)
31+
return Thumbnail(storage_path=thumbnail_name, url=url)
32+
else:
33+
thumbnail = thumbnailer.get_thumbnail(thumbnail_options, generate=True)
34+
return Thumbnail(storage_path=thumbnail.name, url=thumbnail.url)
35+
except Exception as e:
36+
capture_exception(e)
37+
return None
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from django import template
2+
from django.urls import reverse
3+
4+
register = template.Library()
5+
6+
7+
@register.simple_tag
8+
def thumbnail_url(image_field, width: int, height: int) -> str:
9+
if not image_field:
10+
return ""
11+
12+
url = (
13+
reverse("cdn_thumb_serve", kwargs={"path": image_field.name})
14+
+ f"?width={width}&height={height}"
15+
)
16+
17+
return url

0 commit comments

Comments
 (0)