import_gamelist_xml_file.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import xml.etree.ElementTree as ET
  2. from django.core.management.base import BaseCommand, CommandError
  3. from dateutil import parser
  4. from games.models import Developer, Game, GameSystem, Genre, Publisher
  5. US_STRINGS = ["(u)", "(usa)", "(us)"]
  6. JP_STRINGS = ["(j)", "japan", "jp"]
  7. EU_STRINGS = ["(e)", "eur", "europe", "pal"]
  8. def import_gamelist_file_to_db_for_system(file_path, game_system):
  9. imported_games = []
  10. gamelist = ET.parse(file_path)
  11. games = gamelist.findall("game")
  12. for game in games:
  13. name = game.find("name").text
  14. english_patched = "patched" in name.lower()
  15. undub = "undub" in name.lower()
  16. hack = "hack" in name.lower()
  17. region = None
  18. if any(us in name.lower() for us in US_STRINGS):
  19. region = Game.Region.US.name
  20. if any(jp in name.lower() for jp in JP_STRINGS):
  21. region = Game.Region.JP.name
  22. if any(eu in name.lower() for eu in EU_STRINGS):
  23. region = Game.Region.EU.name
  24. release_date_str = game.find("releasedate").text
  25. developer_str = game.find("developer").text
  26. publisher_str = game.find("publisher").text
  27. genres_str = game.find("genre").text
  28. rating_str = game.find("rating").text
  29. players_str = game.find("players").text
  30. try:
  31. kid_game = game.find("kidgame").text == "true"
  32. except AttributeError:
  33. kid_game = False
  34. genre_str_list = genres_str.split(", ")
  35. genre_list = []
  36. if genres_str:
  37. for genre_str in genre_str_list:
  38. genre, _created = Genre.objects.get_or_create(name=genre_str)
  39. genre_list.append(genre)
  40. players = int(players_str) if players_str else 1
  41. rating = float(rating_str) if rating_str else None
  42. publisher = None
  43. if publisher_str:
  44. publisher, _created = Publisher.objects.get_or_create(name=publisher_str)
  45. developer = None
  46. if developer_str:
  47. developer, _created = Developer.objects.get_or_create(name=developer_str)
  48. release_date = parser.parse(release_date_str) if release_date_str else None
  49. screenshot_path = game.find("image").text
  50. rom_path = game.find("path").text
  51. video_path = game.find("video").text
  52. marquee_path = game.find("marquee").text
  53. description = game.find("desc").text
  54. obj, created = Game.objects.get_or_create(name=name)
  55. obj.game_system = game_system
  56. obj.developer = developer
  57. obj.publisher = publisher
  58. obj.players = players
  59. obj.description = description
  60. obj.release_date = release_date
  61. obj.rating = rating
  62. obj.genre.set(genre_list)
  63. obj.screenshot = screenshot_path
  64. obj.rom_file = rom_path
  65. obj.video = video_path
  66. obj.marquee = marquee_path
  67. obj.kid_game = kid_game
  68. obj.english_patched = english_patched
  69. obj.hack = hack
  70. obj.undub = undub
  71. obj.region = region
  72. obj.save()
  73. imported_games.append(game)
  74. return imported_games
  75. class Command(BaseCommand):
  76. help = "Import all games found in a given gamelist XML file"
  77. def add_arguments(self, parser):
  78. parser.add_argument("file_path", nargs="+", type=str)
  79. parser.add_argument("system", nargs="+", type=str)
  80. def handle(self, *args, **options):
  81. game_system = GameSystem.objects.get(retropie_slug=options["system"][0])
  82. games = import_gamelist_file_to_db_for_system(
  83. options["file_path"][0],
  84. game_system,
  85. )
  86. self.stdout.write(self.style.SUCCESS(f"Successfully imported {len(games)}"))