#!/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)