Добавил 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 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):
@@ -25,7 +27,9 @@ def track_upload_to(instance, filename):
class Artist(BaseModel):
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):
return f"{self.name}"
@@ -37,10 +41,35 @@ class Album(BaseModel):
cover_image = models.ImageField(
upload_to=album_cover_upload_to, null=True, blank=True
)
preview_image = models.ImageField(null=True, blank=True)
def __str__(self):
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):
title = models.CharField(max_length=200)

View File

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