From 807af4ed75bd96c8d3c4afc722cc485c4faec9c5 Mon Sep 17 00:00:00 2001 From: Viner Abubakirov Date: Sun, 4 Jan 2026 16:46:55 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20pr?= =?UTF-8?q?eview=5Fimage=20=D0=B2=20Album,=20=D1=87=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=20=D1=81=D0=BD=D0=B8=D0=B7=D0=B8=D1=82=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D1=8B=20cover=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0009_album_preview_image.py | 24 ++++++++++++ music_storage/music/models.py | 37 +++++++++++++++++-- .../templates/components/album_list.html | 4 +- 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 music_storage/music/migrations/0009_album_preview_image.py diff --git a/music_storage/music/migrations/0009_album_preview_image.py b/music_storage/music/migrations/0009_album_preview_image.py new file mode 100644 index 0000000..fe7b579 --- /dev/null +++ b/music_storage/music/migrations/0009_album_preview_image.py @@ -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), + ] diff --git a/music_storage/music/models.py b/music_storage/music/models.py index 94897fc..691e6a8 100644 --- a/music_storage/music/models.py +++ b/music_storage/music/models.py @@ -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) diff --git a/music_storage/templates/components/album_list.html b/music_storage/templates/components/album_list.html index 812e583..30c66f4 100644 --- a/music_storage/templates/components/album_list.html +++ b/music_storage/templates/components/album_list.html @@ -6,8 +6,8 @@ {% for album in albums %}
- {% if album.cover_image %} - {{ album.name }} + {% if album.preview_image %} + {{ album.name }} {% else %} No cover {% endif %}