Initial commit
This commit is contained in:
		
						commit
						81ae0021e2
					
				|  | @ -0,0 +1 @@ | ||||||
|  | __pycache__ | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | 
 | ||||||
|  | from src import app | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     app.run(debug=True) | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | name = "film.lidiarock.one" | ||||||
|  | base_path = "/mnt/hakodate/cul" | ||||||
|  | favicon = "/.favnikon.png" | ||||||
|  | 
 | ||||||
|  | [qbittorrent] | ||||||
|  | base_url = "http://127.0.0.1:8080" | ||||||
|  | username = "" | ||||||
|  | password = "" | ||||||
|  | @ -0,0 +1,63 @@ | ||||||
|  | #!/usr/bin/env python3 | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | import tomllib | ||||||
|  | from flask import Flask, render_template, send_file | ||||||
|  | 
 | ||||||
|  | with open("config.toml", "rb") as f: | ||||||
|  |     config = tomllib.load(f) | ||||||
|  | 
 | ||||||
|  | app = Flask( | ||||||
|  |     __name__, | ||||||
|  |     template_folder="../templates", | ||||||
|  |     static_folder="../static", | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | app.jinja_env.globals.update( | ||||||
|  |     config=config, | ||||||
|  |     path_join=os.path.join, | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | # Catch all | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @app.route('/', defaults={'path': ''}) | ||||||
|  | @app.route('/<path:path>') | ||||||
|  | def index(path): | ||||||
|  |     internal_path = os.path.join(config['base_path'], path) | ||||||
|  |     path = '/' + path | ||||||
|  | 
 | ||||||
|  |     # Checks ################################################### | ||||||
|  | 
 | ||||||
|  |     if '..' in path: | ||||||
|  |         return 'Path cannot contain double dots, i.e. "..".' | ||||||
|  | 
 | ||||||
|  |     if not os.path.exists(internal_path): | ||||||
|  |         return ( | ||||||
|  |             render_template( | ||||||
|  |                 "error.html", | ||||||
|  |                 code=404, | ||||||
|  |                 msg=f'The path "{path}" does not exist.' | ||||||
|  |             ), | ||||||
|  |             404, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     # Actual serving ########################################### | ||||||
|  | 
 | ||||||
|  |     if os.path.isdir(internal_path): | ||||||
|  |         _, dirs, files = next(os.walk(internal_path)) | ||||||
|  |         files = filter(lambda x: not x.startswith("."), files) | ||||||
|  |         dirs = filter(lambda x: not x.startswith("."), dirs) | ||||||
|  | 
 | ||||||
|  |         return ( | ||||||
|  |             render_template( | ||||||
|  |                 "directory.html", | ||||||
|  |                 path=path, | ||||||
|  |                 dirs=dirs, | ||||||
|  |                 files=files, | ||||||
|  |             ), | ||||||
|  |             200, | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     # Path exists, not a folder, must be a file, send | ||||||
|  |     return send_file(internal_path) | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | body { | ||||||
|  |   background-color: #191919; | ||||||
|  | 	color: white; | ||||||
|  | 	font-family: monospace; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | a { | ||||||
|  | 	text-decoration: none; | ||||||
|  | 	color: lightgrey; | ||||||
|  | } | ||||||
|  |   a:visited { | ||||||
|  | 	  color: grey; | ||||||
|  |   } | ||||||
|  |   a:hover { | ||||||
|  | 	  color: #191919; | ||||||
|  | 	  background-color: white; | ||||||
|  |   } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | <!doctype html> | ||||||
|  | <html lang="en"> | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta http-equiv="x-ua-compatible" content="ie=edge" /> | ||||||
|  |     <meta name="description" content="" /> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||||
|  | 
 | ||||||
|  |     <title>{% block title %}{% endblock %} - {{ config["name"] }}</title> | ||||||
|  | 
 | ||||||
|  |     <link | ||||||
|  |       rel="stylesheet" | ||||||
|  |       href="{{ url_for('static', filename='style/main.css') }}" | ||||||
|  |     /> | ||||||
|  |     <link rel="icon" href="{{ config["favicon"] }}"> | ||||||
|  | 
 | ||||||
|  |     {# <script src="{{ url_for('static', filename='lib/htmx.min.js') }}"></script> #} | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     {% block body %}{% endblock %} | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | {% extends 'base.html' %} | ||||||
|  | 
 | ||||||
|  | {% block title %}{{ path }}{% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block body %} | ||||||
|  | <a href=".."><--</a> | ||||||
|  | <br /><br /> | ||||||
|  | 
 | ||||||
|  | {% for dir in dirs %} | ||||||
|  | <a href="{{ path_join(path, dir) }}">{{ dir }}</a><br /> | ||||||
|  | {% endfor %} | ||||||
|  | 
 | ||||||
|  | <br /><br /> | ||||||
|  | 
 | ||||||
|  | <h3>Archivos</h3> | ||||||
|  | 
 | ||||||
|  | {% for file in files %} | ||||||
|  | <a href="{{ path_join(path, file) }}">{{ file }}</a><br /> | ||||||
|  | {% endfor %} | ||||||
|  | 
 | ||||||
|  | {% endblock %} | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | {% extends 'base.html' %} | ||||||
|  | 
 | ||||||
|  | {% block title %}Error {{ code }}{% endblock %} | ||||||
|  | 
 | ||||||
|  | {% block body %} | ||||||
|  | <h1>Error {{ code }}</h1> | ||||||
|  | <p>{{ msg }}</p> | ||||||
|  | <a href="/">Return to Index</a> | ||||||
|  | {% endblock %} | ||||||
		Loading…
	
		Reference in New Issue