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
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]
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)
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})