dithered images
still needs to be integrated with celery, but works for now
This commit is contained in:
@@ -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)
|
||||||
@@ -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"] {
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user