pandora/pandora/archive/tasks.py

178 lines
5.8 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
2012-01-28 11:22:51 +01:00
from glob import glob
2011-12-27 18:51:22 +05:30
from celery.task import task
2011-01-28 14:18:38 +05:30
from django.conf import settings
from django.db.models import Q
2013-02-08 17:01:26 +00:00
from item.models import Item
2016-08-05 15:24:54 +02:00
from item.tasks import update_poster
import models
2012-01-28 11:22:51 +01:00
import extract
2016-07-30 02:49:31 +02:00
import external
2011-02-02 16:06:04 +05:30
_INSTANCE_KEYS = ('mtime', 'path')
2011-02-02 16:06:04 +05:30
2011-04-18 21:12:41 +02:00
def get_or_create_file(volume, f, user, item=None):
2011-02-02 16:06:04 +05:30
try:
file = models.File.objects.get(oshash=f['oshash'])
except models.File.DoesNotExist:
file = models.File()
file.oshash = f['oshash']
file.path = f['path']
2011-04-18 21:12:41 +02:00
if item:
file.item = item
else:
2016-07-01 17:41:53 +02:00
file.item = None # gets pupulated later via update_info
2011-02-02 16:06:04 +05:30
file.save()
return file
2011-02-22 16:42:56 +01:00
def update_or_create_instance(volume, f):
2016-07-01 17:41:53 +02:00
# instance with oshash exists
2011-02-22 16:45:12 +01:00
instance = models.Instance.objects.filter(file__oshash=f['oshash'], volume=volume)
2016-07-01 17:41:53 +02:00
if instance.count():
2011-02-02 16:06:04 +05:30
instance = instance[0]
updated = False
for key in _INSTANCE_KEYS:
if f[key] != getattr(instance, key):
setattr(instance, key, f[key])
2016-07-01 17:41:53 +02:00
updated = True
2011-02-02 16:06:04 +05:30
if updated:
instance.ignore = False
2011-02-02 16:06:04 +05:30
instance.save()
instance.file.save()
2011-02-02 16:06:04 +05:30
else:
instance = models.Instance.objects.filter(path=f['path'], volume=volume)
2016-07-01 17:41:53 +02:00
if instance.count():
# same path, other oshash, keep path/item mapping, remove instance
2011-06-27 21:55:40 +02:00
item = instance[0].file.item
2011-04-18 21:12:41 +02:00
instance.delete()
2016-07-01 17:41:53 +02:00
else: # new instance
2011-04-18 21:12:41 +02:00
item = None
2011-02-02 16:06:04 +05:30
instance = models.Instance()
instance.volume = volume
2011-04-18 21:12:41 +02:00
instance.file = get_or_create_file(volume, f, volume.user, item)
2011-02-02 16:06:04 +05:30
for key in _INSTANCE_KEYS:
setattr(instance, key, f[key])
instance.save()
instance.file.save()
2013-02-08 17:01:26 +00:00
if instance.file.item:
instance.file.item.update_wanted()
2011-02-02 16:06:04 +05:30
return instance
2011-01-01 17:14:42 +05:30
2012-03-21 09:13:38 +01:00
@task(ignore_results=True, queue='default')
def update_files(user, volume, files):
user = models.User.objects.get(username=user)
volume, created = models.Volume.objects.get_or_create(user=user, name=volume)
all_files = [f['oshash'] for f in files]
# remove deleted files
2011-10-20 21:32:31 +02:00
removed = models.Instance.objects.filter(volume=volume).exclude(file__oshash__in=all_files)
2014-09-19 12:26:46 +00:00
ids = [i['public_id'] for i in Item.objects.filter(
files__instances__in=removed.filter(file__selected=True)).distinct().values('public_id')]
2011-10-20 21:32:31 +02:00
removed.delete()
for f in files:
update_or_create_instance(volume, f)
2011-10-20 21:32:31 +02:00
for i in ids:
2014-09-19 12:26:46 +00:00
i = Item.objects.get(public_id=i)
2011-10-20 21:32:31 +02:00
i.update_selected()
2011-06-01 13:03:07 +02:00
2014-07-09 18:27:21 +00:00
@task(ignore_results=True, queue='default')
def update_info(user, info):
2014-07-09 18:29:17 +00:00
user = models.User.objects.get(username=user)
2014-07-09 18:27:21 +00:00
files = models.File.objects.filter(oshash__in=info.keys())
for f in files:
f.update_info(info[f.oshash], user)
f.save()
2014-07-09 18:27:21 +00:00
for i in Item.objects.filter(files__in=files).distinct():
i.update_selected()
i.update_wanted()
2011-08-19 18:54:42 +02:00
@task(queue="encoding")
def process_stream(fileId):
'''
process uploaded stream
'''
2011-08-20 10:45:54 +02:00
file = models.File.objects.get(id=fileId)
2011-08-19 18:54:42 +02:00
streams = file.streams.filter(source=None)
2014-06-04 09:53:39 +03:00
models.File.objects.filter(id=fileId).update(encoding=True, queued=False, failed=False)
2011-08-20 10:45:54 +02:00
if streams.count() > 0:
2011-08-19 18:54:42 +02:00
stream = streams[0]
stream.make_timeline()
stream.extract_derivatives()
2013-05-12 10:44:55 +02:00
file = models.File.objects.get(id=fileId)
file.encoding = False
file.save()
file.item.update_selected()
if not file.item.rendered \
and not file.item.files.exclude(id=fileId).filter(Q(queued=True) | Q(encoding=True)).count():
2011-10-28 15:16:42 +02:00
file.item.update_timeline()
2012-09-08 14:56:40 +02:00
if file.item.rendered:
file.item.save()
models.File.objects.filter(id=fileId).update(encoding=False)
2011-08-19 18:54:42 +02:00
return True
2012-01-28 11:22:51 +01:00
@task(queue="encoding")
def extract_stream(fileId):
'''
extract stream from direct upload
'''
2014-06-04 09:53:39 +03:00
models.File.objects.filter(id=fileId).update(encoding=True, queued=False, failed=False)
file = models.File.objects.get(id=fileId)
if file.data:
config = settings.CONFIG['video']
resolution = file.stream_resolution()
stream, created = models.Stream.objects.get_or_create(
file=file, resolution=resolution, format=config['formats'][0]
)
if created:
file.extract_frames()
2013-05-07 11:36:07 +02:00
stream.media.name = stream.path(stream.name())
2014-07-29 18:37:01 +02:00
stream = stream.encode()
if stream.available:
stream.make_timeline()
stream.extract_derivatives()
2014-07-29 18:37:01 +02:00
# get current version from db
file = models.File.objects.get(id=fileId)
2016-06-26 23:22:27 +02:00
file.item.update_timeline()
2016-08-05 15:24:54 +02:00
update_poster(file.item.public_id)
2014-07-23 17:27:27 +02:00
file.extract_tracks()
models.File.objects.filter(id=fileId).update(encoding=False)
@task(queue="encoding")
def extract_derivatives(fileId, rebuild=False):
file = models.File.objects.get(id=fileId)
streams = file.streams.filter(source=None)
2016-07-01 17:41:53 +02:00
if streams.count():
streams[0].extract_derivatives(rebuild)
return True
2012-01-28 11:22:51 +01:00
@task(queue="encoding")
def update_stream(id):
s = models.Stream.objects.get(pk=id)
2016-07-01 17:41:53 +02:00
if not glob("%s*" % s.timeline_prefix):
2012-01-28 11:22:51 +01:00
s.make_timeline()
if not s.color:
s.cuts = tuple(extract.cuts(s.timeline_prefix))
s.color = tuple(extract.average_color(s.timeline_prefix))
s.save()
s.file.selected = True
s.file.save()
s.file.item.update_timeline()
2016-07-01 17:41:53 +02:00
# make sure all derivatives exist
2012-01-28 11:22:51 +01:00
s.extract_derivatives()
2012-02-24 01:32:59 +05:30
s.file.item.save()
2012-01-28 11:22:51 +01:00
2016-07-01 17:41:53 +02:00
# update clips
2012-01-28 11:22:51 +01:00
for c in s.file.item.clips.all():
c.update_calculated_values()
c.save()
2016-07-30 02:49:31 +02:00
@task(queue="encoding")
def download_media(item_id, url):
return external.download(item_id, url)