Initial commit

This commit is contained in:
Dendy 2024-01-23 17:31:46 +01:00
commit c9483141d4
8 changed files with 148 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__
config.toml

6
app.py Normal file
View File

@ -0,0 +1,6 @@
#!/usr/bin/env python3
from src import app
if __name__ == "__main__":
app.run(debug=True)

8
config.toml.example Normal file
View File

@ -0,0 +1,8 @@
name = "Folder share"
base_path = "/path/to/folder"
favicon = "/.favicon.png"
[qbittorrent]
base_url = "http://127.0.0.1:8080"
username = "admin"
password = "adminadmin"

63
src/__init__.py Normal file
View File

@ -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)

17
static/style/main.css Normal file
View File

@ -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;
}

22
templates/base.html Normal file
View File

@ -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>

21
templates/directory.html Normal file
View File

@ -0,0 +1,21 @@
{% extends 'base.html' %}
{% block title %}{{ path }}{% endblock %}
{% block body %}
<a href="..">&lt;--</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 %}

9
templates/error.html Normal file
View File

@ -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 %}