use site_config for video settings

This commit is contained in:
j 2011-08-19 17:37:37 +02:00
parent 09ee5fc417
commit d9aa4a230b
7 changed files with 39 additions and 71 deletions

View file

@ -346,6 +346,13 @@
"columnWidth": 60, "columnWidth": 60,
"format": {"type": "unit", "args": ["kbps"]} "format": {"type": "unit", "args": ["kbps"]}
}, },
{
"id": "parts",
"title": "Parts",
"type": "integer",
"columnWidth": 60,
"rightsLevel": 1
},
{ {
"id": "numberoffiles", "id": "numberoffiles",
"title": "Number of Files", "title": "Number of Files",

View file

@ -17,6 +17,7 @@ import ox
from ox.normalize import canonicalTitle from ox.normalize import canonicalTitle
import chardet import chardet
from app.models import site_config
from item import utils from item import utils
from item.models import Item from item.models import Item
from person.models import get_name_sort from person.models import get_name_sort
@ -248,10 +249,11 @@ class File(models.Model):
def save_chunk(self, chunk, chunk_id=-1, done=False): def save_chunk(self, chunk, chunk_id=-1, done=False):
if not self.available: if not self.available:
config = site_config()['video']
stream, created = Stream.objects.get_or_create( stream, created = Stream.objects.get_or_create(
file=self, file=self,
resolution=settings.VIDEO_RESOLUTIONS[0], resolution=config['resolutions'][0],
format=settings.VIDEO_FORMATS[0]) format=config['formats'][0])
if created: if created:
stream.video.save(stream.name(), chunk) stream.video.save(stream.name(), chunk)
else: else:
@ -489,9 +491,9 @@ class Stream(models.Model):
return self.file.path(name) return self.file.path(name)
def extract_derivatives(self): def extract_derivatives(self):
self.make_timeline() config = site_config()['video']
for resolution in settings.VIDEO_RESOLUTIONS: for resolution in config['resolutions']:
for f in settings.VIDEO_FORMATS: for f in config['formats']:
derivative, created = Stream.objects.get_or_create(file=self.file, derivative, created = Stream.objects.get_or_create(file=self.file,
resolution=resolution, format=f) resolution=resolution, format=f)
if created: if created:

View file

@ -14,6 +14,7 @@ from ox.django.decorators import login_required_json
from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response from ox.django.shortcuts import render_to_json_response, get_object_or_404_json, json_response
from ox.django.views import task_status from ox.django.views import task_status
from app.models import site_config
from item import utils from item import utils
from item.models import get_item from item.models import get_item
from item.views import parse_query from item.views import parse_query
@ -111,7 +112,8 @@ actions.register(update, cache=False)
@login_required_json @login_required_json
def encodingProfile(request): def encodingProfile(request):
profile = "%sp.%s" % (settings.VIDEO_RESOLUTIONS[0], settings.VIDEO_FORMATS[0]) config = site_config()['video']
profile = "%sp.%s" % (config['resolutions'][0], config['formats'][0])
response = json_response({'profile': profile}) response = json_response({'profile': profile})
return render_to_json_response(response) return render_to_json_response(response)
actions.register(encodingProfile) actions.register(encodingProfile)
@ -166,13 +168,16 @@ class VideoChunkForm(forms.Form):
def firefogg_upload(request): def firefogg_upload(request):
profile = request.GET['profile'] profile = request.GET['profile']
oshash = request.GET['id'] oshash = request.GET['id']
config = site_config()['video']
video_profile = "%sp.%s" % (config['resolutions'][0], config['formats'][0])
#handle video upload #handle video upload
if request.method == 'POST': if request.method == 'POST':
#post next chunk #post next chunk
if 'chunk' in request.FILES and oshash: if 'chunk' in request.FILES and oshash:
f = get_object_or_404(models.File, oshash=oshash) f = get_object_or_404(models.File, oshash=oshash)
form = VideoChunkForm(request.POST, request.FILES) form = VideoChunkForm(request.POST, request.FILES)
if form.is_valid() and profile == settings.VIDEO_PROFILE and f.editable(request.user): if form.is_valid() and profile == video_profile and f.editable(request.user):
c = form.cleaned_data['chunk'] c = form.cleaned_data['chunk']
chunk_id = form.cleaned_data['chunkId'] chunk_id = form.cleaned_data['chunkId']
response = { response = {
@ -194,7 +199,7 @@ def firefogg_upload(request):
response['done'] = 1 response['done'] = 1
return render_to_json_response(response) return render_to_json_response(response)
#init upload #init upload
elif oshash and profile == settings.VIDEO_PROFILE: elif oshash and profile == video_profile:
#404 if oshash is not know, files must be registered via update api first #404 if oshash is not know, files must be registered via update api first
f = get_object_or_404(models.File, oshash=oshash) f = get_object_or_404(models.File, oshash=oshash)
if f.editable(request.user): if f.editable(request.user):

View file

@ -792,49 +792,16 @@ class Item(models.Model):
return [video.streams.filter(source=None)[0] for video in self.main_videos()] return [video.streams.filter(source=None)[0] for video in self.main_videos()]
def update_streams(self, force=False): def update_streams(self, force=False):
files = {} streams = self.streams()
for f in self.main_videos(): self.make_timeline()
files[utils.sort_title(f.name)] = f.video.path self.data['cuts'] = extract.cuts(self.timeline_prefix)
if force or self.stream_info != files: self.data['color'] = extract.average_color(self.timeline_prefix)
self.stream_info = files #extract.timeline_strip(self, self.data['cuts'], stream.info, self.timeline_prefix[:-8])
stream, created = Stream.objects.get_or_create(item=self, self.make_local_poster()
profile=settings.VIDEO_PROFILE) self.make_poster()
stream.video.name = stream.path() self.make_icon()
cmd = [] self.rendered = streams != []
if os.path.exists(stream.video.path): self.save()
os.unlink(stream.video.path)
ox.makedirs(os.path.dirname(stream.video.path))
if len(files.values()) > 1:
if len(files.values()) > 4:
print "FIXME: to many files for this item, not merging entire tv shows"
return
for f in sorted(files):
cmd.append('+')
cmd.append(files[f])
cmd = [ 'mkvmerge', '-o', stream.video.path ] + cmd[1:]
#print cmd
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
p.wait()
else:
os.symlink(files.values()[0], stream.video.path)
stream.save()
self.make_timeline()
if 'video' in stream.info and stream.info['video']:
v = stream.info['video'][0]
self.stream_aspect = v['width']/v['height']
self.data['cuts'] = extract.cuts(self.timeline_prefix)
self.data['color'] = extract.average_color(self.timeline_prefix)
#extract.timeline_strip(self, self.data['cuts'], stream.info, self.timeline_prefix[:-8])
stream.extract_derivatives()
self.make_local_poster()
self.make_poster()
self.make_icon()
self.rendered = files != {}
self.save()
''' '''
Poster related functions Poster related functions
@ -886,7 +853,9 @@ class Item(models.Model):
return None return None
def make_timeline(self): def make_timeline(self):
print "FIXME, needs to build timeline from parts" streams = self.streams()
if len(streams) > 1:
print "FIXME, needs to build timeline from parts"
def make_poster(self, force=False): def make_poster(self, force=False):
if not self.poster or force: if not self.poster or force:
@ -963,7 +932,7 @@ class Item(models.Model):
if frames and len(frames) > int(self.poster_frame): if frames and len(frames) > int(self.poster_frame):
return frames[int(self.poster_frame)]['path'] return frames[int(self.poster_frame)]['path']
else: else:
size = int(settings.VIDEO_PROFILE.split('.')[0][:-1]) size = site_config()['video']['resolutions'][0]
return self.frame(self.poster_frame, size) return self.frame(self.poster_frame, size)
if frames: if frames:

View file

@ -697,4 +697,6 @@ def video(request, id, resolution, format, index=None):
response = HttpFileResponse(path, content_type=content_type) response = HttpFileResponse(path, content_type=content_type)
response['Content-Disposition'] = 'attachment; filename="%s"' % filename response['Content-Disposition'] = 'attachment; filename="%s"' % filename
return response return response
if not settings.XSENDFILE and not settings.XACCELREDIRECT:
return redirect(stream.video.url)
return HttpFileResponse(path) return HttpFileResponse(path)

View file

@ -437,7 +437,7 @@
"showSidebar": true, "showSidebar": true,
"sidebarSize": 256, "sidebarSize": 256,
"sitePage": "home", "sitePage": "home",
"theme": "modern", "theme": "classic",
"videoPosition": {}, "videoPosition": {},
"videoScreen": "fit", "videoScreen": "fit",
"videoSize": "small" "videoSize": "small"

View file

@ -169,26 +169,9 @@ SITE_CONFIG = join(PROJECT_ROOT, '0xdb.json')
DEFAULT_SORT = [{"key": "director", "operator": ""}] DEFAULT_SORT = [{"key": "director", "operator": ""}]
DEFAULT_THEME = "classic" DEFAULT_THEME = "classic"
VIDEO_PROFILE = '96p.webm'
VIDEO_DERIVATIVES = []
TRACKER_URL="http://url2torrent.net:6970/announce" TRACKER_URL="http://url2torrent.net:6970/announce"
VIDEO_FORMATS=['webm']
VIDEO_RESOLUTIONS=[96]
#0xdb
'''
VIDEO_FORMATS=['webm', 'mp4']
VIDEO_RESOLUTIONS=[96]
'''
#Pad.ma
'''
VIDEO_FORMATS=['webm', 'mp4']
VIDEO_RESOLUTIONS=[480, 240, 96]
'''
TRANSMISSON_HOST = 'localhost' TRANSMISSON_HOST = 'localhost'
TRANSMISSON_PORT = 9091 TRANSMISSON_PORT = 9091
TRANSMISSON_USER = 'transmission' TRANSMISSON_USER = 'transmission'