mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-08-24 03:05:24 +02:00
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
from django.db import models
|
|
from django.db.models.signals import post_delete
|
|
from django.dispatch import receiver
|
|
|
|
from .. import helpers
|
|
|
|
|
|
class VideoChapterData(models.Model):
|
|
data = models.JSONField(null=False, blank=False, help_text="Chapter data")
|
|
media = models.ForeignKey('Media', on_delete=models.CASCADE, related_name='chapters')
|
|
|
|
class Meta:
|
|
unique_together = ['media']
|
|
|
|
def save(self, *args, **kwargs):
|
|
from .. import tasks
|
|
|
|
is_new = self.pk is None
|
|
if is_new or (not is_new and self._check_data_changed()):
|
|
super().save(*args, **kwargs)
|
|
tasks.produce_video_chapters.delay(self.pk)
|
|
else:
|
|
super().save(*args, **kwargs)
|
|
|
|
def _check_data_changed(self):
|
|
if self.pk:
|
|
old_instance = VideoChapterData.objects.get(pk=self.pk)
|
|
return old_instance.data != self.data
|
|
return False
|
|
|
|
@property
|
|
def chapter_data(self):
|
|
# ensure response is consistent
|
|
data = []
|
|
for item in self.data:
|
|
if item.get("start") and item.get("title"):
|
|
thumbnail = item.get("thumbnail")
|
|
if thumbnail:
|
|
thumbnail = helpers.url_from_path(thumbnail)
|
|
else:
|
|
thumbnail = "static/images/chapter_default.jpg"
|
|
data.append(
|
|
{
|
|
"start": item.get("start"),
|
|
"title": item.get("title"),
|
|
"thumbnail": thumbnail,
|
|
}
|
|
)
|
|
return data
|
|
|
|
|
|
class VideoTrimRequest(models.Model):
|
|
"""Model to handle video trimming requests"""
|
|
|
|
VIDEO_TRIM_STATUS = (
|
|
("initial", "Initial"),
|
|
("running", "Running"),
|
|
("success", "Success"),
|
|
("fail", "Fail"),
|
|
)
|
|
|
|
VIDEO_ACTION_CHOICES = (
|
|
("replace", "Replace Original"),
|
|
("save_new", "Save as New"),
|
|
("create_segments", "Create Segments"),
|
|
)
|
|
|
|
TRIM_STYLE_CHOICES = (
|
|
("no_encoding", "No Encoding"),
|
|
("precise", "Precise"),
|
|
)
|
|
|
|
media = models.ForeignKey('Media', on_delete=models.CASCADE, related_name='trim_requests')
|
|
status = models.CharField(max_length=20, choices=VIDEO_TRIM_STATUS, default="initial")
|
|
add_date = models.DateTimeField(auto_now_add=True)
|
|
video_action = models.CharField(max_length=20, choices=VIDEO_ACTION_CHOICES)
|
|
media_trim_style = models.CharField(max_length=20, choices=TRIM_STYLE_CHOICES, default="no_encoding")
|
|
timestamps = models.JSONField(null=False, blank=False, help_text="Timestamps for trimming")
|
|
|
|
def __str__(self):
|
|
return f"Trim request for {self.media.title} ({self.status})"
|
|
|
|
|
|
@receiver(post_delete, sender=VideoChapterData)
|
|
def videochapterdata_delete(sender, instance, **kwargs):
|
|
helpers.rm_dir(instance.media.video_chapters_folder)
|