118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
|
#!/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)
|
||
|
|