mp3db / app.py
Sergidev's picture
Update app.py
eb9d562 verified
raw
history blame
3.02 kB
import os
import io
import wave
import struct
from flask import Flask, render_template, request, send_file, jsonify
from werkzeug.utils import secure_filename
app = Flask(__name__)
UPLOAD_FOLDER = '/tmp'
ALLOWED_EXTENSIONS = {'mp3', 'wav'}
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():
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
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)
factor = int(request.form['factor'])
is_decrypting = filename.lower().endswith('.mp3')
try:
if is_decrypting:
output = deconvert_file(filepath, factor)
output_filename = 'deconverted_file.wav'
mimetype = 'audio/wav'
else:
output = convert_file(filepath, factor)
output_filename = 'converted_file.mp3'
mimetype = 'audio/mpeg'
os.remove(filepath)
return send_file(
io.BytesIO(output),
mimetype=mimetype,
as_attachment=True,
download_name=output_filename
)
except Exception as e:
os.remove(filepath)
return jsonify({'error': str(e)}), 500
return jsonify({'error': 'Invalid file type'}), 400
def convert_file(filepath, factor):
with wave.open(filepath, 'rb') as wav_file:
params = wav_file.getparams()
frames = wav_file.readframes(wav_file.getnframes())
audio_data = struct.unpack(f'{len(frames)//params.sampwidth}h', frames)
modified_data = [int(sample * factor / 100) for sample in audio_data]
output = io.BytesIO()
with wave.open(output, 'wb') as wav_output:
wav_output.setparams(params)
wav_output.writeframes(struct.pack(f'{len(modified_data)}h', *modified_data))
return output.getvalue()
def deconvert_file(filepath, factor):
with wave.open(filepath, 'rb') as wav_file:
params = wav_file.getparams()
frames = wav_file.readframes(wav_file.getnframes())
audio_data = struct.unpack(f'{len(frames)//params.sampwidth}h', frames)
modified_data = [int(sample * 100 / factor) for sample in audio_data]
output = io.BytesIO()
with wave.open(output, 'wb') as wav_output:
wav_output.setparams(params)
wav_output.writeframes(struct.pack(f'{len(modified_data)}h', *modified_data))
return output.getvalue()
if __name__ == '__main__':
app.run(debug=True)