aboutsummaryrefslogtreecommitdiff
path: root/app/main.py
diff options
context:
space:
mode:
authorNikolay G <crushoverdrive@mail.ru>2023-02-17 20:51:50 +0300
committerGitHub <noreply@github.com>2023-02-17 20:51:50 +0300
commitf30bd109f7573472c288280b28abb7dd9d30ac7f (patch)
tree247d01d84268d0211f426b0dba30c410e7247797 /app/main.py
parentUpdate README.md (diff)
parentMerge pull request #219 from PikuZheng/patch-1 (diff)
downloadmetube-f30bd109f7573472c288280b28abb7dd9d30ac7f.tar.gz
metube-f30bd109f7573472c288280b28abb7dd9d30ac7f.tar.bz2
metube-f30bd109f7573472c288280b28abb7dd9d30ac7f.zip
Merge branch 'master' into master
Diffstat (limited to 'app/main.py')
-rw-r--r--app/main.py56
1 files changed, 53 insertions, 3 deletions
diff --git a/app/main.py b/app/main.py
index 4602ef9..6fc46c6 100644
--- a/app/main.py
+++ b/app/main.py
@@ -7,6 +7,7 @@ from aiohttp import web
import socketio
import logging
import json
+import pathlib
from ytdl import DownloadQueueNotifier, DownloadQueue
@@ -16,6 +17,8 @@ class Config:
_DEFAULTS = {
'DOWNLOAD_DIR': '.',
'AUDIO_DOWNLOAD_DIR': '%%DOWNLOAD_DIR',
+ 'CUSTOM_DIRS': 'true',
+ 'CREATE_CUSTOM_DIRS': 'true',
'STATE_DIR': '.',
'URL_PREFIX': '',
'OUTPUT_TEMPLATE': '%(title)s.%(ext)s',
@@ -26,12 +29,19 @@ class Config:
'BASE_DIR': ''
}
+ _BOOLEAN = ('CUSTOM_DIRS', 'CREATE_CUSTOM_DIRS')
+
def __init__(self):
for k, v in self._DEFAULTS.items():
setattr(self, k, os.environ[k] if k in os.environ else v)
for k, v in self.__dict__.items():
if v.startswith('%%'):
setattr(self, k, getattr(self, v[2:]))
+ if k in self._BOOLEAN:
+ if v not in ('true', 'false', 'True', 'False', 'on', 'off', '1', '0'):
+ log.error(f'Environment variable "{k}" is set to a non-boolean value "{v}"')
+ sys.exit(1)
+ setattr(self, k, v in ('true', 'True', 'on', '1'))
if not self.URL_PREFIX.endswith('/'):
self.URL_PREFIX += '/'
try:
@@ -83,7 +93,8 @@ async def add(request):
if not url or not quality:
raise web.HTTPBadRequest()
format = post.get('format')
- status = await dqueue.add(url, quality, format)
+ folder = post.get('folder')
+ status = await dqueue.add(url, quality, format, folder)
return web.Response(text=serializer.encode(status))
@routes.post(config.URL_PREFIX + 'delete')
@@ -99,6 +110,40 @@ async def delete(request):
@sio.event
async def connect(sid, environ):
await sio.emit('all', serializer.encode(dqueue.get()), to=sid)
+ await sio.emit('configuration', serializer.encode(config), to=sid)
+ if config.CUSTOM_DIRS:
+ await sio.emit('custom_dirs', serializer.encode(get_custom_dirs()), to=sid)
+
+def get_custom_dirs():
+ def recursive_dirs(base):
+ path = pathlib.Path(base)
+
+ # Converts PosixPath object to string, and remove base/ prefix
+ def convert(p):
+ s = str(p)
+ if s.startswith(base):
+ s = s[len(base):]
+
+ if s.startswith('/'):
+ s = s[1:]
+
+ return s
+
+ # Recursively lists all subdirectories of DOWNLOAD_DIR
+ dirs = list(filter(None, map(convert, path.glob('**'))))
+
+ return dirs
+
+ download_dir = recursive_dirs(config.DOWNLOAD_DIR)
+
+ audio_download_dir = download_dir
+ if config.DOWNLOAD_DIR != config.AUDIO_DOWNLOAD_DIR:
+ audio_download_dir = recursive_dirs(config.AUDIO_DOWNLOAD_DIR)
+
+ return {
+ "download_dir": download_dir,
+ "audio_download_dir": audio_download_dir
+ }
@routes.get(config.URL_PREFIX)
def index(request):
@@ -115,9 +160,14 @@ if config.URL_PREFIX != '/':
routes.static(config.URL_PREFIX + 'favicon/', os.path.join(config.BASE_DIR, 'favicon'))
routes.static(config.URL_PREFIX + 'download/', config.DOWNLOAD_DIR)
+routes.static(config.URL_PREFIX + 'audio_download/', config.AUDIO_DOWNLOAD_DIR)
routes.static(config.URL_PREFIX, os.path.join(config.BASE_DIR, 'ui/dist/metube'))
-app.add_routes(routes)
-
+try:
+ app.add_routes(routes)
+except ValueError as e:
+ if 'ui/dist/metube' in str(e):
+ raise RuntimeError('Could not find the frontend UI static assets. Please run `node_modules/.bin/ng build` inside the ui folder') from e
+ raise e
# https://github.com/aio-libs/aiohttp/pull/4615 waiting for release
# @routes.options(config.URL_PREFIX + 'add')
bgstack15