GSM Audio Pocket Knife
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
gapk/libgsmhr/fetch_sources.py

75 lines
1.5 KiB

#!/usr/bin/env python3
import logging as log
import urllib.request
import io
import os
import sys
import zipfile
URL = "http://www.3gpp.org/ftp/Specs/archive/06_series/06.06/0606-421.zip"
def get_zipfile(data: bytes) -> zipfile.ZipFile:
return zipfile.ZipFile(io.BytesIO(data), 'r')
def get_subfile_data(data: bytes, filename: str):
log.debug('Unpacking \'%s\'', filename)
z = get_zipfile(data)
return z.read(filename)
def process_file(z, e):
log.debug('Processing file \'%s\'', e.filename.lower())
fh = open(os.path.basename(e.filename.lower()), 'wb')
d = z.read(e).replace(b'\r', b'')
fh.write(d)
fh.close()
def main(*args):
# Args
if len(args) != 2:
print("Usage: %s target_dir" % args[0])
return
tgt = args[1]
# Create and go to target dir
if not os.path.isdir(tgt):
os.mkdir(tgt)
os.chdir(tgt)
# Get the original data
log.info('Requesting file: %s', URL)
with urllib.request.urlopen(URL) as response:
log.debug('Response code: %d', response.code)
assert response.code == 200
for h in ('Last-Modified', 'Content-Type', 'Content-Length'):
log.debug('%s: %s', h, response.getheader(h))
log.info('Downloading %d bytes...', response.length)
d = response.read()
# Get DISK.zip
d = get_subfile_data(d, 'DISK.zip')
# Get Dir_C.zip
d = get_subfile_data(d, 'Dir_C.zip')
# Get zip file object
z = get_zipfile(d)
# Save each file
for e in z.filelist:
process_file(z, e)
log.basicConfig(format='[%(levelname)s] %(filename)s:%(lineno)d %(message)s', level=log.DEBUG)
if __name__ == '__main__':
main(*sys.argv)