Добавил preview_image в Album, чтобы снизить размеры cover image #6

Merged
lovinervy merged 1 commits from dev/album-preview into main 2026-01-04 16:47:40 +05:00
3 changed files with 59 additions and 6 deletions
Showing only changes of commit 807af4ed75 - Show all commits

View File

@@ -0,0 +1,24 @@
# Generated by Django 6.0 on 2026-01-04 11:37
from django.db import migrations, models
def create_preview_image(apps, schema_editor):
Album = apps.get_model('music', 'Album')
for album in Album.objects.all():
album.save()
class Migration(migrations.Migration):
dependencies = [
('music', '0008_alter_track_file'),
]
operations = [
migrations.AddField(
model_name='album',
name='preview_image',
field=models.ImageField(blank=True, null=True, upload_to=''),
),
migrations.RunPython(create_preview_image, reverse_code=migrations.RunPython.noop),
]

View File

@@ -1,8 +1,10 @@
from django.db import models
from core.models import BaseModel
import os import os
import uuid import uuid
from io import BytesIO
from PIL import Image
from django.db import models
from core.models import BaseModel
def album_cover_upload_to(instance, filename): def album_cover_upload_to(instance, filename):
@@ -25,7 +27,9 @@ def track_upload_to(instance, filename):
class Artist(BaseModel): class Artist(BaseModel):
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
cover_image = models.ImageField(upload_to=artist_cover_upload_to, null=True, blank=True) cover_image = models.ImageField(
upload_to=artist_cover_upload_to, null=True, blank=True
)
def __str__(self): def __str__(self):
return f"{self.name}" return f"{self.name}"
@@ -37,10 +41,35 @@ class Album(BaseModel):
cover_image = models.ImageField( cover_image = models.ImageField(
upload_to=album_cover_upload_to, null=True, blank=True upload_to=album_cover_upload_to, null=True, blank=True
) )
preview_image = models.ImageField(null=True, blank=True)
def __str__(self): def __str__(self):
return f"{self.artist} - {self.name}" return f"{self.artist} - {self.name}"
def create_preview_image(self):
# Placeholder for preview image creation logic
img = Image.open(self.cover_image)
target_height = 256
target_width = int((target_height / img.height) * img.width)
img = img.resize((target_width, target_height), Image.LANCZOS)
buffer = BytesIO()
img.save(buffer, format="JPEG")
buffer.seek(0)
self.preview_image.save(
os.path.join("album_previews", f"{uuid.uuid4()}.jpg"),
buffer,
save=False,
)
buffer.close()
def save(self, *args, **kwargs):
if not self.preview_image and self.cover_image:
self.create_preview_image()
super().save(*args, **kwargs)
class Track(BaseModel): class Track(BaseModel):
title = models.CharField(max_length=200) title = models.CharField(max_length=200)

View File

@@ -6,8 +6,8 @@
{% for album in albums %} {% for album in albums %}
<div class="album-card"> <div class="album-card">
<a href="{% url 'music:album_detail' album.id %}" class="album-link"> <a href="{% url 'music:album_detail' album.id %}" class="album-link">
{% if album.cover_image %} {% if album.preview_image %}
<img src="{{ album.cover_image.url }}" alt="{{ album.name }}" class="album-cover"> <img src="{{ album.preview_image.url }}" alt="{{ album.name }}" class="album-cover">
{% else %} {% else %}
<img src="{% static 'img/no-cover.png' %}" alt="No cover" class="album-cover"> <img src="{% static 'img/no-cover.png' %}" alt="No cover" class="album-cover">
{% endif %} {% endif %}