add render_public_edits
This commit is contained in:
parent
4dcf945a62
commit
f96815c175
3 changed files with 142 additions and 0 deletions
0
edits/index.html
Normal file
0
edits/index.html
Normal file
25
edits/player.html
Normal file
25
edits/player.html
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<body></body>
|
||||||
|
<script>
|
||||||
|
var mp4 = document.location.hash.substr(1)
|
||||||
|
var vtt = mp4.replace(/.mp4/, '.vtt')
|
||||||
|
var video = document.createElement('video')
|
||||||
|
video.src = mp4
|
||||||
|
video.controls = true
|
||||||
|
var track = document.createElement('track')
|
||||||
|
track.label = 'English'
|
||||||
|
track.kind = 'subtitles'
|
||||||
|
track.srclang = 'en'
|
||||||
|
track.default = true
|
||||||
|
track.src = vtt
|
||||||
|
video.appendChild(track)
|
||||||
|
document.body.appendChild(video)
|
||||||
|
document.body.style.background = 'black'
|
||||||
|
document.body.style.textAlign = 'center'
|
||||||
|
document.body.style.display = 'flex'
|
||||||
|
document.body.style.height = '100vh'
|
||||||
|
document.body.style.overflow = 'hidden'
|
||||||
|
document.body.style.margin = '0'
|
||||||
|
document.body.style.padding = '0'
|
||||||
|
video.style.width = '100%'
|
||||||
|
video.style.height = '100%'
|
||||||
|
</script>
|
117
render_public_edits.py
Executable file
117
render_public_edits.py
Executable file
|
@ -0,0 +1,117 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from urllib.parse import quote
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import unicodedata
|
||||||
|
|
||||||
|
|
||||||
|
import ox
|
||||||
|
import ox.api
|
||||||
|
|
||||||
|
|
||||||
|
sort_edits = {}
|
||||||
|
|
||||||
|
|
||||||
|
def normalize(id):
|
||||||
|
name = id.split(":")[0]
|
||||||
|
id = id.replace(':', '_').replace('/', '_')
|
||||||
|
prefix = hashlib.sha1(('firends' + name).encode()).hexdigest()[:8]
|
||||||
|
return '%s_%s' % (prefix, id)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
site = sys.argv[1]
|
||||||
|
users = sys.argv[2:]
|
||||||
|
api = ox.api.signin('https://%s/api/' % site)
|
||||||
|
|
||||||
|
public_names = []
|
||||||
|
|
||||||
|
r = api.findEdits({
|
||||||
|
'query': {
|
||||||
|
'conditions': [{'key': 'status', 'operator': '!==', 'value': 'private'}]
|
||||||
|
},
|
||||||
|
'range': [0, 1000],
|
||||||
|
'keys': ['id', 'status', 'modified', 'type']
|
||||||
|
})
|
||||||
|
for edit in r['data']['items']:
|
||||||
|
id = edit['id']
|
||||||
|
if users and id.split(':')[0] not in users:
|
||||||
|
continue
|
||||||
|
for sort in sort_edits.get(id, ['index']):
|
||||||
|
if edit['type'] == 'smart' and sort == 'index':
|
||||||
|
sort = 'year'
|
||||||
|
edit_name = 'edits/%s_%s.json' % (normalize(id), sort)
|
||||||
|
modified = int(datetime.strptime(edit['modified'], '%Y-%m-%dT%H:%M:%SZ').timestamp())
|
||||||
|
if not os.path.exists(edit_name) or os.path.getmtime(edit_name) < modified:
|
||||||
|
print('update', id, sort)
|
||||||
|
url = 'https://%s/edits/%s/list/%s' % (site, quote(id.replace('_', '\t')), sort)
|
||||||
|
print(url)
|
||||||
|
cmd = ['../edit.py', url, '-r', '720', '-s', 'local', '-o', edit_name]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
cmd = ['../ffmpeg.py', '-r', '720', edit_name]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
srt = edit_name.replace('.json', '.srt')
|
||||||
|
vtt = edit_name.replace('.json', '.vtt')
|
||||||
|
cmd = [
|
||||||
|
'ffmpeg',
|
||||||
|
'-hide_banner',
|
||||||
|
'-nostats', '-loglevel', 'error',
|
||||||
|
'-y', '-i', srt, vtt
|
||||||
|
]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
public_names.append(edit_name.replace('.json', ''))
|
||||||
|
|
||||||
|
#print('\n'.join(public_names))
|
||||||
|
#print('--')
|
||||||
|
for f in os.listdir('edits'):
|
||||||
|
if f.endswith('.html'):
|
||||||
|
continue
|
||||||
|
f = 'edits/' + f
|
||||||
|
if '.' in f:
|
||||||
|
name, ext = f.rsplit('.', 1)
|
||||||
|
if ext not in ('json', 'mp4', 'srt', 'vtt'):
|
||||||
|
print('skip', ext, f)
|
||||||
|
continue
|
||||||
|
if name not in public_names:
|
||||||
|
print('remove', f, name, ext)
|
||||||
|
os.unlink(f)
|
||||||
|
|
||||||
|
mp4s = [f for f in os.listdir('edits') if f.endswith('.mp4')]
|
||||||
|
html = {}
|
||||||
|
for mp4 in sorted(mp4s):
|
||||||
|
prefix = mp4.split('_')[0]
|
||||||
|
if prefix not in html:
|
||||||
|
html[prefix] = [
|
||||||
|
'''
|
||||||
|
<style>
|
||||||
|
.light {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<h1>%s public edits</h1>
|
||||||
|
''' % mp4.split('_')[1]
|
||||||
|
]
|
||||||
|
title = ' '.join(mp4.replace('.mp4', '').split('_')[2:])
|
||||||
|
info = mp4.replace('.mp4', '.json')
|
||||||
|
srt = mp4.replace('.mp4', '.srt')
|
||||||
|
date = datetime.fromtimestamp(os.path.getmtime('edits/' + mp4))
|
||||||
|
date = date + timedelta(hours=2)
|
||||||
|
date = date.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
line = F'{title} <span class="light">({date})</span><br><a href="{quote(mp4)}">mp4</a> - <a href="{quote(srt)}">subtitles</a> - <a href="player.html#{quote(mp4)}">play</a> - <a href="{quote(info)}">metadata</a><br>\n'
|
||||||
|
html[prefix].append(line)
|
||||||
|
for prefix, data in html.items():
|
||||||
|
data = '<br>'.join(data)
|
||||||
|
current = ''
|
||||||
|
filename = 'edits/%s.html' % prefix
|
||||||
|
if os.path.exists(filename):
|
||||||
|
with open(filename) as fd:
|
||||||
|
current = fd.read()
|
||||||
|
if data != current:
|
||||||
|
with open(filename, 'w') as fd:
|
||||||
|
fd.write(data)
|
||||||
|
|
Loading…
Reference in a new issue