v2_builder/src/download.py

106 lines
4.2 KiB
Python

import os, os.path, json, urllib, urllib.request, sys, zipfile, shutil, argparse
parser = argparse.ArgumentParser()
# get the arguments
parser.add_argument('--output_path', help='The local path like "V2"', default="V2")
# set to args
args = parser.parse_args()
# this is a full path
MAIN_PATH = args.output_path
# some helper dictionaries
v1_translation_names = json.loads(open("../conf/CrosswireModulesMap.json").read())
# scripts directory
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
# function to create path if not exist
def check_path(path):
if not os.path.isdir(path):
os.makedirs(path)
def zipper(src, dest, filename):
"""Backup files from src to dest."""
base = os.path.basename(src)
newFile = filename+".zip"
# Set the current working directory.
os.chdir(dest)
if os.path.exists(newFile):
os.unlink(newFile)
# Write the zipfile and walk the source directory tree.
with zipfile.ZipFile(newFile, 'w') as zip:
for folder, _ , files in os.walk(src):
for file in files:
zip.write(os.path.join(folder, file),
arcname=os.path.join(folder[len(src):], file),
compress_type=zipfile.ZIP_DEFLATED)
# move back to working directory
os.chdir(CURRENT_DIR)
# make sure the main folder exist
check_path(MAIN_PATH)
# number of items
number = len(v1_translation_names.keys())
each_count = int(98 / number)
counter = 0
# loop the names
for sword_name in v1_translation_names:
# set local file name
file_path = MAIN_PATH+"/"+sword_name+".zip"
# set remote URL
file_url = "http://www.crosswire.org/ftpmirror/pub/sword/packages/rawzip/"+sword_name+".zip"
# notice name
file_name = sword_name+".zip"
# check if file exist locally
if os.path.isfile(file_path):
print('XXX\n{}\n{} already exist\nXXX'.format(counter, file_name))
else:
try:
print('XXX\n{}\nDownloading the RAW format of {}\nXXX'.format(counter, file_name))
urllib.request.urlretrieve(file_url, file_path)
except urllib.error.HTTPError as e:
print('XXX\n{} Download {} failed! {}\nXXX'.format(counter, sword_name, e))
# check if this is a legitimate zip file
if zipfile.is_zipfile(file_path) == False:
os.remove(file_path)
print('XXX\n{}\n{} was removed since it has errors...\nXXX'.format(counter, file_path))
# we try the win repository
file_url = "http://www.crosswire.org/ftpmirror/pub/sword/packages/win/" + sword_name + ".zip"
try:
print('XXX\n{}\nDownloading the WIN format of {}\nXXX'.format(counter, file_name))
urllib.request.urlretrieve(file_url, file_path)
except urllib.error.HTTPError as e:
print('XXX\n{}\n{} Download {} failed! {}\nXXX'.format(sword_name, e))
# again check if this is a legitimate zip file
if zipfile.is_zipfile(file_path) == False:
os.remove(file_path)
print('XXX\n{}\n{} was again removed since it has errors...\nXXX'.format(counter, file_name))
else:
# set local file name
folder_path = MAIN_PATH+"/"+sword_name
folder_raw_path = MAIN_PATH+"/"+sword_name+"/RAW"
data_raw_path = MAIN_PATH+"/"+sword_name+"/data.zip"
print('XXX\n{}\n{} is being converted to RAW format\nXXX'.format(counter, file_name))
# first we extract the WIN format
with zipfile.ZipFile(file_path, 'r') as zip_ref:
zip_ref.extractall(folder_path)
os.remove(file_path)
# now we extract the RAW format
with zipfile.ZipFile(data_raw_path, 'r') as zip_ref:
zip_ref.extractall(folder_raw_path)
os.remove(data_raw_path)
# now rename the folder
os.rename(folder_raw_path+"/newmods", folder_raw_path+"/mods.d")
# now zip the RAW folder
zipper(folder_raw_path, MAIN_PATH, sword_name)
# now remove the tmp folder
try:
shutil.rmtree(folder_path)
except OSError as e:
print("XXX\nError: %s - %s.\nXXX" % (e.filename, e.strerror))
# increase the counter
counter = int(counter + each_count)