#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'Jayson Santos dos Reis'
__version__ = '0.1'

import sys
import os
import optparse
import struct

def _e(str):
    sys.stderr.write(str)
    sys.stderr.flush()
    
opcoes_parser = optparse.OptionParser()
opcoes_parser.add_option("-a", "--arquivo", dest="arquivo")

opcoes_parser.add_option("-d", "--diretorio_destino", dest="diretorio_destino")

(opcoes, opcoes_argumentos) = opcoes_parser.parse_args(sys.argv)

if opcoes.arquivo is None:
    _e('O arquivo a ser analisado é obrigatório\n')
    sys.exit(1)
else:
    if os.path.exists(opcoes.arquivo):
        arquivo = open(opcoes.arquivo, 'rb').read()
        tamanho_arquivo = len(arquivo)
    else:
        _e('Arquivo inexistente: "%s"\n' % opcoes.arquivo)
    
if opcoes.diretorio_destino is None:
    diretorio_destino = os.path.abspath(os.path.dirname(__file__))
    arquivo_base = os.path.basename(os.path.splitext(opcoes.arquivo)[0])
    arquivo_swf = os.path.join(diretorio_destino, '%s-%d.swf')
else:
    diretorio_destino = os.path.abspath(os.path.dirname(opcoes.diretorio_destino))
    arquivo_base = os.path.basename(os.path.splitext(opcoes.arquivo)[0])
    arquivo_swf = os.path.join(diretorio_destino, '%s-%d.swf')
    
i = 0
arquivos_flash = 0
print 'Arguarde. A análise do arquivo pode demorar um pouco.'
while i < tamanho_arquivo:
    try:
        tmp = struct.unpack('3s', arquivo[i:i+3])[0]
    except struct.error:
        # fim do arquivo
        break
    if tmp == 'CWS' or tmp == 'FWS' :
        arquivos_flash += 1
        if tmp == 'CWS':
            arquivo_comprimido = True
            _e('Extraindo um arquivo compactado\n')
        else:
            arquivo_comprimido = False
        arquivo_swf_final_nome = arquivo_swf % (arquivo_base, arquivos_flash)
        print 'Encontrado um arquivo flash.'
        tamanho_arquivo = struct.unpack("<I", arquivo[i+4:i+8])[0]
        arquivo_swf_final = open(arquivo_swf_final_nome, 'wb')
        arquivo_swf_final.write(arquivo[i:i+511+tamanho_arquivo])
        arquivo_swf_final.close()
        print "Gravado em: %s" % arquivo_swf_final_nome
        i += 511 + tamanho_arquivo
    else:    
        i += 1
if arquivos_flash > 0:
    if arquivos_flash == 1:
        print '%s arquivo SWF salvo em %s.' % (arquivos_flash, diretorio_destino)
    else:
        print '%s arquivos SWF salvos em %s.' % (arquivos_flash, diretorio_destino)
else:
    print 'Não foram encontrados arquivos SWF dentro do arquivo fornecido.'

