Attempting to run the download_cc_textures.py script results in an error. Looks like maybe there is a bad url?
Download asset: Terrain003 of 37/1060
Traceback (most recent call last):
File "scripts/download_cc_textures.py", line 58, in <module>
urlretrieve(link, current_file_path)
File "/usr/lib/python3.6/urllib/request.py", line 248, in urlretrieve
with contextlib.closing(urlopen(url, data)) as fp:
File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.6/urllib/request.py", line 564, in error
result = self._call_chain(*args)
File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib/python3.6/urllib/request.py", line 756, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/usr/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.6/urllib/request.py", line 570, in error
return self._call_chain(*args)
File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400:
I also encountered this error when downloading. I had to print the urls that cause error (they are Terrain001 Terrain002 and Terrain003 if I remember correctly) and download them manually. Actually it's not due to bad url because I can go to the page in the browser and download the files correctly. Don't know why the error occurs.
Fortunately this manual download is only required for these 3 files out of 1060.
Hey @manuelli,
it seems that some of the newer cctextures contain a circumflex in their forward url. This apparently makes urlretrieve fail and throw this error.
To resolve this issue I replaced using urlretrieve with requests.get. We gonna fix this in the next version, but here is already how the fixed download script should look like:
from sys import version_info
if version_info.major == 2:
raise Exception("This script only works with python3.x!")
import os
import csv
import subprocess
import requests
if __name__ == "__main__":
# setting the default header, else the server does not allow the download
headers = {
'User-Agent': 'Mozilla/5.0'
}
# set the download directory relative to this one
current_dir = os.path.dirname(os.path.abspath(__file__))
cc_texture_dir = os.path.join(current_dir, "..", "resources", "cctextures")
if not os.path.exists(cc_texture_dir):
os.makedirs(cc_texture_dir)
else:
raise Exception("The folder already exists!")
# download the csv file, which contains all the download links
csv_url = "https://cc0textures.com/api/v1/downloads_csv"
csv_file_path = os.path.join(cc_texture_dir, "full_info.csv")
request = requests.get(csv_url, headers=headers)
with open(csv_file_path, "wb") as file:
file.write(request.content)
# extract the download links with the asset name
data = {}
with open(csv_file_path, "r") as csv_file:
csv_reader = csv.DictReader(csv_file, delimiter=',')
for line in csv_reader:
if line["Filetype"] == "zip" and line["DownloadAttribute"] == "2K-JPG":
data[line["AssetID"]] = line["PrettyDownloadLink"]
excluding_list = ["sign", "roadlines", "manhole", "backdrop", "foliage", "TreeEnd", "TreeStump",
"3DBread", "3DApple", "FlowerSet", "FoodSteps", "PineNeedles", "Grate",
"PavingEdge", "Painting", "RockBrush", "WrinklesBrush", "Sticker", "3DRock"]
# download each asset and create a folder for it (unpacking + deleting the zip included)
for index, (asset, link) in enumerate(data.items()):
do_not_use = False
for exclude_element in excluding_list:
if asset.lower().startswith(exclude_element.lower()):
do_not_use = True
break
if do_not_use:
continue
print("Download asset: {} of {}/{}".format(asset, index, len(data)))
current_folder = os.path.join(cc_texture_dir, asset)
if not os.path.exists(current_folder):
os.makedirs(current_folder)
current_file_path = os.path.join(current_folder, "{}.zip".format(asset))
request = requests.get(link, headers=headers)
with open(current_file_path, "wb") as file:
file.write(request.content)
subprocess.call(["unzip {} -d {}> /dev/null".format(current_file_path, current_folder)], shell=True)
os.remove(current_file_path)
print("Done downloading textures, saved in {}".format(cc_texture_dir))
This has been solved in the newest version
Most helpful comment
Hey @manuelli,
it seems that some of the newer cctextures contain a circumflex in their forward url. This apparently makes
urlretrievefail and throw this error.To resolve this issue I replaced using
urlretrievewithrequests.get. We gonna fix this in the next version, but here is already how the fixed download script should look like: