Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for non mp3 releases #26

Merged
merged 2 commits into from
Feb 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ RUN export PATH="/bin:$PATH" && export PKG_CONFIG_PATH="/var/lib/ffmpeg/build/li
--enable-libtheora \
--enable-libvorbis \
--enable-nonfree && \
make -j2 && \
make -j4 && \
make install && \
rm -rf /var/lib/ffmpeg/

Expand All @@ -33,7 +33,7 @@ RUN pip install --trusted-host pypi.org --no-cache-dir --upgrade pip && \
pip install --trusted-host pypi.org --no-cache-dir -r /tmp/prod.txt

# Remove system packages after use
RUN apt-get autoremove -y --purge autoconf automake build-essential cmake git-core pkg-config wget yasm && \
RUN apt-get autoremove -y --purge autoconf automake build-essential cmake git-core pkg-config yasm && \
apt-get clean -y

# Add base user
Expand Down
2 changes: 1 addition & 1 deletion config/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ server {
add_header Content-Disposition 'attachment; filename="$fname"';
}

if ($request_filename ~ "^.*/(.+\.(jpe?g|webp|mp3|ogg|zip))$") {
if ($request_filename ~ "^.*/(.+\.(jpe?g|webp|mp3|ogg|flac|zip))$") {
expires max;
access_log off;

Expand Down
2 changes: 1 addition & 1 deletion manage.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
"""Django's command-line utility for administrative tasks."""
import os
import sys
Expand Down
1 change: 1 addition & 0 deletions manti_by/apps/blog/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class PostAdmin(admin.ModelAdmin):
"fields": (
"cover",
"release",
"mp3_release_ready",
"mp3_preview_ready",
"ogg_preview_ready",
"ogg_release_ready",
Expand Down
4 changes: 4 additions & 0 deletions manti_by/apps/blog/apps.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _


class BlogConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "manti_by.apps.blog"

verbose_name = _("Blog")
verbose_name_plural = _("Blogs")
17 changes: 17 additions & 0 deletions manti_by/apps/blog/constants.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
MP3_PREVIEW = "mp3_preview"

MP3_RELEASE = "mp3_release"

OGG_PREVIEW = "ogg_preview"

OGG_RELEASE = "ogg_release"

TRANSLATED_FIELDS = (
"name_be",
"name_ru",
"name_en",
"meta_be",
"meta_ru",
"meta_en",
"summary_be",
"summary_ru",
"summary_en",
"description_be",
"description_ru",
"description_en",
)
10 changes: 8 additions & 2 deletions manti_by/apps/blog/management/commands/check_posts_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,13 @@ class Command(BaseCommand):

def handle(self, *args, **options):
checked = 0
for post in Post.objects.all():
for post in Post.objects.all().order_by("created"):
try:
post.mp3_release_ready = (
os.path.exists(post.release_mp3_file)
and os.path.getsize(post.release_mp3_file) > 0
)

post.ogg_release_ready = (
os.path.exists(post.release_ogg_file)
and os.path.getsize(post.release_ogg_file) > 0
Expand All @@ -31,9 +36,10 @@ def handle(self, *args, **options):
)

self.stdout.write(
"Checked post #%d: %d %d %d"
"Checked post #%d: %d %d %d %d"
% (
post.id,
1 if post.mp3_release_ready else 0,
1 if post.ogg_release_ready else 0,
1 if post.mp3_preview_ready else 0,
1 if post.ogg_preview_ready else 0,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Generated by Django 4.0.1 on 2022-01-31 21:41

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("taggit", "0004_alter_taggeditem_content_type_alter_taggeditem_tag"),
("blog", "0016_auto_20210917_1132"),
]

operations = [
migrations.AlterModelOptions(
name="post",
options={"verbose_name": "Post", "verbose_name_plural": "Posts"},
),
migrations.RemoveField(
model_name="post",
name="original_id",
),
migrations.AddField(
model_name="post",
name="mp3_release_ready",
field=models.BooleanField(blank=True, default=False),
),
migrations.AlterField(
model_name="genresproxy",
name="tag",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(app_label)s_%(class)s_items",
to="taggit.tag",
),
),
migrations.AlterField(
model_name="post",
name="related",
field=models.ManyToManyField(blank=True, to="blog.Post"),
),
migrations.AlterField(
model_name="tagsproxy",
name="tag",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(app_label)s_%(class)s_items",
to="taggit.tag",
),
),
]
131 changes: 74 additions & 57 deletions manti_by/apps/blog/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Optional, List

from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
Expand All @@ -8,6 +10,7 @@
from taggit.models import TaggedItemBase
from taggit.managers import TaggableManager

from manti_by.apps.blog.constants import TRANSLATED_FIELDS
from manti_by.apps.core.models import BaseModel
from manti_by.apps.core.mixins import SlugifyMixin
from manti_by.apps.core.utils import flush_cache, release_name, cover_name
Expand Down Expand Up @@ -71,104 +74,118 @@ class Post(SlugifyMixin, BaseModel):
related = models.ManyToManyField("self", blank=True)

mp3_preview_ready = models.BooleanField(blank=True, default=False)
mp3_release_ready = models.BooleanField(blank=True, default=False)
ogg_preview_ready = models.BooleanField(blank=True, default=False)
ogg_release_ready = models.BooleanField(blank=True, default=False)

original_id = models.IntegerField(blank=True, default=0) # Temporary field

objects = PostManager()

class Meta:
verbose_name = _("Post")
verbose_name_plural = _("Posts")

def __str__(self):
return self.name

@property
def files_converted(self):
return (
self.mp3_preview_ready and self.ogg_preview_ready and self.ogg_release_ready
self.mp3_preview_ready
and self.mp3_release_ready
and self.ogg_preview_ready
and self.ogg_release_ready
)

@property
def translations_filled(self):
for field in (
"name_be",
"name_ru",
"name_en",
"meta_be",
"meta_ru",
"meta_en",
"summary_be",
"summary_ru",
"summary_en",
"description_be",
"description_ru",
"description_en",
):
def translations_filled(self) -> bool:
for field in TRANSLATED_FIELDS:
if not getattr(self, field):
return False
return True

@property
def url(self):
def url(self) -> str:
return reverse("post", kwargs={"slug": self.slug})

@property
def release_mp3_url(self):
return self.release.url if self.release else None
def release_file_url(self) -> Optional[str]:
try:
ext = self.release.url.split(".")[-1]
return self.release.url.replace(f".{ext}", "")
except (IndexError, AttributeError):
return

@property
def release_mp3_file(self):
return self.release.file.name if self.release else None
def release_file_name(self) -> Optional[str]:
try:
ext = self.release.file.name.split(".")[-1]
return self.release.file.name.replace(f".{ext}", "")
except (IndexError, AttributeError):
return

@property
def preview_mp3_url(self):
return self.release.url.replace("release", "preview") if self.release else None
def preview_file_url(self) -> Optional[str]:
try:
return self.release_file_url.replace("release", "preview")
except (IndexError, AttributeError):
return

@property
def preview_mp3_file(self):
return (
self.release.file.name.replace("release", "preview")
if self.release
else None
)
def preview_file_name(self) -> Optional[str]:
try:
return self.release_file_name.replace("release", "preview")
except (IndexError, AttributeError):
return

@property
def release_ogg_url(self):
return self.release.url.replace("mp3", "ogg") if self.release else None
def release_mp3_url(self) -> Optional[str]:
return f"{self.release_file_url}.mp3" if self.release_file_url else None

@property
def release_ogg_file(self):
return self.release.file.name.replace("mp3", "ogg") if self.release else None
def release_mp3_file(self) -> Optional[str]:
return f"{self.release_file_name}.mp3" if self.release_file_name else None

@property
def preview_ogg_url(self):
return (
self.release.url.replace("release", "preview").replace("mp3", "ogg")
if self.release
else None
)
def preview_mp3_url(self) -> Optional[str]:
return f"{self.preview_file_url}.mp3" if self.preview_file_url else None

@property
def preview_ogg_file(self):
return (
self.release.file.name.replace("release", "preview").replace("mp3", "ogg")
if self.release
else None
)
def preview_mp3_file(self) -> Optional[str]:
return f"{self.preview_file_name}.mp3" if self.preview_file_name else None

@property
def title(self):
return "%s /%s/" % (
self.name,
", ".join(self.genre.values_list("name", flat=True)),
)
def release_ogg_url(self) -> Optional[str]:
return f"{self.release_file_url}.ogg" if self.release_file_url else None

@property
def most_common_tags(self):
for tag in self.tags.exclude(slug="front"):
if TagsProxy.objects.filter(tag_id=tag.id).count() > 1:
yield tag
def release_ogg_file(self) -> Optional[str]:
return f"{self.release_file_name}.ogg" if self.release_file_name else None

def as_dict(self):
@property
def preview_ogg_url(self) -> Optional[str]:
return f"{self.preview_file_url}.ogg" if self.preview_file_url else None

@property
def preview_ogg_file(self) -> Optional[str]:
return f"{self.preview_file_name}.ogg" if self.preview_file_name else None

@property
def genres(self) -> str:
return ", ".join(self.genre.values_list("name", flat=True))

@property
def title(self) -> str:
return f"{self.name} /{self.genres}/"

@property
def most_common_tags(self) -> List[TagsProxy]:
return [
tag
for tag in self.tags.exclude(slug="front")
if TagsProxy.objects.filter(tag_id=tag.id).count() > 1
]

def as_dict(self) -> dict:
return {
"id": self.id,
"url": self.url,
Expand Down
11 changes: 10 additions & 1 deletion manti_by/apps/blog/services.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
from __future__ import annotations
from typing import TYPE_CHECKING

from manti_by.apps.core.services import (
convert_to_mp3_preview,
convert_to_ogg_preview,
convert_to_ogg_release,
convert_to_mp3_release,
)
from manti_by.apps.core.utils import get_rq_queue

queue = get_rq_queue()

if TYPE_CHECKING:
from manti_by.apps.blog.models import Post


def generate_preview_for_post(post):
def generate_preview_for_post(post: Post):
if not post.release:
return
if not post.mp3_preview_ready:
queue.enqueue(convert_to_mp3_preview, post.id)
if not post.mp3_release_ready:
queue.enqueue(convert_to_mp3_release, post.id)
if not post.ogg_preview_ready:
queue.enqueue(convert_to_ogg_preview, post.id)
if not post.ogg_release_ready:
Expand Down
4 changes: 4 additions & 0 deletions manti_by/apps/core/apps.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _


class CoreConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "manti_by.apps.core"

verbose_name = _("Core")
verbose_name_plural = _("Core")
Binary file modified manti_by/apps/core/locale/be/LC_MESSAGES/django.mo
Binary file not shown.
Loading