File size: 4,463 Bytes
c3a814a 0fd032c c3a814a fa163a1 c3a814a 0fd032c c3a814a 0940b20 c3a814a 0fd032c c3a814a 0fd032c c3a814a 0fd032c c3a814a 0fd032c c3a814a fa163a1 0940b20 c3a814a 42bca7e 0940b20 42bca7e 0940b20 c3a814a 0fd032c 42bca7e 0fd032c 42bca7e 0fd032c 42bca7e c3a814a 0fd032c c3a814a 0940b20 c3a814a 0940b20 c3a814a 0940b20 fa163a1 c3a814a fa163a1 c3a814a 0940b20 fa163a1 c3a814a 0940b20 6727e6c c3a814a fa163a1 0940b20 fa163a1 c3a814a eb9d562 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import os
import io
import wave
import struct
import logging
from flask import Flask, render_template, request, send_file, jsonify
from werkzeug.utils import secure_filename
from pydub import AudioSegment
import magic
app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)
logger = app.logger
UPLOAD_FOLDER = '/tmp'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'mp3', 'wav', 'txt', 'pdf'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/')
def index():
return render_template('index.html')
@app.route('/process', methods=['POST'])
def process_file():
logger.info("Processing file request received")
if 'file' not in request.files:
logger.error("No file part in the request")
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
logger.error("No selected file")
return jsonify({'error': 'No selected file'}), 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
logger.info(f"File saved: {filepath}")
factor = int(request.form['factor'])
is_decrypting = filename.lower().endswith('.mp3')
logger.info(f"Processing file: {'decrypting' if is_decrypting else 'encrypting'} with factor {factor}")
try:
if is_decrypting:
output, output_filename, mimetype = decrypt_file(filepath, factor)
else:
output, output_filename, mimetype = encrypt_file(filepath, factor)
logger.info(f"File processed successfully. Output size: {len(output)} bytes")
os.remove(filepath)
logger.info(f"Temporary file removed: {filepath}")
return send_file(
io.BytesIO(output),
mimetype=mimetype,
as_attachment=True,
download_name=output_filename
)
except Exception as e:
logger.error(f"Error processing file: {str(e)}")
os.remove(filepath)
return jsonify({'error': str(e)}), 500
logger.error("Invalid file type")
return jsonify({'error': 'Invalid file type'}), 400
def encrypt_file(filepath, factor):
logger.info(f"Encrypting file: {filepath}")
with open(filepath, 'rb') as file:
data = file.read()
# Convert data to audio samples
samples = [ord(byte) * factor for byte in data.decode('latin-1')]
# Create WAV file
wav_output = io.BytesIO()
with wave.open(wav_output, 'wb') as wav_file:
wav_file.setnchannels(1)
wav_file.setsampwidth(2)
wav_file.setframerate(44100)
wav_file.writeframes(struct.pack(f'{len(samples)}h', *samples))
# Convert WAV to MP3
wav_output.seek(0)
audio = AudioSegment.from_wav(wav_output)
mp3_output = io.BytesIO()
audio.export(mp3_output, format="mp3")
logger.info(f"Encryption complete. Output size: {mp3_output.getbuffer().nbytes} bytes")
return mp3_output.getvalue(), 'encrypted.mp3', 'audio/mpeg'
def decrypt_file(filepath, factor):
logger.info(f"Decrypting file: {filepath}")
# Convert MP3 to WAV
audio = AudioSegment.from_mp3(filepath)
wav_output = io.BytesIO()
audio.export(wav_output, format="wav")
wav_output.seek(0)
with wave.open(wav_output, 'rb') as wav_file:
params = wav_file.getparams()
frames = wav_file.readframes(wav_file.getnframes())
samples = struct.unpack(f'{len(frames)//2}h', frames)
# Use a list comprehension with error handling
decrypted_bytes = bytearray()
for sample in samples:
byte_value = int(round(sample / factor))
# Ensure the byte value is within the valid range (0-255)
decrypted_bytes.append(max(0, min(byte_value, 255)))
decrypted_data = bytes(decrypted_bytes)
# Detect original file type
mime = magic.Magic(mime=True)
file_type = mime.from_buffer(decrypted_data)
file_extension = file_type.split('/')[-1]
logger.info(f"Decryption complete. Output size: {len(decrypted_data)} bytes")
return decrypted_data, f'decrypted_file.{file_extension}', file_type
if __name__ == '__main__':
app.run(debug=True) |