def parseFontHeader(self): yield UInt16(self, "maj_ver", "Major version") yield UInt16(self, "min_ver", "Minor version") yield UInt16(self, "font_maj_ver", "Font major version") yield UInt16(self, "font_min_ver", "Font minor version") yield textHandler(UInt32(self, "checksum"), hexadecimal) yield Bytes(self, "magic", 4, r"Magic string (\x5F\x0F\x3C\xF5)") if self["magic"].value != b"\x5F\x0F\x3C\xF5": raise ParserError("TTF: invalid magic of font header") # Flags yield Bit(self, "y0", "Baseline at y=0") yield Bit(self, "x0", "Left sidebearing point at x=0") yield Bit(self, "instr_point", "Instructions may depend on point size") yield Bit(self, "ppem", "Force PPEM to integer values for all") yield Bit(self, "instr_width", "Instructions may alter advance width") yield Bit(self, "vertical", "e laid out vertically?") yield PaddingBits(self, "reserved[]", 1) yield Bit(self, "linguistic", "Requires layout for correct linguistic rendering?") yield Bit(self, "gx", "Metamorphosis effects?") yield Bit(self, "strong", "Contains strong right-to-left glyphs?") yield Bit(self, "indic", "contains Indic-style rearrangement effects?") yield Bit(self, "lossless", "Data is lossless (Agfa MicroType compression)") yield Bit(self, "converted", "Font converted (produce compatible metrics)") yield Bit(self, "cleartype", "Optimised for ClearType") yield Bits(self, "adobe", 2, "(used by Adobe)") yield UInt16(self, "unit_per_em", "Units per em") if not(16 <= self["unit_per_em"].value <= 16384): raise ParserError("TTF: Invalid unit/em value") yield UInt32(self, "created_high") yield TimestampMac32(self, "created") yield UInt32(self, "modified_high") yield TimestampMac32(self, "modified") yield UInt16(self, "xmin") yield UInt16(self, "ymin") yield UInt16(self, "xmax") yield UInt16(self, "ymax") # Mac style yield Bit(self, "bold") yield Bit(self, "italic") yield Bit(self, "underline") yield Bit(self, "outline") yield Bit(self, "shadow") yield Bit(self, "condensed", "(narrow)") yield Bit(self, "expanded") yield PaddingBits(self, "reserved[]", 9) yield UInt16(self, "lowest", "Smallest readable size in pixels") yield Enum(UInt16(self, "font_dir", "Font direction hint"), DIRECTION_NAME) yield Enum(UInt16(self, "ofst_format"), {0: "short offsets", 1: "long"}) yield UInt16(self, "glyph_format", "(=0)")
def createFields(self): yield String(self, "name", 32, "Name") yield UInt16(self, "flags", "Flags") yield UInt16(self, "version", "Version") yield TimestampMac32(self, "create_time", "Creation time") yield TimestampMac32(self, "mod_time", "Modification time") yield TimestampMac32(self, "backup_time", "Backup time") yield UInt32(self, "mod_num", "mod num") yield UInt32(self, "app_info", "app info") yield UInt32(self, "sort_info", "sort info") yield UInt32(self, "type", "type") yield UInt32(self, "id", "id") yield UInt32(self, "unique_id_seed", "unique_id_seed") yield UInt32(self, "next_record_list", "next_record_list") yield UInt16(self, "num_records", "num_records")
def createFields(self): yield String(self, "header_id", 4, "Playlist Header Markup (\"mhyp\")", charset="ISO-8859-1") yield UInt32(self, "header_length", "Header Length") yield UInt32(self, "entry_length", "Entry Length") yield UInt32(self, "data_object_child_count", "Number of Child Data Objects") yield UInt32(self, "playlist_count", "Number of Playlist Items") yield Enum(UInt8(self, "type", "Normal or master playlist?"), self.is_master_pl_name) yield UInt8(self, "XXX1", "XXX1") yield UInt8(self, "XXX2", "XXX2") yield UInt8(self, "XXX3", "XXX3") yield TimestampMac32(self, "creation_date", "Date when the playlist was created") yield UInt64(self, "playlistid", "Persistent Playlist ID") yield UInt32(self, "unk3", "unk3") yield UInt16(self, "string_mhod_count", "Number of string MHODs for this playlist") yield Enum(UInt16(self, "is_podcast", "Playlist or Podcast List?"), self.is_podcast_name) yield Enum(UInt32(self, "sort_order", "Playlist Sort Order"), self.list_sort_order_name) padding = self.seekByte(self["header_length"].value, "entry padding") if padding: yield padding for i in range(self["data_object_child_count"].value): yield DataObject(self, "mhod[]") for i in range(self["playlist_count"].value): yield PlaylistItem(self, "playlist_item[]")
def createFields(self): yield String(self, "header_id", 4, "Playlist Item Header Markup (\"mhip\")", charset="ISO-8859-1") yield UInt32(self, "header_length", "Header Length") yield UInt32(self, "entry_length", "Entry Length") yield UInt32(self, "data_object_child_count", "Number of Child Data Objects") yield UInt32(self, "podcast_grouping_flag", "Podcast Grouping Flag") yield UInt32(self, "group_id", "Group ID") yield UInt32(self, "track_id", "Track ID") yield TimestampMac32(self, "timestamp", "Song Timestamp") yield UInt32(self, "podcast_grouping_ref", "Podcast Grouping Reference") padding = self.seekByte(self["header_length"].value, "header padding") if padding: yield padding for i in range(self["data_object_child_count"].value): yield DataObject(self, "mhod[]")
def createFields(self): yield String(self, "header_id", 4, "Track Item Header Markup (\"mhit\")", charset="ISO-8859-1") yield UInt32(self, "header_length", "Header Length") yield UInt32(self, "entry_length", "Entry Length") yield UInt32(self, "string_number", "Number of Strings") yield UInt32(self, "unique_id", "Unique ID") yield UInt32(self, "visible_tag", "Visible Tag") yield String(self, "file_type", 4, "File Type") yield Enum(UInt8(self, "x1_type", "Extended Type 1"), self.x1_type_name) yield Enum(UInt8(self, "x2_type", "Extended type 2"), self.x2_type_name) yield UInt8(self, "compilation_flag", "Compilation Flag") yield UInt8(self, "rating", "Rating") yield TimestampMac32(self, "last_modified", "Time of the last modification of the track") yield filesizeHandler(UInt32(self, "size", "Track size in bytes")) yield displayHandler(UInt32(self, "length", "Track length in milliseconds"), humanDuration) yield UInt32(self, "track_number", "Number of this track") yield UInt32(self, "total_track", "Total number of tracks") yield UInt32(self, "year", "Year of the track") yield UInt32(self, "bitrate", "Bitrate") yield UInt32(self, "samplerate", "Sample Rate") yield UInt32(self, "volume", "volume") yield UInt32(self, "start_time", "Start playing at, in milliseconds") yield UInt32(self, "stop_time", "Stop playing at, in milliseconds") yield UInt32(self, "soundcheck", "SoundCheck preamp") yield UInt32(self, "playcount_1", "Play count of the track") yield UInt32(self, "playcount_2", "Play count of the track when last synced") yield TimestampMac32(self, "last_played_time", "Time the song was last played") yield UInt32(self, "disc_number", "disc number in multi disc sets") yield UInt32(self, "total_discs", "Total number of discs in the disc set") yield UInt32(self, "userid", "User ID in the DRM scheme") yield TimestampMac32(self, "added_date", "Date when the item was added") yield UInt32(self, "bookmark_time", "Bookmark time for AudioBook") yield UInt64(self, "dbid", "Unique DataBase ID for the song (identical in mhit and in mhii)") yield UInt8(self, "checked", "song is checked") yield UInt8(self, "application_rating", "Last Rating before change") yield UInt16(self, "BPM", "BPM of the track") yield UInt16(self, "artwork_count", "number of artworks for this item") yield UInt16(self, "unknown[]") yield UInt32(self, "artwork_size", "Total size of artworks in bytes") yield UInt32(self, "unknown[]") yield Float32(self, "sample_rate_2", "Sample Rate express in float") yield UInt32(self, "released_date", "Date of release in Music Store or in Podcast") yield UInt16(self, "unknown[]") yield UInt16(self, "explicit_flag[]", "Explicit flag") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "skip_count[]", "Skip Count") yield TimestampMac32(self, "last_skipped", "Date when the item was last skipped") yield UInt8(self, "has_artwork", "0x01 for track with artwork, 0x02 otherwise") yield UInt8(self, "skip_wen_shuffling", "Skip that track when shuffling") yield UInt8(self, "remember_playback_position", "Remember playback position") yield UInt8(self, "flag4", "Flag 4") yield UInt64(self, "dbid2", "Unique DataBase ID for the song (identical as above)") yield UInt8(self, "lyrics_flag", "Lyrics Flag") yield UInt8(self, "movie_file_flag", "Movie File Flag") yield UInt8(self, "played_mark", "Track has been played") yield UInt8(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "pregap[]", "Number of samples of silence before the song starts") yield UInt64(self, "sample_count", "Number of samples in the song (only for WAV and AAC files)") yield UInt32(self, "unknown[]") yield UInt32(self, "postgap[]", "Number of samples of silence at the end of the song") yield UInt32(self, "unknown[]") yield Enum(UInt32(self, "media_type", "Media Type for video iPod"), self.media_type_name) yield UInt32(self, "season_number", "Season Number") yield UInt32(self, "episode_number", "Episode Number") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "gapless_data[]", "The size in bytes from first Sync Frame until the 8th before the last frame.") yield UInt32(self, "unknown[]") yield UInt16(self, "gaplessTrackFlag[]", "1 if track has gapless data") yield UInt16(self, "gaplessAlbumFlag[]", "1 if track uses crossfading in iTunes") yield RawBytes(self, "unknown[]", 20) yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt32(self, "unknown[]") yield UInt16(self, "unknown[]") yield UInt16(self, "album_id[]", "Album ID (used to link tracks with MHIAs)") yield RawBytes(self, "unknown[]", 52) yield UInt32(self, "mhii_link[]", "Artwork ID (used to link tracks with MHIIs)") padding = self.seekByte(self["header_length"].value, "header padding") if padding: yield padding # while ((self.stream.readBytes(0, 4) == b'mhod') and # ((self.current_size//8) < self["entry_length"].value)): for i in range(self["string_number"].value): yield DataObject(self, "data[]") padding = self.seekBit(self._size, "entry padding") if padding: yield padding
def createFields(self): yield UInt16(self, "cfclcb", "Count of fields in the array of FC/LCB pairs") self._size = self['cfclcb'].value * 64 + 16 yield FCLCB(self, "StshfOrig", "Original STSH allocation") yield FCLCB(self, "Stshf", "Current STSH allocation") yield FCLCB(self, "PlcffndRef", "Footnote reference (FRD) PLC") yield FCLCB(self, "PlcffndTxt", "Footnote text PLC") yield FCLCB(self, "PlcfandRef", "Annotation reference (ATRD) PLC") yield FCLCB(self, "PlcfandTxt", "Annotation text PLC") yield FCLCB(self, "Plcfsed", "Section descriptor (SED) PLC") yield FCLCB(self, "Plcpad", "No longer used; used to be Plcfpgd (Page descriptor PLC)") yield FCLCB(self, "Plcfphe", "Paragraph heights (PHE) PLC (only for Complex files)") yield FCLCB(self, "Sttbfglsy", "Glossary string table") yield FCLCB(self, "Plcfglsy", "Glossary PLC") yield FCLCB(self, "Plcfhdd", "Header (HDD) PLC") yield FCLCB(self, "PlcfbteChpx", "Character property bin table PLC") yield FCLCB(self, "PlcfbtePapx", "Paragraph property bin table PLC") yield FCLCB(self, "Plcfsea", "Private Use PLC") yield FCLCB(self, "Sttbfffn", "Font information STTB") yield FCLCB(self, "PlcffldMom", "Main document field position (FLD) PLC") yield FCLCB(self, "PlcffldHdr", "Header subdocument field position (FLD) PLC") yield FCLCB(self, "PlcffldFtn", "Footnote subdocument field position (FLD) PLC") yield FCLCB(self, "PlcffldAtn", "Annotation subdocument field position (FLD) PLC") yield FCLCB(self, "PlcffldMcr", "No longer used") yield FCLCB(self, "Sttbfbkmk", "Bookmark names STTB") yield FCLCB(self, "Plcfbkf", "Bookmark begin position (BKF) PLC") yield FCLCB(self, "Plcfbkl", "Bookmark end position (BKL) PLC") yield FCLCB(self, "Cmds", "Macro commands") yield FCLCB(self, "Plcmcr", "No longer used") yield FCLCB(self, "Sttbfmcr", "No longer used") yield FCLCB(self, "PrDrvr", "Printer Driver information") yield FCLCB(self, "PrEnvPort", "Printer environment for Portrait mode") yield FCLCB(self, "PrEnvLand", "Printer environment for Landscape mode") yield FCLCB(self, "Wss", "Window Save State") yield FCLCB(self, "Dop", "Document Property data") yield FCLCB(self, "SttbfAssoc", "Associated strings STTB") yield FCLCB(self, "Clx", "Complex file information") yield FCLCB(self, "PlcfpgdFtn", "Not used") yield FCLCB(self, "AutosaveSource", "Original filename for Autosave purposes") yield FCLCB(self, "GrpXstAtnOwners", "String Group for Annotation Owner Names") yield FCLCB(self, "SttbfAtnbkmk", "Annotation subdocument bookmark names STTB") yield FCLCB(self, "PlcdoaMom", "No longer used") yield FCLCB(self, "PlcdoaHdr", "No longer used") yield FCLCB(self, "PlcspaMom", "Main document File Shape (FSPA) PLC") yield FCLCB(self, "PlcspaHdr", "Header subdocument FSPA PLC") yield FCLCB(self, "PlcfAtnbkf", "Annotation subdocument bookmark begin position (BKF) PLC") yield FCLCB(self, "PlcfAtnbkl", "Annotation subdocument bookmark end position (BKL) PLC") yield FCLCB(self, "Pms", "Print Merge State") yield FCLCB(self, "FormFldSttbs", "Form field values STTB") yield FCLCB(self, "PlcfendRef", "Endnote Reference (FRD) PLC") yield FCLCB(self, "PlcfendTxt", "Endnote Text PLC") yield FCLCB(self, "PlcffldEdn", "Endnote subdocument field position (FLD) PLC)") yield FCLCB(self, "PlcfpgdEdn", "not used") yield FCLCB(self, "DggInfo", "Office Art Object Table Data") yield FCLCB(self, "SttbfRMark", "Editor Author Abbreviations STTB") yield FCLCB(self, "SttbCaption", "Caption Title STTB") yield FCLCB(self, "SttbAutoCaption", "Auto Caption Title STTB") yield FCLCB(self, "Plcfwkb", "WKB PLC") yield FCLCB(self, "Plcfspl", "Spell Check State PLC") yield FCLCB(self, "PlcftxbxTxt", "Text Box Text PLC") yield FCLCB(self, "PlcffldTxbx", "Text Box Reference (FLD) PLC") yield FCLCB(self, "PlcfhdrtxbxTxt", "Header Text Box Text PLC") yield FCLCB(self, "PlcffldHdrTxbx", "Header Text Box Reference (FLD) PLC") yield FCLCB(self, "StwUser", "Macro User storage") yield FCLCB(self, "Sttbttmbd", "Embedded TrueType Font Data") yield FCLCB(self, "Unused") yield FCLCB(self, "PgdMother", "Main text page descriptors PLF") yield FCLCB(self, "BkdMother", "Main text break descriptors PLF") yield FCLCB(self, "PgdFtn", "Footnote text page descriptors PLF") yield FCLCB(self, "BkdFtn", "Footnote text break descriptors PLF") yield FCLCB(self, "PgdEdn", "Endnote text page descriptors PLF") yield FCLCB(self, "BkdEdn", "Endnote text break descriptors PLF") yield FCLCB(self, "SttbfIntlFld", "Field keywords STTB") yield FCLCB(self, "RouteSlip", "Mailer Routing Slip") yield FCLCB(self, "SttbSavedBy", "STTB of names of users who have saved the document") yield FCLCB(self, "SttbFnm", "STTB of filenames of documents referenced by this one") yield FCLCB(self, "PlcfLst", "List Format information PLC") yield FCLCB(self, "PlfLfo", "List Format Override information PLC") yield FCLCB(self, "PlcftxbxBkd", "Main document textbox break table (BKD) PLC") yield FCLCB(self, "PlcftxbxHdrBkd", "Header subdocument textbox break table (BKD) PLC") yield FCLCB(self, "DocUndo", "Undo/Versioning data") yield FCLCB(self, "Rgbuse", "Undo/Versioning data") yield FCLCB(self, "Usp", "Undo/Versioning data") yield FCLCB(self, "Uskf", "Undo/Versioning data") yield FCLCB(self, "PlcupcRgbuse", "Undo/Versioning data") yield FCLCB(self, "PlcupcUsp", "Undo/Versioning data") yield FCLCB(self, "SttbGlsyStyle", "Glossary entry style names STTB") yield FCLCB(self, "Plgosl", "Grammar options PL") yield FCLCB(self, "Plcocx", "OCX data PLC") yield FCLCB(self, "PlcfbteLvc", "Character property bin table PLC") if self['../fMac'].value: yield TimestampMac32(self, "ftModified", "Date last modified") yield Int32(self, "padding[]") else: yield TimestampWin64(self, "ftModified", "Date last modified") yield FCLCB(self, "Plcflvc", "LVC PLC") yield FCLCB(self, "Plcasumy", "Autosummary PLC") yield FCLCB(self, "Plcfgram", "Grammar check PLC") yield FCLCB(self, "SttbListNames", "List names STTB") yield FCLCB(self, "SttbfUssr", "Undo/Versioning data") while self.current_size < self.size: yield FCLCB(self, "unknown[]")
def parseVersion(self): yield TimestampMac32(self, "timestamp")
def createFields(self): yield TimestampMac32(self, "timestamp") yield PascalString32(self, "text")