]> git.parisson.com Git - teleforma.git/commitdiff
add Conference.session_file, update media import command
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Fri, 15 Jul 2022 10:06:42 +0000 (12:06 +0200)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Fri, 15 Jul 2022 10:06:42 +0000 (12:06 +0200)
teleforma/management/commands/teleforma-import-seminar-media-update.py
teleforma/models/core.py
teleforma/models/pro.py

index 2975c54c0d5ebac9cc44b43daa7fdf9697b1736a..564cd82e1c8cc6fb5fcb0918600ceb02aacae138 100644 (file)
@@ -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}))
index a0cf7dc46d9bf2b9e6e4c46c83a108adf5c7938f..5a91db0ce0317ead4d3b2ada6c53602fbd756a6e 100755 (executable)
@@ -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']
index 5bbabbe2fc6003b903b99dc70fcc142af07e21af..08655887cfb059297dcbece171d2b776225a8acc 100644 (file)
@@ -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)