pycrate/tools/pycrate_showmedia.py

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())