108 lines
3.3 KiB
Python
Executable File
108 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
#/**
|
|
# * Software Name : pycrate
|
|
# * Version : 0.4
|
|
# *
|
|
# * Copyright 2017. Benoit Michau. ANSSI.
|
|
# *
|
|
# * This program is free software: you can redistribute it and/or modify
|
|
# * it under the terms of the GNU General Public License version 2 as published
|
|
# * by the Free Software Foundation.
|
|
# *
|
|
# * This program is distributed in the hope that it will be useful,
|
|
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# * GNU General Public License for more details.
|
|
# *
|
|
# * You will find a copy of the terms and conditions of the GNU General Public
|
|
# * License version 2 in the "license.txt" file or
|
|
# * see http://www.gnu.org/licenses/ or write to the Free Software Foundation,
|
|
# * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
# *
|
|
# *--------------------------------------------------------
|
|
# * File Name : pycrate_showstruct.py
|
|
# * Created : 2017-04-23
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
|
|
import os
|
|
import sys
|
|
import argparse
|
|
|
|
from pycrate_core.base import Buf
|
|
from pycrate_core.elt import Element
|
|
|
|
# list of supported media
|
|
mediasup = 'BMP, GIF, JPEG, MP3, MPEG4, PNG, TIFF'
|
|
|
|
def main():
|
|
|
|
parser = argparse.ArgumentParser(description='print the internal structure of the input media file,'\
|
|
'supported formats are: %s' % mediasup)
|
|
parser.add_argument('input', type=str, help='input media file')
|
|
parser.add_argument('-bl', type=int, default=1024,
|
|
help='maximum length for buffer representation')
|
|
parser.add_argument('-wt', action='store_true', default=False,
|
|
help='show also absent / transparent fields')
|
|
args = parser.parse_args()
|
|
|
|
if not os.path.isfile(args.input):
|
|
print('%s, args error: invalid input %s' % (sys.argv[0], args.input))
|
|
return 0
|
|
suf = args.input.split('.')[-1].upper()
|
|
try:
|
|
fd = open(args.input, 'rb')
|
|
except:
|
|
print('%s, args error: unable to open input %s' % (sys.argv[0], args.input))
|
|
return 0
|
|
else:
|
|
buf = fd.read()
|
|
fd.close()
|
|
|
|
if suf == 'BMP':
|
|
from pycrate_media.BMP import BMP
|
|
struct = BMP()
|
|
elif suf == 'GIF':
|
|
from pycrate_media.GIF import GIF
|
|
struct = GIF()
|
|
elif suf in ('JPG', 'JPEG'):
|
|
from pycrate_media.JPEG import JPEG
|
|
struct = JPEG()
|
|
elif suf == 'MP3':
|
|
from pycrate_media.MP3 import MP3
|
|
struct = MP3()
|
|
elif suf in ('MPEG4', 'MP4'):
|
|
from pycrate_media.MPEG4 import MPEG4
|
|
struct = MPEG4()
|
|
elif suf == 'PNG':
|
|
from pycrate_media.PNG import PNG
|
|
struct = PNG()
|
|
elif suf in ('TIFF', 'TIF'):
|
|
from pycrate_media.TIFF import TIFF
|
|
struct = TIFF()
|
|
else:
|
|
print('%s, unknown format: %s' % (sys.argv[0], suf))
|
|
return 0
|
|
|
|
Buf.REPR_MAXLEN = args.bl
|
|
|
|
try:
|
|
struct.from_bytes(buf)
|
|
except:
|
|
print('%s, parsing error: unable to parse file %s' % (sys.argv[0], args.input))
|
|
return 0
|
|
|
|
# do not print absent / transparent fields
|
|
if not args.wt:
|
|
Element.ENV_SEL_TRANS = False
|
|
|
|
print(struct.show())
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|
|
|