rework files
This commit is contained in:
parent
2c2ec73d49
commit
3259e710ed
9 changed files with 138 additions and 98 deletions
|
|
@ -34,6 +34,8 @@ from .timelines import join_timelines
|
|||
|
||||
from archive import extract
|
||||
from annotation.models import Annotation, Layer
|
||||
import archive.models
|
||||
|
||||
from person.models import get_name_sort
|
||||
from app.models import site_config
|
||||
|
||||
|
|
@ -340,11 +342,11 @@ class Item(models.Model):
|
|||
|
||||
posters = []
|
||||
|
||||
poster = self.path('poster.local.jpg')
|
||||
poster = self.path('siteposter.jpg')
|
||||
poster = os.path.abspath(os.path.join(settings.MEDIA_ROOT, poster))
|
||||
if os.path.exists(poster):
|
||||
posters.append({
|
||||
'url': '/%s/poster.jpg' % self.itemId,
|
||||
'url': '/%s/siteposter.jpg' % self.itemId,
|
||||
'width': 640,
|
||||
'height': 1024,
|
||||
'source': settings.URL,
|
||||
|
|
@ -614,18 +616,17 @@ class Item(models.Model):
|
|||
s.wordsperminute = 0
|
||||
s.clips = 0 #FIXME: get clips from all layers or something
|
||||
s.popularity = 0 #FIXME: get popularity from somewhere
|
||||
videos = self.main_videos()
|
||||
if len(videos) > 0:
|
||||
videos = self.files.filter(active=True, is_video=True)
|
||||
if videos.count() > 0:
|
||||
s.duration = sum([v.duration for v in videos])
|
||||
s.resolution = videos[0].width * videos[0].height
|
||||
v = videos[0]
|
||||
s.resolution = v.width * v.height
|
||||
s.aspectratio = float(utils.parse_decimal(v.display_aspect_ratio))
|
||||
#FIXME: should be average over all files
|
||||
if 'bitrate' in videos[0].info:
|
||||
s.bitrate = videos[0].info['bitrate']
|
||||
s.pixels = sum([v.pixels for v in videos])
|
||||
s.numberoffiles = self.files.all().count()
|
||||
s.parts = len(videos)
|
||||
s.parts = videos.count()
|
||||
s.size = sum([v.size for v in videos]) #FIXME: only size of movies?
|
||||
s.bitrate = s.size * 8 / s.duration
|
||||
s.volume = 0
|
||||
else:
|
||||
s.duration = None
|
||||
|
|
@ -707,38 +708,62 @@ class Item(models.Model):
|
|||
|
||||
@property
|
||||
def timeline_prefix(self):
|
||||
videos = self.main_videos()
|
||||
videos = self.streams()
|
||||
if len(videos) == 1:
|
||||
return os.path.join(settings.MEDIA_ROOT, videos[0].path('timeline'))
|
||||
return os.path.join(settings.MEDIA_ROOT, self.path(), 'timeline')
|
||||
|
||||
def main_videos(self):
|
||||
#FIXME: needs to check if more than one user has main files and only
|
||||
# take from "higher" user
|
||||
videos = self.files.filter(is_main=True, is_video=True, available=True, instances__gt=0).order_by('part')
|
||||
if videos.count()>0:
|
||||
first = videos[0]
|
||||
user = first.instances.all()[0].volume.user
|
||||
#only take videos from same user and with same width/height
|
||||
def check(v):
|
||||
if v.instances.filter(volume__user=user).count()>0 and \
|
||||
first.width == v.width and first.height == v.height:
|
||||
return True
|
||||
return False
|
||||
videos = filter(check, videos)
|
||||
def get_files(self, user):
|
||||
#FIXME: limit by user
|
||||
return [f.json() for f in self.files.all()]
|
||||
|
||||
def users_with_files(self):
|
||||
return User.objects.filter(volumes__files__file__item=self).distinct()
|
||||
|
||||
def update_wanted(self):
|
||||
users = self.users_with_files()
|
||||
if users.filter(is_superuser=True).count()>0:
|
||||
files = self.files.filter(instances__volume__user__is_superuser=True)
|
||||
users = User.objects.filter(volumes__files__file__item__in=files,
|
||||
is_superuser=True).distinct()
|
||||
elif users.filter(is_staff=True).count()>0:
|
||||
files = self.files.filter(instances__volume__user__is_staff=True)
|
||||
users = User.objects.filter(volumes__files__file__item__in=files,
|
||||
is_staff=True).distinct()
|
||||
else:
|
||||
audio = self.files.filter(is_main=True, is_audio=True, available=True)
|
||||
if audio.count()>0:
|
||||
first = audio[0]
|
||||
user = first.instances.all()[0].volume.user
|
||||
#only take videos from same user and with same width/height
|
||||
def check(v):
|
||||
if v.instances.filter(volume__user=user).count()>0:
|
||||
return True
|
||||
return False
|
||||
videos = filter(check, audio)
|
||||
|
||||
return videos
|
||||
files = self.files.all()
|
||||
files = files.filter(is_video=True, instances__extra=False, instances__gt=0).order_by('part')
|
||||
folders = list(set([f.folder for f in files]))
|
||||
if len(folders) > 1:
|
||||
files = files.filter(folder=folders[0])
|
||||
files.update(wanted=True)
|
||||
|
||||
def update_selected(self):
|
||||
files = archive.models.File.objects.filter(item=self,
|
||||
streams__available=True,
|
||||
streams__source=None)
|
||||
def get_level(users):
|
||||
if users.filter(is_superuser=True).count() > 0: level = 0
|
||||
elif users.filter(is_staff=True).count() > 0: level = 1
|
||||
else: level = 2
|
||||
return level
|
||||
|
||||
users = User.objects.filter(volumes__files__file__in=self.files.filter(active=True)).distinct()
|
||||
current_level = get_level(users)
|
||||
|
||||
users = User.objects.filter(volumes__files__file__in=files).distinct()
|
||||
possible_level = get_level(users)
|
||||
|
||||
if possible_level < current_level:
|
||||
files = self.files.filter(instances__volume__user__in=users).order_by('part')
|
||||
#FIXME: this should be instance folders
|
||||
folders = list(set([f.folder
|
||||
for f in files.filter(is_video=True, instances__extra=False)]))
|
||||
files = files.filter(folder__startswith=folders[0])
|
||||
files.update(active=True)
|
||||
self.rendered = False
|
||||
self.save()
|
||||
self.update_timeline()
|
||||
|
||||
def make_torrent(self):
|
||||
base = self.path('torrent')
|
||||
|
|
@ -751,26 +776,25 @@ class Item(models.Model):
|
|||
base = os.path.abspath(os.path.join(settings.MEDIA_ROOT, base))
|
||||
size = 0
|
||||
duration = 0.0
|
||||
if len(self.main_videos()) == 1:
|
||||
streams = self.streams()
|
||||
if streams.count() == 1:
|
||||
url = "%s/torrent/%s.webm" % (self.get_absolute_url(),
|
||||
quote(self.get('title').encode('utf-8')))
|
||||
video = "%s.webm" % base
|
||||
v = self.main_videos()[0]
|
||||
v = streams[0]
|
||||
os.symlink(v.video.path, video)
|
||||
info = ox.avinfo(video)
|
||||
size = info.get('size', 0)
|
||||
duration = info.get('duration', 0.0)
|
||||
size = v.video.size
|
||||
duration = v.duration
|
||||
else:
|
||||
url = "%s/torrent/" % self.get_absolute_url()
|
||||
part = 1
|
||||
os.makedirs(base)
|
||||
for v in self.main_videos():
|
||||
for v in streams:
|
||||
video = "%s/%s.Part %d.webm" % (base, self.get('title'), part)
|
||||
part += 1
|
||||
os.symlink(v.video.path, video)
|
||||
info = ox.avinfo(video)
|
||||
size += info.get('size', 0)
|
||||
duration += info.get('duration', 0.0)
|
||||
size += v.video.size
|
||||
duration += v.duration
|
||||
video = base
|
||||
|
||||
torrent = '%s.torrent' % base
|
||||
|
|
@ -794,7 +818,7 @@ class Item(models.Model):
|
|||
|
||||
def streams(self):
|
||||
return [video.streams.filter(source=None, available=True)[0]
|
||||
for video in self.main_videos()]
|
||||
for video in self.files.filter(is_video=True, active=True)]
|
||||
|
||||
def update_timeline(self, force=False):
|
||||
config = site_config()
|
||||
|
|
@ -846,8 +870,7 @@ class Item(models.Model):
|
|||
else:
|
||||
poster= self.path('poster.jpg')
|
||||
path = os.path.abspath(os.path.join(settings.MEDIA_ROOT, poster))
|
||||
posters = glob(path.replace('.jpg', '*.jpg'))
|
||||
for f in filter(lambda p: not p.endswith('poster.local.jpg'), posters):
|
||||
for f in glob(path.replace('.jpg', '*.jpg')):
|
||||
os.unlink(f)
|
||||
|
||||
def prefered_poster_url(self):
|
||||
|
|
@ -883,7 +906,7 @@ class Item(models.Model):
|
|||
self.poster.save('poster.jpg', ContentFile(f.read()))
|
||||
|
||||
def make_local_poster(self):
|
||||
poster = self.path('poster.local.jpg')
|
||||
poster = self.path('siteposter.jpg')
|
||||
poster = os.path.abspath(os.path.join(settings.MEDIA_ROOT, poster))
|
||||
|
||||
frame = self.get_poster_frame_path()
|
||||
|
|
@ -914,12 +937,14 @@ class Item(models.Model):
|
|||
ox.makedirs(os.path.join(settings.MEDIA_ROOT,self.path()))
|
||||
p = subprocess.Popen(cmd)
|
||||
p.wait()
|
||||
for f in glob(poster.replace('.jpg', '*.jpg')):
|
||||
os.unlink(f)
|
||||
return poster
|
||||
|
||||
def poster_frames(self):
|
||||
frames = []
|
||||
offset = 0
|
||||
for f in self.main_videos():
|
||||
for f in self.files(active=True, is_video=True):
|
||||
for ff in f.frames.all():
|
||||
frames.append({
|
||||
'position': offset + ff.position,
|
||||
|
|
@ -976,7 +1001,7 @@ class Item(models.Model):
|
|||
Annotation.objects.filter(layer=layer,item=self).delete()
|
||||
offset = 0
|
||||
language = ''
|
||||
languages = [f.language for f in self.files.filter(is_main=True, is_subtitle=True,
|
||||
languages = [f.language for f in self.files.filter(active=True, is_subtitle=True,
|
||||
available=True)]
|
||||
if languages:
|
||||
if 'en' in languages:
|
||||
|
|
@ -985,7 +1010,7 @@ class Item(models.Model):
|
|||
language = ''
|
||||
else:
|
||||
language = languages[0]
|
||||
for f in self.files.filter(is_main=True, is_subtitle=True,
|
||||
for f in self.files.filter(active=True, is_subtitle=True,
|
||||
available=True, language=language).order_by('part'):
|
||||
user = f.instances.all()[0].volume.user
|
||||
for data in f.srt(offset):
|
||||
|
|
@ -999,7 +1024,7 @@ class Item(models.Model):
|
|||
)
|
||||
annotation.save()
|
||||
duration = self.files.filter(Q(is_audio=True)|Q(is_video=True)) \
|
||||
.filter(is_main=True, available=True, part=f.part)
|
||||
.filter(active=True, available=True, part=f.part)
|
||||
if duration:
|
||||
duration = duration[0].duration
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@ urlpatterns = patterns("item.views",
|
|||
|
||||
#poster
|
||||
(r'^(?P<id>[A-Z0-9].+)/poster(?P<size>\d+)\.jpg$', 'poster'),
|
||||
(r'^(?P<id>[A-Z0-9].+)/poster\.jpg$', 'poster_local'),
|
||||
(r'^(?P<id>[A-Z0-9].+)/siteposter(?P<size>\d+)\.jpg$', 'siteposter'),
|
||||
(r'^(?P<id>[A-Z0-9].+)/poster\.jpg$', 'siteposter'),
|
||||
(r'^(?P<id>[A-Z0-9].+)/frameposter(?P<position>\d+).jpg$', 'poster_frame'),
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import os.path
|
|||
from datetime import datetime, timedelta
|
||||
import mimetypes
|
||||
|
||||
import Image
|
||||
from django.db.models import Count, Sum, Max
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
|
|
@ -343,6 +344,8 @@ def get(request):
|
|||
info['stream'] = item.get_stream()
|
||||
if not data['keys'] or 'layers' in data['keys']:
|
||||
info['layers'] = item.get_layers(request.user)
|
||||
if data['keys'] and 'files' in data['keys']:
|
||||
info['files'] = item.get_files(request.user)
|
||||
response['data'] = info
|
||||
else:
|
||||
response = json_response(status=403, text='permission denied')
|
||||
|
|
@ -582,7 +585,7 @@ def poster_frame(request, id, position):
|
|||
raise Http404
|
||||
|
||||
|
||||
def image_to_response(item, image, size=None):
|
||||
def image_to_response(image, size=None):
|
||||
if size:
|
||||
size = int(size)
|
||||
path = image.path.replace('.jpg', '.%d.jpg'%size)
|
||||
|
|
@ -596,10 +599,17 @@ def image_to_response(item, image, size=None):
|
|||
path = image.path
|
||||
return HttpFileResponse(path, content_type='image/jpeg')
|
||||
|
||||
def poster_local(request, id):
|
||||
def siteposter(request, id, size=None):
|
||||
item = get_object_or_404(models.Item, itemId=id)
|
||||
poster = item.path('poster.local.jpg')
|
||||
poster = item.path('siteposter.jpg')
|
||||
poster = os.path.abspath(os.path.join(settings.MEDIA_ROOT, poster))
|
||||
if size:
|
||||
image = Image.open(poster)
|
||||
image_size = max(image.size)
|
||||
if size < image_size:
|
||||
path = poster.replace('.jpg', '.%d.jpg'%size)
|
||||
extract.resize_image(poster, path, size=size)
|
||||
poster = path
|
||||
return HttpFileResponse(poster, content_type='image/jpeg')
|
||||
|
||||
def poster(request, id, size=None):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue