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)