vstinner / hachoir

Hachoir is a Python library to view and edit a binary stream field by field
http://hachoir.readthedocs.io/
GNU General Public License v2.0
613 stars 70 forks source link

How do I add new fields in the metadata? #94

Closed Plaoo closed 6 months ago

Plaoo commented 6 months ago

As titled is there any way to add new fields in the file metadata? example not working

# ....
            parser = createParser(file_content)
            md5_sum = md5(file_content.getbuffer()).hexdigest()
            metadata = extractMetadata(parser)
            if metadata:
                md5_field = MissingField("md5", str(md5_sum))
                metadata.add(md5_field)
                metadata = self._list_to_dict(metadata.exportPlaintext())
                return metadata
vstinner commented 6 months ago

You have to register a new data type. See hachoir/metadata/register.py for examples. Example:

    meta.register(Data("title", 100, "Title", type=str))

Then you can just set an attribute:

metadata.title = "My title"
Plaoo commented 6 months ago

Thanks @vstinner But what is meta? I recover medatada so:

    parser = createParser(file_content)
    metadata = extractMetadata(parser)
    metadata.register(Data("title", 100, "Title", type=str)) #register is not a know member of None
    metadata.title = "My title" # title is not a know member of None
vstinner commented 6 months ago

You can create a new metadata object from scratch like that:

from hachoir.metadata.metadata import Metadata
metadata = Metadata(None)
metadata.title = "My title"

To register your own MD5 type, you can use:

from hachoir.metadata.metadata import Metadata
from hachoir.metadata.metadata_item import Data

metadata = Metadata(None)
metadata.register(Data("md5", 990, "MD5 checksum", type=str))
metadata.md5 = "123"
Plaoo commented 6 months ago

Thanks again @vstinner I solved it, now I try to rewrite the metadata inside the file.