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
@@ -154,7 +154,7 @@ iframe {
font-weight: normal;
}
#album img {
max-width: 256px;
width: 256px;
}
input[type="range"] {
+19
View File
@@ -1,5 +1,8 @@
from celery import shared_task
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 dotenv
@@ -7,6 +10,8 @@ import dotenv
import json
from requests import get, post
from requests.exceptions import ConnectionError
from PIL import Image
from io import BytesIO
dotenv.load_dotenv()
@@ -52,3 +57,17 @@ def get_banter(id):
track.banter_done = True
track.save()
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 %}
<div id="embed"></div>
<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}}" />
{% else %}
<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 .utils import from_json, get_unvoted
from . import spotify
from .tasks import get_banter
from .tasks import get_banter, get_and_dither_image
spt = spotify.Spotify()
@@ -22,6 +22,8 @@ class AuthView(View):
class VoteView(LoginRequiredMixin, View):
def get(self, request, error=None):
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})
def post(self, request):
try: