pandora_prelinger/data.py

146 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
import json
import os
from os.path import join, normpath, dirname
import ox
from django.conf import settings
import item.models
import archive.models
base = normpath(dirname(__file__))
with open(join(base, 'prelinger.json')) as f:
data = json.load(f)
def get_item(archive):
qs = item.models.Item.objects.filter(data__contains='"archive": "%s"'%archive)
if qs.count():
return qs[0], False
return item.models.Item(), True
def update_item(d, add_only=False):
info = {{
'description': 'summary',
'id': 'archive',
'mp4': 'stream',
'subject': 'topic',
}.get(k,k):d[k] for k in d}
for k in ('type', 'flv', 'video'):
if k in info:
del info[k]
if 'year' in info:
if isinstance(info['year'], list):
info['year'] = info['year'][0]
if isinstance(info['year'], str):
info['year'] = info['year'][:4]
extra = []
for key in ('director', 'publisher', 'creator', 'sponsor'):
if key in info:
if len(info[key]) > 200:
extra.append(info[key])
info[key] = [info[key].split('.')[0][:200]]
else:
info[key] = [info[key]]
if extra:
info['summary'] = info.get('summary', '') + '\n\n' + '\n\n'.join(extra)
if 'summary' in info:
info['summary'] = ox.sanitize_html(info['summary'].replace('\n', '<br>\n'))
if 'title' in info:
info['title'] = info['title'].replace('(%s)' % info.get('year', ''), '').strip()
info['title'] = ox.normalize_title(info['title'])
if info.get('sound') in ('b&w', 'b/w'):
info['sound'], info['color'] = info['color'], info['sound']
if 'sound' in info:
info['sound'] = [{
'sound': 'Sound',
'sd': 'Sound',
'yes': 'Sound',
'no': 'Silent',
'si': 'Silent',
'silen': 'Silent',
'silent': 'Silent',
}.get(c.lower(), c) for c in info['sound'].split('/')]
if 'color' in info:
info['color'] = [{
'color': 'Color',
'c': 'Color',
'b': 'B&W',
'w': 'B&W',
'sepia': 'Sepia',
'tinted': 'Tinted',
'tinted B&W': 'B&W (tinted)',
'black and white': 'B&W',
'black & white': 'B&W',
'bw': 'B&W',
'b&w': 'B&W',
}.get(c.lower(), c) for c in info['color'].replace('b/w', 'b&w').replace('B/W', 'B&W').split('/')]
i, created = get_item(info['archive'])
if add_only and not created:
return
print(info['archive'], info.get('title', 'Untitled'))
for k in info:
i.data[k] = info[k]
i.level = 0
i.save()
if created:
i.save()
i.make_poster(True)
def update_items(add_only=False):
for d in data:
update_item(d, add_only)
def update_item_stream(i, force=False):
if update_stream(i) or force:
for s in i.streams():
s.make_timeline()
i.save()
i.update_timeline()
i.make_poster(True)
return True
return False
def update_stream(i):
stream_url = i.data.get('stream')
if not stream_url:
return False
for s in i.streams():
if s.info['url'] != stream_url:
s.delete()
else:
return False
oshash = ox.net.oshash(stream_url)
if oshash == 'IOError':
print('invalid url', stream_url)
return False
f, created = archive.models.File.objects.get_or_create(oshash=oshash)
f.item = i
f.selected = True
f.available = True
f.info['extension'] = 'mp4'
f.path = stream_url
f.save()
s, created = archive.models.Stream.objects.get_or_create(source=None, file=f)
if created:
s.info['url'] = stream_url
s.available = True
s.resolution = 480
s.format = 'mp4'
s.save()
return True
return False
def update_streams():
import itemlist.models
l = itemlist.models.List.get('j:with Video')
for i in item.models.Item.objects.all():
print(i)
if update_item_stream(i):
l.add(i)