initial test version

This commit is contained in:
Todor Bogosavljević 2024-08-23 11:51:59 +02:00
parent d0ff7ffd3a
commit d40befddd1

97
main.py Executable file
View File

@ -0,0 +1,97 @@
import os
import uuid
import time
import json
import threading
from flask import Flask, request, redirect, send_from_directory, abort
app = Flask(__name__)
# config
UPLOAD_FOLDER = './uploads'
MAX_FILE_SIZE = 1024 * 1024 * 100 # last number = megabytes
EXPIRATION_TIME = 60 * 60 * 24 * 7 # last number = days
DATA_FILE = 'data.json'
URL_PREFIX = 'http://localhost:5000/'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
def load_data():
if os.path.exists(DATA_FILE):
with open(DATA_FILE, 'r') as f:
return json.load(f)
return {}
data = load_data()
def save_data():
with open(DATA_FILE, 'w') as f:
json.dump(data, f)
def cleanup_files():
while True:
time.sleep(60 * 60)
now = time.time()
for key, item in list(data.items()):
if 'expiry' in item and now > item['expiry']:
try:
os.remove(item['path'])
except Exception as e:
print(f"Error removing file {item['path']}: {e}")
del data[key]
save_data()
threading.Thread(target=cleanup_files, daemon=True).start()
@app.route('/', methods=['POST'])
def upload_file():
file = request.files.get('file')
if not file:
return "No file uploaded\n", 400
if file.content_length > MAX_FILE_SIZE:
return "File too large\n", 400
filename = file.filename
key = uuid.uuid4().hex[:6]
filepath = os.path.join(UPLOAD_FOLDER, f"{key}_{filename}")
file.save(filepath)
data[key] = {
'type': 'file',
'path': filepath,
'expiry': time.time() + EXPIRATION_TIME
}
save_data()
return f"{URL_PREFIX}{key}\n"
@app.route('/shorten', methods=['POST'])
def shorten_url():
url = request.form.get('url')
if not url:
return "No URL provided\n", 400
key = uuid.uuid4().hex[:6]
data[key] = {
'type': 'url',
'url': url,
'expiry': time.time() + EXPIRATION_TIME
}
save_data()
return f"{URL_PREFIX}{key}\n"
@app.route('/<key>', methods=['GET'])
def get_content(key):
item = data.get(key)
if not item:
abort(404)
if item['type'] == 'file':
return send_from_directory(UPLOAD_FOLDER, os.path.basename(item['path']))
elif item['type'] == 'url':
return redirect(item['url'])
else:
abort(404)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)