123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import xml.etree.ElementTree as ET
- from django.core.management.base import BaseCommand, CommandError
- from dateutil import parser
- from games.models import Developer, Game, GameSystem, Genre, Publisher
- US_STRINGS = ["(u)", "(usa)", "(us)"]
- JP_STRINGS = ["(j)", "japan", "jp"]
- EU_STRINGS = ["(e)", "eur", "europe", "pal"]
- def import_gamelist_file_to_db_for_system(file_path, game_system):
- imported_games = []
- gamelist = ET.parse(file_path)
- games = gamelist.findall("game")
- for game in games:
- name = game.find("name").text
- english_patched = "patched" in name.lower()
- undub = "undub" in name.lower()
- hack = "hack" in name.lower()
- region = None
- if any(us in name.lower() for us in US_STRINGS):
- region = Game.Region.US.name
- if any(jp in name.lower() for jp in JP_STRINGS):
- region = Game.Region.JP.name
- if any(eu in name.lower() for eu in EU_STRINGS):
- region = Game.Region.EU.name
- release_date_str = game.find("releasedate").text
- developer_str = game.find("developer").text
- publisher_str = game.find("publisher").text
- genres_str = game.find("genre").text
- rating_str = game.find("rating").text
- players_str = game.find("players").text
- try:
- kid_game = game.find("kidgame").text == "true"
- except AttributeError:
- kid_game = False
- genre_str_list = genres_str.split(", ")
- genre_list = []
- if genres_str:
- for genre_str in genre_str_list:
- genre, _created = Genre.objects.get_or_create(name=genre_str)
- genre_list.append(genre)
- players = int(players_str) if players_str else 1
- rating = float(rating_str) if rating_str else None
- publisher = None
- if publisher_str:
- publisher, _created = Publisher.objects.get_or_create(name=publisher_str)
- developer = None
- if developer_str:
- developer, _created = Developer.objects.get_or_create(name=developer_str)
- release_date = parser.parse(release_date_str) if release_date_str else None
- screenshot_path = game.find("image").text
- rom_path = game.find("path").text
- video_path = game.find("video").text
- marquee_path = game.find("marquee").text
- description = game.find("desc").text
- obj, created = Game.objects.get_or_create(name=name)
- obj.game_system = game_system
- obj.developer = developer
- obj.publisher = publisher
- obj.players = players
- obj.description = description
- obj.release_date = release_date
- obj.rating = rating
- obj.genre.set(genre_list)
- obj.screenshot = screenshot_path
- obj.rom_file = rom_path
- obj.video = video_path
- obj.marquee = marquee_path
- obj.kid_game = kid_game
- obj.english_patched = english_patched
- obj.hack = hack
- obj.undub = undub
- obj.region = region
- obj.save()
- imported_games.append(game)
- return imported_games
- class Command(BaseCommand):
- help = "Import all games found in a given gamelist XML file"
- def add_arguments(self, parser):
- parser.add_argument("file_path", nargs="+", type=str)
- parser.add_argument("system", nargs="+", type=str)
- def handle(self, *args, **options):
- game_system = GameSystem.objects.get(retropie_slug=options["system"][0])
- games = import_gamelist_file_to_db_for_system(
- options["file_path"][0],
- game_system,
- )
- self.stdout.write(self.style.SUCCESS(f"Successfully imported {len(games)}"))
|