utils.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import os
  2. import xml.etree.ElementTree as ET
  3. from dateutil import parser
  4. from django.conf import settings
  5. from .models import Developer, Game, GameSystem, Genre, Publisher
  6. US_STRINGS = ["(u)", "(usa)", "(us)"]
  7. JP_STRINGS = ["(j)", "japan", "jp"]
  8. EU_STRINGS = ["(e)", "eur", "europe", "pal"]
  9. def update_media_root_for_import(file_path):
  10. """Given a file path, re-write it for our app MEDIA_ROOT"""
  11. split_path = file_path.split("/")
  12. file_name = split_path[-1]
  13. game_system_slug = split_path[-2]
  14. return os.path.join(settings.ROMS_DIR, game_system_slug, file_name)
  15. def import_gamelist_file_to_db_for_system(game_system_slug, file_path=None):
  16. imported_games = []
  17. if not file_path:
  18. file_path = os.path.join(settings.ROMS_DIR, game_system_slug, "gamelist.xml")
  19. gamelist = ET.parse(file_path)
  20. game_system = GameSystem.objects.get(retropie_slug=game_system_slug)
  21. games = gamelist.findall("game")
  22. for game in games:
  23. name = game.find("name").text
  24. english_patched = "patched" in name.lower()
  25. undub = "undub" in name.lower()
  26. hack = "hack" in name.lower()
  27. region = None
  28. if any(us in name.lower() for us in US_STRINGS):
  29. region = Game.Region.US.name
  30. if any(jp in name.lower() for jp in JP_STRINGS):
  31. region = Game.Region.JP.name
  32. if any(eu in name.lower() for eu in EU_STRINGS):
  33. region = Game.Region.EU.name
  34. release_date_str = game.find("releasedate").text
  35. developer_str = game.find("developer").text
  36. publisher_str = game.find("publisher").text
  37. genres_str = game.find("genre").text
  38. rating_str = game.find("rating").text
  39. players_str = "1"
  40. if game.find("players"):
  41. players_str = game.find("players").text
  42. try:
  43. kid_game = game.find("kidgame").text == "true"
  44. except AttributeError:
  45. kid_game = False
  46. genre_list = []
  47. if genres_str:
  48. genre_str_list = genres_str.split(", ")
  49. for genre_str in genre_str_list:
  50. genre, _created = Genre.objects.get_or_create(name=genre_str)
  51. genre_list.append(genre)
  52. players = int(players_str) if players_str else 1
  53. rating = float(rating_str) if rating_str else None
  54. publisher = None
  55. if publisher_str:
  56. publisher, _created = Publisher.objects.get_or_create(name=publisher_str)
  57. developer = None
  58. if developer_str:
  59. developer, _created = Developer.objects.get_or_create(name=developer_str)
  60. release_date = parser.parse(release_date_str) if release_date_str else None
  61. screenshot_path = game.find("image").text
  62. rom_path = game.find("path").text
  63. video_path = game.find("video").text
  64. marquee_path = game.find("marquee").text
  65. description = game.find("desc").text
  66. obj, created = Game.objects.get_or_create(name=name)
  67. obj.game_system = game_system
  68. obj.developer = developer
  69. obj.publisher = publisher
  70. obj.players = players
  71. obj.description = description
  72. obj.release_date = release_date
  73. obj.rating = rating
  74. obj.genre.set(genre_list)
  75. obj.screenshot = screenshot_path
  76. obj.rom_file = rom_path
  77. obj.video = video_path
  78. obj.marquee = marquee_path
  79. obj.kid_game = kid_game
  80. obj.english_patched = english_patched
  81. obj.hack = hack
  82. obj.undub = undub
  83. obj.region = region
  84. obj.save()
  85. imported_games.append(game)
  86. return imported_games
  87. def export_gamelist_file_to_path_for_system(game_system_slug, file_path=None):
  88. exported_games = []
  89. game_system = GameSystem.objects.get(retropie_slug=game_system_slug)
  90. if not file_path:
  91. file_path = f"/tmp/{game_system_slug}-gamelist.xml"
  92. # file_path = os.path.join(settings.ROMS_DIR, game_system_slug, "gamelist.xml")
  93. root = ET.Element("gameList")
  94. tree = ET.ElementTree(root)
  95. tree.write("filename.xml")
  96. games = Game.objects.filter(game_system=game_system)
  97. for game in games:
  98. game_node = ET.SubElement(root, "game")
  99. genre_str = ", ".join(game.genre.all().values_list("name", flat=True))
  100. release_date_str = ""
  101. if game.release_date:
  102. release_date_str = game.release_date.strftime("%Y%m%dT00000")
  103. ET.SubElement(game_node, "path").text = (
  104. game.rom_file.path if game.rom_file else ""
  105. )
  106. ET.SubElement(game_node, "name").text = game.name
  107. ET.SubElement(game_node, "thumbnail").text = ""
  108. ET.SubElement(game_node, "image").text = (
  109. game.screenshot.path if game.screenshot else ""
  110. )
  111. ET.SubElement(game_node, "marquee").text = (
  112. game.marquee.path if game.marquee else ""
  113. )
  114. ET.SubElement(game_node, "video").text = game.video.path if game.video else ""
  115. ET.SubElement(game_node, "rating").text = str(game.rating)
  116. ET.SubElement(game_node, "desc").text = game.description
  117. ET.SubElement(game_node, "releasedate").text = release_date_str
  118. ET.SubElement(game_node, "developer").text = str(game.developer)
  119. ET.SubElement(game_node, "publisher").text = str(game.publisher)
  120. ET.SubElement(game_node, "genre").text = genre_str
  121. ET.SubElement(game_node, "players").text = str(game.players)
  122. if game.kid_game:
  123. ET.SubElement(game_node, "kidgame").text = "true"
  124. exported_games.append(game)
  125. tree = ET.ElementTree(root)
  126. tree.write(file_path, xml_declaration=True, encoding="utf-8")
  127. return exported_games