export_gamelist_xml_file.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. def export_gamelist_file_to_path_for_system(file_path, game_system):
  6. exported_games = []
  7. root = ET.Element("gameList")
  8. tree = ET.ElementTree(root)
  9. tree.write("filename.xml")
  10. games = Game.objects.filter(game_system=game_system)
  11. for game in games:
  12. game_node = ET.SubElement(root, "game")
  13. genre_str = ", ".join(game.genre.all().values_list("name", flat=True))
  14. release_date_str = ""
  15. if game.release_date:
  16. release_date_str = game.release_date.strftime("%Y%m%dT00000")
  17. ET.SubElement(game_node, "path").text = (
  18. game.rom_file.path if game.rom_file else ""
  19. )
  20. ET.SubElement(game_node, "name").text = game.name
  21. ET.SubElement(game_node, "thumbnail").text = ""
  22. ET.SubElement(game_node, "image").text = (
  23. game.screenshot.path if game.screenshot else ""
  24. )
  25. ET.SubElement(game_node, "marquee").text = (
  26. game.marquee.path if game.marquee else ""
  27. )
  28. ET.SubElement(game_node, "video").text = game.video.path if game.video else ""
  29. ET.SubElement(game_node, "rating").text = str(game.rating)
  30. ET.SubElement(game_node, "desc").text = game.description
  31. ET.SubElement(game_node, "releasedate").text = release_date_str
  32. ET.SubElement(game_node, "developer").text = str(game.developer)
  33. ET.SubElement(game_node, "publisher").text = str(game.publisher)
  34. ET.SubElement(game_node, "genre").text = genre_str
  35. ET.SubElement(game_node, "players").text = str(game.players)
  36. if game.kid_game:
  37. ET.SubElement(game_node, "kidgame").text = "true"
  38. exported_games.append(game)
  39. tree = ET.ElementTree(root)
  40. tree.write(file_path, xml_declaration=True, encoding="utf-8")
  41. return exported_games
  42. class Command(BaseCommand):
  43. help = "Export all games found to a given gamelist XML file"
  44. def add_arguments(self, parser):
  45. parser.add_argument("file_path", nargs="+", type=str)
  46. parser.add_argument("system", nargs="+", type=str)
  47. def handle(self, *args, **options):
  48. game_system = GameSystem.objects.get(retropie_slug=options["system"][0])
  49. games = export_gamelist_file_to_path_for_system(
  50. options["file_path"][0],
  51. game_system,
  52. )
  53. self.stdout.write(self.style.SUCCESS(f"Successfully exported {len(games)}"))