cybertool-api / app.py
alphg's picture
Rename api.py to app.py
a17d378 verified
import time
import os
import subprocess
import zipfile
import base64
from flask import Flask, jsonify, request, send_file, make_response
import libtorrent as lt
from werkzeug.utils import secure_filename
from pdf2docx import Converter
import rarfile
from rembg import remove
from PIL import Image
from waitress import serve
from flask_cors import CORS, cross_origin
from whisper import load_model
app = Flask(__name__)
CORS(app)
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'webp'])
leet_dict = {
'a': '4',
'e': '3',
'i': '1',
'o': '0',
's': '5',
't': '7',
'A': '4',
'E': '3',
'I': '1',
'O': '0',
'S': '5',
'T': '7'
}
app.config['UPLOAD_FOLDER'] = 'temp/'
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
@app.route('/')
def hello_world():
return jsonify({"status": "online"})
@app.route('/t2m', methods=['POST'])
@cross_origin(origin='*')
def convert_to_magnet():
if 'file' not in request.files:
return jsonify({"error": "No file part in the request"}), 400
file = request.files['file']
if file.filename == '':
return jsonify({"error": "No selected file"}), 400
torrent_data = file.read()
ti = lt.torrent_info(lt.bdecode(torrent_data))
magnet_link = lt.make_magnet_uri(ti)
return jsonify({"magnet_link": magnet_link})
@app.route('/m2t', methods=['POST'])
@cross_origin(origin='*')
def magnet_to_torrent():
if 'magnet_link' not in request.form:
return jsonify({"error": "No magnet_link in the request"}), 400
magnet_link = request.form['magnet_link']
dst = 'temp'
try:
params = lt.parse_magnet_uri(magnet_link)
params.save_path = dst
session = lt.session()
handle = session.add_torrent(params)
while not handle.has_metadata():
time.sleep(0.1)
torrent_info = handle.get_torrent_info()
torrent_file = lt.create_torrent(torrent_info)
torrent_path = os.path.join(dst, torrent_info.name() + ".torrent")
with open(torrent_path, "wb") as f:
f.write(lt.bencode(torrent_file.generate()))
response = send_file(torrent_path, as_attachment=True,
download_name=torrent_info.name() + ".torrent")
os.remove(torrent_path)
return response
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/w2p', methods=['POST'])
@cross_origin(origin='*')
def convert_word_to_pdf():
if 'file' not in request.files:
return {"error": "No file in the request"}, 400
file = request.files['file']
filename = secure_filename(file.filename)
filepath = os.path.join('temp', filename)
file.save(filepath)
output_pdf_path = os.path.join('temp', f"{filename.split('.')[0]}.pdf")
try:
subprocess.run(['libreoffice', '--headless', '--convert-to',
'pdf', filepath, '--outdir', 'temp'], check=True)
response = send_file(output_pdf_path, as_attachment=True,
download_name=f"{filename.split('.')[0]}.pdf")
os.remove(filepath)
os.remove(output_pdf_path)
return response
except Exception as e:
return {"error": str(e)}, 500
@app.route('/p2w', methods=['POST'])
@cross_origin(origin='*')
def convert_pdf_to_word():
if 'file' not in request.files:
return {"error": "No file in the request"}, 400
file = request.files['file']
filename = secure_filename(file.filename)
filepath = os.path.join('temp', filename)
file.save(filepath)
output_word_path = os.path.join('temp', f"{filename.split('.')[0]}.docx")
try:
cv = Converter(filepath)
cv.convert(output_word_path, start=0, end=None)
cv.close()
response = send_file(output_word_path, as_attachment=True,
download_name=f"{filename.split('.')[0]}.docx")
os.remove(filepath)
os.remove(output_word_path)
return response
except Exception as e:
return {"error": str(e)}, 500
@app.route('/unzip', methods=['POST'])
@cross_origin(origin='*')
def upload_file():
if 'file' not in request.files:
return jsonify({"error": "No file in the request"}), 400
file = request.files['file']
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
try:
if filename.endswith('.zip'):
unzip_file(filepath)
elif filename.endswith('.rar'):
unrar_file(filepath)
else:
return jsonify({"error": "Unsupported file type"}), 400
os.remove(filepath)
return jsonify({"message": "File unzipped successfully"}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/rmbg', methods=['POST'])
@cross_origin(origin='*')
def remback():
if 'file' not in request.files:
return 'No file part', 400
file = request.files['file']
if file.filename == '':
return 'No selected file', 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
output_filename = filename.split('.')[0] + "_rembg.png"
output_path = os.path.join(
app.config['UPLOAD_FOLDER'], output_filename)
remove_background(file_path, output_path)
response = send_file(output_path, mimetype='image/png')
os.remove(file_path)
os.remove(output_path)
return response
else:
return 'File type not allowed', 400
@app.route('/b64en', methods=['POST'])
@cross_origin(origin='*')
def encode_base64():
data = request.get_json()
if 'string' not in data:
return make_response(jsonify({'error': 'Missing string parameter'}), 400)
base64_data = base64.b64encode(
data['string'].encode('utf-8')).decode('utf-8')
return jsonify({'base64_data': base64_data})
@app.route('/b64de', methods=['POST'])
@cross_origin(origin='*')
def decode_base64():
data = request.get_json()
if 'string' not in data:
return make_response(jsonify({'error': 'Missing string parameter'}), 400)
try:
decoded_data = base64.b64decode(data['string']).decode('utf-8')
except Exception as _:
return make_response(jsonify({'error': 'Invalid base64 string'}), 400)
return jsonify({'decoded_data': decoded_data})
@app.route('/toleet', methods=['POST'])
def convert_to_leet():
data = request.get_json()
if 'text' not in data:
return jsonify({"error": "No text provided"}), 400
text = data['text']
leet_text = to_leet(text)
return jsonify({"leet_text": leet_text})
@app.route('/totext', methods=['POST'])
def speech_to_text():
audio_file = request.files['audio']
if audio_file:
filename = secure_filename(audio_file.filename)
audio_file.save(os.path.join('temp', filename))
else:
return {'error': 'No audio_file file provided'}, 400
model = load_model("tiny")
result = model.transcribe(f"temp/{filename}")
transcription = result["text"]
os.remove(f"temp/{filename}")
return jsonify({'transcription': transcription})
def unzip_file(filepath):
with zipfile.ZipFile(filepath, 'r') as zip_ref:
zip_ref.extractall(app.config['UPLOAD_FOLDER'])
def unrar_file(filepath):
with rarfile.RarFile(filepath, 'r') as rar_ref:
rar_ref.extractall(app.config['UPLOAD_FOLDER'])
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def remove_background(input_path, output_path):
input_img = Image.open(input_path)
output_img = remove(input_img)
output_img.save(output_path)
def to_leet(text):
leet_text = ""
for char in text:
if char in leet_dict:
leet_text += leet_dict[char]
else:
leet_text += char
return leet_text
if __name__ == '__main__':
serve(app, host='0.0.0.0', port=7860, threads=10)