|
5 | 5 | import json |
6 | 6 | import logging |
7 | 7 | import os |
| 8 | +import re |
8 | 9 | import requests |
9 | 10 | import sys |
10 | 11 |
|
@@ -92,6 +93,35 @@ def coldcard_version_formatted(ver_str): |
92 | 93 |
|
93 | 94 | return {'success': True, 'message': 'Coldcard firmware version {} downloaded to {}'.format(version, downloaded_file)} |
94 | 95 |
|
| 96 | +def keepkey_download(version=None, bitcoinonly=False): |
| 97 | + versions = feedparser.parse('https://github.com/keepkey/keepkey-firmware/tags.atom') |
| 98 | + releases = versions.entries |
| 99 | + |
| 100 | + def keepkey_id_formatted(id_str): |
| 101 | + tag = id_str.split('/')[-1] |
| 102 | + p = re.compile(r'^v\d+.\d+.\d$') |
| 103 | + return bool(p.match(tag)) |
| 104 | + |
| 105 | + releases = [r for r in releases if keepkey_id_formatted(r['id'])] |
| 106 | + releases.sort(key=lambda r: r["updated_parsed"], reverse=True) |
| 107 | + |
| 108 | + version_info = {} |
| 109 | + if version is None: |
| 110 | + version_info = releases[0] |
| 111 | + version = version_info['id'].split('/')[-1][1:] |
| 112 | + else: |
| 113 | + for r in releases: |
| 114 | + if r['id'].split('/')[-1][1:] == version: |
| 115 | + version_info = r |
| 116 | + break |
| 117 | + else: |
| 118 | + raise BadArgumentError('{} is not available'.format(version)) |
| 119 | + |
| 120 | + url = 'https://github.com/keepkey/keepkey-firmware/releases/download/v{}/firmware.keepkey.bin'.format(version) |
| 121 | + downloaded_file = _download_file(url) |
| 122 | + |
| 123 | + return {'success': True, 'message': 'Keepkey firmware version {} downloaded to {}'.format(version, downloaded_file)} |
| 124 | + |
95 | 125 | def download_firmware(model, version, bitcoinonly=False): |
96 | 126 | dev_model = model.lower() |
97 | 127 | func_name = dev_model + '_download' |
|
0 commit comments