diff --git a/api.py b/api.py new file mode 100644 index 0000000..de3f9ae --- /dev/null +++ b/api.py @@ -0,0 +1,77 @@ +import os +import random +import threading +import time +from flask import Flask, render_template, request +from flask_socketio import SocketIO, emit, join_room, leave_room, disconnect + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'your_secret_key' +socketio = SocketIO(app, cors_allowed_origins="*") + +files = {} +lock = threading.Lock() + +def generate_code(): + return ''.join(random.choices('0123456789', k=6)) + +def remove_file_after_timeout(code, uploader_sid, timeout=600): + start_time = time.time() + while time.time() - start_time < timeout: + with lock: + if code not in files or files[code].get('downloading'): + return + remaining_time = int(timeout - (time.time() - start_time)) + socketio.emit('countdown', {'code': code, 'remaining_time': remaining_time}, room=uploader_sid) + time.sleep(1) + + with lock: + if code in files: + del files[code] + socketio.emit('file_expired', {'code': code}, room=uploader_sid) + print(f"File transfer for code {code} has expired and been removed.") + +@app.route('/') +def index(): + return render_template('index.html') + +@socketio.on('upload_file') +def handle_upload_file(data): + code = generate_code() + file = data['file'] + uploader_sid = request.sid + + with lock: + files[code] = {'file': file, 'uploader_sid': uploader_sid, 'downloading': False} + + threading.Thread(target=remove_file_after_timeout, args=(code, uploader_sid)).start() + + emit('file_uploaded', {'code': code}, room=uploader_sid) + +@socketio.on('join') +def on_join(data): + code = data['code'] + join_room(code) + emit('joined_room', {'message': f'Joined room {code}'}, room=code) + +@socketio.on('download_request') +def handle_download_request(data): + code = data['code'] + with lock: + if code in files: + file_info = files[code] + file = file_info['file'] + uploader_sid = file_info['uploader_sid'] + file_info['downloading'] = True + emit('download_file', {'file': file}, room=code) + emit('download_started', {'message': f'Download started for code {code}'}, room=code) + emit('file_downloading', {'message': 'File is being downloaded'}, room=uploader_sid) + else: + emit('error', {'message': 'Invalid code or file does not exist'}, room=code) + +@socketio.on('disconnect') +def on_disconnect(): + leave_room(request.sid) + +if __name__ == '__main__': + socketio.run(app, host='0.0.0.0', port=5000, debug=True)