]> git.parisson.com Git - teleforma.git/commitdiff
update preview import
authorGuillaume Pellerin <yomguy@parisson.com>
Mon, 26 May 2014 21:34:13 +0000 (23:34 +0200)
committerGuillaume Pellerin <yomguy@parisson.com>
Mon, 26 May 2014 21:34:13 +0000 (23:34 +0200)
teleforma/management/commands/teleforma-import-seminars-preview.py

index 2e210b40af86f8041ba7ecb6f237f3a099ddbdb0..f940f196ddc7ae42ad7ee5c7a2b3b9e416cdbf13 100644 (file)
@@ -6,6 +6,8 @@ from django.template.defaultfilters import slugify
 from telemeta.models import *
 from telemeta.util.unaccent import unaccent
 from teleforma.models import *
+from django.core.urlresolvers import reverse
+
 import logging
 import os, sys, time, datetime
 import timeside
@@ -24,54 +26,118 @@ class Logger:
 
 
 class Command(BaseCommand):
-    help = "Import seminars from the MEDIA_ROOT directory "
+    help = "Import seminars from a media directory for a special period.name"
     admin_email = 'webmaster@parisson.com'
-    args = 'organization log_file'
+    args = 'organization period_name log_file media_dir'
     spacer = '_-_'
-    audio_formats = ['ogg', 'mp3']
-    video_formats = ['webm', 'mp4']
+    original_format = 'webm'
+    transcoded_formats = ['mp4', 'ogg', 'mp3']
     image_formats = ['png', 'jpg']
     media_rank_dict = {'bis': 2, 'ter': 3, 'quarter': 4, 'quinquies': 5, 'quater': 4}
-
-    def cleanup(self):
-        seminars = Seminar.objects.all()
-        for seminar in seminars:
-            for medias in seminar.media_preview.all():
-                for media in medias:
-                    media.item.delete()
-                    media.delete()
-                medias.delete()
+    site = Site.objects.get_current()
+
+    def full_cleanup(self):
+        items  = MediaItemTranscoded.objects.all()
+        for i in items :
+            i.delete()
+
+        items  = MediaItemRelated.objects.all()
+        for i in items :
+            i.delete()
+
+        items  = MediaItem.objects.all()
+        for i in items :
+            i.delete()
+
+        items  = MediaCollection.objects.all()
+        for i in items :
+            i.delete()
+
+        medias = Media.objects.all()
+        for media in medias:
+            media.delete()
+
+    def delete_media(self, media):
+        if media:
+            if media.item:
+                for trans in media.item.transcoded.all():
+                    trans.delete()
+                for related in media.item.related.all():
+                    related.delete()
+                media.item.delete()
+            media.delete()
+
+    def seminar_media_cleanup(self, seminar):
+        for media in seminar.medias.all():
+            seminar.medias.remove(media)
+            self.delete_media(media)
+        if seminar.media_preview:
+            preview = seminar.media_preview
+            seminar.media_preview = None
+            seminar.save()
+            self.delete_media(preview)
+
+    def get_duration(self, file):
+        decoder = timeside.decoder.FileDecoder(file)
+        decoder.setup()
+        # time.sleep(0.5)
+        value = str(datetime.timedelta(0,decoder.input_duration))
+        t = value.split(':')
+        t[2] = t[2].split('.')[0]
+        return ':'.join(t)
+
+    def get_item(self, collection, id):
+        items = MediaItem.objects.filter(collection=collection, code=id)
+        if not items:
+            item = MediaItem(collection=collection, code=id)
+            item.save()
+        else:
+            item = items[0]
+        return item
 
     def handle(self, *args, **options):
         organization_name = args[0]
-        log_file = args[1]
+        period_name = args[1]
+        log_file = args[2]
+        media_dir = args[3]
         logger = Logger(log_file)
 
         organization = Organization.objects.get(name=organization_name)
-        self.media_dir = settings.MEDIA_ROOT + organization.name
-        print self.media_dir
+        period = Period.objects.get(name=period_name)
+        self.media_dir = media_dir
         file_list = []
-        i = 1
+        seminars = []
 
-        self.cleanup()
+        # NOT FOR PROD : CLEANUP
+        # self.cleanup()
+        #for seminar in Seminar.objects.filter(period=period):
+        #    self.seminar_media_cleanup(seminar)
 
-        for root, dirs, files in os.walk(self.media_dir, followlinks=True):
+        walk = os.walk(self.media_dir, followlinks=True)
+
+        for root, dirs, files in walk:
             for filename in files:
                 name = os.path.splitext(filename)[0]
                 ext = os.path.splitext(filename)[1][1:]
-                print filename
                 root_list = root.split(os.sep)
 
-                if (ext in self.video_formats or ext in self.audio_formats) \
-                        and 'preview' in root_list:
+                if ext in self.original_format and not 'preview' in root_list \
+                            and not 'preview' in filename and not 'Preview' in filename and filename[0] != '.':
+
                     # seminar_rank <= 9
                     seminar_rank = int(root_list[-1][0])
+
                     if len(root_list[-1]) != 1:
-                        media_rank = self.media_rank_dict[root_list[-1][1:]]
+                        rank = root_list[-1][1:]
+                        media_rank = self.media_rank_dict[rank.replace('_', '')]
+                        preview_trigger = False
                     else:
+                        rank = 0
                         media_rank = 1
+                        preview_trigger = True
 
-                    course_code = root_list[-3]
+                    course_code = root_list[-2]
+                    period_dir = root_list[-3]
                     master_dir = root_list[-4]
                     department_name = root_list[-5]
                     organization_name = root_list[-6]
@@ -84,22 +150,26 @@ class Command(BaseCommand):
                     course = Course.objects.get(code=course_code)
                     department, c = Department.objects.get_or_create(name=department_name,
                                                                      organization=organization)
-                    seminar, c = Seminar.objects.get_or_create(course=course, rank=seminar_rank)
-                    print str(seminar.id)
-                    exist = False
+                    seminar, c = Seminar.objects.get_or_create(course=course,
+                                            rank=seminar_rank, period=period)
+                    if c:
+                        seminar.title = course.title
+                        seminar.status = 1
+                        seminar.save()
 
-                    media_packages = seminar.media_preview.all()
-                    for media_package in media_packages:
-                        for media in media_package.video.all():
-                            if media.item.file == path:
-                                exist = True
-                                break
-                        for media in media_package.audio.all():
-                            if media.item.file == path:
-                                exist = True
-                                break
+                    exist = False
+                    for media in seminar.media_preview.all():
+                        if media.item.file == path:
+                            exist = True
+                            break
 
                     if not exist:
+                        print root + os.sep + filename
+                        logger.logger.info(seminar.public_url())
+                        logger.logger.info(path)
+                        if not seminar in seminars:
+                            seminars.append(seminar)
+
                         collections = MediaCollection.objects.filter(code=collection_id)
                         if not collections:
                             collection = MediaCollection(code=collection_id,title=collection_id)
@@ -107,57 +177,40 @@ class Command(BaseCommand):
                         else:
                             collection = collections[0]
 
-                        id = '_'.join([collection_id, ext, str(i), 'preview'])
-
-                        items = MediaItem.objects.filter(collection=collection, code=id)
-                        if not items:
-                            item = MediaItem(collection=collection, code=id)
-                            item.save()
-                        else:
-                            item = items[0]
-
-                        item.title = name
-                        item.file = path
-                        item.save()
-                        
-                        print path
-                        
-                        files = os.listdir(root)
-                        for file in files:
-                            filename, extension = os.path.splitext(file)
-                            if extension[1:] in self.image_formats:
-                                related = MediaItemRelated(item=item)
-                                related.file = dir + os.sep + file
-                                related.title = 'preview'
-                                related.set_mime_type()
-                                related.save()
-                                print 'thumb added'
-                                break
-
-                        media = Media(item=item, course=course, type=ext)
-                        media.set_mime_type()
-                        media.is_published = True
-                        media.save()
-                        
-                        media_package_exist = False
-                        media_packages = seminar.media_preview.all()
-                        for media_package in media_packages:
-                            if media_package.rank == media_rank:
-                                media_package_exist = True
-                                break
-                        
-                        if not media_package_exist:
-                            media_package = MediaPackage(rank=media_rank, title=seminar_title)
-                            media_package.save()
-                            seminar.media_preview.add(media_package)
-
-                        if ext in self.video_formats:
-                            media_package.video.add(media)
-                        if ext in self.audio_formats:
-                            media_package.audio.add(media)
-
-                        media_package.is_published = True
-                        media_package.save()
-
-                        logger.logger.info(path)
-                        i += 1
+                        id = '_'.join([period.name, '30', collection_id, ext, str(media_rank)])
+
+                        item = self.get_item(collection, id)
+
+                        # 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)
+                                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.objects.get_or_create(item=item, course=course, type=ext)
+                                media.set_mime_type()
+                                media.is_published = True
+                                media.save()
+                                seminar.media_preview = media
+                                seminar.save()
+
+        for s in seminars:
+            print 'http://' + self.site.domain + reverse('teleforma-seminar-detail', kwargs={'pk': s.id})