share / main.py
Starchik1's picture
Update main.py
448021a verified
raw
history blame
2.08 kB
from flask import Flask, request, jsonify, Response
import random
import string
import threading
import time
from datetime import datetime, timedelta
app = Flask(__name__)
transfers = {}
transfer_data = {}
transfer_lock = threading.Lock()
# Настройки
KEEP_ALIVE_INTERVAL = 10 # Отправлять keep-alive каждые 25 секунд
TRANSFER_TIMEOUT = 3600 # 1 час таймаута передачи
def generate_short_id(length=4):
while True:
token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
if token not in transfers:
return token
@app.route('/download/<transfer_id>', methods=['GET'])
def download_file(transfer_id):
def generate():
last_activity = time.time()
index = 0
while True:
with transfer_lock:
# Проверка таймаута
if time.time() - last_activity > TRANSFER_TIMEOUT:
break
transfer = transfers.get(transfer_id)
if not transfer:
break
chunks = transfer_data.get(transfer_id, [])
# Отправка доступных чанков
while index < len(chunks):
yield chunks[index]
last_activity = time.time()
index += 1
if transfer['completed']:
break
# Отправка keep-alive
if time.time() - last_activity > KEEP_ALIVE_INTERVAL:
yield b'\0' # Пустой чанк для поддержания соединения
last_activity = time.time()
time.sleep(0.1)
return Response(
generate(),
mimetype='application/octet-stream',
headers={
'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
'Cache-Control': 'no-store'
}
)