-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame_info_mgr.py
More file actions
131 lines (95 loc) · 4.54 KB
/
Copy pathgame_info_mgr.py
File metadata and controls
131 lines (95 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from datetime import datetime
from lxml import etree
class GameInfoMgr():
"""Информация об игре"""
def __init__(self):
# Текст последней ошибки
self.__err_msg = ""
# Возможные теги с информацией в Anbernic и их типы
self.__d_elem_types = {
'path': str,
'name': str,
'desc': str,
'image': str,
'video': str,
'marquee': str,
'thumbnail': str,
'rating': float, # 1.0 - это 100% ?
'releasedate': datetime,
'developer': str,
'publisher': str,
'genre': str, # Puzzle-Game - может, они какие-то конкретные?
'players': int,
'playcount': int,
'lastplayed': datetime,
'gametime': int, # В секундах
'lang': str, # en, ru
'crc32': str, # Хэши для контроля целостности
'md5': str,
'cheevosId': int,
'cheevosHash': str
}
# Формат даты в XML теге
self.__date_format = "%Y%m%dT%H%M%S" # 20190318T000000
# Фактические значения атрибутов игры
self.__d_elems = {}
def get_last_error(self):
"""Получить последний текст ошибки
:return: Строка с текстом ошибки
"""
return self.__err_msg
def get_possible_attribs(self):
"""Получить список возможных атрибутов c их типами
:return: Словарь тег (атрибут игры) - его тип
"""
return self.__d_elem_types
def get_filled_attribs(self):
"""Получить список заполненных атрибутов игры
:return: Словарь с атрибутами
"""
return self.__d_elems
def get_attrib_val(self, attrib_name):
"""Получить значение атрибута игры
:param attrib_name: Наименование атрибута игры (тэг)
:return: Значение атрибута, либо False, если такой не предусмотрен
"""
if attrib_name not in self.__d_elem_types.keys():
self.__err_msg = f"Атрибут {attrib_name} отсутствует"
return False
if attrib_name in self.__d_elems.keys():
return self.__d_elems[attrib_name]
if isinstance("", self.__d_elem_types[attrib_name]):
return ""
return None
def set_attrib_val(self, attrib_name, attrib_val):
"""Задать значение атрибута игры
:param attrib_name: Наименование атрибута игры (тэг)
:param attrib_val: Значение атрибута игры
:return: True, при успехе
"""
if attrib_name not in self.__d_elem_types.keys():
self.__err_msg = f"Атрибут {attrib_name} отсутствует"
return False
if not isinstance(attrib_val, self.__d_elem_types[attrib_name]):
# Ожидается другой тип данных для атрибута
self.__err_msg = f"Атрибут {attrib_name} должен иметь тип " \
+ f"{str(self.__d_elem_types[attrib_name])}"
return False
# Задаем значение атрибута игры
self.__d_elems[attrib_name] = attrib_val
def gen_xml_node(self):
"""Сгенерировать узел XML на основе имеющихся данных
:return: XML узел (node)
"""
xml_elem = etree.Element("game")
for elem_tag, elem_val in self.__d_elems.items():
if self.__d_elem_types[elem_tag] == datetime:
elem_val = datetime.strftime(elem_val, self.__date_format)
elif elem_tag in ["image", "video", "marquee", "thumbnail"]:
# Изображения хранятся в отдельной папке images
elem_val = f"./images/{elem_val}"
elif elem_tag == "video":
# Видео хранится в отдельной папке videos
elem_val = f"./videos/{elem_val}"
etree.SubElement(xml_elem, elem_tag).text = elem_val
return xml_elem