mirror of
https://github.com/NinjaCheetah/libWiiPy.git
synced 2025-04-27 22:01:01 -04:00
Added methods to get a content index from a CID and add content from a Title()
This commit is contained in:
parent
0d306076a2
commit
7fed039fdc
@ -158,16 +158,11 @@ class ContentRegion:
|
|||||||
bytes
|
bytes
|
||||||
The encrypted content listed in the content record.
|
The encrypted content listed in the content record.
|
||||||
"""
|
"""
|
||||||
# Get a list of the current Content IDs, so we can make sure the target one exists.
|
try:
|
||||||
content_ids = []
|
content_index = self.get_index_from_cid(cid)
|
||||||
for record in self.content_records:
|
except ValueError:
|
||||||
content_ids.append(record.content_id)
|
raise ValueError(f"You are trying to get a content with Content ID {cid}, "
|
||||||
if cid not in content_ids:
|
f"but no content with that ID exists!")
|
||||||
raise ValueError("You are trying to get a content with Content ID " + str(cid) + ", but no content with "
|
|
||||||
"that ID exists!")
|
|
||||||
# Get the content index associated with the CID we now know exists.
|
|
||||||
target_index = content_ids.index(cid)
|
|
||||||
content_index = self.content_records[target_index].index
|
|
||||||
content_enc = self.get_enc_content_by_index(content_index)
|
content_enc = self.get_enc_content_by_index(content_index)
|
||||||
return content_enc
|
return content_enc
|
||||||
|
|
||||||
@ -246,16 +241,11 @@ class ContentRegion:
|
|||||||
bytes
|
bytes
|
||||||
The decrypted content listed in the content record.
|
The decrypted content listed in the content record.
|
||||||
"""
|
"""
|
||||||
# Get a list of the current Content IDs, so we can make sure the target one exists.
|
try:
|
||||||
content_ids = []
|
content_index = self.get_index_from_cid(cid)
|
||||||
for record in self.content_records:
|
except ValueError:
|
||||||
content_ids.append(record.content_id)
|
raise ValueError(f"You are trying to get a content with Content ID {cid}, "
|
||||||
if cid not in content_ids:
|
f"but no content with that ID exists!")
|
||||||
raise ValueError("You are trying to get a content with Content ID " + str(cid) + ", but no content with "
|
|
||||||
"that ID exists!")
|
|
||||||
# Get the content index associated with the CID we now know exists.
|
|
||||||
target_index = content_ids.index(cid)
|
|
||||||
content_index = self.content_records[target_index].index
|
|
||||||
content_dec = self.get_content_by_index(content_index, title_key, skip_hash)
|
content_dec = self.get_content_by_index(content_index, title_key, skip_hash)
|
||||||
return content_dec
|
return content_dec
|
||||||
|
|
||||||
@ -281,6 +271,32 @@ class ContentRegion:
|
|||||||
dec_contents.append(self.get_content_by_index(content, title_key, skip_hash))
|
dec_contents.append(self.get_content_by_index(content, title_key, skip_hash))
|
||||||
return dec_contents
|
return dec_contents
|
||||||
|
|
||||||
|
def get_index_from_cid(self, cid: int) -> int:
|
||||||
|
"""
|
||||||
|
Gets the content index of a content by its Content ID. The returned index is the value tied to each content and
|
||||||
|
used as the IV for encryption, rather than the literal index in the array of content, because sometimes the
|
||||||
|
contents end up out of order in a WAD while still retaining the original indices.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
cid : int
|
||||||
|
The Content ID to get the index of.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
int
|
||||||
|
The content index.
|
||||||
|
"""
|
||||||
|
# Get a list of the current Content IDs, so we can make sure the target one exists.
|
||||||
|
content_ids = []
|
||||||
|
for record in self.content_records:
|
||||||
|
content_ids.append(record.content_id)
|
||||||
|
if cid not in content_ids:
|
||||||
|
raise ValueError("The specified Content ID does not exist!")
|
||||||
|
literal_index = content_ids.index(cid)
|
||||||
|
target_index = self.content_records[literal_index].index
|
||||||
|
return target_index
|
||||||
|
|
||||||
def add_enc_content(self, enc_content: bytes, cid: int, index: int, content_type: int, content_size: int,
|
def add_enc_content(self, enc_content: bytes, cid: int, index: int, content_type: int, content_size: int,
|
||||||
content_hash: bytes) -> None:
|
content_hash: bytes) -> None:
|
||||||
"""
|
"""
|
||||||
@ -534,16 +550,11 @@ class ContentRegion:
|
|||||||
cid : int
|
cid : int
|
||||||
The Content ID of the content you want to remove.
|
The Content ID of the content you want to remove.
|
||||||
"""
|
"""
|
||||||
# Get a list of the current Content IDs, so we can make sure the target one exists.
|
try:
|
||||||
content_ids = []
|
content_index = self.get_index_from_cid(cid)
|
||||||
for record in self.content_records:
|
except ValueError:
|
||||||
content_ids.append(record.content_id)
|
raise ValueError(f"You are trying to remove content with Content ID {cid}, "
|
||||||
if cid not in content_ids:
|
f"but no content with that ID exists!")
|
||||||
raise ValueError("You are trying to remove content with Content ID " + str(cid) + ", but no content with "
|
|
||||||
"that ID exists!")
|
|
||||||
# Remove the content index associated with the CID we now know exists.
|
|
||||||
target_index = content_ids.index(cid)
|
|
||||||
content_index = self.content_records[target_index].index
|
|
||||||
self.remove_content_by_index(content_index)
|
self.remove_content_by_index(content_index)
|
||||||
|
|
||||||
|
|
||||||
|
@ -244,6 +244,55 @@ class Title:
|
|||||||
blocks = math.ceil(title_size_bytes / 131072)
|
blocks = math.ceil(title_size_bytes / 131072)
|
||||||
return blocks
|
return blocks
|
||||||
|
|
||||||
|
def add_enc_content(self, enc_content: bytes, cid: int, index: int, content_type: int, content_size: int,
|
||||||
|
content_hash: bytes) -> None:
|
||||||
|
"""
|
||||||
|
Adds a new encrypted content to the ContentRegion, and adds the provided Content ID, index, content type,
|
||||||
|
content size, and content hash to a new record in the ContentRecord list.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
enc_content : bytes
|
||||||
|
The new encrypted content to add.
|
||||||
|
cid : int
|
||||||
|
The Content ID to assign the new content in the content record.
|
||||||
|
index : int
|
||||||
|
The index used when encrypting the new content.
|
||||||
|
content_type : int
|
||||||
|
The type of the new content.
|
||||||
|
content_size : int
|
||||||
|
The size of the new encrypted content when decrypted.
|
||||||
|
content_hash : bytes
|
||||||
|
The hash of the new encrypted content when decrypted.
|
||||||
|
"""
|
||||||
|
# Add the encrypted content.
|
||||||
|
self.content.add_enc_content(enc_content, cid, index, content_type, content_size, content_hash)
|
||||||
|
# Update the TMD to match.
|
||||||
|
self.tmd.content_records = self.content.content_records
|
||||||
|
|
||||||
|
def add_content(self, dec_content: bytes, cid: int, content_type: int) -> None:
|
||||||
|
"""
|
||||||
|
Adds a new decrypted content to the end of the ContentRegion, and adds the provided Content ID, content type,
|
||||||
|
content size, and content hash to a new record in the ContentRecord list. The index will be automatically
|
||||||
|
assigned by incrementing the current highest index in the records.
|
||||||
|
|
||||||
|
This first gets the content hash and size from the provided data, and then encrypts the content with the
|
||||||
|
Title Key before adding it to the ContentRegion.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
dec_content : bytes
|
||||||
|
The new decrypted content to add.
|
||||||
|
cid : int
|
||||||
|
The Content ID to assign the new content in the content record.
|
||||||
|
content_type : int
|
||||||
|
The type of the new content.
|
||||||
|
"""
|
||||||
|
# Add the decrypted content.
|
||||||
|
self.content.add_content(dec_content, cid, content_type, self.ticket.get_title_key())
|
||||||
|
# Update the TMD to match.
|
||||||
|
self.tmd.content_records = self.content.content_records
|
||||||
|
|
||||||
def set_enc_content(self, enc_content: bytes, index: int, content_size: int, content_hash: bytes, cid: int = None,
|
def set_enc_content(self, enc_content: bytes, index: int, content_size: int, content_hash: bytes, cid: int = None,
|
||||||
content_type: int = None) -> None:
|
content_type: int = None) -> None:
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user