dithered images

still needs to be integrated with celery, but works for now
This commit is contained in:
2024-02-21 17:46:31 +01:00
parent 81a60804b1
commit 10703beaca
5 changed files with 27 additions and 4 deletions
+1 -1
View File
@@ -10,4 +10,4 @@ class Album(models.Model):
album_type = models.CharField(max_length=255) album_type = models.CharField(max_length=255)
total_tracks = models.PositiveSmallIntegerField(null=True) total_tracks = models.PositiveSmallIntegerField(null=True)
image = models.ImageField(upload_to="albums/") image = models.ImageField(upload_to="albums/")
image_url = models.URLField(null=True) image_url = models.URLField(null=True)
+1 -1
View File
@@ -154,7 +154,7 @@ iframe {
font-weight: normal; font-weight: normal;
} }
#album img { #album img {
max-width: 256px; width: 256px;
} }
input[type="range"] { input[type="range"] {
+19
View File
@@ -1,5 +1,8 @@
from celery import shared_task from celery import shared_task
from .models import Track from .models import Track
from django.core.files import File
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.core.files.base import ContentFile
import os import os
import dotenv import dotenv
@@ -7,6 +10,8 @@ import dotenv
import json import json
from requests import get, post from requests import get, post
from requests.exceptions import ConnectionError from requests.exceptions import ConnectionError
from PIL import Image
from io import BytesIO
dotenv.load_dotenv() dotenv.load_dotenv()
@@ -52,3 +57,17 @@ def get_banter(id):
track.banter_done = True track.banter_done = True
track.save() track.save()
return f"{track}: {e}" return f"{track}: {e}"
@shared_task
def get_and_dither_image(url, instance, attribute):
"""Expects a url, and a Django model cls with an ImageField attribute"""
print(f"Parsing {url} for {instance} with attribute {attribute}")
r = get(url)
print(r.content)
i = Image.open(BytesIO(r.content))
i = i.resize(size=(128, 128)).convert("P").quantize(colors=32)
buffer = BytesIO()
i.save(fp=buffer, format='PNG')
file = InMemoryUploadedFile(ContentFile(buffer.getvalue()), None, instance.name + ".png", "image/png", buffer.tell, "utf-8")
instance.image = file
instance.save()
+3 -1
View File
@@ -10,7 +10,9 @@ Stemmen
{% if error %}<div class="error">{{ error }}</div>{% endif %} {% if error %}<div class="error">{{ error }}</div>{% endif %}
<div id="embed"></div> <div id="embed"></div>
<div id="album"> <div id="album">
{% if track.album.image_url %} {% if track.album.image %}
<img src="{{track.album.image.url}}" />
{% elif track.album.image_url %}
<img src="{{track.album.image_url}}" /> <img src="{{track.album.image_url}}" />
{% else %} {% else %}
<img src="https://kagi.com/proxy/windows-95-logo-png-1.png?c=xjdP8sWN58YWflc6NcGN5ZvzREJyOwtrou-TSsaXxcx37J0VVJbSeycOcAptMJEUpzzvqmbKQ3JRuSmPN8HCK43OxjkRe_cQvncxVzlCblc%3D" /> <img src="https://kagi.com/proxy/windows-95-logo-png-1.png?c=xjdP8sWN58YWflc6NcGN5ZvzREJyOwtrou-TSsaXxcx37J0VVJbSeycOcAptMJEUpzzvqmbKQ3JRuSmPN8HCK43OxjkRe_cQvncxVzlCblc%3D" />
+3 -1
View File
@@ -7,7 +7,7 @@ import re
from .models import Track, Artist, Album, Vote, Background, Profile from .models import Track, Artist, Album, Vote, Background, Profile
from .utils import from_json, get_unvoted from .utils import from_json, get_unvoted
from . import spotify from . import spotify
from .tasks import get_banter from .tasks import get_banter, get_and_dither_image
spt = spotify.Spotify() spt = spotify.Spotify()
@@ -22,6 +22,8 @@ class AuthView(View):
class VoteView(LoginRequiredMixin, View): class VoteView(LoginRequiredMixin, View):
def get(self, request, error=None): def get(self, request, error=None):
track = get_unvoted(request.user) track = get_unvoted(request.user)
if not track.album.image:
get_and_dither_image(track.album.image_url, track.album, "image")
return TemplateResponse(request, "Vote.html", {"track": track, "error": error}) return TemplateResponse(request, "Vote.html", {"track": track, "error": error})
def post(self, request): def post(self, request):
try: try: