From 022ec3fea178704e2da38ca64cc772d953516b19 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Fri, 15 Jul 2022 12:06:42 +0200 Subject: [PATCH] add Conference.session_file, update media import command --- .../teleforma-import-seminar-media-update.py | 161 ++++++++---------- teleforma/models/core.py | 23 ++- teleforma/models/pro.py | 2 + 3 files changed, 95 insertions(+), 91 deletions(-) diff --git a/teleforma/management/commands/teleforma-import-seminar-media-update.py b/teleforma/management/commands/teleforma-import-seminar-media-update.py index 2975c54c..564cd82e 100644 --- a/teleforma/management/commands/teleforma-import-seminar-media-update.py +++ b/teleforma/management/commands/teleforma-import-seminar-media-update.py @@ -174,99 +174,80 @@ class Command(BaseCommand): seminar.status = 1 seminar.save() - collections = MediaCollection.objects.filter(code=collection_id) - if not collections: - collection = MediaCollection(code=collection_id,title=collection_id) - collection.save() - else: - collection = collections[0] - - id = '_'.join([period.name, self.id_incr, collection_id, ext, str(media_rank)]) - item = self.get_item(collection, id) - item.title = name - - id_webm = '_'.join([period.name, self.id_incr, collection_id, 'webm', str(media_rank)]) - items_webm = MediaItem.objects.filter(collection=collection, code=id_webm) - - # cleanup old media for media in seminar.medias.all(): - if not period.name in media.item.code: - seminar.medias.remove(media) + seminar.medias.remove(media) - if not item.file == path and not items_webm: - logger.logger.info(seminar.public_url()) - logger.logger.info(path) - if not seminar in seminars: - seminars.append(seminar) - - item.file = path - if os.path.getsize(root+os.sep+filename): - item.approx_duration = self.get_duration(root+os.sep+filename) - item.save() - - files = os.listdir(root) - for file in files: - r_path = dir + os.sep + file - filename, extension = os.path.splitext(file) - if extension[1:] in self.image_formats: - related, c = MediaItemRelated.objects.get_or_create(item=item, file=r_path) - related.title = 'preview' - related.set_mime_type() - related.save() - logger.logger.info(r_path) - elif extension[1:] in self.transcoded_formats and not extension[1:] in self.original_format: - t, c = MediaItemTranscoded.objects.get_or_create(item=item, file=r_path) - logger.logger.info(r_path) - elif extension[1:] == 'kdenlive': - related, c = MediaItemRelated.objects.get_or_create(item=item, file=r_path) - title, markers = related.parse_markers(from_first_marker=False) - item.title = title - item.save() - logger.logger.info(r_path) - - media, c = Media.objects.get_or_create(item=item, course=course, type=ext) - if c: - media.set_mime_type() - media.rank = media_rank - media.is_published = True - media.save() - - if not media in seminar.medias.all(): - seminar.medias.add(media) - - # import previews - if preview_trigger: - dir = os.path.abspath(root + '/../preview/' + str(seminar_rank)) - if os.path.exists(dir): - r_dir = os.sep.join(dir.split(os.sep)[-7:]) - files = os.listdir(dir) - if files and seminar.media_preview: - seminar.media_preview.delete() - code = item.code + '_preview' - title = item.title + ' (preview)' - item = self.get_item(collection, code) - item.title = title - item.save() - for file in files: - r_path = r_dir + os.sep + file - filename, extension = os.path.splitext(file) - if extension[1:] in self.original_format and not '.' == filename[0]: - item.file = r_path - if os.path.getsize(dir+os.sep+file): - item.approx_duration = self.get_duration(dir+os.sep+file) - item.save() - logger.logger.info(r_path) - elif extension[1:] in self.transcoded_formats: - t, c = MediaItemTranscoded.objects.get_or_create(item=item, file=r_path) - logger.logger.info(r_path) - - media = Media(item=item, course=course, type=ext) - media.set_mime_type() - media.is_published = True - media.save() - seminar.media_preview = media - seminar.save() + # if not item.file == path and not items_webm: + logger.logger.info(seminar.public_url()) + logger.logger.info(path) + if not seminar in seminars: + seminars.append(seminar) + + + media, c = Media.objects.get_or_create(course=course, + type=ext, + file=path, + title='main') + if c: + media.set_mime_type() + media.rank = media_rank + media.is_published = True + media.save() + + if not media in seminar.medias.all(): + seminar.medias.add(media) + + + files = os.listdir(root) + for file in files: + r_path = dir + os.sep + file + filename, extension = os.path.splitext(file) + if extension[1:] in self.image_formats: + media.file = r_path + elif extension[1:] in self.transcoded_formats and not extension[1:] in self.original_format: + transcoded, c = MediaTranscoded.objects.get_or_create(item=media, file=r_path) + elif extension[1:] == 'kdenlive': + media.session_file = r_path + media.parse_markers(from_first_marker=False) + logger.logger.info(r_path) + media.save() + + # import previews + if preview_trigger: + dir = os.path.abspath(root + '/../preview/' + str(seminar_rank)) + if os.path.exists(dir): + r_dir = os.sep.join(dir.split(os.sep)[-7:]) + files = os.listdir(dir) + + if files and seminar.media_preview: + seminar.media_preview.delete() + + media_preview, c = Media.objects.get_or_create(course=course, + type=ext, + title='preview') + if c: + media_preview.set_mime_type() + media_preview.rank = media_rank + media_preview.is_published = True + media_preview.save() + + for file in files: + r_path = r_dir + os.sep + file + filename, extension = os.path.splitext(file) + if extension[1:] in self.original_format and not '.' == filename[0]: + media_preview.file = r_path + logger.logger.info(r_path) + elif extension[1:] in self.transcoded_formats: + transcoded, c = MediaItemTranscoded.objects.get_or_create(item=media_preview, file=r_path) + logger.logger.info(r_path) + + media_preview.save() + media_preview.set_mime_type() + media_preview.is_published = True + media_preview.save() + seminar.media_preview = media_preview + seminar.save() for s in seminars: print('http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id})) diff --git a/teleforma/models/core.py b/teleforma/models/core.py index a0cf7dc4..5a91db0c 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -39,6 +39,7 @@ import string import datetime import mimetypes import copy +import random from unidecode import unidecode from django.conf import settings @@ -65,6 +66,8 @@ from jxmlease import XMLListNode, XMLDictNode from teleforma.bbb_utils import bbb, register_web_hook from teleforma.fields import Duration, DurationField, ShortTextField +from teleforma.utils.kdenlive import KDEnLiveSession + HAS_TELEMETA = False try: @@ -76,6 +79,10 @@ except ImportError: app_label = 'teleforma' +def get_random_hash(): + hash = random.getrandbits(64) + return "%016x" % hash + def get_n_choices(n): return [(str(x), str(y)) for x in range(1, n) for y in range(1, n) if x == y] @@ -556,6 +563,7 @@ class MediaTranscoded(Model): class Meta(MetaCore): db_table = app_label + '_media_transcoded' + class MediaItemMarker(Model): "2D marker object : text value vs. time (in seconds)" @@ -601,6 +609,7 @@ class Media(MediaBase): readers = ManyToManyField(User, related_name="media", verbose_name=_('readers'), blank=True) file = models.FileField(_('file'), upload_to='items/%Y/%m/%d', max_length=1024, null=True, blank=False) + session_file = models.FileField(_('session file'), upload_to='items/%Y/%m/%d', max_length=1024, null=True, blank=False) poster_file = models.FileField(_('poster file'), upload_to='items/%Y/%m/%d', max_length=255, null=True, blank=False) approx_duration = DurationField(_('approximative duration')) @@ -642,13 +651,25 @@ class Media(MediaBase): self.conference.course.save() self.set_mime_type() - def poster_url(self, geometry='640'): url = '' if self.poster_file: url = sorl_default.backend.get_thumbnail(self.poster_file, geometry).url return url + def parse_markers(self, **kwargs): + # Parse KDEnLive session + if self.session_file: + session = KDEnLiveSession(self.file.path) + markers = session.markers(**kwargs) + for marker in markers: + m = MediaItemMarker(item=self) + m.public_id = get_random_hash() + m.time = float(marker['time']) + m.title = marker['comment'] + m.save() + return markers + class Meta(MetaCore): db_table = app_label + '_' + 'media' ordering = ['rank'] diff --git a/teleforma/models/pro.py b/teleforma/models/pro.py index 5bbabbe2..08655887 100644 --- a/teleforma/models/pro.py +++ b/teleforma/models/pro.py @@ -49,6 +49,8 @@ from forms_builder.forms.models import Form from mezzanine.core.managers import DisplayableManager from quiz.models import Quiz import tinymce + + class SeminarType(models.Model): name = models.CharField(_('name'), max_length=255, blank=True) -- 2.39.5