download_assets.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python3
  2. import urllib.request
  3. import shutil
  4. import sys
  5. import os
  6. import zipfile
  7. TEST_SUITES = ['PNG', 'XML']
  8. DOWNLOAD_BASE_PATH = "assets/{}"
  9. ASSETS_BASE_URL = "https://raw.githubusercontent.com/odin-lang/test-assets/master/{}/{}"
  10. PNG_IMAGES = [
  11. "basi0g01.png", "basi0g02.png", "basi0g04.png", "basi0g08.png", "basi0g16.png", "basi2c08.png",
  12. "basi2c16.png", "basi3p01.png", "basi3p02.png", "basi3p04.png", "basi3p08.png", "basi4a08.png",
  13. "basi4a16.png", "basi6a08.png", "basi6a16.png", "basn0g01.png", "basn0g02.png", "basn0g04.png",
  14. "basn0g08.png", "basn0g16.png", "basn2c08.png", "basn2c16.png", "basn3p01.png", "basn3p02.png",
  15. "basn3p04.png", "basn3p08.png", "basn4a08.png", "basn4a16.png", "basn6a08.png", "basn6a16.png",
  16. "bgai4a08.png", "bgai4a16.png", "bgan6a08.png", "bgan6a16.png", "bgbn4a08.png", "bggn4a16.png",
  17. "bgwn6a08.png", "bgyn6a16.png", "ccwn2c08.png", "ccwn3p08.png", "cdfn2c08.png", "cdhn2c08.png",
  18. "cdsn2c08.png", "cdun2c08.png", "ch1n3p04.png", "ch2n3p08.png", "cm0n0g04.png", "cm7n0g04.png",
  19. "cm9n0g04.png", "cs3n2c16.png", "cs3n3p08.png", "cs5n2c08.png", "cs5n3p08.png", "cs8n2c08.png",
  20. "cs8n3p08.png", "ct0n0g04.png", "ct1n0g04.png", "cten0g04.png", "ctfn0g04.png", "ctgn0g04.png",
  21. "cthn0g04.png", "ctjn0g04.png", "ctzn0g04.png", "exif2c08.png", "f00n0g08.png", "f00n2c08.png",
  22. "f01n0g08.png", "f01n2c08.png", "f02n0g08.png", "f02n2c08.png", "f03n0g08.png", "f03n2c08.png",
  23. "f04n0g08.png", "f04n2c08.png", "f99n0g04.png", "g03n0g16.png", "g03n2c08.png", "g03n3p04.png",
  24. "g04n0g16.png", "g04n2c08.png", "g04n3p04.png", "g05n0g16.png", "g05n2c08.png", "g05n3p04.png",
  25. "g07n0g16.png", "g07n2c08.png", "g07n3p04.png", "g10n0g16.png", "g10n2c08.png", "g10n3p04.png",
  26. "g25n0g16.png", "g25n2c08.png", "g25n3p04.png", "oi1n0g16.png", "oi1n2c16.png", "oi2n0g16.png",
  27. "oi2n2c16.png", "oi4n0g16.png", "oi4n2c16.png", "oi9n0g16.png", "oi9n2c16.png", "pp0n2c16.png",
  28. "pp0n6a08.png", "ps1n0g08.png", "ps1n2c16.png", "ps2n0g08.png", "ps2n2c16.png", "s01i3p01.png",
  29. "s01n3p01.png", "s02i3p01.png", "s02n3p01.png", "s03i3p01.png", "s03n3p01.png", "s04i3p01.png",
  30. "s04n3p01.png", "s05i3p02.png", "s05n3p02.png", "s06i3p02.png", "s06n3p02.png", "s07i3p02.png",
  31. "s07n3p02.png", "s08i3p02.png", "s08n3p02.png", "s09i3p02.png", "s09n3p02.png", "s32i3p04.png",
  32. "s32n3p04.png", "s33i3p04.png", "s33n3p04.png", "s34i3p04.png", "s34n3p04.png", "s35i3p04.png",
  33. "s35n3p04.png", "s36i3p04.png", "s36n3p04.png", "s37i3p04.png", "s37n3p04.png", "s38i3p04.png",
  34. "s38n3p04.png", "s39i3p04.png", "s39n3p04.png", "s40i3p04.png", "s40n3p04.png", "tbbn0g04.png",
  35. "tbbn2c16.png", "tbbn3p08.png", "tbgn2c16.png", "tbgn3p08.png", "tbrn2c08.png", "tbwn0g16.png",
  36. "tbwn3p08.png", "tbyn3p08.png", "tm3n3p02.png", "tp0n0g08.png", "tp0n2c08.png", "tp0n3p08.png",
  37. "tp1n3p08.png", "xc1n0g08.png", "xc9n2c08.png", "xcrn0g04.png", "xcsn0g01.png", "xd0n2c08.png",
  38. "xd3n2c08.png", "xd9n2c08.png", "xdtn0g01.png", "xhdn0g08.png", "xlfn0g04.png", "xs1n0g01.png",
  39. "xs2n0g01.png", "xs4n0g01.png", "xs7n0g01.png", "z00n2c08.png", "z03n2c08.png", "z06n2c08.png",
  40. "z09n2c08.png",
  41. "PngSuite.png", "logo-slim.png", "emblem-1024.png"
  42. ]
  43. def try_download_file(url, out_file):
  44. try:
  45. with urllib.request.urlopen(url) as response, open(out_file, 'wb') as of:
  46. shutil.copyfileobj(response, of)
  47. print("... ", out_file)
  48. except urllib.error.HTTPError:
  49. print("Could not download", url)
  50. return 1
  51. def try_download_and_unpack_zip(suite):
  52. url = ASSETS_BASE_URL.format(suite, "{}.zip".format(suite))
  53. out_file = DOWNLOAD_BASE_PATH.format(suite) + "/{}.zip".format(suite)
  54. print("\tDownloading {} to {}.".format(url, out_file))
  55. if try_download_file(url, out_file) is not None:
  56. print("Could not download ZIP file")
  57. return 1
  58. # Try opening the ZIP file and extracting the test images
  59. try:
  60. with zipfile.ZipFile(out_file) as z:
  61. for file in z.filelist:
  62. filename = file.filename
  63. extract_path = DOWNLOAD_BASE_PATH.format(suite)
  64. print("\t\tExtracting: {}".format(filename))
  65. z.extract(file, extract_path)
  66. except:
  67. print("Could not extract ZIP file")
  68. return 2
  69. def main():
  70. for suite in TEST_SUITES:
  71. print("Downloading {} assets".format(suite))
  72. # Make assets path
  73. try:
  74. path = DOWNLOAD_BASE_PATH.format(suite)
  75. os.makedirs(path)
  76. except FileExistsError:
  77. pass
  78. # Try downloading and unpacking the assets
  79. r = try_download_and_unpack_zip(suite)
  80. if r is not None:
  81. return r
  82. # We could fall back on downloading the PNG files individually, but it's slow
  83. print("Done downloading {} assets.".format(suite))
  84. return 0
  85. if __name__ == '__main__':
  86. sys.exit(main())