gen_cache.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import os, sys, json, getopt, logging
  4. from binascii import hexlify
  5. from TitleInfo import TitleInfo
  6. from IconManager import IconManager
  7. import common
  8. # Dictionary of title keys
  9. enc_title_keys = {}
  10. with open('encTitleKeys.bin', 'rb') as f:
  11. n_entries = os.fstat(f.fileno()).st_size / 32
  12. f.seek(16, os.SEEK_SET)
  13. for i in range(int(n_entries)):
  14. f.seek(8, os.SEEK_CUR)
  15. title_id = f.read(8)
  16. title_key = f.read(16)
  17. enc_title_keys[hexlify(title_id).decode().upper()] = hexlify(title_key).decode()
  18. # Dictionary to store scraped data to turn into json
  19. json_data = {}
  20. feature_data = {}
  21. def filter_titles(titles):
  22. # Game | DSiWare
  23. tid_index = ['00040000','00048004']
  24. ret = []
  25. for title_id in titles:
  26. tid_high = title_id[:8]
  27. if tid_high in tid_index:
  28. ret.append(title_id)
  29. return ret
  30. def scrape():
  31. global json_data
  32. titles = list(enc_title_keys.keys())
  33. titles = filter_titles(titles)
  34. uid_list = TitleInfo.get_id_pairs(titles)
  35. for i, uid in enumerate(uid_list):
  36. if not uid:
  37. print("Failed to get uid for title id: " + titles[i])
  38. else:
  39. try:
  40. title_data = TitleInfo(titles[i], uid)
  41. temp_flist_data = title_data.take_my_flist()
  42. for key, value in temp_flist_data.items():
  43. feature_data[key] = value
  44. print("Title {} out of {}: [{}] {}".format(i+1, len(uid_list), title_data.product_code, title_data.name))
  45. except ValueError as e:
  46. logging.warn(e)
  47. pass
  48. except KeyboardInterrupt:
  49. break
  50. with open('features.json', 'w') as f:
  51. json.dump(feature_data, f, separators=(',', ':'))
  52. def load_cache(input_dir):
  53. global json_data
  54. with open(os.path.join(input_dir, "data.json")) as f:
  55. json_data = json.load(f)
  56. max_icon_index = max(json_data, key=(lambda x: json_data[x][6]))
  57. icon_index = json_data[max_icon_index][6] + 1
  58. common.icon_manager = IconManager(icon_index, os.path.join(input_dir, "images"))
  59. for i in list(json_data.keys()):
  60. enc_title_keys.pop(i, None)
  61. def show_usage_exit():
  62. print('gen_cache.py [-i <input directory>]')
  63. sys.exit(2)
  64. def main(argv):
  65. input_dir = None
  66. logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
  67. try:
  68. opts, args = getopt.getopt(argv, "hi:")
  69. except getopt.GetoptError:
  70. show_usage_exit()
  71. for opt, arg in opts:
  72. if opt == '-h':
  73. show_usage_exit()
  74. elif opt in ("-i", "--input"):
  75. input_dir = arg
  76. if input_dir:
  77. load_cache(input_dir)
  78. scrape()
  79. else:
  80. scrape()
  81. if __name__ == '__main__':
  82. main(sys.argv[1:])