From d40befddd13d54a0a2dce631f6ec4e6f92db32a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Todor=20Bogosavljevi=C4=87?= Date: Fri, 23 Aug 2024 11:51:59 +0200 Subject: [PATCH] initial test version --- main.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 main.py diff --git a/main.py b/main.py new file mode 100755 index 0000000..271ecc6 --- /dev/null +++ b/main.py @@ -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('/', 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)