From 130c790dc7780f39581dee29983e5695e9080ced Mon Sep 17 00:00:00 2001 From: j Date: Tue, 16 May 2017 12:59:32 +0000 Subject: [PATCH] render subtitles --- subtitles.py | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 subtitles.py diff --git a/subtitles.py b/subtitles.py new file mode 100644 index 0000000..256be89 --- /dev/null +++ b/subtitles.py @@ -0,0 +1,104 @@ +#!/usr/bin/python3 +import os +import sys +import json +import subprocess +from collections import defaultdict +import string +from glob import glob +from copy import deepcopy + +import ox +import ox.web.auth + + +base_url = 'http://127.0.0.1:2620' + +FRAME_DURATION = 1/60 +MAX_DURATION = 40 + +HIDDEN_TAGS = [ + "women with white males", + "gene z hanrahan" +] + +# items to not use at all +BLACKLIST = [ + 'XN' +] + +api = None + +def get_api(): + global api + if not api: + api = ox.API(base_url + '/api/') + api.signin(**ox.web.auth.get('cdosea')) + + +def get_subtitles(): + get_api() + items = api.find({ + 'query': { + 'conditions': [{'key': 'tags', 'value': 'Vocal', 'operator': '=='}] + }, + 'keys': ['id', 'title'], + 'range': [0, 1000]})['data']['items'] + for item in items: + ''' + info = api.findMedia({ + 'query': { + 'conditions': [ + {'key': 'id', 'operator': '==', 'value': item['id']} + ] + }, + 'keys': ['id', 'extension'], + 'range': [0, 1] + })['data']['items'][0] + ''' + item['subtitles'] = api.get({'id': item['id'], 'keys': ['layers']})['data']['layers']['subtitles'] + + return items + +def get_subtitles(items, id): + for item in items: + if item['title'].startswith(id): + return deepcopy(item['subtitles']) + +def render_subtitles(item_json, output_json, output_srt): + with open(item_json) as fd: + item = json.load(fd) + + subtitles = [] + position = 0 + for clip in item['vocals']: + if not clip.get('blank'): + # vocals/A/A4_chaton.wav + id = clip['path'].split('/')[-1][:2] + clip_subtitles = get_subtitles(items, id) + for sub in clip_subtitles: + srt = {} + srt['in'] = sub['in'] + position + srt['out'] = sub['out'] + position + srt['value'] = sub['value'].replace('
', '') + subtitles.append(srt) + position += clip['duration'] + + with open(output_srt, 'wb') as fd: + fd.write(ox.srt.encode(subtitles)) + with open(output_json, 'w') as fd: + json.dump(subtitles, fd, indent=4, ensure_ascii=False) + +if __name__ == '__main__': + if os.path.exists('subtitles.json'): + items = json.load(open('subtitles.json')) + else: + items = get_subtitles() + with open('subtitles.json', 'w') as fd: + json.dump(items, fd, indent=4, ensure_ascii=False) + + for item_json in glob('output/*/*.json'): + prefix = 'public/' + item_json.split('/')[-1][0].lower() + item_json.split('/')[-2] + '.1080p.' + output_json = prefix + 'json' + output_srt = prefix + 'srt' + render_subtitles(item_json, output_json, output_srt)