Fix handling of title and content types in tmd module

This commit is contained in:
Campbell 2024-08-02 23:57:43 -04:00
parent 415af7b8b8
commit 7edf764768
Signed by: NinjaCheetah
GPG Key ID: B547958AF96ED344

View File

@ -43,7 +43,7 @@ class TMD:
self.ios_tid: str = "" # The Title ID of the IOS version the associated title runs on. self.ios_tid: str = "" # The Title ID of the IOS version the associated title runs on.
self.ios_version: int = 0 # The IOS version the associated title runs on. self.ios_version: int = 0 # The IOS version the associated title runs on.
self.title_id: str = "" # The Title ID of the associated title. self.title_id: str = "" # The Title ID of the associated title.
self.content_type: str = "" # The type of content contained within the associated title. self.title_type: str = "" # The type of the associated title.
self.group_id: int = 0 # The ID of the publisher of the associated title. self.group_id: int = 0 # The ID of the publisher of the associated title.
self.region: int = 0 # The ID of the region of the associated title. self.region: int = 0 # The ID of the region of the associated title.
self.ratings: bytes = b'' # The parental controls rating of the associated title. self.ratings: bytes = b'' # The parental controls rating of the associated title.
@ -109,7 +109,7 @@ class TMD:
tmd_data.seek(0x194) tmd_data.seek(0x194)
content_type_bin = tmd_data.read(4) content_type_bin = tmd_data.read(4)
content_type_hex = binascii.hexlify(content_type_bin) content_type_hex = binascii.hexlify(content_type_bin)
self.content_type = str(content_type_hex.decode()) self.title_type = str(content_type_hex.decode())
# Publisher of the title. # Publisher of the title.
tmd_data.seek(0x198) tmd_data.seek(0x198)
self.group_id = int.from_bytes(tmd_data.read(2)) self.group_id = int.from_bytes(tmd_data.read(2))
@ -190,7 +190,7 @@ class TMD:
# Title's Title ID. # Title's Title ID.
tmd_data += binascii.unhexlify(self.title_id) tmd_data += binascii.unhexlify(self.title_id)
# Content type. # Content type.
tmd_data += binascii.unhexlify(self.content_type) tmd_data += binascii.unhexlify(self.title_type)
# Group ID. # Group ID.
tmd_data += int.to_bytes(self.group_id, 2) tmd_data += int.to_bytes(self.group_id, 2)
# 2 bytes of zero for reasons. # 2 bytes of zero for reasons.
@ -263,7 +263,7 @@ class TMD:
Gets the region of the TMD's associated title. Gets the region of the TMD's associated title.
Can be one of several possible values: Can be one of several possible values:
'JAP', 'USA', 'EUR', 'WORLD', or 'KOR'. 'Japan', 'North America', 'Europe', 'World', or 'Korea'.
Returns Returns
------- -------
@ -272,29 +272,15 @@ class TMD:
""" """
match self.region: match self.region:
case 0: case 0:
return "JAP" return "Japan"
case 1: case 1:
return "USA" return "North America"
case 2: case 2:
return "EUR" return "Europe"
case 3: case 3:
return "WORLD" return "World"
case 4: case 4:
return "KOR" return "Korea"
def get_is_vwii_title(self) -> bool:
"""
Gets whether the TMD is designed for the vWii or not.
Returns
-------
bool
If the title is for vWii.
"""
if self.vwii == 1:
return True
else:
return False
def get_title_type(self) -> str: def get_title_type(self) -> str:
""" """
@ -308,8 +294,7 @@ class TMD:
str str
The type of the title. The type of the title.
""" """
title_id_high = self.title_id[:8] match self.title_type:
match title_id_high:
case '00000001': case '00000001':
return "System" return "System"
case '00010000': case '00010000':
@ -327,28 +312,40 @@ class TMD:
case _: case _:
return "Unknown" return "Unknown"
def get_content_type(self): def get_content_type(self, content_index: int) -> str:
""" """
Gets the type of content contained in the TMD's associated title. Gets the type of content contained in the TMD's associated title.
Can be one of several possible values: Can be one of several possible values:
'Normal', 'Development/Unknown', 'Hash Tree', 'DLC', or 'Shared' 'Normal', 'Development/Unknown', 'Hash Tree', 'DLC', or 'Shared'
Parameters
----------
content_index : int
The index of the content you want the type of.
Returns Returns
------- -------
str str
The type of content. The type of content.
""" """
match self.content_type: # Get a list of the current content indices, so we can make sure the target one exists. Doing it this way
case '00000001': # ensures we can find the target, even if the highest content index is greater than the highest literal index.
current_indices = []
for record in self.content_records:
current_indices.append(record.index)
# This is the literal index in the list of content that we're going to get.
target_index = current_indices.index(content_index)
match self.content_records[target_index].content_type:
case 1:
return "Normal" return "Normal"
case '00000002': case 2:
return "Development/Unknown" return "Development/Unknown"
case '00000003': case 3:
return "Hash Tree" return "Hash Tree"
case '00004001': case 16385:
return "DLC" return "DLC"
case '00008001': case 32769:
return "Shared" return "Shared"
case _: case _:
return "Unknown" return "Unknown"