textures: be more resilient against corrupted jars
This commit is contained in:
@@ -184,6 +184,26 @@ class Textures(object):
|
|||||||
"""
|
"""
|
||||||
if verbose: logging.info("Starting search for {0}".format(filename))
|
if verbose: logging.info("Starting search for {0}".format(filename))
|
||||||
|
|
||||||
|
# Look for the file is stored in with the overviewer
|
||||||
|
# installation. We include a few files that aren't included with Minecraft
|
||||||
|
# textures. This used to be for things such as water and lava, since
|
||||||
|
# they were generated by the game and not stored as images. Nowdays I
|
||||||
|
# believe that's not true, but we still have a few files distributed
|
||||||
|
# with overviewer.
|
||||||
|
# Do this first so we don't try all .jar files for stuff like "water.png"
|
||||||
|
programdir = util.get_program_path()
|
||||||
|
if verbose: logging.info("Looking for texture in overviewer_core/data/textures")
|
||||||
|
path = os.path.join(programdir, "overviewer_core", "data", "textures", filename)
|
||||||
|
if os.path.isfile(path):
|
||||||
|
if verbose: logging.info("Found %s in '%s'", filename, path)
|
||||||
|
return open(path, mode)
|
||||||
|
elif hasattr(sys, "frozen") or imp.is_frozen("__main__"):
|
||||||
|
# windows special case, when the package dir doesn't exist
|
||||||
|
path = os.path.join(programdir, "textures", filename)
|
||||||
|
if os.path.isfile(path):
|
||||||
|
if verbose: logging.info("Found %s in '%s'", filename, path)
|
||||||
|
return open(path, mode)
|
||||||
|
|
||||||
# A texture path was given on the command line. Search this location
|
# A texture path was given on the command line. Search this location
|
||||||
# for the file first.
|
# for the file first.
|
||||||
if self.find_file_local_path:
|
if self.find_file_local_path:
|
||||||
@@ -228,7 +248,6 @@ class Textures(object):
|
|||||||
|
|
||||||
|
|
||||||
# Look in the location of the overviewer executable for the given path
|
# Look in the location of the overviewer executable for the given path
|
||||||
programdir = util.get_program_path()
|
|
||||||
path = os.path.join(programdir, filename)
|
path = os.path.join(programdir, filename)
|
||||||
if os.path.isfile(path):
|
if os.path.isfile(path):
|
||||||
if verbose: logging.info("Found %s in '%s'", filename, path)
|
if verbose: logging.info("Found %s in '%s'", filename, path)
|
||||||
@@ -297,34 +316,20 @@ class Textures(object):
|
|||||||
jarpath = os.path.join(versiondir, jarname, jarname + ".jar")
|
jarpath = os.path.join(versiondir, jarname, jarname + ".jar")
|
||||||
|
|
||||||
if os.path.isfile(jarpath):
|
if os.path.isfile(jarpath):
|
||||||
jar = zipfile.ZipFile(jarpath)
|
|
||||||
try:
|
try:
|
||||||
|
jar = zipfile.ZipFile(jarpath)
|
||||||
jar.getinfo(filename)
|
jar.getinfo(filename)
|
||||||
if verbose: logging.info("Found %s in '%s'", filename, jarpath)
|
if verbose: logging.info("Found %s in '%s'", filename, jarpath)
|
||||||
self.jars[jarpath] = jar
|
self.jars[jarpath] = jar
|
||||||
return jar.open(filename)
|
return jar.open(filename)
|
||||||
except (KeyError, IOError) as e:
|
except (KeyError, IOError) as e:
|
||||||
pass
|
pass
|
||||||
|
except (zipfile.BadZipFile) as e:
|
||||||
|
logging.warning("Your jar {0} is corrupted, I'll be skipping it, but you "
|
||||||
|
"should probably look into that.".format(jarpath))
|
||||||
|
|
||||||
if verbose: logging.info("Did not find file {0} in jar {1}".format(filename, jarpath))
|
if verbose: logging.info("Did not find file {0} in jar {1}".format(filename, jarpath))
|
||||||
|
|
||||||
# Last ditch effort: look for the file is stored in with the overviewer
|
|
||||||
# installation. We include a few files that aren't included with Minecraft
|
|
||||||
# textures. This used to be for things such as water and lava, since
|
|
||||||
# they were generated by the game and not stored as images. Nowdays I
|
|
||||||
# believe that's not true, but we still have a few files distributed
|
|
||||||
# with overviewer.
|
|
||||||
if verbose: logging.info("Looking for texture in overviewer_core/data/textures")
|
|
||||||
path = os.path.join(programdir, "overviewer_core", "data", "textures", filename)
|
|
||||||
if os.path.isfile(path):
|
|
||||||
if verbose: logging.info("Found %s in '%s'", filename, path)
|
|
||||||
return open(path, mode)
|
|
||||||
elif hasattr(sys, "frozen") or imp.is_frozen("__main__"):
|
|
||||||
# windows special case, when the package dir doesn't exist
|
|
||||||
path = os.path.join(programdir, "textures", filename)
|
|
||||||
if os.path.isfile(path):
|
|
||||||
if verbose: logging.info("Found %s in '%s'", filename, path)
|
|
||||||
return open(path, mode)
|
|
||||||
|
|
||||||
raise TextureException("Could not find the textures while searching for '{0}'. Try specifying the 'texturepath' option in your config file.\nSet it to the path to a Minecraft Resource pack.\nAlternately, install the Minecraft client (which includes textures)\nAlso see <http://docs.overviewer.org/en/latest/running/#installing-the-textures>\n(Remember, this version of Overviewer requires a 1.16-compatible resource pack)\n(Also note that I won't automatically use snapshots; you'll have to use the texturepath option to use a snapshot jar)".format(filename))
|
raise TextureException("Could not find the textures while searching for '{0}'. Try specifying the 'texturepath' option in your config file.\nSet it to the path to a Minecraft Resource pack.\nAlternately, install the Minecraft client (which includes textures)\nAlso see <http://docs.overviewer.org/en/latest/running/#installing-the-textures>\n(Remember, this version of Overviewer requires a 1.16-compatible resource pack)\n(Also note that I won't automatically use snapshots; you'll have to use the texturepath option to use a snapshot jar)".format(filename))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user