From 5ae2fca54b2ad6cf09234a691d3f95f97d2faeee Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Mon, 26 May 2014 23:34:13 +0200 Subject: [PATCH] update preview import --- .../teleforma-import-seminars-preview.py | 235 +++++++++++------- 1 file changed, 144 insertions(+), 91 deletions(-) diff --git a/teleforma/management/commands/teleforma-import-seminars-preview.py b/teleforma/management/commands/teleforma-import-seminars-preview.py index 2e210b40..f940f196 100644 --- a/teleforma/management/commands/teleforma-import-seminars-preview.py +++ b/teleforma/management/commands/teleforma-import-seminars-preview.py @@ -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}) -- 2.39.5