#!/usr/bin/env python3 import json import os import requests import sys from zipfile import ZipFile def warn(*args, **kwargs): print(*args, **kwargs, file=sys.stderr) def download_file(url, local_filename): # From https://stackoverflow.com/questions/16694907/ # download-large-file-in-python-with-requests if os.path.exists(local_filename): warn('Using existing', local_filename) return warn('Downloading', local_filename) with requests.get(url, stream=True) as r: r.raise_for_status() with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) return local_filename bin_name = 'qpdf-external-libs-bin.zip' src_name = 'qpdf-external-libs-src.zip' dir_name = 'external-libs-dist' os.makedirs(dir_name, exist_ok=True) github_headers = { 'content-type': 'application/json', } try: token = sys.argv[1] github_headers['authorization'] = f'Bearer {token}' except IndexError: print('WARNING: unauthenticated call to github API' ' will be subject to more stringent rate limits.') r = requests.get( 'https://api.github.com/repos/qpdf/external-libs/releases', headers=github_headers) if r.status_code >= 400: exit(f'GitHub API call returned status {r.status_code}: {r.text}') releases = json.loads(r.text) by_tag = sorted( [(r['tag_name'], r) for r in releases if r['prerelease'] is False], reverse=True) latest = by_tag[0][1] bin_url = None src_url = None for i in latest['assets']: if i['name'] == bin_name: bin_url = i['browser_download_url'] elif i['name'] == src_name: src_url = i['browser_download_url'] print(bin_url) download_file(bin_url, f'{dir_name}/{bin_name}') download_file(src_url, f'{dir_name}/{src_name}') print('\n** external library information **') with ZipFile(f'{dir_name}/{src_name}') as z1: with z1.open('external-libs-src/versions') as z2: print(z2.read().decode())