Добавил preview_image в Album, чтобы снизить размеры cover image #6
24
music_storage/music/migrations/0009_album_preview_image.py
Normal file
24
music_storage/music/migrations/0009_album_preview_image.py
Normal 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),
|
||||||
|
]
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user