import json, os, re, subprocess, sys from datetime import datetime from pathlib import Path from zipfile import ZipFile DEAL_CONVERT_PATH = os.environ.get('LIGA_BOARDS_DEAL_CONVERT_PATH') PBN_EVENT_TAG = re.compile('\[Event ".*"\]') def deal_convert(source_file, target_files, params=''): command = 'python2 %s %s %s %s' % (DEAL_CONVERT_PATH, params, source_file, ' '.join(target_files)) try: subprocess.check_output(command, stderr=subprocess.STDOUT, universal_newlines=True, shell=True) except subprocess.CalledProcessError as ex: print('ERROR: %s' % (ex.output), file=sys.stderr) def check_path(target_path, source_paths): source_mtime = max([path.stat().st_mtime for path in source_paths]) if target_path.exists(): if source_mtime <= target_path.stat().st_mtime: return True print('Target path %s older than source, regenerating' % (target_path), file=sys.stderr) target_path.unlink() else: print('Target path %s does not exist, generating' % (target_path), file=sys.stderr) target_path.parent.mkdir(parents=True, exist_ok=True) return False def ensure_pbn(source_id, config_name, event_name): target_path = Path('output') / config_name / 'files' / (source_id + '.pbn') source_path = Path('pbns') / config_name / (source_id + '.pbn') if check_path(target_path, [source_path]): return target_path deal_convert(str(source_path), [str(target_path)], '--jfr') with open(target_path) as target_file: pbn_content = target_file.read() pbn_content = re.sub(PBN_EVENT_TAG, '[Event "%s"]' % (event_name), pbn_content) with open(target_path, 'w') as target_file: target_file.write(pbn_content) return target_path def ensure_pdf(source_id, config_name): target_path = Path('output') / config_name / 'files' / (source_id + '.pdf') source_path = Path('output') / config_name / 'files' / (source_id + '.pbn') if check_path(target_path, [source_path]): return target_path deal_convert(str(source_path), [str(target_path)]) return target_path def ensure_zip(source_id, config_name, source_files): target_path = Path('output') / config_name / 'files' / (source_id + '.zip') source_paths = [Path(path) for path in source_files] if check_path(target_path, source_paths): # TODO: check if file list haven't changed return target_path with ZipFile(target_path, 'w') as zip_file: for source_file in source_files: zip_file.write(source_file, arcname=source_file.name) return target_path output_files = [] config_dir = Path('config') for config_path in config_dir.glob('*.json'): config_name = config_path.stem print('Found config "%s" in %s' % (config_name, config_path), file=sys.stderr) with open(config_path) as config_file: config = json.load(config_file) output_dir = Path('output') / config_name output_dir.mkdir(parents=True, exist_ok=True) content = '' for section in config['sections']: content += '%s' % (section['title']) for dealset in section['sets']: set_enabled = False set_finished = True set_content = '%s' % (dealset['title']) set_files = [] for pbn in dealset['files']: if pbn.get('enabled', 0): set_files.append( ensure_pbn(pbn['path'], config_name, pbn['title'])) set_files.append( ensure_pdf(pbn['path'], config_name)) set_enabled = True set_content += '' set_content += '%s' % (pbn['name']) for filetype in ('pbn', 'pdf'): set_content += '%s' % (pbn['path'], filetype, filetype) set_content += '' else: set_finished = False output_files += set_files if set_finished and 'zip' in dealset: output_files.append( ensure_zip(dealset['zip']['id'], config_name, set_files)) set_content += '' set_content += '%s' % (dealset['zip'].get('title', 'cały mecz')) set_content += 'zip' % (dealset['zip']['id']) set_content += '' if set_enabled: content += set_content content += ' ' with open('template/%s.html' % (config_name)) as template_file: template = template_file.read() with open('template/%s.logo.html' % (config_name)) as logoh_file: template = template.replace('', logoh_file.read()) template = template.replace('', content) template = template.replace('', datetime.now().strftime('%Y-%m-%d %X')) output_path = output_dir / 'index.html' with open(output_path, 'w') as output_file: output_file.write(template) print('Written output file %s' % (output_path), file=sys.stderr) output_files.append(output_path) existing_files = Path('output').glob('**/*.*') for existing_file in existing_files: if not existing_file.name.startswith('.') and existing_file not in output_files: print('Extraneous file: %s, deleting' % (existing_file)) existing_file.unlink()