pandora_render/render_public_edits.py
2024-04-18 11:17:30 +02:00

117 lines
3.9 KiB
Python
Executable file

#!/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)