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)}"))