From 6fd9393a917927453e36107664d9d102b5f5bd47 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 17 Mar 2020 00:04:13 -0400 Subject: [PATCH 001/570] Fix #52 by catching exceptions during download --- youtube-dl-server.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 78fd46c9..b6d2901f 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -67,7 +67,10 @@ def update(): def dl_worker(): while not done: url, options = dl_q.get() - download(url, options) + try: + download(url, options) + except Exception as e: + print("Exception during download task:\n" + e) dl_q.task_done() From 6ce3a720598af43e68e22a3fe19a610af137b252 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 2 Apr 2020 02:06:20 +0000 Subject: [PATCH 002/570] Remove external links to css/js Dockerfile now adds these files to the image directly --- Dockerfile | 16 +++++++++++++--- index.html | 14 +++++--------- static/{ => css}/style.css | 0 static/js/.gitkeep | 0 youtube-dl-server.py | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) rename static/{ => css}/style.css (100%) create mode 100644 static/js/.gitkeep diff --git a/Dockerfile b/Dockerfile index 3bfe9582..e0e932f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,7 @@ FROM python:alpine -RUN apk add --no-cache \ - ffmpeg \ - tzdata +RUN apk add --no-cache ffmpeg tzdata curl wget RUN mkdir -p /usr/src/app WORKDIR /usr/src/app @@ -18,8 +16,20 @@ RUN pip install --no-cache-dir -r requirements.txt COPY . /usr/src/app +# Download static files (JS/CSS Libraries) +WORKDIR /usr/src/app/static +RUN curl -s https://code.jquery.com/jquery-3.4.1.min.js > js/jquery.min.js +RUN curl -s https://unpkg.com/@popperjs/core@2.1.1/dist/umd/popper.min.js > js/popper.min.js +RUN wget https://github.com/twbs/bootstrap/releases/download/v4.4.1/bootstrap-4.4.1-dist.zip +RUN mkdir tmp_bs +RUN unzip bootstrap-4.4.1-dist.zip -d tmp_bs +RUN mv tmp_bs/*/css/* css/ +RUN mv tmp_bs/*/js/* js/ +RUN rm -rf bootstrap-4.4.1-dist.zip tmp_bs + EXPOSE 8080 +WORKDIR /usr/src/app VOLUME ["/youtube-dl"] CMD [ "python", "-u", "./youtube-dl-server.py" ] diff --git a/index.html b/index.html index 4b8da6f5..f6d26267 100644 --- a/index.html +++ b/index.html @@ -8,9 +8,8 @@ - - + + youtube-dl @@ -66,12 +65,9 @@

youtube-dl

- - - + + + diff --git a/static/style.css b/static/css/style.css similarity index 100% rename from static/style.css rename to static/css/style.css diff --git a/static/js/.gitkeep b/static/js/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/youtube-dl-server.py b/youtube-dl-server.py index b6d2901f..4086d269 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -29,7 +29,7 @@ def dl_queue_list(): return static_file('index.html', root='./') -@app.route('/youtube-dl/static/:filename#.*#') +@app.route('/static/:filename#.*#') def server_static(filename): return static_file(filename, root='./static') From f8d5052385ade6380a2f2782b4f9d85e608b37dc Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 3 Apr 2020 01:18:57 +0000 Subject: [PATCH 003/570] Add js to front end - User xhr to submit new link - display small message attesting of success of failure of add to queue (NOT of the download itself). --- index.html | 59 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/index.html b/index.html index f6d26267..a9e95d39 100644 --- a/index.html +++ b/index.html @@ -22,37 +22,37 @@

youtube-dl

Enter a video url to download the video to the server. Url can be to YouTube or any other supported site. The server will automatically download the highest quality version available.

-
-
-
- - -
- -
+
+ + +
+
- +
+
+
+
@@ -68,6 +68,7 @@

youtube-dl

+ From 6d2a889ad74679a34f7a7ebe911ab4a1a495f659 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 3 Apr 2020 01:20:47 +0000 Subject: [PATCH 004/570] Update routes to be more explicit, and error message --- youtube-dl-server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 4086d269..dd07c178 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -24,7 +24,7 @@ } -@app.route('/youtube-dl') +@app.route('/') def dl_queue_list(): return static_file('index.html', root='./') @@ -34,12 +34,12 @@ def server_static(filename): return static_file(filename, root='./static') -@app.route('/youtube-dl/q', method='GET') +@app.route('/downloads/count', method='GET') def q_size(): return {"success": True, "size": json.dumps(list(dl_q.queue))} -@app.route('/youtube-dl/q', method='POST') +@app.route('/downloads', method='POST') def q_put(): url = request.forms.get("url") options = { @@ -47,7 +47,7 @@ def q_put(): } if not url: - return {"success": False, "error": "/q called without a 'url' query param"} + return {"success": False, "error": "'url' query parameter omitted"} dl_q.put((url, options)) print("Added url " + url + " to the download queue") From 4e90ea475154f0562551428175b69fa0fce0697c Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 3 Apr 2020 01:33:31 +0000 Subject: [PATCH 005/570] Update README with new endpoints --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c8e6ee5c..66089374 100644 --- a/README.md +++ b/README.md @@ -47,18 +47,18 @@ Downloads can be triggered by supplying the `{{url}}` of the requested video thr #### HTML -Just navigate to `http://{{host}}:8080/youtube-dl` and enter the requested `{{url}}`. +Just navigate to `http://{{host}}:8080/` and enter the requested `{{url}}`. #### Curl ```shell -curl -X POST --data-urlencode "url={{url}}" http://{{host}}:8080/youtube-dl/q +curl -X POST --data-urlencode "url={{url}}" http://{{host}}:8080/downloads ``` #### Fetch ```javascript -fetch(`http://${host}:8080/youtube-dl/q`, { +fetch(`http://${host}:8080/downloads`, { method: "POST", body: new URLSearchParams({ url: url, @@ -72,7 +72,7 @@ fetch(`http://${host}:8080/youtube-dl/q`, { Add the following bookmarklet to your bookmark bar so you can conviently send the current page url to your youtube-dl-server instance. ```javascript -javascript:!function(){fetch("http://${host}:8080/youtube-dl/q",{body:new URLSearchParams({url:window.location.href,format:"bestvideo"}),method:"POST"})}(); +javascript:!function(){fetch("http://${host}:8080/downloads",{body:new URLSearchParams({url:window.location.href,format:"bestvideo"}),method:"POST"})}(); ``` ## Implementation From 019a9605b221eb232e97b135f1b290f8367d1fb9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 3 Apr 2020 02:11:19 +0000 Subject: [PATCH 006/570] Add omitted javascript file --- static/js/youtubedl.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 static/js/youtubedl.js diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js new file mode 100644 index 00000000..a82853a4 --- /dev/null +++ b/static/js/youtubedl.js @@ -0,0 +1,27 @@ +function set_dismissible_message(result_data){ + success = result_data.success; + message_list = $('#message_list').html(); + message_list += "
"; + message_list += "" + (success ? "Success" : "Error") + ": " + (success ? "Link added to the list" : result_data.error) +"."; + message_list += ""; + message_list += "
"; + $("#message_list").html(message_list); +} + +function submit_video(){ + data = {url: $("#url").val(),format: $("#format").val()}; + $.post("/downloads", data) + .done(function (data) { + set_dismissible_message(data); + }) + .fail(function() { + set_dismissible_message({'success': false, 'error': 'Could not add the url to the queue'}); + }); +} + +$('#url').keypress(function (e) { + if (e.which == 13) { + submit_video(); + return false; + } +}); From 9c8c1dcd05bdd43eafaaaaf50b7be4452d718c46 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 5 Apr 2020 03:51:29 +0000 Subject: [PATCH 007/570] Reset input after successful submission --- static/js/youtubedl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js index a82853a4..28d8ff9e 100644 --- a/static/js/youtubedl.js +++ b/static/js/youtubedl.js @@ -13,6 +13,7 @@ function submit_video(){ $.post("/downloads", data) .done(function (data) { set_dismissible_message(data); + $("#url").val(""); }) .fail(function() { set_dismissible_message({'success': false, 'error': 'Could not add the url to the queue'}); From d35fbc61d2f5cad37f67aeb39556411169cf030b Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 5 Apr 2020 03:53:16 +0000 Subject: [PATCH 008/570] Add escaped url to confirmation message --- static/js/youtubedl.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js index 28d8ff9e..08ef0861 100644 --- a/static/js/youtubedl.js +++ b/static/js/youtubedl.js @@ -1,8 +1,25 @@ +var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' +}; + +function escapeHtml(string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); +} + function set_dismissible_message(result_data){ success = result_data.success; message_list = $('#message_list').html(); message_list += "
"; - message_list += "" + (success ? "Success" : "Error") + ": " + (success ? "Link added to the list" : result_data.error) +"."; + message_list += "" + (success ? "Success" : "Error") + ": " + (success ? (escapeHtml($("#url").val()) + " added to the list") : result_data.error) +"."; message_list += ""; message_list += "
"; $("#message_list").html(message_list); From 69ce2a30d22fbf9f1b78689ac6dcd62d63f69df7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 5 Apr 2020 03:56:49 +0000 Subject: [PATCH 009/570] Reverse order of success/error message Latest now goes on top --- static/js/youtubedl.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js index 08ef0861..6c6e80b4 100644 --- a/static/js/youtubedl.js +++ b/static/js/youtubedl.js @@ -17,11 +17,11 @@ function escapeHtml(string) { function set_dismissible_message(result_data){ success = result_data.success; - message_list = $('#message_list').html(); - message_list += "
"; + message_list = "
"; message_list += "" + (success ? "Success" : "Error") + ": " + (success ? (escapeHtml($("#url").val()) + " added to the list") : result_data.error) +"."; message_list += ""; message_list += "
"; + message_list += $('#message_list').html(); $("#message_list").html(message_list); } From 00ecb5174a67cd8acd9243cab9e6641b8fc3a1e7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 5 Apr 2020 23:29:45 +0000 Subject: [PATCH 010/570] Add named folders for playlist downloads --- youtube-dl-server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index dd07c178..5bdc3cf8 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -18,6 +18,7 @@ 'YDL_EXTRACT_AUDIO_QUALITY': '192', 'YDL_RECODE_VIDEO_FORMAT': None, 'YDL_OUTPUT_TEMPLATE': '/youtube-dl/%(title)s [%(id)s].%(ext)s', + 'YDL_OUTPUT_TEMPLATE_PLAYLIST': '/youtube-dl/%(playlist_title)s/%(title)s [%(id)s].%(ext)s', 'YDL_ARCHIVE_FILE': None, 'YDL_SERVER_HOST': '0.0.0.0', 'YDL_SERVER_PORT': 8080, @@ -116,6 +117,10 @@ def get_ydl_options(request_options): def download(url, request_options): with youtube_dl.YoutubeDL(get_ydl_options(request_options)) as ydl: + info = ydl.extract_info(url, download=False) + if '_type' in info and info['_type'] == 'playlist' \ + and 'YDL_OUTPUT_TEMPLATE_PLAYLIST' in app_defaults: + ydl.params['outtmpl'] = app_defaults['YDL_OUTPUT_TEMPLATE_PLAYLIST'] ydl.download([url]) From 4f3627fceab63a1ee90620ee9bbe5dd703fcb92d Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 14 Apr 2020 04:42:15 +0000 Subject: [PATCH 011/570] Add navbar, and display queue size --- index.html | 23 +++++++++++++++++++++++ static/css/style.css | 4 ++++ static/js/youtubedl.js | 8 ++++++++ youtube-dl-server.py | 15 ++++++++------- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index a9e95d39..bcb9a068 100644 --- a/index.html +++ b/index.html @@ -15,6 +15,25 @@ +
+ +
+
@@ -69,6 +88,10 @@

youtube-dl

+ diff --git a/static/css/style.css b/static/css/style.css index 242ff3f8..878e5f28 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -2,6 +2,10 @@ body { background-color: #002b36; } +nav { + background-color: #001b26; +} + .container { height: 100vh; } diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js index 6c6e80b4..43752532 100644 --- a/static/js/youtubedl.js +++ b/static/js/youtubedl.js @@ -37,9 +37,17 @@ function submit_video(){ }); } +function update_queue_size(){ + $.getJSON("/api/downloads/count", function (data) { + $("#queue_size").html(data.size); + }); +} + + $('#url').keypress(function (e) { if (e.which == 13) { submit_video(); + update_queue_size(); return false; } }); diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 5bdc3cf8..603ff74c 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -26,7 +26,7 @@ @app.route('/') -def dl_queue_list(): +def front_index(): return static_file('index.html', root='./') @@ -35,13 +35,14 @@ def server_static(filename): return static_file(filename, root='./static') -@app.route('/downloads/count', method='GET') -def q_size(): - return {"success": True, "size": json.dumps(list(dl_q.queue))} +@app.route('/api/downloads/count', method='GET') +def api_queue_size(): + return {"success": True, "size": len(list(dl_q.queue))} -@app.route('/downloads', method='POST') -def q_put(): + +@app.route('/api/downloads', method='POST') +def api_queue_download(): url = request.forms.get("url") options = { 'format': request.forms.get("format") @@ -55,7 +56,7 @@ def q_put(): return {"success": True, "url": url, "options": options} @app.route("/youtube-dl/update", method="GET") -def update(): +def ydl_update(): command = ["pip", "install", "--upgrade", "youtube-dl"] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) From bc2a5141570e22e0e9378eb6a0677067e171e53e Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 14 Apr 2020 04:49:22 +0000 Subject: [PATCH 012/570] Add sqlite3 db management for job logs --- youtube_dl_logdb.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 youtube_dl_logdb.py diff --git a/youtube_dl_logdb.py b/youtube_dl_logdb.py new file mode 100644 index 00000000..7a4783f0 --- /dev/null +++ b/youtube_dl_logdb.py @@ -0,0 +1,59 @@ +import os +import sqlite3 + +STATUS_NAME =["Running", + "Completed", + "Failed"] +class Job: + def __init__(self, name, status, log): + self.id = -1 + self.name = name + self.status = status + self.log = log + self.last_update = "" + +class JobsDB: + def __init__(self, db_path, readonly=True): + if not os.path.isfile(db_path): + self.conn = sqlite3.connect("file://%s" % db_path) + self.create_table() + self.conn.close() + self.conn = sqlite3.connect("file://%s%s" % (db_path, + "?mode=ro" if readonly else ""), + uri=True) + + def close(self): + self.conn.close() + + def insert_job(self, job): + cursor = self.conn.cursor() + cursor.execute("INSERT INTO jobs (name, status, log) VALUES (?,\ + ?, ?);", (job.name, str(job.status), job.log)) + job.id = cursor.lastrowid + self.conn.commit() + + def update_job(self, job): + cursor = self.conn.cursor() + cursor.execute("UPDATE jobs SET status = ?, log = ?, last_update = datetime() \ + where id = ?;", (str(job.status), job.log, str(job.id))) + self.conn.commit() + + def create_table(self): + cursor = self.conn.cursor() + cursor.execute("CREATE TABLE jobs (id INTEGER PRIMARY KEY \ + AUTOINCREMENT, name TEXT NOT NULL, \ + status INTEGER NOT NULL, log TEXT, \ + last_update DATETIME DEFAULT CURRENT_TIMESTAMP);") + self.conn.commit() + + def get_all(self, limit=50): + cursor = self.conn.cursor() + cursor.execute("SELECT id, name, status, log, last_update from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) + rows = [] + for job_id, name, status, log, last_update in cursor.fetchall(): + rows.append({'id': job_id, + 'name': name, + 'status': STATUS_NAME[status], + 'log': log, + 'last_update': last_update}) + return rows From e865fa9681e6ae6b0a9f054608f6eba95c8f85c8 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 14 Apr 2020 04:50:22 +0000 Subject: [PATCH 013/570] Record download logs into sqlite3 database --- static/js/youtubedl.js | 2 +- youtube-dl-server.py | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/static/js/youtubedl.js b/static/js/youtubedl.js index 43752532..0b5d3878 100644 --- a/static/js/youtubedl.js +++ b/static/js/youtubedl.js @@ -27,7 +27,7 @@ function set_dismissible_message(result_data){ function submit_video(){ data = {url: $("#url").val(),format: $("#format").val()}; - $.post("/downloads", data) + $.post("/api/downloads", data) .done(function (data) { set_dismissible_message(data); $("#url").val(""); diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 603ff74c..0d2a4222 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals import json +import contextlib, io import os import subprocess from queue import Queue @@ -8,6 +9,7 @@ import youtube_dl from pathlib import Path from collections import ChainMap +from youtube_dl_logdb import JobsDB, Job app = Bottle() @@ -22,6 +24,7 @@ 'YDL_ARCHIVE_FILE': None, 'YDL_SERVER_HOST': '0.0.0.0', 'YDL_SERVER_PORT': 8080, + 'YDL_DB_PATH': '/youtube-dl/.ydl-metadata.db', } @@ -40,6 +43,10 @@ def api_queue_size(): return {"success": True, "size": len(list(dl_q.queue))} +@app.route('/api/downloads', method='GET') +def api_logs(): + db = JobsDB(app_defaults['YDL_DB_PATH'], readonly=True) + return json.dumps(db.get_all()) @app.route('/api/downloads', method='POST') def api_queue_download(): @@ -67,12 +74,19 @@ def ydl_update(): } def dl_worker(): + db = JobsDB(app_defaults['YDL_DB_PATH'], readonly=False) while not done: url, options = dl_q.get() + job = Job(url, 0, "") + db.insert_job(job) try: - download(url, options) + job.log = download(url, options) + job.status = 1 except Exception as e: - print("Exception during download task:\n" + e) + job.status = 2 + job.log += str(e) + print("Exception during download task:\n" + str(e)) + db.update_job(job) dl_q.task_done() @@ -122,7 +136,10 @@ def download(url, request_options): if '_type' in info and info['_type'] == 'playlist' \ and 'YDL_OUTPUT_TEMPLATE_PLAYLIST' in app_defaults: ydl.params['outtmpl'] = app_defaults['YDL_OUTPUT_TEMPLATE_PLAYLIST'] + # Swap out sys.stdout as ydl's output so we can capture it + ydl._screen_file = io.StringIO() ydl.download([url]) + return ydl._screen_file.getvalue() dl_q = Queue() From 50696bbe42949c7475a2a1aa0d5a50c2ba8e0727 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 14 Apr 2020 04:50:52 +0000 Subject: [PATCH 014/570] Add front-end log viewing --- index.html | 5 +++ logs.html | 84 ++++++++++++++++++++++++++++++++++++++++++ static/js/youtubedl.js | 38 +++++++++++++++++++ youtube-dl-server.py | 5 +++ 4 files changed, 132 insertions(+) create mode 100644 logs.html diff --git a/index.html b/index.html index bcb9a068..b8486230 100644 --- a/index.html +++ b/index.html @@ -22,6 +22,11 @@ - + - - - - - - - + + + + - + window.setInterval(get_download_logs, 5000); + get_download_logs(); + + From f92e0c3781b35691ef2c818cb85096614c81e95b Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 29 Apr 2020 03:36:21 +0000 Subject: [PATCH 049/570] Update job logs while job is running So we can provide some feedback to the user during long running jobs where currently it seems nothing might be happening. --- ydl_server/ydlhandler.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index d8c11310..2030e8cc 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -8,6 +8,7 @@ from ydl_server.logdb import JobsDB, Job, Actions from ydl_server import jobshandler from ydl_server.config import app_defaults +from time import sleep queue = Queue() thread = None @@ -29,13 +30,18 @@ def worker(): if action == Actions.DOWNLOAD: job.status = Job.RUNNING jobshandler.put((Actions.UPDATE, job)) + output = io.StringIO() + stdout_thread = Thread(target=download_log_update, + args=(job, output)) + stdout_thread.start() try: - job.log = Job.clean_logs(download(job.name, {'format': job.format})) + job.log = Job.clean_logs(download(job.name, {'format': job.format}, output),) job.status = Job.COMPLETED except Exception as e: job.status = Job.FAILED job.log += str(e) print("Exception during download task:\n" + str(e)) + stdout_thread.join() jobshandler.put((Actions.UPDATE, job)) queue.task_done() @@ -99,8 +105,13 @@ def get_ydl_options(request_options): return ydl_options +def download_log_update(job, stringio): + while job.status == Job.RUNNING: + job.log = Job.clean_logs(stringio.getvalue()) + jobshandler.put((Actions.UPDATE, job)) + sleep(5) -def download(url, request_options): +def download(url, request_options, output): with youtube_dl.YoutubeDL(get_ydl_options(request_options)) as ydl: ydl.params['extract_flat']= 'in_playlist' info = ydl.extract_info(url, download=False) @@ -110,7 +121,7 @@ def download(url, request_options): ydl.params['extract_flat']= False # Swap out sys.stdout as ydl's output so we can capture it - ydl._screen_file = io.StringIO() + ydl._screen_file = output ydl._err_file = ydl._screen_file ydl.download([url]) return ydl._screen_file.getvalue() From cecfd5c7519636bf84753428e86edb71616a38f8 Mon Sep 17 00:00:00 2001 From: Jan Eike von Seggern Date: Mon, 4 May 2020 22:30:41 +0200 Subject: [PATCH 050/570] Add list of downloaded files --- ydl_server/static/js/youtubedl.js | 13 +++++ ydl_server/templates/finished.html | 88 ++++++++++++++++++++++++++++++ ydl_server/templates/index.html | 3 + ydl_server/templates/logs.html | 3 + youtube-dl-server.py | 24 ++++++++ 5 files changed, 131 insertions(+) create mode 100644 ydl_server/templates/finished.html diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index c9618b15..b51f0c70 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -88,6 +88,19 @@ function get_download_logs(){ }); } +function get_finished_files(){ + $.getJSON("api/finished", function (data) { + let finished_files = ""; + $.each(data.files, function(key, file) { + finished_files += ""; + finished_files += "" + file.name + ""; + finished_files += "" + (new Date(file.modified)).toISOString() + ""; + finished_files += ""; + }); + $("#finished_files").html(finished_files); + }); +} + function hide_logs_detail(){ $('td:nth-child(6),th:nth-child(6)').hide(); } diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html new file mode 100644 index 00000000..6c0af52b --- /dev/null +++ b/ydl_server/templates/finished.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + youtube-dl - done + + + +
+ +
+ +
+
+
+

Finished Files

+ +
+ + + + + + + + + +
NameDate
+
+
+
+ + + + + + + + + + + + diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 674b986b..fb6a9d62 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -26,6 +26,9 @@ +
diff --git a/ydl_server/templates/logs.html b/ydl_server/templates/logs.html index 31ff96f6..8a70d399 100644 --- a/ydl_server/templates/logs.html +++ b/ydl_server/templates/logs.html @@ -68,11 +68,12 @@

Download History

+ diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 2030e8cc..01709f9b 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -135,4 +135,5 @@ def resume_pending(): job.id = pending["id"] jobshandler.put((Actions.RESUME, job)) - +def get_ydl_version(): + return youtube_dl.version.__version__ diff --git a/youtube-dl-server.py b/youtube-dl-server.py index b81c9e7d..692f85c9 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -3,7 +3,7 @@ import os from collections import ChainMap from queue import Queue -from bottle import route, run, Bottle, request, static_file +from bottle import route, run, Bottle, request, static_file, template from threading import Thread from pathlib import Path from ydl_server.logdb import JobsDB, Job, Actions @@ -15,13 +15,13 @@ @app.route(['/', '/index']) def front_index(): - return static_file('templates/index.html', root='./ydl_server') - + return template('./ydl_server/templates/index.html', + ydl_version=ydlhandler.get_ydl_version()) @app.route('/logs') def front_logs(): - return static_file('templates/logs.html', root='./ydl_server') - + return template('./ydl_server/templates/logs.html', + ydl_version=ydlhandler.get_ydl_version()) @app.route('/static/:filename#.*#') def server_static(filename): @@ -61,12 +61,16 @@ def api_queue_download(): if not url: return {"success": False, "error": "'url' query parameter omitted"} - job = Job(url, 3, "", request.forms.get("format")) + job = Job(url, Job.PENDING, "", request.forms.get("format")) jobshandler.put((Actions.INSERT, job)) print("Added url " + url + " to the download queue") return {"success": True, "url": url, "options": options} +@app.route('/api/youtube-dl/version') +def ydl_version(): + return {'version': youtube_dl.version.__version__} + @app.route("/youtube-dl/update", method="GET") def ydl_update(): return ydlhandler.update() From 2aa450a656e61c1972d1637fefe26747f0752ca2 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 9 May 2020 02:16:30 +0000 Subject: [PATCH 053/570] Refactoring in job handling --- ydl_server/jobshandler.py | 4 ++-- ydl_server/ydlhandler.py | 33 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index 67dd23b0..91d7add6 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -24,11 +24,11 @@ def worker(dl_queue): db.purge_jobs() elif action == Actions.INSERT: db.insert_job(job) - dl_queue.put((Actions.DOWNLOAD, job)) + dl_queue.put(job) elif action == Actions.UPDATE: db.update_job(job) elif action == Actions.RESUME: db.update_job(job) - dl_queue.put((Actions.DOWNLOAD, job)) + dl_queue.put(job) queue.task_done() diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 01709f9b..4e50e988 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -26,23 +26,22 @@ def finish(): def worker(): while not done: - action, job = queue.get() - if action == Actions.DOWNLOAD: - job.status = Job.RUNNING - jobshandler.put((Actions.UPDATE, job)) - output = io.StringIO() - stdout_thread = Thread(target=download_log_update, - args=(job, output)) - stdout_thread.start() - try: - job.log = Job.clean_logs(download(job.name, {'format': job.format}, output),) - job.status = Job.COMPLETED - except Exception as e: - job.status = Job.FAILED - job.log += str(e) - print("Exception during download task:\n" + str(e)) - stdout_thread.join() - jobshandler.put((Actions.UPDATE, job)) + job = queue.get() + job.status = Job.RUNNING + jobshandler.put((Actions.UPDATE, job)) + output = io.StringIO() # FIXME intialize this ? + stdout_thread = Thread(target=download_log_update, + args=(job, output)) + stdout_thread.start() + try: + job.log = Job.clean_logs(download(job.name, {'format': job.format}, output),) + job.status = Job.COMPLETED + except Exception as e: + job.status = Job.FAILED + job.log += str(e) + print("Exception during download task:\n" + str(e)) + stdout_thread.join() + jobshandler.put((Actions.UPDATE, job)) queue.task_done() def update(): From 5f98ffd3244a6e156658ee5a8fd85795afaa9579 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 10 May 2020 12:56:02 +0000 Subject: [PATCH 054/570] Add retry option in logs for failed jobs --- ydl_server/static/js/youtubedl.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index c9618b15..6eb3619d 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -24,6 +24,15 @@ function set_dismissible_message(success, message){ $("#message_list").html(message_list); } +function retry_download(url, format){ + data = {url: url,format: format}; + $.post("api/downloads", data) + .done(function (data) { + get_download_logs(); + update_stats(); + }); +} + function submit_video(){ data = {url: $("#url").val(),format: $("#format").val()}; $.post("api/downloads", data) @@ -76,7 +85,7 @@ function get_download_logs(){ download_logs += "" + row.last_update + ""; download_logs += "" + row.name + ""; download_logs += "" + row.format + ""; - download_logs += " " + row.status + ""; + download_logs += " " + row.status + "" + (row.status == 'Failed' ? ' Retry' : '') + ""; download_logs += "" + row.log.replace(/\n|\r/g, '
') + ""; download_logs += ""; }); From 2465c2391bed25768ccd7b4f86ba7fce06c1ff49 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 10 May 2020 13:01:55 +0000 Subject: [PATCH 055/570] Fix typo --- ydl_server/static/js/youtubedl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 6eb3619d..9afe8959 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -85,7 +85,7 @@ function get_download_logs(){ download_logs += "" + row.last_update + ""; download_logs += "" + row.name + ""; download_logs += "" + row.format + ""; - download_logs += " " + row.status + "" + (row.status == 'Failed' ? ' Retry' : '') + ""; + download_logs += " " + row.status + "" + (row.status == 'Failed' ? ' Retry' : '') + ""; download_logs += "" + row.log.replace(/\n|\r/g, '
') + ""; download_logs += ""; }); From 031b6e80eb0fa6a8ef7b85ff68c43f2d681b7a92 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 10 May 2020 14:59:58 +0000 Subject: [PATCH 056/570] Update footer in logs and finished --- ydl_server/templates/finished.html | 4 ++-- ydl_server/templates/index.html | 2 -- ydl_server/templates/logs.html | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 6c0af52b..78fc1a8c 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -65,8 +65,8 @@

Finished Files

diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 6f34d365..0955e87e 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -94,8 +94,6 @@

youtube-dl

- - diff --git a/ydl_server/templates/logs.html b/ydl_server/templates/logs.html index 38f9318a..71049a56 100644 --- a/ydl_server/templates/logs.html +++ b/ydl_server/templates/logs.html @@ -71,8 +71,8 @@

Download History

From 1e3df96f72e43fd56f7ce9d234fe0452b58c87c5 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 10 May 2020 15:08:46 +0000 Subject: [PATCH 057/570] User template for "finished" page --- youtube-dl-server.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 32768174..670815fb 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -27,7 +27,9 @@ def front_logs(): @app.route('/finished') def front_finished(): - return static_file('templates/finished.html', root='./ydl_server') + return template('./ydl_server/templates/finished.html', + ydl_version=ydlhandler.get_ydl_version()) + @app.route('/api/finished') def api_list_finished(): From d325e6c9ead05d633b6d7e24d8aca89c575d6feb Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 11 May 2020 03:05:11 +0000 Subject: [PATCH 058/570] Organize finished files page by folders --- ydl_server/static/js/youtubedl.js | 12 +++++++++++- ydl_server/templates/finished.html | 2 +- youtube-dl-server.py | 15 ++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 37cf0754..f55f3d60 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -102,7 +102,17 @@ function get_finished_files(){ let finished_files = ""; $.each(data.files, function(key, file) { finished_files += ""; - finished_files += "" + file.name + ""; + if (file.children.length > 0) { + finished_files += "" + file.name + ""; + finished_files += "
"; + $.each(file.children, function(child_key, child_file) { + finished_files += ""; + }); + finished_files += "
" + child_file.name + "" + (new Date(child_file.modified)).toISOString() + "
"; + } + else { + finished_files += "" + file.name + ""; + } finished_files += "" + (new Date(file.modified)).toISOString() + ""; finished_files += ""; }); diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 78fc1a8c..3444b0b1 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -51,7 +51,7 @@

Finished Files


- +
diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 670815fb..41a06dca 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -34,11 +34,16 @@ def front_finished(): @app.route('/api/finished') def api_list_finished(): root_dir = Path(app_vars['YDL_OUTPUT_TEMPLATE']).parent - matches = chain(root_dir.glob('*'), root_dir.glob('*/*')) - files = [{ - 'name': f.relative_to(root_dir).as_posix(), - 'modified': f.stat().st_mtime * 1000, - } for f in matches if not f.name.startswith('.') and f.is_file()] + matches = root_dir.glob('*') + + files = [{'name': f1.name, + 'modified': f1.stat().st_mtime * 1000, + 'children': sorted([{ + 'name': f2.name, + 'modified': f2.stat().st_mtime * 1000 + } for f2 in f1.iterdir() if not f2.name.startswith('.')] if f1.is_dir() else [], key=itemgetter('modified'), reverse=True) + } for f1 in matches if not f1.name.startswith('.')] + files = sorted(files, key=itemgetter('modified'), reverse=True) return { "success": True, From 34643d381bf580cea614d868f89c44d31f840d91 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 12 May 2020 01:50:22 +0000 Subject: [PATCH 059/570] Update failed/retry button for failed jobs --- ydl_server/static/js/youtubedl.js | 5 ++++- ydl_server/templates/finished.html | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index f55f3d60..98ffd89d 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -85,7 +85,10 @@ function get_download_logs(){ download_logs += ""; download_logs += ""; download_logs += ""; - download_logs += ""; + if (row.status == 'Failed') + download_logs += ""; + else + download_logs += ""; download_logs += ""; download_logs += ""; }); diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 3444b0b1..fae0ccb9 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -79,8 +79,6 @@

Finished Files

From ddf4dbffbe3b50bc18fc47157d0f21ae0edb6d52 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 15 May 2020 00:09:22 +0000 Subject: [PATCH 060/570] Update templates, refactor html --- ydl_server/templates/finished.html | 60 +----------------------------- ydl_server/templates/footer.html | 13 +++++++ ydl_server/templates/header.html | 46 +++++++++++++++++++++++ ydl_server/templates/index.html | 60 +----------------------------- ydl_server/templates/logs.html | 60 +----------------------------- 5 files changed, 65 insertions(+), 174 deletions(-) create mode 100644 ydl_server/templates/footer.html create mode 100644 ydl_server/templates/header.html diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index fae0ccb9..b2ac2f1d 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -1,49 +1,4 @@ - - - - - - - - - - - - - - youtube-dl - done - - - -
- -
+%include('ydl_server/templates/header.html')
@@ -64,18 +19,7 @@

Finished Files

- - - - - - - - +% include('ydl_server/templates/footer.html', ydl_version=ydl_version) + + + + diff --git a/ydl_server/templates/header.html b/ydl_server/templates/header.html new file mode 100644 index 00000000..94512327 --- /dev/null +++ b/ydl_server/templates/header.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + youtube-dl + + + +
+ +
diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 0955e87e..8fd20c63 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -1,49 +1,4 @@ - - - - - - - - - - - - - - youtube-dl - - - -
- -
+% include('ydl_server/templates/header.html')
@@ -88,18 +43,7 @@

youtube-dl

- - - - - - - - +% include('ydl_server/templates/footer.html', ydl_version=ydl_version) - - - +% include('ydl_server/templates/footer.html', ydl_version=ydl_version) - + + - + \ No newline at end of file diff --git a/ydl_server/views.py b/ydl_server/views.py index ddb5e257..218ac4b4 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -119,8 +119,7 @@ async def api_queue_download(request): async def api_metadata_fetch(request): data = await request.form() - url = data.get("url") - rc, stdout = request.app.state.ydlhandler.fetch_metadata(url) + rc, stdout = request.app.state.ydlhandler.fetch_metadata(data.get("url")) if rc == 0: return JSONResponse(stdout) return JSONResponse({}, status_code=404) From 6801d2ed9f841d6f225f2d0d4e85386618e939dd Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 01:35:03 +0000 Subject: [PATCH 144/570] Add log cleanup api endpoint --- ydl_server/jobshandler.py | 2 ++ ydl_server/logdb.py | 9 +++++++++ ydl_server/routes.py | 1 + ydl_server/views.py | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index 431ad674..bae7f551 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -50,6 +50,8 @@ def worker(self, dl_queue): elif action == Actions.SET_STATUS: job_id, status = job db.set_job_status(job_id, status) + elif action == Actions.CLEAN_LOGS: + db.clean_old_jobs() self.queue.task_done() diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index e6c7b6a9..4877ff29 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -14,6 +14,7 @@ class Actions: SET_NAME = 6 SET_STATUS = 7 SET_LOG = 8 + CLEAN_LOGS = 9 class JobType: @@ -126,6 +127,14 @@ def purge_jobs(self): self.conn.commit() self.conn.execute("VACUUM") + def clean_old_jobs(self, limit=10): + cursor = self.conn.cursor() + cursor.execute("SELECT last_update from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) + oldest = list(cursor.fetchall())[-1][0] + cursor.execute("DELETE FROM jobs WHERE last_update < ? AND status != ? and status != ?;", (oldest, Job.PENDING, Job.RUNNING)) + self.conn.commit() + self.conn.execute("VACUUM") + def get_all(self, limit=50): cursor = self.conn.cursor() cursor.execute("SELECT id, name, status, log, last_update, format, type, url from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) diff --git a/ydl_server/routes.py b/ydl_server/routes.py index 6a2dcc26..4c9f12f9 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -21,6 +21,7 @@ Route("/api/youtube-dl/update", views.ydl_update, name="api_update"), Route("/api/downloads/stats", views.api_queue_size, name="api_queue_size"), Route("/api/downloads", views.api_logs, name="api_logs"), + Route("/api/downloads/clean", views.api_logs_clean, name="api_logs_clean"), Route("/api/downloads", views.api_logs_purge, name="api_logs_purge", diff --git a/ydl_server/views.py b/ydl_server/views.py index 218ac4b4..2915fffe 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -92,6 +92,11 @@ async def api_logs_purge(request): return JSONResponse({"success": True}) +async def api_logs_clean(request): + request.app.state.jobshandler.put((Actions.CLEAN_LOGS, None)) + return JSONResponse({"success": True}) + + async def api_queue_download(request): data = await request.form() if (app_config['ydl_server'].get('update_poll_delay_min') and From 9492bed8719de7e105e800d8b0656da946cd79e6 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 01:38:43 +0000 Subject: [PATCH 145/570] Update README.md to reflect switch to starlette --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f2afdce6..edfc5263 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ # youtube-dl-server Simple Web and REST interface for downloading youtube videos onto a server. -[`bottle`](https://github.com/bottlepy/bottle) + +[`starlette`](https://www.starlette.io/) + [`youtube-dl`](https://github.com/rg3/youtube-dl) / [`youtube-dlc`](https://github.com/blackjack4494/yt-dlc) @@ -114,8 +114,11 @@ ydl_options: If you have python ^3.3.0 installed in your PATH you can simply run like this, providing optional environment variable overrides inline. -You will need `bottle`, `pyyaml` and either `youtube-dl` or `youtube-dlc` -installed locally. +Install the python dependencies from `requirements.txt`: + +```shell +pip install -r requirements.txt +``` You can run [bootstrap.sh](https://github.com/nbr23/youtube-dl-server/blob/master/bootstrap.sh) @@ -195,7 +198,7 @@ scenarios. ## Implementation -The server uses [`bottle`](https://github.com/bottlepy/bottle) for the web +The server uses [`starlette`](https://www.starlette.io/) for the web framework and [`youtube-dl`](https://github.com/rg3/youtube-dl) / [`youtube-dlc`](https://github.com/blackjack4494/yt-dlc) to handle the downloading. The integration with youtube-dl does NOT use their [python From 6210363a93802558b23cb93e21a59a184b403207 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 01:44:12 +0000 Subject: [PATCH 146/570] Update bootstrap.sh, bump to 4.6 --- bootstrap.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 858fdf77..45997b47 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -3,7 +3,7 @@ # Download required web frontend libraries wget -q https://code.jquery.com/jquery-3.4.1.min.js -O ydl_server/static/js/jquery.min.js wget -q https://unpkg.com/@popperjs/core@2.1.1/dist/umd/popper.min.js -O ydl_server/static/js/popper.min.js -wget -q https://github.com/twbs/bootstrap/releases/download/v4.4.1/bootstrap-4.4.1-dist.zip -unzip -jo bootstrap-4.4.1-dist.zip *.css *.css.map -d ydl_server/static/css/ -unzip -jo bootstrap-4.4.1-dist.zip *.js *.js.map -d ydl_server/static/js/ -rm -f bootstrap-4.4.1-dist.zip +wget -q https://github.com/twbs/bootstrap/releases/download/v4.6.0/bootstrap-4.6.0-dist.zip -O bootstrap.zip +unzip -jo bootstrap.zip *.css *.css.map -d ydl_server/static/css/ +unzip -jo bootstrap.zip *.js *.js.map -d ydl_server/static/js/ +rm -f bootstrap.zip From 4aa0df9b53157598c50baa91ed40ba2fa6a194af Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 01:46:47 +0000 Subject: [PATCH 147/570] Coding style in jobshandler --- ydl_server/jobshandler.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index bae7f551..21adf914 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -1,6 +1,6 @@ from queue import Queue from threading import Thread -from ydl_server.logdb import JobsDB, Job, Actions +from ydl_server.logdb import JobsDB, Actions class JobsHandler: @@ -9,24 +9,19 @@ def __init__(self): self.thread = None self.done = False - def start(self, dl_queue): self.thread = Thread(target=self.worker, args=(dl_queue,)) self.thread.start() - def stop(self): self.done = True - def put(self, obj): self.queue.put(obj) - def finish(self): self.done = True - def worker(self, dl_queue): db = JobsDB(readonly=False) while not self.done: @@ -54,7 +49,6 @@ def worker(self, dl_queue): db.clean_old_jobs() self.queue.task_done() - def join(self): if self.thread is not None: return self.thread.join() From 172cf7b3778ecf2c9f2de72a70abcd9893e6658a Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 01:54:53 +0000 Subject: [PATCH 148/570] Add log rotate, auto older log cleanup --- config.yml | 1 + ydl_server/jobshandler.py | 5 ++++- youtube-dl-server.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config.yml b/config.yml index 08fe8ef5..0d7a248b 100644 --- a/config.yml +++ b/config.yml @@ -5,6 +5,7 @@ ydl_server: # youtube-dl-server specific settings metadata_db_path: '/youtube-dl/.ydl-metadata.db' # Path to metadata DB output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory update_poll_delay_min: 1440 # Automatically check for updates every 24h + max_log_entries: 100 # Maximum number of job log history to keep ydl_options: # youtube-dl options output: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # output directory diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index 21adf914..5c890d7b 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -4,10 +4,11 @@ class JobsHandler: - def __init__(self): + def __init__(self, app_config): self.queue = Queue() self.thread = None self.done = False + self.app_config = app_config def start(self, dl_queue): self.thread = Thread(target=self.worker, args=(dl_queue,)) @@ -29,6 +30,8 @@ def worker(self, dl_queue): if action == Actions.PURGE_LOGS: db.purge_jobs() elif action == Actions.INSERT: + db.clean_old_jobs(self.app_config['ydl_server'] + .get('max_log_entries', 100)) db.insert_job(job) dl_queue.put(job) elif action == Actions.UPDATE: diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 0821d21b..472956cd 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -21,7 +21,7 @@ app = Starlette(routes=routes, debug=app_config['ydl_server'].get('debug', False)) - app.state.jobshandler = JobsHandler() + app.state.jobshandler = JobsHandler(app_config) app.state.ydlhandler = YdlHandler(app_config, app.state.jobshandler) app.state.ydlhandler.start() From 60fa0e8c61e27d29eca76c843785dcb716b05808 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Jan 2021 02:57:13 +0000 Subject: [PATCH 149/570] Install python deps from requirements.txt in container --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96d9cccf..132d25d0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,10 +7,10 @@ FROM python:alpine ARG YOUTUBE_DL=youtube_dl -RUN apk add --no-cache ffmpeg tzdata -RUN pip install --no-cache-dir starlette uvicorn aiofiles jinja2 python-multipart pyyaml ${YOUTUBE_DL} RUN mkdir -p /usr/src/app - +RUN apk add --no-cache ffmpeg tzdata +COPY ./requirements.txt /usr/src/app/ +RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt COPY ./bootstrap.sh /usr/src/app/ COPY ./config.yml /usr/src/app/default_config.yml From 2acff0447e53d1692b890d22da3987ec9a30b7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B3=E9=88=9E?= Date: Fri, 29 Jan 2021 05:44:04 +0800 Subject: [PATCH 150/570] Fix: IndexError: list index out of range When starting server without any previous logs (new start up), the server fails on https://github.com/nbr23/youtube-dl-server/blob/master/ydl_server/logdb.py#L133 --- ydl_server/logdb.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index 4877ff29..55c54258 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -130,8 +130,9 @@ def purge_jobs(self): def clean_old_jobs(self, limit=10): cursor = self.conn.cursor() cursor.execute("SELECT last_update from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) - oldest = list(cursor.fetchall())[-1][0] - cursor.execute("DELETE FROM jobs WHERE last_update < ? AND status != ? and status != ?;", (oldest, Job.PENDING, Job.RUNNING)) + rows = list(cursor.fetchall()) + if len(rows) > 0: + cursor.execute("DELETE FROM jobs WHERE last_update < ? AND status != ? and status != ?;", (rows[-1][0], Job.PENDING, Job.RUNNING)) self.conn.commit() self.conn.execute("VACUUM") From 4ea78a77dd1af9c83067dd05dfd8c3df31b255b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B3=E9=88=9E?= Date: Wed, 20 Jan 2021 04:18:42 +0800 Subject: [PATCH 151/570] Add atomicparsley to the Dockerfile installation To make youtube-dl embed-thumbnail work. --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 132d25d0..67e9cb3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ ARG YOUTUBE_DL=youtube_dl RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata +RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley COPY ./requirements.txt /usr/src/app/ RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt From 05d668b2362135a8e811bd2e02f8b537e8829869 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 31 Jan 2021 22:37:24 +0000 Subject: [PATCH 152/570] Add atomicparsley only if requested through build-arg --- Dockerfile | 3 ++- hooks/build | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 67e9cb3d..598b3356 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,10 +6,11 @@ FROM python:alpine ARG YOUTUBE_DL=youtube_dl +ARG ATOMICPARSLEY=0 RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata -RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; fi COPY ./requirements.txt /usr/src/app/ RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt diff --git a/hooks/build b/hooks/build index a4d257ef..862481a9 100644 --- a/hooks/build +++ b/hooks/build @@ -1,7 +1,16 @@ #!/bin/bash + YOUTUBE_DL="youtube-dl" -if [ "$DOCKER_TAG" == "youtube-dl" ] || [ "$DOCKER_TAG" == "youtube-dlc" ]; then - YOUTUBE_DL="$DOCKER_TAG" +ATOMICPARSLEY=0 + +IFS='_' read -ra DOCKER_TAGS <<< "$DOCKER_TAG" + +if [ "${DOCKER_TAGS[0]}" == "youtube-dl" ] || [ "${DOCKER_TAGS[0]}" == "youtube-dlc" ]; then + YOUTUBE_DL="${DOCKER_TAGS[0]}" fi -docker build --build-arg YOUTUBE_DL=$YOUTUBE_DL -f $DOCKERFILE_PATH -t $IMAGE_NAME . +if [ "${#DOCKER_TAGS[1]}" -gt 0 ] && [ "${DOCKER_TAGS[1]}" == "atomicparsley" ]; then + ATOMICPARSLEY=1 +fi + +docker build --build-arg YOUTUBE_DL=$YOUTUBE_DL --build-arg ATOMICPARSLEY=$ATOMICPARSLEY -f $DOCKERFILE_PATH -t $IMAGE_NAME . \ No newline at end of file From 6e2afedf6a18c8fe59a6d30930f46f2512aad5d9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 31 Jan 2021 22:47:17 +0000 Subject: [PATCH 153/570] Update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index edfc5263..2f5c7e6f 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,11 @@ Force using `youtube-dl` or `youtube-dlc` by using the tags of the same name, eg: `nbr23/youtube-dl-server:youtube-dl` and `nbr23/youtube-dl-server:youtube-dlc`. -*Note: the legacy version using `config.py` is available on the -[legacy](https://github.com/nbr23/youtube-dl-server/tree/legacy) branch, -and through the `legacy` tag on docker.* +If you plan on using the `--embed-thumbnail` flag in youtube-dl, +you will need `atomicparsley` embedded in the container. + +Use the tags `nbr23/youtube-dl-server:youtube-dl_atomicparsley` +or `nbr23/youtube-dl-server:youtube-dlc_atomicparsley` to achieve this. ### Ansible From 91d9ef2e43a13288bd24e93202ba0c558f754f9c Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 2 Feb 2021 23:20:52 +0000 Subject: [PATCH 154/570] Fix None format when no format is requested --- ydl_server/ydlhandler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 0428fa53..7d9e79c9 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -123,7 +123,9 @@ def update(self): def get_ydl_options(self, ydl_config, request_options): ydl_config = ydl_config.copy() - req_format = request_options.get('format', 'best') + req_format = request_options.get('format') + if req_format is None: + req_format = 'best' if req_format.startswith('audio/'): ydl_config.update({'extract-audio': None}) ydl_config.update({'audio-format': req_format.split('/')[-1]}) From 560b2fd4a8241ae9ddadfe434e4c05c0dae9a078 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 7 Feb 2021 20:45:36 +0000 Subject: [PATCH 155/570] Update config documentation --- config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.yml b/config.yml index 0d7a248b..e3df9327 100644 --- a/config.yml +++ b/config.yml @@ -3,12 +3,12 @@ ydl_server: # youtube-dl-server specific settings host: 0.0.0.0 # IP youtube-dl-server should bind to debug: False # Enable/Disable debug mode metadata_db_path: '/youtube-dl/.ydl-metadata.db' # Path to metadata DB - output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory + output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory template update_poll_delay_min: 1440 # Automatically check for updates every 24h max_log_entries: 100 # Maximum number of job log history to keep ydl_options: # youtube-dl options - output: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # output directory + output: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # output directory template cache-dir: '/youtube-dl/.cache' # youtube-dl cache directory ignore-errors: True # instruct youtube-dl to skip errors age-limit: 6 # minimal age requirement / parental control setting From 2a44a03008e6fd64548ac2b2f609ac361d8552c1 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 7 Feb 2021 20:46:10 +0000 Subject: [PATCH 156/570] Update finished files directory/file split handling --- ydl_server/static/js/youtubedl.js | 2 +- ydl_server/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 72a6d42e..64872f19 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -173,7 +173,7 @@ function get_finished_files(){ var finished_files = ""; $.each(data.files, function(key, file) { finished_files += "
"; - if (file.children.length > 0) { + if (file.children != null) { finished_files += " - + @@ -63,20 +63,20 @@

Finished Files

- + From 50cc1206bd8661ed9b410889b87af0223be6dcb7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 16 Nov 2021 01:19:31 +0000 Subject: [PATCH 205/570] Update bootstrap --- bootstrap.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bootstrap.sh b/bootstrap.sh index c44a2d4e..d0de0540 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,8 +1,10 @@ #! /usr/bin/env sh +BOOTSTRAP_VERSION=5.1.3 + # Download required web frontend libraries wget -q https://code.jquery.com/jquery-3.6.0.min.js -O ydl_server/static/js/jquery.min.js -wget -q https://github.com/twbs/bootstrap/releases/download/v5.0.2/bootstrap-5.0.2-dist.zip -O bootstrap.zip +wget -q https://github.com/twbs/bootstrap/releases/download/v$BOOTSTRAP_VERSION/bootstrap-$BOOTSTRAP_VERSION-dist.zip -O bootstrap.zip unzip -jo bootstrap.zip *.css *.css.map -d ydl_server/static/css/ unzip -jo bootstrap.zip *.js *.js.map -d ydl_server/static/js/ rm -f bootstrap.zip From e9563de1811f80131013a358f249ef0fd0572dff Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 16 Nov 2021 10:01:39 +0000 Subject: [PATCH 206/570] Update github actions --- .github/workflows/docker-images.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml index 0f913ce2..957aad4f 100644 --- a/.github/workflows/docker-images.yml +++ b/.github/workflows/docker-images.yml @@ -31,7 +31,6 @@ jobs: context: . platforms: linux/amd64,linux/arm,linux/arm64 push: true - no-cache: true tags: nbr23/youtube-dl-server:latest,nbr23/youtube-dl-server:youtube-dl - name: Build and push @@ -42,7 +41,6 @@ jobs: YOUTUBE_DL=yt_dlp platforms: linux/amd64,linux/arm,linux/arm64 push: true - no-cache: true tags: nbr23/youtube-dl-server:yt-dlp - name: Build and push @@ -53,7 +51,6 @@ jobs: ATOMICPARSLEY=1 platforms: linux/amd64,linux/arm,linux/arm64 push: true - no-cache: true tags: nbr23/youtube-dl-server:atomicparsley,nbr23/youtube-dl-server:youtube-dl_atomicparsley - name: Build and push @@ -65,5 +62,4 @@ jobs: YOUTUBE_DL=yt_dlp platforms: linux/amd64,linux/arm,linux/arm64 push: true - no-cache: true tags: nbr23/youtube-dl-server:yt-dlp_atomicparsley From 968eca025104af8d31eb85253eba9dbf68411047 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 31 Dec 2021 19:34:57 +0000 Subject: [PATCH 207/570] Add Jenkinsfile, remove github actions --- .github/workflows/docker-images.yml | 65 ----------------------------- Jenkinsfile | 45 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 65 deletions(-) delete mode 100644 .github/workflows/docker-images.yml create mode 100644 Jenkinsfile diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml deleted file mode 100644 index 957aad4f..00000000 --- a/.github/workflows/docker-images.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: ci - -on: - push: - branches: - - 'master' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - platforms: linux/amd64,linux/arm,linux/arm64 - push: true - tags: nbr23/youtube-dl-server:latest,nbr23/youtube-dl-server:youtube-dl - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - build-args: | - YOUTUBE_DL=yt_dlp - platforms: linux/amd64,linux/arm,linux/arm64 - push: true - tags: nbr23/youtube-dl-server:yt-dlp - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - build-args: | - ATOMICPARSLEY=1 - platforms: linux/amd64,linux/arm,linux/arm64 - push: true - tags: nbr23/youtube-dl-server:atomicparsley,nbr23/youtube-dl-server:youtube-dl_atomicparsley - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - build-args: | - ATOMICPARSLEY=1 - YOUTUBE_DL=yt_dlp - platforms: linux/amd64,linux/arm,linux/arm64 - push: true - tags: nbr23/youtube-dl-server:yt-dlp_atomicparsley diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..b0ab9e1f --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,45 @@ +pipeline { + agent any + stages { + + + stage('Checkout'){ + steps { + checkout scm + } + } + + stage('Dockerhub login') { + steps { + withCredentials([usernamePassword(credentialsId: 'dockerhub', usernameVariable: 'DOCKERHUB_CREDENTIALS_USR', passwordVariable: 'DOCKERHUB_CREDENTIALS_PSW')]) { + sh 'docker login -u $DOCKERHUB_CREDENTIALS_USR -p "$DOCKERHUB_CREDENTIALS_PSW"' + } + } + } + stage('Build Youtube-dl Image') { + steps { + sh ''' + BUILDER=`docker buildx create --use` + docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:latest -t nbr23/youtube-dl-server:youtube-dl -t nbr23/youtube-dl-server:youtube-dl_atomicparsley --push . + docker buildx rm $BUILDER + ''' + } + } + + stage('Build Youtube-dl yt_dlp Image') { + steps { + sh ''' + BUILDER=`docker buildx create --use` + docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley--push . + docker buildx rm $BUILDER + ''' + } + } + } + + post { + always { + sh 'docker logout' + } + } +} \ No newline at end of file From 7cf46d535be48a8f99bf1b96dbd63caec23af5f0 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 31 Dec 2021 19:41:12 +0000 Subject: [PATCH 208/570] Fix typo in Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index b0ab9e1f..4bb42080 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { steps { sh ''' BUILDER=`docker buildx create --use` - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley--push . + docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley --push . docker buildx rm $BUILDER ''' } From 538a22a26dab39a65f9c20eb1cf4e4f6a7bffae0 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 9 Feb 2022 12:55:21 +0000 Subject: [PATCH 209/570] Upgrade pip to latest in dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9c2cbc43..dcfae28c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi COPY ./requirements.txt /usr/src/app/ -RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt +RUN pip install --upgrade pip && sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt COPY ./bootstrap.sh /usr/src/app/ COPY ./docker_run.sh /usr/src/app/ From b45f5f77b9db682af493452c9c4d4bb49f1831e2 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 20 Apr 2022 06:51:46 -0500 Subject: [PATCH 210/570] Fix builds --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index dcfae28c..0c0bd697 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ ARG YDL_PYTHONPATH='/youtube-dl/.python' VOLUME "/youtube-dl" VOLUME "/app_config" -RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo; fi +RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc g++ libffi-dev openssl-dev rust cargo; fi RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install cryptography pycryptodome; fi RUN mkdir -p /usr/src/app From e556e27ae1fe148a775756476b66cd285072903b Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 4 May 2022 06:36:27 -0500 Subject: [PATCH 211/570] Import prebuilt wheels from docker image --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0c0bd697..24360b42 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,8 @@ ARG YDL_PYTHONPATH='/youtube-dl/.python' VOLUME "/youtube-dl" VOLUME "/app_config" -RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc g++ libffi-dev openssl-dev rust cargo; fi -RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install cryptography pycryptodome; fi +COPY --from=nbr23/youtube-dl-wheels /out/wheels /wheels +RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install --no-cache /wheels/*; fi RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From 1900129826937fd35f99902a3bdf74ba08635ad7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 4 May 2022 06:36:28 -0500 Subject: [PATCH 212/570] Update dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 24360b42..cb6ae487 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ VOLUME "/youtube-dl" VOLUME "/app_config" COPY --from=nbr23/youtube-dl-wheels /out/wheels /wheels -RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install --no-cache /wheels/*; fi +RUN pip install --no-cache /wheels/* RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From dc316a8bd245a555f71d0bc94ec9d99c9d43897c Mon Sep 17 00:00:00 2001 From: nbr23 Date: Fri, 6 May 2022 08:09:07 -0400 Subject: [PATCH 213/570] Allow updates skipping --- docker_run.sh | 3 +-- ydl_server/ydlhandler.py | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docker_run.sh b/docker_run.sh index d34d5075..e97349b0 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -1,4 +1,3 @@ #! /usr/bin/env sh -pip install --no-cache-dir -t $YDL_PYTHONPATH --upgrade $YOUTUBE_DL -PYTHONPATH="${PYTHONPATH}:${YDL_PYTHONPATH}" python -u ./youtube-dl-server.py \ No newline at end of file +PYTHONPATH="${PYTHONPATH}:${YDL_PYTHONPATH}" python -u ./youtube-dl-server.py diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index c3c9969c..61d9219e 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -105,6 +105,8 @@ def worker(self): self.queue.task_done() def update(self): + if self.app_config["ydl_server"].get("no_updates", False): + return 0, "" print(f"Updating: Current {self.ydl_module_name} version: {self.ydl_version}") if os.environ.get("YDL_PYTHONPATH"): command = [ @@ -226,4 +228,4 @@ def resume_pending(self): def join(self): if self.thread is not None: - return self.thread.join() \ No newline at end of file + return self.thread.join() From 69b340d851ec95a124c1bafebed443944dc35aa7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 22 May 2022 18:28:44 +0000 Subject: [PATCH 214/570] Remove auto update --- config.yml | 1 - ydl_server/routes.py | 1 - ydl_server/static/js/youtubedl.js | 4 --- ydl_server/templates/footer.html | 2 +- ydl_server/views.py | 22 ++++--------- ydl_server/ydlhandler.py | 51 ++++++------------------------- youtube-dl-server.py | 5 --- 7 files changed, 17 insertions(+), 69 deletions(-) diff --git a/config.yml b/config.yml index 2fdee67c..38beb689 100644 --- a/config.yml +++ b/config.yml @@ -4,7 +4,6 @@ ydl_server: # youtube-dl-server specific settings debug: False # Enable/Disable debug mode metadata_db_path: '/youtube-dl/.ydl-metadata.db' # Path to metadata DB output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory template - update_poll_delay_min: 1440 # Automatically check for updates every 24h max_log_entries: 100 # Maximum number of job log history to keep forwarded_allow_ips: None # uvicorn Comma seperated list of IPs to trust with proxy headers. proxy_headers: True # uvicorn flag Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info. diff --git a/ydl_server/routes.py b/ydl_server/routes.py index 869ee344..ccb9383c 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -16,7 +16,6 @@ Route("/logs", views.front_logs, name="logs"), Route("/finished", views.front_finished, name="finished"), Route("/api/extractors", views.api_list_extractors, name="api_list_extractors"), - Route("/api/youtube-dl/update", views.ydl_update, name="api_update"), Route("/api/downloads/stats", views.api_queue_size, name="api_queue_size"), Route("/api/downloads", views.api_logs, name="api_logs"), Route("/api/downloads/clean", views.api_logs_clean, name="api_logs_clean"), diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 1670693e..84572286 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -170,10 +170,6 @@ function get_download_logs(){ }); } -function ydl_update(){ - $.get("api/youtube-dl/update"); -} - function hide_logs_detail(){ $('td:nth-child(5),th:nth-child(5)').hide(); } diff --git a/ydl_server/templates/footer.html b/ydl_server/templates/footer.html index 48a5d366..8267a577 100644 --- a/ydl_server/templates/footer.html +++ b/ydl_server/templates/footer.html @@ -2,7 +2,7 @@

Drag and Drop the Bookmarklet to your bookmark bar for easy access: Youtube-DL
- Powered by {{ ydl_name }} version {{ ydl_version }}. + Powered by {{ ydl_name }} version {{ ydl_version }}. Code & issues on GitHub.

diff --git a/ydl_server/views.py b/ydl_server/views.py index 9369c8fe..ea4db0dd 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -126,14 +126,14 @@ async def api_logs_clean(request): return JSONResponse({"success": True}) +# TODO +async def api_jobs_stop(request): + request.app.state.jobshandler.put((Actions.CLEAN_LOGS, None)) + return JSONResponse({"success": True}) + + async def api_queue_download(request): data = await request.form() - if (app_config['ydl_server'].get('update_poll_delay_min') and - (datetime.now() - app_config['ydl_last_update']).total_seconds() > - app_config['ydl_server'].get('update_poll_delay_min') * 60): - job = Job("Youtube-dl Auto-Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) - request.app.state.jobshandler.put((Actions.INSERT, job)) - url = data.get("url") options = {"format": data.get("format")} @@ -153,13 +153,3 @@ async def api_metadata_fetch(request): if rc == 0: return JSONResponse(stdout) return JSONResponse({}, status_code=404) - - -async def ydl_update(request): - job = Job("Youtube-dl Manual Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) - request.app.state.jobshandler.put((Actions.INSERT, job)) - return JSONResponse( - { - "success": True, - } - ) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 61d9219e..3b1db571 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -97,37 +97,9 @@ def worker(self): job.status = Job.FAILED job.log = "Error during download task:\n{}:\n\t{}".format(type(e).__name__, str(e)) print("Error during download task:\n{}:\n\t{}".format(type(e).__name__, str(e))) - elif job.type == JobType.YDL_UPDATE: - rc, log = self.update() - job.log = Job.clean_logs(log) - job.status = Job.COMPLETED if rc == 0 else Job.FAILED self.jobshandler.put((Actions.UPDATE, job)) self.queue.task_done() - def update(self): - if self.app_config["ydl_server"].get("no_updates", False): - return 0, "" - print(f"Updating: Current {self.ydl_module_name} version: {self.ydl_version}") - if os.environ.get("YDL_PYTHONPATH"): - command = [ - "pip", - "install", - "--no-cache-dir", - "-t", - os.environ.get("YDL_PYTHONPATH"), - "--upgrade", - self.ydl_module_name, - ] - else: - command = ["pip", "install", "--no-cache-dir", "--upgrade", self.ydl_module_name] - proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - out, err = proc.communicate() - if proc.wait() == 0: - self.app_config["ydl_last_update"] = datetime.now() - self.import_ydl_module() - print(f"Updating: New {self.ydl_module_name} version: {self.ydl_version}") - return proc.returncode, str(out.decode("utf-8")) - def get_ydl_options(self, ydl_config, request_options): ydl_config = ydl_config.copy() req_format = request_options.get("format") @@ -212,19 +184,16 @@ def resume_pending(self): jobs = db.get_all(self.app_config["ydl_server"].get("max_log_entries", 100)) not_endeds = [job for job in jobs if job["status"] == "Pending" or job["status"] == "Running"] for pending in not_endeds: - if int(pending["type"]) == JobType.YDL_UPDATE: - self.jobshandler.put((Actions.SET_STATUS, (pending["id"], Job.FAILED))) - else: - job = Job( - pending["name"], - Job.PENDING, - "Queue stopped", - int(pending["type"]), - pending["format"], - pending["url"], - ) - job.id = pending["id"] - self.jobshandler.put((Actions.RESUME, job)) + job = Job( + pending["name"], + Job.PENDING, + "Queue stopped", + int(pending["type"]), + pending["format"], + pending["url"], + ) + job.id = pending["id"] + self.jobshandler.put((Actions.RESUME, job)) def join(self): if self.thread is not None: diff --git a/youtube-dl-server.py b/youtube-dl-server.py index b84c1d8d..03da9329 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -15,7 +15,6 @@ from ydl_server.routes import routes - if __name__ == "__main__": JobsDB.check_db_latest() @@ -33,10 +32,6 @@ app.state.jobshandler.start(app.state.ydlhandler.queue) print("Started jobs manager thread") - print("Updating %s to the newest version" % app.state.ydlhandler.ydl_module_name) - job = Job("Youtube-dl at Boot Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) - app.state.jobshandler.put((Actions.INSERT, job)) - app.state.ydlhandler.resume_pending() uvicorn.run( From 04ff74192287e4504b8c1c0bd2003f5a0d4486d2 Mon Sep 17 00:00:00 2001 From: nbr23 Date: Mon, 11 Jul 2022 06:50:31 -0500 Subject: [PATCH 215/570] Build ffmpeg from source for ytdlp image --- Dockerfile-ytdlp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ Jenkinsfile | 4 ++-- 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 Dockerfile-ytdlp diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp new file mode 100644 index 00000000..b2a2fd8c --- /dev/null +++ b/Dockerfile-ytdlp @@ -0,0 +1,58 @@ +# +# youtube-dl Server Dockerfile +# +# https://github.com/nbr23/youtube-dl-server +# + +FROM alpine as ffmpeg + +WORKDIR /ffmpeg + +RUN apk add wget && \ + if [ "$(uname -m)" == "x86_64" ]; then \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz; \ + elif [ "$(uname -m)" == "aarch64" ]; then \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-arm64-static.tar.xz; \ + elif [ "$(uname -m)" == "armv7l" ]; then \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-armhf-static.tar.xz; \ + else \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$(uname -m)-static.tar.xz; \ + fi \ + && tar -xvf ffmpeg-git-*-static.tar.xz && cd ffmpeg-git-*-static && mv ffmpeg ffprobe ../ + +FROM python:alpine3.13 +ARG YOUTUBE_DL=youtube_dl +ARG ATOMICPARSLEY=0 +ARG YDL_PYTHONPATH='/youtube-dl/.python' + +VOLUME "/youtube-dl" +VOLUME "/app_config" + +COPY --from=nbr23/youtube-dl-wheels /out/wheels /wheels +RUN pip install --no-cache /wheels/* + +RUN mkdir -p /usr/src/app +COPY --from=ffmpeg /ffmpeg/ffmpeg /usr/local/bin/ffmpeg +COPY --from=ffmpeg /ffmpeg/ffprobe /usr/local/bin/ffprobe +RUN apk add --no-cache tzdata mailcap +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi +COPY ./requirements.txt /usr/src/app/ +RUN pip install --upgrade pip && sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt + +COPY ./bootstrap.sh /usr/src/app/ +COPY ./docker_run.sh /usr/src/app/ +COPY ./config.yml /usr/src/app/default_config.yml +COPY ./ydl_server /usr/src/app/ydl_server +COPY ./youtube-dl-server.py /usr/src/app/ + +WORKDIR /usr/src/app + +RUN apk add --no-cache wget && ./bootstrap.sh && apk del wget + + +EXPOSE 8080 + +ENV YOUTUBE_DL=$YOUTUBE_DL +ENV YDL_CONFIG_PATH='/app_config' +ENV YDL_PYTHONPATH=$YDL_PYTHONPATH +CMD [ "./docker_run.sh" ] diff --git a/Jenkinsfile b/Jenkinsfile index 4bb42080..de55d6b6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,7 +30,7 @@ pipeline { steps { sh ''' BUILDER=`docker buildx create --use` - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley --push . + docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley -f Dockerfile-ytdlp --push . docker buildx rm $BUILDER ''' } @@ -42,4 +42,4 @@ pipeline { sh 'docker logout' } } -} \ No newline at end of file +} From 3ca97f493063600b577fba3396e19736449c3932 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 23 Jul 2022 18:50:19 +0000 Subject: [PATCH 216/570] Update yt-dlp usage doc --- Dockerfile-ytdlp | 4 ++-- README.md | 20 +++++++++++++++----- requirements-yt-dlp.txt | 7 +++++++ 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 requirements-yt-dlp.txt diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index b2a2fd8c..00b05197 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -36,8 +36,8 @@ COPY --from=ffmpeg /ffmpeg/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /ffmpeg/ffprobe /usr/local/bin/ffprobe RUN apk add --no-cache tzdata mailcap RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi -COPY ./requirements.txt /usr/src/app/ -RUN pip install --upgrade pip && sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt +COPY ./requirements-yt-dlp.txt /usr/src/app/ +RUN pip install --upgrade pip && pip install --no-cache-dir -r /usr/src/app/requirements-yt-dlp.txt COPY ./bootstrap.sh /usr/src/app/ COPY ./docker_run.sh /usr/src/app/ diff --git a/README.md b/README.md index e3aed544..6228954c 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,10 @@ Forked from [manbearwiz/youtube-dl-server](https://github.com/manbearwiz/youtube ## Running For easier deployment, a docker image is available on -[dockerhub](https://hub.docker.com/r/nbr23/youtube-dl-server). +[dockerhub](https://hub.docker.com/r/nbr23/youtube-dl-server): -If you plan on using the `--embed-thumbnail` flag in youtube-dl, -you will need `atomicparsley` embedded in the container. - -Use the tags `nbr23/youtube-dl-server:atomicparsley` to achieve this. +- `nbr23/youtube-dl-server:latest` to use `youtube-dl` +- `nbr23/youtube-dl-server:yt-dlp` to use `yt-dlp` ### Ansible @@ -42,6 +40,12 @@ This directory will be used to output the resulting videos. docker run -d --name youtube-dl -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:latest ``` +OR for yt-dlp: + +```shell +docker run -d --name youtube-dl -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:yt-dlp +``` + ### Docker Compose This is an example service definition that could be put in `docker-compose.yml`. @@ -120,6 +124,12 @@ Install the python dependencies from `requirements.txt`: pip install -r requirements.txt ``` +OR, if using `yt-dlp`: + +```shell +pip install -r requirements-yt-dlp.txt +``` + You can run [bootstrap.sh](https://github.com/nbr23/youtube-dl-server/blob/master/bootstrap.sh) to download the required front-end libraries (jquery, bootstrap). diff --git a/requirements-yt-dlp.txt b/requirements-yt-dlp.txt new file mode 100644 index 00000000..a1b4fb6f --- /dev/null +++ b/requirements-yt-dlp.txt @@ -0,0 +1,7 @@ +starlette +uvicorn +aiofiles +jinja2 +python-multipart +pyyaml +yt-dlp From e40709bd3b9b703bad6a4289742c1d79255d19d7 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 29 Jul 2022 09:36:39 -0400 Subject: [PATCH 217/570] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6228954c..f12d4825 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ ![Docker Stars Shield](https://img.shields.io/docker/stars/nbr23/youtube-dl-server.svg?style=flat-square) ![Docker Pulls Shield](https://img.shields.io/docker/pulls/nbr23/youtube-dl-server.svg?style=flat-square) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://raw.githubusercontent.com/nbr23/youtube-dl-server/master/LICENSE) -[![ci](https://github.com/nbr23/youtube-dl-server/actions/workflows/docker-images.yml/badge.svg)](https://github.com/nbr23/youtube-dl-server/actions/workflows/docker-images.yml) # youtube-dl-server From 362a33f28a5608c3541202cd1c245ec5dd9f1684 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 7 Sep 2022 21:09:07 -0500 Subject: [PATCH 218/570] Display finished file size --- requirements.txt | 3 ++- ydl_server/templates/finished.html | 9 ++++++--- ydl_server/views.py | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8e9aa2ca..28b34d53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ aiofiles jinja2 python-multipart pyyaml -youtube-dl +humanize==4.3.0 +youtube-dl \ No newline at end of file diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index db542df6..94349b5e 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -10,7 +10,8 @@

Finished Files

- + + @@ -54,7 +55,8 @@

Finished Files

- + + @@ -76,7 +78,8 @@

Finished Files

- + + diff --git a/ydl_server/views.py b/ydl_server/views.py index ea4db0dd..74ebe6ac 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -8,6 +8,7 @@ from datetime import datetime import os import shutil +import humanize templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates")) @@ -46,7 +47,7 @@ async def front_finished(request): "directory": f1.is_dir(), "children": sorted( [ - {"name": f2.name, "modified": datetime.fromtimestamp(f2.stat().st_mtime).strftime("%H:%m %D")} + {"name": f2.name, "size": humanize.naturalsize(f2.stat().st_size),"modified": datetime.fromtimestamp(f2.stat().st_mtime).strftime("%H:%m %D")} for f2 in f1.iterdir() if not f2.name.startswith(".") ], From f53cbbaf2536ada4795b4a417e26b362401dd070 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 9 Sep 2022 00:18:15 +0000 Subject: [PATCH 219/570] Add missing dependency for yt-dlp! --- requirements-yt-dlp.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-yt-dlp.txt b/requirements-yt-dlp.txt index a1b4fb6f..ca497153 100644 --- a/requirements-yt-dlp.txt +++ b/requirements-yt-dlp.txt @@ -4,4 +4,5 @@ aiofiles jinja2 python-multipart pyyaml +humanize==4.3.0 yt-dlp From c81a6d44dcf1ecf7ad0150c73867b7eda420743b Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 9 Sep 2022 01:32:11 +0000 Subject: [PATCH 220/570] Fix size display --- ydl_server/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ydl_server/views.py b/ydl_server/views.py index 74ebe6ac..358642dc 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -44,6 +44,7 @@ async def front_finished(request): { "name": f1.name, "modified": datetime.fromtimestamp(f1.stat().st_mtime).strftime("%H:%m %D"), + "size": humanize.naturalsize(f1.stat().st_size) if not f1.is_dir() else None, "directory": f1.is_dir(), "children": sorted( [ From e71f625762509ccb158604f9cb31b7ea4e0e2f60 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 14 Sep 2022 22:58:08 -0400 Subject: [PATCH 221/570] Allow job cancellation --- ydl_server/jobshandler.py | 3 ++ ydl_server/logdb.py | 87 ++++++++++++++++++++++++------- ydl_server/routes.py | 1 + ydl_server/static/js/youtubedl.js | 17 ++++-- ydl_server/views.py | 15 +++++- ydl_server/ydlhandler.py | 6 +++ 6 files changed, 104 insertions(+), 25 deletions(-) diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index d7bbf73f..70e57790 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -47,6 +47,9 @@ def worker(self, dl_queue): elif action == Actions.SET_STATUS: job_id, status = job db.set_job_status(job_id, status) + elif action == Actions.SET_PID: + job_id, pid = job + db.set_job_pid(job_id, pid) elif action == Actions.CLEAN_LOGS: db.clean_old_jobs() self.queue.task_done() diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index 118d418b..bf82aa12 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -4,7 +4,7 @@ from ydl_server.config import app_config -STATUS_NAME = ["Running", "Completed", "Failed", "Pending"] +STATUS_NAME = ["Running", "Completed", "Failed", "Pending", "Aborted"] class Actions: @@ -17,6 +17,7 @@ class Actions: SET_STATUS = 7 SET_LOG = 8 CLEAN_LOGS = 9 + SET_PID = 10 class JobType: @@ -29,8 +30,9 @@ class Job: COMPLETED = 1 FAILED = 2 PENDING = 3 + ABORTED = 4 - def __init__(self, name, status, log, jobtype, format=None, url=None, id=-1): + def __init__(self, name, status, log, jobtype, format=None, url=None, id=-1, pid=0): self.id = id self.name = name self.status = status @@ -39,6 +41,7 @@ def __init__(self, name, status, log, jobtype, format=None, url=None, id=-1): self.format = format self.type = jobtype self.url = url + self.pid = pid @staticmethod def clean_logs(logs): @@ -59,8 +62,8 @@ def check_db_latest(): cursor = conn.cursor() cursor.execute("PRAGMA table_info('jobs')") columns = [row[1] for row in cursor.fetchall()] - if set(columns) != set(['id', 'name', 'status', 'format', 'log', 'last_update', 'type', 'url']): - print("Outdated jbos table, cleaning up and recreating") + if set(columns) != set(["id", "name", "status", "format", "log", "last_update", "type", "url", "pid"]): + print("Outdated jobs table, cleaning up and recreating") cursor.execute("DROP TABLE if exists jobs;") conn.close() @@ -77,7 +80,8 @@ def init_db(): format TEXT, \ last_update DATETIME DEFAULT CURRENT_TIMESTAMP, \ type INTEGER NOT NULL, \ - url TEXT);" + url TEXT, \ + pid INTEGER);" ) conn.commit() conn.close() @@ -92,10 +96,11 @@ def close(self): def insert_job(self, job): cursor = self.conn.cursor() - cursor.execute("INSERT INTO jobs (name, status, log, format, type, \ - url) VALUES (?, ?, ?, ?, ?, ?);", - (job.name, str(job.status), job.log, job.format, str(job.type), - job.url)) + cursor.execute( + "INSERT INTO jobs (name, status, log, format, type, \ + url, pid) VALUES (?, ?, ?, ?, ?, ?, ?);", + (job.name, str(job.status), job.log, job.format, str(job.type), job.url, job.pid), + ) job.id = cursor.lastrowid self.conn.commit() @@ -117,6 +122,15 @@ def set_job_status(self, job_id, status): ) self.conn.commit() + def set_job_pid(self, job_id, pid): + cursor = self.conn.cursor() + cursor.execute( + "UPDATE jobs SET pid = ?, last_update = datetime() \ + where id = ?;", + (str(pid), str(job_id)), + ) + self.conn.commit() + def set_job_log(self, job_id, log): cursor = self.conn.cursor() cursor.execute( @@ -135,6 +149,14 @@ def set_job_name(self, job_id, name): ) self.conn.commit() + def set_job_pid(self, job_id, pid): + cursor = self.conn.cursor() + cursor.execute( + "UPDATE jobs SET pid = ?, last_update = datetime() \ + where id = ?;", + (pid, str(job_id)), + ) + self.conn.commit() def purge_jobs(self): cursor = self.conn.cursor() @@ -154,17 +176,44 @@ def clean_old_jobs(self, limit=10): self.conn.commit() self.conn.execute("VACUUM") + def get_job_by_id(self, job_id): + cursor = self.conn.cursor() + cursor.execute( + "SELECT id, name, status, log, last_update, format, type, url, pid from jobs where id = ?;", + (job_id,), + ) + job_id, name, status, log, last_update, format, jobtype, url, pid = cursor.fetchone() + return { + "id": job_id, + "name": escape(name), + "status": STATUS_NAME[status], + "log": escape(log), + 'format': escape(format) if format is not None else None, + "last_update": last_update, + "type": jobtype, + "url": url, + "pid": pid, + } + def get_all(self, limit=50): cursor = self.conn.cursor() - cursor.execute("SELECT id, name, status, log, last_update, format, type, url from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) + cursor.execute( + "SELECT id, name, status, log, last_update, format, type, url, pid from jobs ORDER BY last_update DESC LIMIT ?;", + (str(limit),), + ) rows = [] - for job_id, name, status, log, last_update, format, jobtype, url in cursor.fetchall(): - rows.append({'id': job_id, - 'name': escape(name), - 'status': STATUS_NAME[status], - 'log': escape(log), - 'format': escape(format) if format is not None else None, - 'last_update': last_update, - 'type': jobtype, - 'url': escape(url)}) + for job_id, name, status, log, last_update, format, jobtype, url, pid in cursor.fetchall(): + rows.append( + { + "id": job_id, + "name": escape(name), + "status": STATUS_NAME[status], + "log": escape(log), + 'format': escape(format) if format is not None else None, + "last_update": last_update, + "type": jobtype, + "url": escape(url), + "pid": pid, + } + ) return rows diff --git a/ydl_server/routes.py b/ydl_server/routes.py index ccb9383c..cee95e3b 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -23,6 +23,7 @@ Route("/api/downloads", views.api_queue_download, name="api_queue_download", methods=["POST"]), Route("/api/metadata", views.api_metadata_fetch, name="api_metadata_fetch", methods=["POST"]), Route("/api/finished/{fname:path}", views.api_delete_file, name="api_delete_file", methods=["DELETE"]), + Route("/api/jobs/{job_id:str}/stop", views.api_jobs_stop, name="api_jobs_stop", methods=["POST"]), Mount("/static", static, name="static"), Mount("/api/finished/", finished_files, name="api_finished"), ] diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 84572286..096e946a 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -33,6 +33,12 @@ function retry_download(url, format){ }); } +function terminate_job(job_id){ + $.post(`api/jobs/${job_id}/stop`, {}) + .done(function (data) { + }); +} + function pretty_size(size_b) { if (size_b == null) { return "NaN"; @@ -141,6 +147,7 @@ function purge_download_logs(){ var statusToTrClass = { Pending: 'badge', Failed: 'badge bg-danger', + Aborted: 'badge bg-warning', Running: 'badge bg-info', Completed: 'badge bg-success' } @@ -153,12 +160,14 @@ function get_download_logs(){ download_logs += ""; download_logs += ""; download_logs += ""; - if (row.status == 'Failed' && row.type != 1) { + if ((row.status === 'Failed' || row.status === 'Aborted') && row.type != 1) { format = row.format != null ? "'" + row.format +"'" : "null"; download_logs += ""; - } - else + } else if ((row.status === 'Running' || row.status === 'Pending') && row.type != 1) { + download_logs += "`; + } else { download_logs += ""; + } download_logs += ""; download_logs += ""; }); @@ -223,4 +232,4 @@ function delete_finished_file(fname){ }); } -bookmarklet(); \ No newline at end of file +bookmarklet(); diff --git a/ydl_server/views.py b/ydl_server/views.py index 358642dc..3113e698 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -7,6 +7,7 @@ from ydl_server.logdb import JobsDB, Job, Actions, JobType from datetime import datetime import os +import signal import shutil import humanize @@ -108,6 +109,7 @@ async def api_queue_size(request): "running": len([job for job in jobs if job["status"] == "Running"]), "completed": len([job for job in jobs if job["status"] == "Completed"]), "failed": len([job for job in jobs if job["status"] == "Failed"]), + "aborted": len([job for job in jobs if job["status"] == "Aborted"]), }, } ) @@ -128,9 +130,18 @@ async def api_logs_clean(request): return JSONResponse({"success": True}) -# TODO async def api_jobs_stop(request): - request.app.state.jobshandler.put((Actions.CLEAN_LOGS, None)) + db = JobsDB(readonly=True) + data = await request.form() + job_id = request.path_params["job_id"] + job = db.get_job_by_id(job_id) + if job["status"] == 'Pending': + print("Cancelling pending job") + request.app.state.jobshandler.put((Actions.SET_STATUS, (job["id"], Job.ABORTED))) + elif job["status"] == 'Running' and int(job["pid"]) != 0: + print("Stopping running job", job["pid"]) + print(os.kill(job["pid"], signal.SIGINT)) + return JSONResponse({"success": True}) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 3b1db571..a89ca941 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -85,8 +85,13 @@ def finish(self): self.done = True def worker(self): + db = JobsDB(readonly=True) while not self.done: job = self.queue.get() + job_detail = db.get_job_by_id(job.id) + if job_detail["status"] == 'Aborted': + self.queue.task_done() + continue job.status = Job.RUNNING self.jobshandler.put((Actions.SET_STATUS, (job.id, job.status))) if job.type == JobType.YDL_DOWNLOAD: @@ -165,6 +170,7 @@ def download(self, job, request_options, output): cmd = self.get_ydl_full_cmd(ydl_opts, job.url) proc = Popen(cmd, stdout=PIPE, stderr=STDOUT) + self.jobshandler.put((Actions.SET_PID, (job.id, proc.pid))) stdout_thread = Thread(target=self.download_log_update, args=(job, proc, output)) stdout_thread.start() From 5fdaca15445e67a51633b8309b8a6206bfad412b Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 6 Oct 2022 19:55:11 -0400 Subject: [PATCH 222/570] Fix pip setup --- Dockerfile | 2 -- Dockerfile-ytdlp | 10 ++++------ docker_run.sh | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index cb6ae487..e12d9960 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,6 @@ FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 -ARG YDL_PYTHONPATH='/youtube-dl/.python' VOLUME "/youtube-dl" VOLUME "/app_config" @@ -37,5 +36,4 @@ EXPOSE 8080 ENV YOUTUBE_DL=$YOUTUBE_DL ENV YDL_CONFIG_PATH='/app_config' -ENV YDL_PYTHONPATH=$YDL_PYTHONPATH CMD [ "./docker_run.sh" ] diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 00b05197..682166e7 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -10,20 +10,19 @@ WORKDIR /ffmpeg RUN apk add wget && \ if [ "$(uname -m)" == "x86_64" ]; then \ - wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz; \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz; \ elif [ "$(uname -m)" == "aarch64" ]; then \ - wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-arm64-static.tar.xz; \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-arm64-static.tar.xz; \ elif [ "$(uname -m)" == "armv7l" ]; then \ - wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-armhf-static.tar.xz; \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-armhf-static.tar.xz; \ else \ - wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$(uname -m)-static.tar.xz; \ + wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-$(uname -m)-static.tar.xz; \ fi \ && tar -xvf ffmpeg-git-*-static.tar.xz && cd ffmpeg-git-*-static && mv ffmpeg ffprobe ../ FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 -ARG YDL_PYTHONPATH='/youtube-dl/.python' VOLUME "/youtube-dl" VOLUME "/app_config" @@ -54,5 +53,4 @@ EXPOSE 8080 ENV YOUTUBE_DL=$YOUTUBE_DL ENV YDL_CONFIG_PATH='/app_config' -ENV YDL_PYTHONPATH=$YDL_PYTHONPATH CMD [ "./docker_run.sh" ] diff --git a/docker_run.sh b/docker_run.sh index e97349b0..b364127e 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -1,3 +1,3 @@ #! /usr/bin/env sh -PYTHONPATH="${PYTHONPATH}:${YDL_PYTHONPATH}" python -u ./youtube-dl-server.py +python -u ./youtube-dl-server.py From bf5c1a9cdd20e75c16bcf264b80df51610cd3e34 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Thu, 20 Oct 2022 20:51:58 +0200 Subject: [PATCH 223/570] Update README.md Updatet docker run commands to include port mappings because without them the server cannot be reached --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f12d4825..27f65175 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,13 @@ app. Note the `-v` argument to specify the volume and its binding on the host. This directory will be used to output the resulting videos. ```shell -docker run -d --name youtube-dl -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:latest +docker run -d --name youtube-dl -p 8080:8080 -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:latest ``` OR for yt-dlp: ```shell -docker run -d --name youtube-dl -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:yt-dlp +docker run -d --name youtube-dl -p 8080:8080 -v $HOME/youtube-dl:/youtube-dl nbr23/youtube-dl-server:yt-dlp ``` ### Docker Compose From 2decfa78cbd44b02079cecad1ed948d7249c952e Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 28 Oct 2022 21:02:52 -0400 Subject: [PATCH 224/570] Fix atomicparsley build --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e12d9960..c669484c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ RUN pip install --no-cache /wheels/* RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap -RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi COPY ./requirements.txt /usr/src/app/ RUN pip install --upgrade pip && sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt From b6336c48384dfeb74a83546585e01e02ad57f8ee Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 28 Oct 2022 21:15:56 -0400 Subject: [PATCH 225/570] Fix ytdlp image too! --- Dockerfile-ytdlp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 682166e7..4f114fdc 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -34,7 +34,7 @@ RUN mkdir -p /usr/src/app COPY --from=ffmpeg /ffmpeg/ffmpeg /usr/local/bin/ffmpeg COPY --from=ffmpeg /ffmpeg/ffprobe /usr/local/bin/ffprobe RUN apk add --no-cache tzdata mailcap -RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi COPY ./requirements-yt-dlp.txt /usr/src/app/ RUN pip install --upgrade pip && pip install --no-cache-dir -r /usr/src/app/requirements-yt-dlp.txt From cf8b50f3b15855c00bffc807b3637b095ca4a864 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 12 Nov 2022 15:38:40 -0500 Subject: [PATCH 226/570] Fix build --- Dockerfile-ytdlp | 2 +- Jenkinsfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 4f114fdc..7decb000 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -28,7 +28,7 @@ VOLUME "/youtube-dl" VOLUME "/app_config" COPY --from=nbr23/youtube-dl-wheels /out/wheels /wheels -RUN pip install --no-cache /wheels/* +RUN pip install --upgrade --no-cache-dir pip && pip install --no-cache-dir /wheels/* RUN mkdir -p /usr/src/app COPY --from=ffmpeg /ffmpeg/ffmpeg /usr/local/bin/ffmpeg diff --git a/Jenkinsfile b/Jenkinsfile index de55d6b6..cf917b04 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -20,7 +20,7 @@ pipeline { steps { sh ''' BUILDER=`docker buildx create --use` - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:latest -t nbr23/youtube-dl-server:youtube-dl -t nbr23/youtube-dl-server:youtube-dl_atomicparsley --push . + docker buildx build --pull --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:latest -t nbr23/youtube-dl-server:youtube-dl -t nbr23/youtube-dl-server:youtube-dl_atomicparsley --push . docker buildx rm $BUILDER ''' } @@ -30,7 +30,7 @@ pipeline { steps { sh ''' BUILDER=`docker buildx create --use` - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley -f Dockerfile-ytdlp --push . + docker buildx build --pull --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley -f Dockerfile-ytdlp --push . docker buildx rm $BUILDER ''' } From 9ce477d7ddbaa5af6b2d6357ddcb49894b12a3c0 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 12 Nov 2022 15:46:11 -0500 Subject: [PATCH 227/570] Fix homepage url --- Dockerfile-ytdlp | 2 +- ydl_server/ydlhandler.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 7decb000..8e2a27df 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -21,7 +21,7 @@ RUN apk add wget && \ && tar -xvf ffmpeg-git-*-static.tar.xz && cd ffmpeg-git-*-static && mv ffmpeg ffprobe ../ FROM python:alpine3.13 -ARG YOUTUBE_DL=youtube_dl +ARG YOUTUBE_DL=yt_dlp ARG ATOMICPARSLEY=0 VOLUME "/youtube-dl" diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index a89ca941..c2fff6b0 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -20,9 +20,9 @@ def get_ydl_website(ydl_module_name): import pip._internal.commands.show as pipshow info = list(pipshow.search_packages_info([ydl_module_name])) - if len(info) < 1 or "home-page" not in info[0]: + if len(info) < 1: return "" - return info[0]["home-page"] + return getattr(info[0], "home-page", getattr(info[0], "homepage", "")) def read_proc_stdout(proc, strio): From 0f524a902688e8d6cdd014ada8063e7dcb49e507 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 22 Dec 2022 23:26:34 +0000 Subject: [PATCH 228/570] bump to alpine3.17 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c669484c..ee5405d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ # -FROM python:alpine3.13 +FROM python:alpine3.17 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 From 0315f7fbf37f92d1e18483fc11df55ad9c0e15c9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 23 Dec 2022 07:29:41 +0000 Subject: [PATCH 229/570] bump alpine --- Dockerfile-ytdlp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 8e2a27df..8236fbac 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -20,7 +20,7 @@ RUN apk add wget && \ fi \ && tar -xvf ffmpeg-git-*-static.tar.xz && cd ffmpeg-git-*-static && mv ffmpeg ffprobe ../ -FROM python:alpine3.13 +FROM python:alpine3.17 ARG YOUTUBE_DL=yt_dlp ARG ATOMICPARSLEY=0 From aa3c2429ebd09070c26a3ec8e45ce7d99754da5f Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 27 Dec 2022 22:08:17 -0500 Subject: [PATCH 230/570] Dependabot docker --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..9f34e579 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: docker + directory: / + schedule: + interval: weekly From 2b9e5ea477bb1b51c103072ce5ac85f8ee1514e0 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 27 Dec 2022 22:19:20 -0500 Subject: [PATCH 231/570] css updates --- ydl_server/static/css/style.css | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ydl_server/static/css/style.css b/ydl_server/static/css/style.css index 1285f7dd..bb888de0 100644 --- a/ydl_server/static/css/style.css +++ b/ydl_server/static/css/style.css @@ -1,6 +1,8 @@ -html, body { +html, +body { height: 100%; background-color: #002b36; + color: #fff; margin: 0; } @@ -16,14 +18,18 @@ nav { background-color: #001b26; } -div.input-group>select.custom-select { +div.input-group > select.custom-select { flex: 0.1 1 100px; + background-color: #d1e4eb; + color: #000; } .nav-item .badge { margin-right: 2px; } -.footer{ - height: 70px; +.footer { + width: 100%; + position: absolute; + bottom: 0; } From af700ba6e75650501a0deb2559d1361219d6b67b Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 27 Dec 2022 22:29:32 -0500 Subject: [PATCH 232/570] Fix extractor modal --- ydl_server/templates/index.html | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 7e923380..2a31644d 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -28,21 +28,18 @@

youtube-dl


-
"; - download_logs += ""; - download_logs += ""; - download_logs += ""; - if ((row.status === 'Failed' || row.status === 'Aborted') && row.type != 1) { - format = row.format != null ? "'" + row.format +"'" : "null"; - download_logs += ""; - } else if ((row.status === 'Running' || row.status === 'Pending') && row.type != 1) { - download_logs += "`; - } else { - download_logs += ""; - } - download_logs += ""; - download_logs += ""; - }); - $("#job_logs").html(download_logs); - var visible = $("th:nth-child(5)").is(":visible"); - if (!visible) { - hide_logs_detail(); - } - }); -} - -function hide_logs_detail(){ - $('td:nth-child(5),th:nth-child(5)').hide(); -} - -function show_logs_detail(){ - $('td:nth-child(5),th:nth-child(5)').show(); -} - -function toggle_hide_logs_detail(){ - if ($("th:nth-child(5)").is(":visible")) { - hide_logs_detail(); - $("#toggle_log_button").text("Show Logs"); - } - else { - show_logs_detail(); - $("#toggle_log_button").text("Hide Logs"); - } -} - -function bookmarklet(){ - url = window.location.protocol + '//' + window.location.hostname - if (window.location.port != '') { - url = url + ':' + window.location.port; - } - if (window.location.protocol == 'https:') { - $("#bookmarklet").attr("href", "javascript:fetch(\"" + url - + "/api/downloads\",{body:new URLSearchParams({url:window.location.href}),method:\"POST\"});"); - } - else { - $("#bookmarklet").attr("href", "javascript:(function(){document.body.innerHTML += '';document.ydl_form.submit()})();"); - } -} - -$('#url').keypress(function (e) { - if (e.which == 13) { - submit_video(); - update_stats(); - return false; - } -}); - -function delete_finished_file(fname){ - $.ajax({ - url: 'api/finished/' + fname, - type: 'DELETE', - success: function(data) { - location.reload(); - } - }); -} - -bookmarklet(); diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html deleted file mode 100644 index b6f9b8ff..00000000 --- a/ydl_server/templates/finished.html +++ /dev/null @@ -1,99 +0,0 @@ -{% include 'header.html' %} - -
-
-
-

Finished Files

-
-
-
Name" + row.last_update + "" + row.name + "" + row.format + " " + row.status + "" + (row.status == 'Failed' ? ' Retry' : '') + " " + row.status + " / Retry " + row.status + "" + row.log.replace(/\n|\r/g, '
') + "
" + file.name + ""; finished_files += "
"; $.each(file.children, function(child_key, child_file) { diff --git a/ydl_server/views.py b/ydl_server/views.py index 2915fffe..eaf67e02 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -53,7 +53,7 @@ async def api_list_finished(request): 'children': sorted([{ 'name': f2.name, 'modified': f2.stat().st_mtime * 1000 - } for f2 in f1.iterdir() if not f2.name.startswith('.')] if f1.is_dir() else [], key=itemgetter('modified'), reverse=True) + } for f2 in f1.iterdir() if not f2.name.startswith('.')], key=itemgetter('modified'), reverse=True) if f1.is_dir() else None } for f1 in matches if not f1.name.startswith('.')] files = sorted(files, key=itemgetter('modified'), reverse=True) From 566ebe3ea9f1297bf2367e3aa3564ea991751bbb Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 7 Feb 2021 20:47:02 +0000 Subject: [PATCH 157/570] Update output root directory detection --- ydl_server/config.py | 12 ++++++++++++ ydl_server/routes.py | 5 +++-- ydl_server/views.py | 4 ++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/ydl_server/config.py b/ydl_server/config.py index 8e6ab0f8..6c852b60 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -34,6 +34,18 @@ def load_config(): return config +def get_finished_path(): + finished_path = [] + for s in app_config['ydl_options'].get('output').split('/'): + if '%' in s and '%%' not in s: + break + finished_path.append(s) + finished_path = '/'.join(finished_path) + if not os.path.isdir(finished_path): + os.mkdir(finished_path, 0o755) + return finished_path + + app_config = load_config() if app_config is None or app_config.get('ydl_server') is None or \ diff --git a/ydl_server/routes.py b/ydl_server/routes.py index 4c9f12f9..e71aa41e 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -1,13 +1,14 @@ from pathlib import Path from ydl_server import views -from ydl_server.config import app_config +from ydl_server.config import app_config, get_finished_path from starlette.routing import Route, Mount from starlette.staticfiles import StaticFiles static = StaticFiles(directory=str(Path(__file__).parent / "static")) -finished_files = StaticFiles(directory=Path(app_config['ydl_options'].get('output')).parent) + +finished_files = StaticFiles(directory=get_finished_path()) routes = [ Route("/", views.front_index, name="index"), diff --git a/ydl_server/views.py b/ydl_server/views.py index eaf67e02..1bb9c341 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -3,7 +3,7 @@ from operator import itemgetter from pathlib import Path -from ydl_server.config import app_config +from ydl_server.config import app_config, get_finished_path from ydl_server.logdb import JobsDB, Job, Actions, JobType from datetime import datetime @@ -45,7 +45,7 @@ async def front_finished(request): async def api_list_finished(request): - root_dir = Path(app_config['ydl_options'].get('output')).parent + root_dir = Path(get_finished_path()) matches = root_dir.glob('*') files = [{'name': f1.name, From 8cc9d7faefab878b31406a42a94e2eff05e92cdb Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 7 Feb 2021 21:02:34 +0000 Subject: [PATCH 158/570] Add uvicorn parameters to config.yml --- config.yml | 2 ++ youtube-dl-server.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config.yml b/config.yml index e3df9327..c170ce43 100644 --- a/config.yml +++ b/config.yml @@ -6,6 +6,8 @@ ydl_server: # youtube-dl-server specific settings output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory template update_poll_delay_min: 1440 # Automatically check for updates every 24h max_log_entries: 100 # Maximum number of job log history to keep + forwarded_allow_ips: None # uvicorn Comma seperated list of IPs to trust with proxy headers. + proxy_headers: True # uvicorn flag Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info. ydl_options: # youtube-dl options output: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # output directory template diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 472956cd..8c70da0f 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -40,7 +40,9 @@ host=app_config['ydl_server'].get('host'), port=app_config['ydl_server'].get('port'), log_level=('debug' if app_config['ydl_server'].get( - 'debug', False) else 'info')) + 'debug', False) else 'info'), + forwarded_allow_ips=app_config['ydl_server'].get('forwarded_allow_ips', None), + proxy_headers=app_config['ydl_server'].get('proxy_headers', True)) app.state.ydlhandler.finish() app.state.jobshandler.finish() From 413182c68d97792abb69455e8739c85dce27ef0d Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 8 Feb 2021 01:16:28 +0000 Subject: [PATCH 159/570] Add AtomicParsley link as alpine binary is misnamed --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 598b3356..04913b5e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ ARG ATOMICPARSLEY=0 RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata -RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; fi +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi COPY ./requirements.txt /usr/src/app/ RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt From c8ac2fe94a5bee12121e83c25426ba1e1c59bec7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 28 Feb 2021 16:45:52 +0000 Subject: [PATCH 160/570] Fix null format handling in javascript --- ydl_server/static/js/youtubedl.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 64872f19..081391fc 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -25,7 +25,7 @@ function set_dismissible_message(success, message){ } function retry_download(url, format){ - data = {url: url,format: format}; + data = format != null ? {url: url, format: format} : {url: url}; $.post("api/downloads", data) .done(function (data) { get_download_logs(); @@ -152,9 +152,11 @@ function get_download_logs(){ download_logs += ""; download_logs += ""; download_logs += ""; - download_logs += ""; - if (row.status == 'Failed' && row.type != 1) - download_logs += ""; + download_logs += ""; + if (row.status == 'Failed' && row.type != 1) { + format = row.format != null ? "'" + row.format +"'" : "null"; + download_logs += ""; + } else download_logs += ""; download_logs += ""; From de058edae52996f9ac92b2ab65912951d100fbbc Mon Sep 17 00:00:00 2001 From: andrewstech <45342431+andrewstech@users.noreply.github.com> Date: Wed, 17 Mar 2021 18:40:40 +0000 Subject: [PATCH 161/570] Create docker-arm.yml --- .github/workflows/docker-arm.yml | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/docker-arm.yml diff --git a/.github/workflows/docker-arm.yml b/.github/workflows/docker-arm.yml new file mode 100644 index 00000000..55b6292d --- /dev/null +++ b/.github/workflows/docker-arm.yml @@ -0,0 +1,34 @@ +name: ci + +on: + push: + branches: + - 'master' + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - + name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + platforms: linux/arm64,linux/arm + push: true + tags: nbr23/youtube-dl-server:arm From db316c15b83be1be8d7a4146e1ff4934f882f6e5 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 18 Mar 2021 01:06:45 +0000 Subject: [PATCH 162/570] Add download button to finished page Fix https://github.com/nbr23/youtube-dl-server/issues/38 --- ydl_server/static/js/youtubedl.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index 081391fc..d6b22561 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -171,6 +171,7 @@ function get_download_logs(){ } function get_finished_files(){ + download_svg = ""; $.getJSON("api/finished", function (data) { var finished_files = ""; $.each(data.files, function(key, file) { @@ -179,12 +180,18 @@ function get_finished_files(){ finished_files += ""; } else { - finished_files += ""; + finished_files += ""; } finished_files += ""; finished_files += ""; From 2efe841d1fce0539d0cc37f89fe36bd5fc7fd69a Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 19 Mar 2021 03:12:19 +0000 Subject: [PATCH 163/570] Add mailcap to alpine image, fix #40 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 04913b5e..e83ec8b8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 RUN mkdir -p /usr/src/app -RUN apk add --no-cache ffmpeg tzdata +RUN apk add --no-cache ffmpeg tzdata mailcap RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi COPY ./requirements.txt /usr/src/app/ RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt From ab3f6be1081f2e921913c8bf6dec70afa98555fc Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 23 Mar 2021 02:03:39 +0000 Subject: [PATCH 164/570] Update README, removing youtube-dlc --- README.md | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2f5c7e6f..afda2f0c 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,7 @@ Simple Web and REST interface for downloading youtube videos onto a server. [`starlette`](https://www.starlette.io/) + -[`youtube-dl`](https://github.com/rg3/youtube-dl) / -[`youtube-dlc`](https://github.com/blackjack4494/yt-dlc) +[`youtube-dl`](https://github.com/rg3/youtube-dl) Forked from [manbearwiz/youtube-dl-server](https://github.com/manbearwiz/youtube-dl-server). @@ -21,17 +20,11 @@ Forked from [manbearwiz/youtube-dl-server](https://github.com/manbearwiz/youtube For easier deployment, a docker image is available on [dockerhub](https://hub.docker.com/r/nbr23/youtube-dl-server). -The `latest` tag uses `youtube-dl`. - -Force using `youtube-dl` or `youtube-dlc` by using the tags of the same name, -eg: `nbr23/youtube-dl-server:youtube-dl` and -`nbr23/youtube-dl-server:youtube-dlc`. - If you plan on using the `--embed-thumbnail` flag in youtube-dl, you will need `atomicparsley` embedded in the container. -Use the tags `nbr23/youtube-dl-server:youtube-dl_atomicparsley` -or `nbr23/youtube-dl-server:youtube-dlc_atomicparsley` to achieve this. +Use the tags `nbr23/youtube-dl-server:youtube-dl_atomicparsley` to achieve +this. ### Ansible @@ -130,7 +123,8 @@ to download the required front-end libraries (jquery, bootstrap). python3 -u ./youtube-dl-server.py ``` -To force using `youtube-dl` or `youtube-dlc`, use the variable `YOUTUBE_DL`: +To force a specific `youtube-dl` version/fork (eg `youtube-dlc`), use the +variable `YOUTUBE_DL`: ```shell YOUTUBE_DL=youtube-dlc python3 -u ./youtube-dl-server.py @@ -200,9 +194,8 @@ scenarios. ## Implementation -The server uses [`starlette`](https://www.starlette.io/) for the web -framework and [`youtube-dl`](https://github.com/rg3/youtube-dl) / -[`youtube-dlc`](https://github.com/blackjack4494/yt-dlc) to handle the +The server uses [`starlette`](https://www.starlette.io/) for the web framework +and [`youtube-dl`](https://github.com/rg3/youtube-dl) to handle the downloading. The integration with youtube-dl does NOT use their [python api](https://github.com/rg3/youtube-dl#embedding-youtube-dl) anymore, but calls the youtube-dl binary directly as the API doesn't provide easy ways to handle From 62c0175a5d14578e106a2e1fd876a8afff6df0b9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 14 Apr 2021 10:44:08 +0000 Subject: [PATCH 165/570] Fix best audio downloading --- ydl_server/static/js/youtubedl.js | 2 +- ydl_server/templates/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index d6b22561..f91b6bb8 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -189,7 +189,7 @@ function get_finished_files(){ } else { finished_files += ""; } diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index aa11b62b..95e369de 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -24,7 +24,7 @@

youtube-dl

- + From a50df03da2a21c030e8aae29e6feabe7156d11ac Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 2 May 2021 20:10:08 +0000 Subject: [PATCH 166/570] Fix docker-compose example; close #45 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index afda2f0c..f62789a4 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ This is an example service definition that could be put in `docker-compose.yml`. image: "nbr23/youtube-dl-server:latest" volumes: - $HOME/youtube-dl:/youtube-dl - - ./config.yml:/usr/src/app/config.yml:ro # Overwrite the container's config file with your own configuration + - ./config.yml:/app_config/config.yml:ro # Overwrite the container's config file with your own configuration restart: always ``` From 864f51be831642032942ec590bc68f26ce88b184 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 3 May 2021 23:56:10 +0000 Subject: [PATCH 167/570] Escape served user entries #46 --- ydl_server/logdb.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index 55c54258..a02b0939 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -1,5 +1,7 @@ import sqlite3 import re +from markupsafe import Markup, escape + from ydl_server.config import app_config STATUS_NAME = ["Running", "Completed", "Failed", "Pending"] @@ -142,11 +144,11 @@ def get_all(self, limit=50): rows = [] for job_id, name, status, log, last_update, format, jobtype, url in cursor.fetchall(): rows.append({'id': job_id, - 'name': name, - 'status': STATUS_NAME[status], - 'log': log, - 'format': format, - 'last_update': last_update, - 'type': jobtype, - 'url': url}) + 'name': escape(name), + 'status': STATUS_NAME[status], + 'log': escape(log), + 'format': escape(format), + 'last_update': last_update, + 'type': jobtype, + 'url': escape(url)}) return rows From 0b0a2f05f49c7da3c146b86e5c51011191d50f4c Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 3 May 2021 23:58:34 +0000 Subject: [PATCH 168/570] Update build workflow --- .../{docker-arm.yml => docker-images.yml} | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) rename .github/workflows/{docker-arm.yml => docker-images.yml} (62%) diff --git a/.github/workflows/docker-arm.yml b/.github/workflows/docker-images.yml similarity index 62% rename from .github/workflows/docker-arm.yml rename to .github/workflows/docker-images.yml index 55b6292d..a8ff134d 100644 --- a/.github/workflows/docker-arm.yml +++ b/.github/workflows/docker-images.yml @@ -29,6 +29,16 @@ jobs: uses: docker/build-push-action@v2 with: context: . - platforms: linux/arm64,linux/arm + platforms: linux/amd64,linux/arm,linux/arm64 push: true - tags: nbr23/youtube-dl-server:arm + tags: nbr23/youtube-dl-server:latest + - + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + build-args: | + ATOMICPARSLEY=1 + platforms: linux/amd64,linux/arm,linux/arm64 + push: true + tags: nbr23/youtube-dl-server:atomicparsley From 5d2d893c15886e76190ddc00605ed820c1425bf4 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 4 May 2021 01:12:22 +0000 Subject: [PATCH 169/570] Update README docker tags --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f62789a4..220ba69b 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,7 @@ For easier deployment, a docker image is available on If you plan on using the `--embed-thumbnail` flag in youtube-dl, you will need `atomicparsley` embedded in the container. -Use the tags `nbr23/youtube-dl-server:youtube-dl_atomicparsley` to achieve -this. +Use the tags `nbr23/youtube-dl-server:atomicparsley` to achieve this. ### Ansible From 20b25e4b585abf5285b3fa2c83777b109580f385 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 13 May 2021 02:51:19 +0000 Subject: [PATCH 170/570] Disable CORS to allow bookmarklets --- youtube-dl-server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 8c70da0f..39dd50ad 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -3,6 +3,8 @@ from starlette.staticfiles import StaticFiles from starlette.responses import HTMLResponse from starlette.templating import Jinja2Templates +from starlette.middleware import Middleware +from starlette.middleware.cors import CORSMiddleware import uvicorn from ydl_server.logdb import JobsDB, Job, Actions, JobType @@ -19,7 +21,9 @@ JobsDB.check_db_latest() JobsDB.init_db() - app = Starlette(routes=routes, debug=app_config['ydl_server'].get('debug', False)) + middleware = [Middleware(CORSMiddleware, allow_origins=['*'])] + + app = Starlette(routes=routes, debug=app_config['ydl_server'].get('debug', False), middleware=middleware) app.state.jobshandler = JobsHandler(app_config) app.state.ydlhandler = YdlHandler(app_config, app.state.jobshandler) From 0df02e0e39b3d26f4136b480424451d2e1b9db68 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 25 May 2021 01:12:43 +0000 Subject: [PATCH 171/570] Add bookmarklet shortcut --- ydl_server/static/css/style.css | 6 +++--- ydl_server/static/js/youtubedl.js | 18 ++++++++++++++++++ ydl_server/templates/footer.html | 8 +++++--- ydl_server/views.py | 6 +++--- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/ydl_server/static/css/style.css b/ydl_server/static/css/style.css index 10a15512..1285f7dd 100644 --- a/ydl_server/static/css/style.css +++ b/ydl_server/static/css/style.css @@ -8,8 +8,8 @@ html, body { min-height: 100%; margin-top: -50px; padding-top: 70px; - margin-bottom: -50px; - padding-bottom: 50px; + margin-bottom: -70px; + padding-bottom: 70px; } nav { @@ -25,5 +25,5 @@ div.input-group>select.custom-select { } .footer{ - height: 50px; + height: 70px; } diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index f91b6bb8..e5455948 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -223,6 +223,22 @@ function toggle_hide_logs_detail(){ } } +function bookmarklet(){ + url = window.location.protocol + '//' + window.location.hostname + if (window.location.port != '') { + url = url + ':' + window.location.port; + } + if (window.location.protocol == 'https:') { + $("#bookmarklet").attr("href", "javascript:fetch(\"" + url + + "/api/downloads\",{body:new URLSearchParams({url:window.location.href}),method:\"POST\"});"); + } + else { + $("#bookmarklet").attr("href", "javascript:(function(){document.body.innerHTML += '
';document.ydl_form.submit()})();"); + } +} + $('#url').keypress(function (e) { if (e.which == 13) { submit_video(); @@ -230,3 +246,5 @@ $('#url').keypress(function (e) { return false; } }); + +bookmarklet(); \ No newline at end of file diff --git a/ydl_server/templates/footer.html b/ydl_server/templates/footer.html index 5787d0b1..82e53dc9 100644 --- a/ydl_server/templates/footer.html +++ b/ydl_server/templates/footer.html @@ -1,5 +1,8 @@ @@ -7,7 +10,6 @@ - - + diff --git a/ydl_server/views.py b/ydl_server/views.py index 1bb9c341..dbceed96 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -16,7 +16,7 @@ async def front_index(request): 'request': request, 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website + 'ydl_website': request.app.state.ydlhandler.ydl_website, } return templates.TemplateResponse('index.html', context=context) @@ -27,7 +27,7 @@ async def front_logs(request): 'request': request, 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website + 'ydl_website': request.app.state.ydlhandler.ydl_website, } return templates.TemplateResponse('logs.html', context=context) @@ -38,7 +38,7 @@ async def front_finished(request): 'request': request, 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website + 'ydl_website': request.app.state.ydlhandler.ydl_website, } return templates.TemplateResponse('finished.html', context=context) From fd39de93b7416d20e833bd06aafb33509a5f1ebc Mon Sep 17 00:00:00 2001 From: andrewstech <45342431+andrewstech@users.noreply.github.com> Date: Sat, 29 May 2021 21:06:18 +0100 Subject: [PATCH 172/570] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 220ba69b..3b522455 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,11 @@ This is an example service definition that could be put in `docker-compose.yml`. - ./config.yml:/app_config/config.yml:ro # Overwrite the container's config file with your own configuration restart: always ``` +### HomeAssistant Addon + +In the addons store add the repository (https://github.com/unofficial-skills/addons) or click the buton [![adds addon repo.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Funofficial-skills%2Faddons). + +Once the addon repository you should be able to install youtube dl server from the Unofficial-skills section. #### Configuration From 12844d06c05b8d21e127b5cf26a705ea2ad136af Mon Sep 17 00:00:00 2001 From: andrewstech <45342431+andrewstech@users.noreply.github.com> Date: Sat, 29 May 2021 21:07:21 +0100 Subject: [PATCH 173/570] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b522455..8c8800d0 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This is an example service definition that could be put in `docker-compose.yml`. In the addons store add the repository (https://github.com/unofficial-skills/addons) or click the buton [![adds addon repo.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Funofficial-skills%2Faddons). -Once the addon repository you should be able to install youtube dl server from the Unofficial-skills section. +Once the addon repository has been added, you should be able to install youtube dl server from the Unofficial-skills section. #### Configuration From 3e9b100b3ae1c827cc7417021f8f56a3c512d366 Mon Sep 17 00:00:00 2001 From: andrewstech <45342431+andrewstech@users.noreply.github.com> Date: Sat, 29 May 2021 21:08:15 +0100 Subject: [PATCH 174/570] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c8800d0..037d0569 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This is an example service definition that could be put in `docker-compose.yml`. In the addons store add the repository (https://github.com/unofficial-skills/addons) or click the buton [![adds addon repo.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Funofficial-skills%2Faddons). -Once the addon repository has been added, you should be able to install youtube dl server from the Unofficial-skills section. +Once the addon repository has been added, you should be able to install (YouTube Dl Server) from the Unofficial-skills section. #### Configuration From 023546b009f002790b7129ffb1d873c0dfe96e6f Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 9 Jun 2021 00:08:36 +0000 Subject: [PATCH 175/570] Switch to bootstrap 5.0 --- bootstrap.sh | 3 +- ydl_server/static/js/youtubedl.js | 12 +++---- ydl_server/templates/footer.html | 2 -- ydl_server/templates/header.html | 52 +++++++++++++++++-------------- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 45997b47..67a703dd 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -2,8 +2,7 @@ # Download required web frontend libraries wget -q https://code.jquery.com/jquery-3.4.1.min.js -O ydl_server/static/js/jquery.min.js -wget -q https://unpkg.com/@popperjs/core@2.1.1/dist/umd/popper.min.js -O ydl_server/static/js/popper.min.js -wget -q https://github.com/twbs/bootstrap/releases/download/v4.6.0/bootstrap-4.6.0-dist.zip -O bootstrap.zip +wget -q https://github.com/twbs/bootstrap/releases/download/v5.0.1/bootstrap-5.0.1-dist.zip -O bootstrap.zip unzip -jo bootstrap.zip *.css *.css.map -d ydl_server/static/css/ unzip -jo bootstrap.zip *.js *.js.map -d ydl_server/static/js/ rm -f bootstrap.zip diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index e5455948..b863bd4f 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -16,9 +16,9 @@ function escapeHtml(string) { } function set_dismissible_message(success, message){ - message_list = "
"; + message_list = "
"; message_list += "" + (success ? "Success" : "Error") + ": " + message; - message_list += ""; + message_list += ""; message_list += "
"; message_list += $('#message_list').html(); $("#message_list").html(message_list); @@ -140,9 +140,9 @@ function purge_download_logs(){ var statusToTrClass = { Pending: 'badge', - Failed: 'badge badge-danger', - Running: 'badge badge-info', - Completed: 'badge badge-success' + Failed: 'badge bg-danger', + Running: 'badge bg-info', + Completed: 'badge bg-success' } function get_download_logs(){ @@ -177,7 +177,7 @@ function get_finished_files(){ $.each(data.files, function(key, file) { finished_files += "
"; if (file.children != null) { - finished_files += " - {% for f in finished_files %} - {% if f.directory %} - {% set dirnum = loop.index %} - - - - - - - - {% for c in f.children %} - - - - - - - - {% endfor %} - {% else %} - + + {% for f in finished_files %} + {% if f.directory %} + {% set dirnum = loop.index %} + + + + + + + + {% for c in f.children %} + - - + + - - {% endif %} - {% endfor %} - + + {% endfor %} + {% else %} + + + + + + + + {% endif %} + {% endfor %}
" + row.last_update + "" + row.name + "" + (row.format ? row.format : "") + " " + row.status + " / Retry" + (row.format != null ? row.format : "") + " " + row.status + " / Retry " + row.status + "" + row.log.replace(/\n|\r/g, '
') + "
" + file.name + ""; finished_files += "
"; $.each(file.children, function(child_key, child_file) { - finished_files += ""; + finished_files += ""; }); finished_files += "
" + child_file.name + "" + (new Date(child_file.modified)).toISOString() + "
"+ download_svg +"  " + child_file.name + "" + (new Date(child_file.modified)).toISOString() + "
" + file.name + ""+ download_svg +"  " + file.name + " " + (new Date(file.modified)).toISOString() + "
"+ download_svg +"  "+ download_svg +"  " + file.name + "
" + file.name + ""; + finished_files += "" + file.name + ""; finished_files += "
"; $.each(file.children, function(child_key, child_file) { finished_files += ""; - if (file.children != null) { - finished_files += ""; - } - else { - finished_files += ""; - } - finished_files += ""; - finished_files += ""; - }); - $("#finished_files").html(finished_files); - }); -} - function ydl_update(){ $.get("api/youtube-dl/update"); } @@ -247,4 +217,14 @@ $('#url').keypress(function (e) { } }); +function delete_finished_file(fname){ + $.ajax({ + url: 'api/finished/' + fname, + type: 'DELETE', + success: function(data) { + location.reload(); + } + }); +} + bookmarklet(); \ No newline at end of file diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 845ad885..77e200d6 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -1,19 +1,86 @@ {% include 'header.html' %}
-
-
-

Finished Files

- -
+
+
+

Finished Files

+
+
- - diff --git a/ydl_server/templates/header.html b/ydl_server/templates/header.html index 8bb09b57..88359cb7 100644 --- a/ydl_server/templates/header.html +++ b/ydl_server/templates/header.html @@ -19,30 +19,34 @@
From 2ccb25224d5c858b2c1ef193b3a8c52b9c88d7ef Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 9 Jun 2021 01:23:51 +0000 Subject: [PATCH 176/570] Update workflows tags --- .github/workflows/docker-images.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml index a8ff134d..b29b63d7 100644 --- a/.github/workflows/docker-images.yml +++ b/.github/workflows/docker-images.yml @@ -31,7 +31,7 @@ jobs: context: . platforms: linux/amd64,linux/arm,linux/arm64 push: true - tags: nbr23/youtube-dl-server:latest + tags: nbr23/youtube-dl-server:latest,nbr23/youtube-dl-server:youtube-dl - name: Build and push uses: docker/build-push-action@v2 @@ -41,4 +41,4 @@ jobs: ATOMICPARSLEY=1 platforms: linux/amd64,linux/arm,linux/arm64 push: true - tags: nbr23/youtube-dl-server:atomicparsley + tags: nbr23/youtube-dl-server:atomicparsley,nbr23/youtube-dl-server:youtube-dl_atomicparsley From 1c35aa8023695e912c67bae174e974b9bfcd270f Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 22 Jun 2021 00:59:50 +0000 Subject: [PATCH 177/570] Update finished, add file deletion Closes #44 --- ydl_server/config.py | 2 +- ydl_server/routes.py | 1 + ydl_server/static/js/youtubedl.js | 40 ++++---------- ydl_server/templates/finished.html | 86 ++++++++++++++++++++++++++---- ydl_server/templates/footer.html | 3 +- ydl_server/views.py | 62 +++++++++++++++------ 6 files changed, 134 insertions(+), 60 deletions(-) diff --git a/ydl_server/config.py b/ydl_server/config.py index 6c852b60..b8ea39de 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -40,7 +40,7 @@ def get_finished_path(): if '%' in s and '%%' not in s: break finished_path.append(s) - finished_path = '/'.join(finished_path) + finished_path = '/'.join(finished_path) + '/' if not os.path.isdir(finished_path): os.mkdir(finished_path, 0o755) return finished_path diff --git a/ydl_server/routes.py b/ydl_server/routes.py index e71aa41e..d76ff078 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -35,6 +35,7 @@ views.api_metadata_fetch, name="api_metadata_fetch", methods=['POST']), + Route("/api/finished/{fname:path}", views.api_delete_file, name="api_delete_file", methods=['DELETE']), Mount("/static", static, name="static"), Mount("/api/finished/", finished_files, name="api_finished"), ] \ No newline at end of file diff --git a/ydl_server/static/js/youtubedl.js b/ydl_server/static/js/youtubedl.js index b863bd4f..1670693e 100644 --- a/ydl_server/static/js/youtubedl.js +++ b/ydl_server/static/js/youtubedl.js @@ -170,36 +170,6 @@ function get_download_logs(){ }); } -function get_finished_files(){ - download_svg = ""; - $.getJSON("api/finished", function (data) { - var finished_files = ""; - $.each(data.files, function(key, file) { - finished_files += "
" + file.name + ""; - finished_files += "
"; - $.each(file.children, function(child_key, child_file) { - finished_files += ""; - }); - finished_files += "
"+ download_svg +"  " + child_file.name + "" + (new Date(child_file.modified)).toISOString() + "
"+ download_svg +"  " + file.name + " " + (new Date(file.modified)).toISOString() + "
- - - + + + + + + {% for f in finished_files %} + {% if f.directory %} + {% set dirnum = loop.index %} + + + + + + + + {% for c in f.children %} + + + + + + + + {% endfor %} + {% else %} + + + + + - + {% endif %} + {% endfor %}
NameDate
ActionNameDate
+ + + + + + + + + + + + + {{ c.name }}{{ c.modified }}
+ + + + + + + + + + + + + {{ f.name }}{{ f.modified }}
@@ -23,7 +90,6 @@

Finished Files

diff --git a/ydl_server/templates/footer.html b/ydl_server/templates/footer.html index ba5f7330..48a5d366 100644 --- a/ydl_server/templates/footer.html +++ b/ydl_server/templates/footer.html @@ -9,5 +9,4 @@ - - + \ No newline at end of file diff --git a/ydl_server/views.py b/ydl_server/views.py index dbceed96..3dc65fbc 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -6,6 +6,8 @@ from ydl_server.config import app_config, get_finished_path from ydl_server.logdb import JobsDB, Job, Actions, JobType from datetime import datetime +import os +import shutil templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates")) @@ -34,32 +36,58 @@ async def front_logs(request): async def front_finished(request): + root_dir = Path(get_finished_path()) + matches = root_dir.glob('*') + + files = [{'name': f1.name, + 'modified': datetime.fromtimestamp(f1.stat().st_mtime).strftime('%H:%m %D'), + 'directory': f1.is_dir(), + 'children': sorted([{ + 'name': f2.name, + 'modified': datetime.fromtimestamp(f2.stat().st_mtime).strftime('%H:%m %D') + } for f2 in f1.iterdir() if not f2.name.startswith('.')], key=itemgetter('modified'), reverse=True) if f1.is_dir() else None + } for f1 in matches if not f1.name.startswith('.')] + context = { 'request': request, 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), 'ydl_name': request.app.state.ydlhandler.ydl_module_name, 'ydl_website': request.app.state.ydlhandler.ydl_website, + 'finished_files': sorted(files, key=itemgetter('modified'), reverse=True) } return templates.TemplateResponse('finished.html', context=context) -async def api_list_finished(request): - root_dir = Path(get_finished_path()) - matches = root_dir.glob('*') - - files = [{'name': f1.name, - 'modified': f1.stat().st_mtime * 1000, - 'children': sorted([{ - 'name': f2.name, - 'modified': f2.stat().st_mtime * 1000 - } for f2 in f1.iterdir() if not f2.name.startswith('.')], key=itemgetter('modified'), reverse=True) if f1.is_dir() else None - } for f1 in matches if not f1.name.startswith('.')] - - files = sorted(files, key=itemgetter('modified'), reverse=True) +async def api_delete_file(request): + fname = request.path_params['fname'] + if not fname: + return JSONResponse({ + "success": False, + "message": "No filename specified" + }) + fname = os.path.realpath(os.path.join(get_finished_path(), fname)) + if os.path.commonprefix((fname, get_finished_path())) != get_finished_path(): + return JSONResponse({ + "success": False, + "message": "Invalid filename" + }) + fname = Path(fname) + try: + if fname.is_dir(): + shutil.rmtree(fname) + else: + fname.unlink() + except OSError as e: + print(e) + return JSONResponse({ + "success": False, + "message": "Could not delete the specified file" + }) + return JSONResponse({ "success": True, - "files": files + "message": "File deleted" }) @@ -102,7 +130,7 @@ async def api_queue_download(request): if (app_config['ydl_server'].get('update_poll_delay_min') and (datetime.now() - app_config['ydl_last_update']).seconds > app_config['ydl_server'].get('update_poll_delay_min') * 60): - job = Job("Youtube-dl Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) + job = Job("Youtube-dl Auto-Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) request.app.state.jobshandler.put((Actions.INSERT, job)) url = data.get("url") @@ -131,8 +159,8 @@ async def api_metadata_fetch(request): async def ydl_update(request): - job = Job("Youtube-dl Update", Job.PENDING, "", JobType.YDL_UPDATE, None, - None) + job = Job("Youtube-dl Manual Update", Job.PENDING, "", JobType.YDL_UPDATE, + None, None) request.app.state.jobshandler.put((Actions.INSERT, job)) return JSONResponse({ "success": True, From dd220e75b7b076c415cad437457810c5730946e1 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 22 Jun 2021 01:04:02 +0000 Subject: [PATCH 178/570] Update README --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 037d0569..ee39b4e0 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ In the addons store add the repository (https://github.com/unofficial-skills/add Once the addon repository has been added, you should be able to install (YouTube Dl Server) from the Unofficial-skills section. -#### Configuration +## Configuration Configuration is done through the config.yml file at the root of the project. @@ -108,7 +108,7 @@ ydl_options: sub-lang: es ``` -### Python +## Python If you have python ^3.3.0 installed in your PATH you can simply run like this, providing optional environment variable overrides inline. @@ -141,17 +141,17 @@ YOUTUBE_DL=youtube-dlc python3 -u ./youtube-dl-server.py Downloads can be triggered by supplying the `{{url}}` of the requested video through the Web UI or through the REST interface via curl, etc. -#### HTML +### HTML Just navigate to `http://{{host}}:8080/` and enter the requested `{{url}}`. -#### Curl +### Curl ```shell curl -X POST --data-urlencode "url={{url}}" http://{{host}}:8080/api/downloads ``` -#### Fetch +### Fetch ```javascript fetch(`http://${host}:8080/api/downloads`, { @@ -163,12 +163,12 @@ fetch(`http://${host}:8080/api/downloads`, { }); ``` -#### Bookmarklet +### Bookmarklet Add the following bookmarklet to your bookmark bar so you can conviently send the current page url to your youtube-dl-server instance. -##### HTTPS +#### HTTPS If your youtube-dl-server is served through https (behind a reverse proxy handling https for example), you can use the following bookmarklet: @@ -177,7 +177,7 @@ handling https for example), you can use the following bookmarklet: javascript:fetch("https://${host}/api/downloads",{body:new URLSearchParams({url:window.location.href,format:"bestvideo"}),method:"POST"}); ``` -##### Plain text +#### Plain text If you are hosting it without HTTPS, the previous bookmarklet will likely be blocked by your browser (as it will generate mixed content when used on HTTPS @@ -191,7 +191,7 @@ javascript:(function(){document.body.innerHTML += '
Date: Tue, 22 Jun 2021 12:48:13 +0000 Subject: [PATCH 179/570] Remove deleted endpoint from routes --- ydl_server/routes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ydl_server/routes.py b/ydl_server/routes.py index d76ff078..d9c36eff 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -15,7 +15,6 @@ Route("/index", views.front_index, name="index"), Route("/logs", views.front_logs, name="logs"), Route("/finished", views.front_finished, name="finished"), - Route("/api/finished", views.api_list_finished, name="api_list_finished"), Route("/api/extractors", views.api_list_extractors, name="api_list_extractors"), From 5bdfbb091ccee5f7a0a706b74049b65134992837 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 23 Jun 2021 00:50:23 +0000 Subject: [PATCH 180/570] Fix auto update --- ydl_server/views.py | 2 +- youtube-dl-server.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ydl_server/views.py b/ydl_server/views.py index 3dc65fbc..645a0c51 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -128,7 +128,7 @@ async def api_logs_clean(request): async def api_queue_download(request): data = await request.form() if (app_config['ydl_server'].get('update_poll_delay_min') and - (datetime.now() - app_config['ydl_last_update']).seconds > + (datetime.now() - app_config['ydl_last_update']).total_seconds() > app_config['ydl_server'].get('update_poll_delay_min') * 60): job = Job("Youtube-dl Auto-Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) request.app.state.jobshandler.put((Actions.INSERT, job)) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 39dd50ad..5250c5f3 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -35,7 +35,7 @@ print("Updating youtube-dl to the newest version") - job = Job("Youtube-dl Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) + job = Job("Youtube-dl at Boot Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) app.state.jobshandler.put((Actions.INSERT, job)) app.state.ydlhandler.resume_pending() From a1c63d3efba0cb2960b5ef96ce215382b379f616 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 26 Jul 2021 03:08:09 +0000 Subject: [PATCH 181/570] Fix metadata modal closing buttons --- ydl_server/templates/index.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 95e369de..957e41f7 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -70,8 +70,7 @@ From 6c0fa288843b355a3263dd60ec1bc57691a90671 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 27 Jul 2021 01:12:59 +0000 Subject: [PATCH 182/570] Version bump, bootstrap, jquery --- bootstrap.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 67a703dd..c44a2d4e 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,8 +1,8 @@ #! /usr/bin/env sh # Download required web frontend libraries -wget -q https://code.jquery.com/jquery-3.4.1.min.js -O ydl_server/static/js/jquery.min.js -wget -q https://github.com/twbs/bootstrap/releases/download/v5.0.1/bootstrap-5.0.1-dist.zip -O bootstrap.zip +wget -q https://code.jquery.com/jquery-3.6.0.min.js -O ydl_server/static/js/jquery.min.js +wget -q https://github.com/twbs/bootstrap/releases/download/v5.0.2/bootstrap-5.0.2-dist.zip -O bootstrap.zip unzip -jo bootstrap.zip *.css *.css.map -d ydl_server/static/css/ unzip -jo bootstrap.zip *.js *.js.map -d ydl_server/static/js/ rm -f bootstrap.zip From 5407901c388e4e25f5bbff1760bfe8fbfe45cd8e Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 11 Aug 2021 03:42:57 +0000 Subject: [PATCH 183/570] Update job counter --- ydl_server/jobshandler.py | 2 +- ydl_server/views.py | 4 ++-- ydl_server/ydlhandler.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index 5c890d7b..303d6cc4 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -31,7 +31,7 @@ def worker(self, dl_queue): db.purge_jobs() elif action == Actions.INSERT: db.clean_old_jobs(self.app_config['ydl_server'] - .get('max_log_entries', 100)) + .get('max_log_entries', 100) - 1) db.insert_job(job) dl_queue.put(job) elif action == Actions.UPDATE: diff --git a/ydl_server/views.py b/ydl_server/views.py index 645a0c51..c5cf1076 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -97,7 +97,7 @@ async def api_list_extractors(request): async def api_queue_size(request): db = JobsDB(readonly=True) - jobs = db.get_all() + jobs = db.get_all(app_config['ydl_server'].get('max_log_entries', 100)) return JSONResponse({ "success": True, "stats": { @@ -112,7 +112,7 @@ async def api_queue_size(request): async def api_logs(request): db = JobsDB(readonly=True) - return JSONResponse(db.get_all()) + return JSONResponse(db.get_all(app_config['ydl_server'].get('max_log_entries', 100))) async def api_logs_purge(request): diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 7d9e79c9..cb97b212 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -208,7 +208,7 @@ def download(self, job, request_options, output): def resume_pending(self): db = JobsDB(readonly=False) - jobs = db.get_all() + jobs = db.get_all(self.app_config['ydl_server'].get('max_log_entries', 100)) not_endeds = [job for job in jobs if job['status'] == "Pending" or job['status'] == 'Running'] for pending in not_endeds: From 23e8217f88c210649226163c8ba85281600d3606 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 21 Aug 2021 16:09:34 +0000 Subject: [PATCH 184/570] Apply black formatting --- ydl_server/config.py | 32 ++++----- ydl_server/jobshandler.py | 3 +- ydl_server/logdb.py | 58 ++++++++++------ ydl_server/routes.py | 23 ++----- ydl_server/views.py | 136 ++++++++++++++++++-------------------- ydl_server/ydlhandler.py | 132 +++++++++++++++++------------------- youtube-dl-server.py | 22 +++--- 7 files changed, 199 insertions(+), 207 deletions(-) diff --git a/ydl_server/config.py b/ydl_server/config.py index b8ea39de..07cdb847 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -5,18 +5,16 @@ def copy_default_config(config_file_path): try: - shutil.copy('./default_config.yml', config_file_path) + shutil.copy("./default_config.yml", config_file_path) except Exception as e: - raise Exception("Error copying default config file to {}:\n{}".format( - config_file_path, str(e))) + raise Exception("Error copying default config file to {}:\n{}".format(config_file_path, str(e))) def get_config_file_path(): - config_path = os.environ.get( - 'YDL_CONFIG_PATH', os.getcwd()) - if '.' in os.path.basename(config_path): + config_path = os.environ.get("YDL_CONFIG_PATH", os.getcwd()) + if "." in os.path.basename(config_path): return config_path - return os.path.join(config_path, 'config.yml') + return os.path.join(config_path, "config.yml") def load_config(): @@ -25,8 +23,7 @@ def load_config(): print("Using configuration file {}".format(config_file_path)) if not os.path.isfile(config_file_path): - print("{} does not exist, creating it from default values".format( - config_file_path)) + print("{} does not exist, creating it from default values".format(config_file_path)) copy_default_config(config_file_path) with open(config_file_path) as configfile: config = yaml.load(configfile, Loader=yaml.SafeLoader) @@ -36,11 +33,11 @@ def load_config(): def get_finished_path(): finished_path = [] - for s in app_config['ydl_options'].get('output').split('/'): - if '%' in s and '%%' not in s: + for s in app_config["ydl_options"].get("output").split("/"): + if "%" in s and "%%" not in s: break finished_path.append(s) - finished_path = '/'.join(finished_path) + '/' + finished_path = "/".join(finished_path) + "/" if not os.path.isdir(finished_path): os.mkdir(finished_path, 0o755) return finished_path @@ -48,7 +45,10 @@ def get_finished_path(): app_config = load_config() -if app_config is None or app_config.get('ydl_server') is None or \ - app_config.get('ydl_options') is None or \ - app_config['ydl_options'].get('output') is None: - raise Exception('Invalid configuration file') +if ( + app_config is None + or app_config.get("ydl_server") is None + or app_config.get("ydl_options") is None + or app_config["ydl_options"].get("output") is None +): + raise Exception("Invalid configuration file") diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index 303d6cc4..d7bbf73f 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -30,8 +30,7 @@ def worker(self, dl_queue): if action == Actions.PURGE_LOGS: db.purge_jobs() elif action == Actions.INSERT: - db.clean_old_jobs(self.app_config['ydl_server'] - .get('max_log_entries', 100) - 1) + db.clean_old_jobs(self.app_config["ydl_server"].get("max_log_entries", 100) - 1) db.insert_job(job) dl_queue.put(job) elif action == Actions.UPDATE: diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index a02b0939..ba10dccf 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -45,18 +45,17 @@ def clean_logs(logs): if not logs: return logs clean = "" - for line in logs.split('\n'): - line = re.sub('.*\r', '', line) + for line in logs.split("\n"): + line = re.sub(".*\r", "", line) if len(line) > 0: - clean = '%s%s\n' % (clean, line) + clean = "%s%s\n" % (clean, line) return clean class JobsDB: - @staticmethod def check_db_latest(): - conn = sqlite3.connect("file://%s" % app_config['ydl_server'].get('metadata_db_path'), uri=True) + conn = sqlite3.connect("file://%s" % app_config["ydl_server"].get("metadata_db_path"), uri=True) cursor = conn.cursor() cursor.execute("PRAGMA table_info('jobs')") columns = [row[1] for row in cursor.fetchall()] @@ -65,12 +64,12 @@ def check_db_latest(): cursor.execute("DROP TABLE if exists jobs;") conn.close() - @staticmethod def init_db(): - conn = sqlite3.connect("file://%s" % app_config['ydl_server'].get('metadata_db_path'), uri=True) + conn = sqlite3.connect("file://%s" % app_config["ydl_server"].get("metadata_db_path"), uri=True) cursor = conn.cursor() - cursor.execute("CREATE TABLE if not exists jobs \ + cursor.execute( + "CREATE TABLE if not exists jobs \ (id INTEGER PRIMARY KEY AUTOINCREMENT, \ name TEXT NOT NULL, \ status INTEGER NOT NULL, \ @@ -78,14 +77,15 @@ def init_db(): format TEXT, \ last_update DATETIME DEFAULT CURRENT_TIMESTAMP, \ type INTEGER NOT NULL, \ - url TEXT);") + url TEXT);" + ) conn.commit() conn.close() def __init__(self, readonly=True): - self.conn = sqlite3.connect("file://%s%s" % (app_config['ydl_server'].get('metadata_db_path'), - "?mode=ro" if readonly else ""), - uri=True) + self.conn = sqlite3.connect( + "file://%s%s" % (app_config["ydl_server"].get("metadata_db_path"), "?mode=ro" if readonly else ""), uri=True + ) def close(self): self.conn.close() @@ -101,28 +101,41 @@ def insert_job(self, job): def update_job(self, job): cursor = self.conn.cursor() - cursor.execute("UPDATE jobs SET status = ?, log = ?, last_update = datetime() \ - where id = ?;", (str(job.status), job.log, str(job.id))) + cursor.execute( + "UPDATE jobs SET status = ?, log = ?, last_update = datetime() \ + where id = ?;", + (str(job.status), job.log, str(job.id)), + ) self.conn.commit() def set_job_status(self, job_id, status): cursor = self.conn.cursor() - cursor.execute("UPDATE jobs SET status = ?, last_update = datetime() \ - where id = ?;", (str(status), str(job_id))) + cursor.execute( + "UPDATE jobs SET status = ?, last_update = datetime() \ + where id = ?;", + (str(status), str(job_id)), + ) self.conn.commit() def set_job_log(self, job_id, log): cursor = self.conn.cursor() - cursor.execute("UPDATE jobs SET log = ?, last_update = datetime() \ - where id = ?;", (log, str(job_id))) + cursor.execute( + "UPDATE jobs SET log = ?, last_update = datetime() \ + where id = ?;", + (log, str(job_id)), + ) self.conn.commit() def set_job_name(self, job_id, name): cursor = self.conn.cursor() - cursor.execute("UPDATE jobs SET name = ?, last_update = datetime() \ - where id = ?;", (name, str(job_id))) + cursor.execute( + "UPDATE jobs SET name = ?, last_update = datetime() \ + where id = ?;", + (name, str(job_id)), + ) self.conn.commit() + def purge_jobs(self): cursor = self.conn.cursor() cursor.execute("DELETE FROM jobs;") @@ -134,7 +147,10 @@ def clean_old_jobs(self, limit=10): cursor.execute("SELECT last_update from jobs ORDER BY last_update DESC LIMIT ?;", (str(limit),)) rows = list(cursor.fetchall()) if len(rows) > 0: - cursor.execute("DELETE FROM jobs WHERE last_update < ? AND status != ? and status != ?;", (rows[-1][0], Job.PENDING, Job.RUNNING)) + cursor.execute( + "DELETE FROM jobs WHERE last_update < ? AND status != ? and status != ?;", + (rows[-1][0], Job.PENDING, Job.RUNNING), + ) self.conn.commit() self.conn.execute("VACUUM") diff --git a/ydl_server/routes.py b/ydl_server/routes.py index d9c36eff..869ee344 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -15,26 +15,15 @@ Route("/index", views.front_index, name="index"), Route("/logs", views.front_logs, name="logs"), Route("/finished", views.front_finished, name="finished"), - Route("/api/extractors", - views.api_list_extractors, - name="api_list_extractors"), + Route("/api/extractors", views.api_list_extractors, name="api_list_extractors"), Route("/api/youtube-dl/update", views.ydl_update, name="api_update"), Route("/api/downloads/stats", views.api_queue_size, name="api_queue_size"), Route("/api/downloads", views.api_logs, name="api_logs"), Route("/api/downloads/clean", views.api_logs_clean, name="api_logs_clean"), - Route("/api/downloads", - views.api_logs_purge, - name="api_logs_purge", - methods=['DELETE']), - Route("/api/downloads", - views.api_queue_download, - name="api_queue_download", - methods=['POST']), - Route("/api/metadata", - views.api_metadata_fetch, - name="api_metadata_fetch", - methods=['POST']), - Route("/api/finished/{fname:path}", views.api_delete_file, name="api_delete_file", methods=['DELETE']), + Route("/api/downloads", views.api_logs_purge, name="api_logs_purge", methods=["DELETE"]), + Route("/api/downloads", views.api_queue_download, name="api_queue_download", methods=["POST"]), + Route("/api/metadata", views.api_metadata_fetch, name="api_metadata_fetch", methods=["POST"]), + Route("/api/finished/{fname:path}", views.api_delete_file, name="api_delete_file", methods=["DELETE"]), Mount("/static", static, name="static"), Mount("/api/finished/", finished_files, name="api_finished"), -] \ No newline at end of file +] diff --git a/ydl_server/views.py b/ydl_server/views.py index c5cf1076..479cc47b 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -15,63 +15,66 @@ async def front_index(request): context = { - 'request': request, - 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), - 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website, + "request": request, + "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_name": request.app.state.ydlhandler.ydl_module_name, + "ydl_website": request.app.state.ydlhandler.ydl_website, } - return templates.TemplateResponse('index.html', - context=context) + return templates.TemplateResponse("index.html", context=context) async def front_logs(request): context = { - 'request': request, - 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), - 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website, + "request": request, + "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_name": request.app.state.ydlhandler.ydl_module_name, + "ydl_website": request.app.state.ydlhandler.ydl_website, } - return templates.TemplateResponse('logs.html', - context=context) + return templates.TemplateResponse("logs.html", context=context) async def front_finished(request): root_dir = Path(get_finished_path()) - matches = root_dir.glob('*') - - files = [{'name': f1.name, - 'modified': datetime.fromtimestamp(f1.stat().st_mtime).strftime('%H:%m %D'), - 'directory': f1.is_dir(), - 'children': sorted([{ - 'name': f2.name, - 'modified': datetime.fromtimestamp(f2.stat().st_mtime).strftime('%H:%m %D') - } for f2 in f1.iterdir() if not f2.name.startswith('.')], key=itemgetter('modified'), reverse=True) if f1.is_dir() else None - } for f1 in matches if not f1.name.startswith('.')] + matches = root_dir.glob("*") + + files = [ + { + "name": f1.name, + "modified": datetime.fromtimestamp(f1.stat().st_mtime).strftime("%H:%m %D"), + "directory": f1.is_dir(), + "children": sorted( + [ + {"name": f2.name, "modified": datetime.fromtimestamp(f2.stat().st_mtime).strftime("%H:%m %D")} + for f2 in f1.iterdir() + if not f2.name.startswith(".") + ], + key=itemgetter("modified"), + reverse=True, + ) + if f1.is_dir() + else None, + } + for f1 in matches + if not f1.name.startswith(".") + ] context = { - 'request': request, - 'ydl_version': request.app.state.ydlhandler.get_ydl_version(), - 'ydl_name': request.app.state.ydlhandler.ydl_module_name, - 'ydl_website': request.app.state.ydlhandler.ydl_website, - 'finished_files': sorted(files, key=itemgetter('modified'), reverse=True) + "request": request, + "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_name": request.app.state.ydlhandler.ydl_module_name, + "ydl_website": request.app.state.ydlhandler.ydl_website, + "finished_files": sorted(files, key=itemgetter("modified"), reverse=True), } - return templates.TemplateResponse('finished.html', - context=context) + return templates.TemplateResponse("finished.html", context=context) async def api_delete_file(request): - fname = request.path_params['fname'] + fname = request.path_params["fname"] if not fname: - return JSONResponse({ - "success": False, - "message": "No filename specified" - }) + return JSONResponse({"success": False, "message": "No filename specified"}) fname = os.path.realpath(os.path.join(get_finished_path(), fname)) if os.path.commonprefix((fname, get_finished_path())) != get_finished_path(): - return JSONResponse({ - "success": False, - "message": "Invalid filename" - }) + return JSONResponse({"success": False, "message": "Invalid filename"}) fname = Path(fname) try: if fname.is_dir(): @@ -80,15 +83,9 @@ async def api_delete_file(request): fname.unlink() except OSError as e: print(e) - return JSONResponse({ - "success": False, - "message": "Could not delete the specified file" - }) - - return JSONResponse({ - "success": True, - "message": "File deleted" - }) + return JSONResponse({"success": False, "message": "Could not delete the specified file"}) + + return JSONResponse({"success": True, "message": "File deleted"}) async def api_list_extractors(request): @@ -97,22 +94,24 @@ async def api_list_extractors(request): async def api_queue_size(request): db = JobsDB(readonly=True) - jobs = db.get_all(app_config['ydl_server'].get('max_log_entries', 100)) - return JSONResponse({ - "success": True, - "stats": { - "queue": request.app.state.ydlhandler.queue.qsize(), - "pending": len([job for job in jobs if job['status'] == "Pending"]), - "running": len([job for job in jobs if job['status'] == "Running"]), - "completed": len([job for job in jobs if job['status'] == "Completed"]), - "failed": len([job for job in jobs if job['status'] == "Failed"]) + jobs = db.get_all(app_config["ydl_server"].get("max_log_entries", 100)) + return JSONResponse( + { + "success": True, + "stats": { + "queue": request.app.state.ydlhandler.queue.qsize(), + "pending": len([job for job in jobs if job["status"] == "Pending"]), + "running": len([job for job in jobs if job["status"] == "Running"]), + "completed": len([job for job in jobs if job["status"] == "Completed"]), + "failed": len([job for job in jobs if job["status"] == "Failed"]), + }, } - }) + ) async def api_logs(request): db = JobsDB(readonly=True) - return JSONResponse(db.get_all(app_config['ydl_server'].get('max_log_entries', 100))) + return JSONResponse(db.get_all(app_config["ydl_server"].get("max_log_entries", 100))) async def api_logs_purge(request): @@ -134,16 +133,12 @@ async def api_queue_download(request): request.app.state.jobshandler.put((Actions.INSERT, job)) url = data.get("url") - options = {'format': data.get("format")} + options = {"format": data.get("format")} if not url: - return JSONResponse({ - "success": False, - "error": "'url' query parameter omitted" - }) + return JSONResponse({"success": False, "error": "'url' query parameter omitted"}) - job = Job(url, Job.PENDING, "", JobType.YDL_DOWNLOAD, - data.get("format"), url) + job = Job(url, Job.PENDING, "", JobType.YDL_DOWNLOAD, data.get("format"), url) request.app.state.jobshandler.put((Actions.INSERT, job)) print("Added url " + url + " to the download queue") @@ -159,9 +154,10 @@ async def api_metadata_fetch(request): async def ydl_update(request): - job = Job("Youtube-dl Manual Update", Job.PENDING, "", JobType.YDL_UPDATE, - None, None) + job = Job("Youtube-dl Manual Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) request.app.state.jobshandler.put((Actions.INSERT, job)) - return JSONResponse({ - "success": True, - }) + return JSONResponse( + { + "success": True, + } + ) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index cb97b212..f38322ce 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -15,7 +15,7 @@ def reload_youtube_dl(): for module in list(sys.modules.keys()): - if 'youtube' in module: + if "youtube" in module: try: importlib.reload(sys.modules[module]) except ModuleNotFoundError: @@ -24,10 +24,11 @@ def reload_youtube_dl(): def get_ydl_website(ydl_module_name): import pip._internal.commands.show as pipshow + info = list(pipshow.search_packages_info([ydl_module_name])) - if len(info) < 1 or 'home-page' not in info[0]: - return '' - return info[0]['home-page'] + if len(info) < 1 or "home-page" not in info[0]: + return "" + return info[0]["home-page"] def read_proc_stdout(proc, strio): @@ -44,28 +45,26 @@ def __init__(self, app_config, jobshandler): self.app_config = app_config self.jobshandler = jobshandler - self.app_config['ydl_last_update'] = datetime.now() + self.app_config["ydl_last_update"] = datetime.now() - modules = ['youtube-dl', 'youtube-dlc'] + modules = ["youtube-dl", "youtube-dlc"] - if os.environ.get('YOUTUBE_DL') in modules: - self.ydl_module = importlib.import_module( - os.environ.get('YOUTUBE_DL').replace('-', '_')) + if os.environ.get("YOUTUBE_DL") in modules: + self.ydl_module = importlib.import_module(os.environ.get("YOUTUBE_DL").replace("-", "_")) else: for module in modules: try: - self.ydl_module = importlib.import_module( - module.replace('-', '_')) + self.ydl_module = importlib.import_module(module.replace("-", "_")) break except ImportError: pass if self.ydl_module is None: - raise ImportError('No youtube_dl implementation found') - self.ydl_module_name = self.ydl_module.__name__.replace('_', '-') + raise ImportError("No youtube_dl implementation found") + self.ydl_module_name = self.ydl_module.__name__.replace("_", "-") self.ydl_website = get_ydl_website(self.ydl_module_name) - print('Using {} module'.format(self.ydl_module_name)) + print("Using {} module".format(self.ydl_module_name)) def start(self): self.thread = Thread(target=self.worker) @@ -85,13 +84,11 @@ def worker(self): if job.type == JobType.YDL_DOWNLOAD: output = io.StringIO() try: - self.download(job, {'format': job.format}, output) + self.download(job, {"format": job.format}, output) except Exception as e: job.status = Job.FAILED - job.log = "Error during download task:\n{}:\n\t{}"\ - .format(type(e).__name__, str(e)) - print("Error during download task:\n{}:\n\t{}"\ - .format(type(e).__name__, str(e))) + job.log = "Error during download task:\n{}:\n\t{}".format(type(e).__name__, str(e)) + print("Error during download task:\n{}:\n\t{}".format(type(e).__name__, str(e))) elif job.type == JobType.YDL_UPDATE: rc, log = self.update() job.log = Job.clean_logs(log) @@ -100,41 +97,39 @@ def worker(self): self.queue.task_done() def update(self): - if os.environ.get('YDL_PYTHONPATH'): + if os.environ.get("YDL_PYTHONPATH"): command = [ - "pip", "install", "--no-cache-dir", - "-t", os.environ.get('YDL_PYTHONPATH'), - "--upgrade", self.ydl_module_name - ] + "pip", + "install", + "--no-cache-dir", + "-t", + os.environ.get("YDL_PYTHONPATH"), + "--upgrade", + self.ydl_module_name, + ] else: - command = [ - "pip", "install", "--no-cache-dir", - "--upgrade", self.ydl_module_name - ] - proc = subprocess.Popen( - command, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) + command = ["pip", "install", "--no-cache-dir", "--upgrade", self.ydl_module_name] + proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, err = proc.communicate() if proc.wait() == 0: - self.app_config['ydl_last_update'] = datetime.now() + self.app_config["ydl_last_update"] = datetime.now() reload_youtube_dl() - return proc.returncode, str(out.decode('utf-8')) + return proc.returncode, str(out.decode("utf-8")) def get_ydl_options(self, ydl_config, request_options): ydl_config = ydl_config.copy() - req_format = request_options.get('format') + req_format = request_options.get("format") if req_format is None: - req_format = 'best' - if req_format.startswith('audio/'): - ydl_config.update({'extract-audio': None}) - ydl_config.update({'audio-format': req_format.split('/')[-1]}) - elif req_format.startswith('video/'): + req_format = "best" + if req_format.startswith("audio/"): + ydl_config.update({"extract-audio": None}) + ydl_config.update({"audio-format": req_format.split("/")[-1]}) + elif req_format.startswith("video/"): # youtube-dl downloads BEST video and audio by default - if req_format != 'video/best': - ydl_config.update({'format': req_format.split('/')[-1]}) + if req_format != "video/best": + ydl_config.update({"format": req_format.split("/")[-1]}) else: - ydl_config.update({'format': req_format}) + ydl_config.update({"format": req_format}) return ydl_config def download_log_update(self, job, proc, strio): @@ -145,9 +140,9 @@ def download_log_update(self, job, proc, strio): sleep(3) def fetch_metadata(self, url): - ydl_opts = self.app_config.get('ydl_options', {}) + ydl_opts = self.app_config.get("ydl_options", {}) cmd = self.get_ydl_full_cmd(ydl_opts, url) - cmd.extend(['-J', '--flat-playlist']) + cmd.extend(["-J", "--flat-playlist"]) proc = Popen(cmd, stdout=PIPE, stderr=PIPE) stdout, stderr = proc.communicate() @@ -162,15 +157,14 @@ def get_ydl_full_cmd(self, opt_dict, url): for key, val in opt_dict.items(): if isinstance(val, bool) and not val: continue - cmd.append('--{}'.format(key)) + cmd.append("--{}".format(key)) if val is not None and not isinstance(val, bool): cmd.append(str(val)) cmd.append(url) return cmd def download(self, job, request_options, output): - ydl_opts = self.get_ydl_options(self.app_config.get('ydl_options', {}), - request_options) + ydl_opts = self.get_ydl_options(self.app_config.get("ydl_options", {}), request_options) cmd = self.get_ydl_full_cmd(ydl_opts, job.url) rc, metadata = self.fetch_metadata(job.url) @@ -179,20 +173,15 @@ def download(self, job, request_options, output): job.status = Job.FAILED raise Exception(job.log) - self.jobshandler.put((Actions.SET_NAME, - (job.id, metadata.get('title', job.url)))) + self.jobshandler.put((Actions.SET_NAME, (job.id, metadata.get("title", job.url)))) - if metadata.get('_type') == 'playlist': - ydl_opts.update({ - 'output': self.app_config['ydl_server'] - .get('output_playlist', ydl_opts.get('output')) - }) + if metadata.get("_type") == "playlist": + ydl_opts.update({"output": self.app_config["ydl_server"].get("output_playlist", ydl_opts.get("output"))}) cmd = self.get_ydl_full_cmd(ydl_opts, job.url) proc = Popen(cmd, stdout=PIPE, stderr=STDOUT) - stdout_thread = Thread(target=self.download_log_update, - args=(job, proc, output)) + stdout_thread = Thread(target=self.download_log_update, args=(job, proc, output)) stdout_thread.start() if proc.wait() == 0: @@ -208,18 +197,20 @@ def download(self, job, request_options, output): def resume_pending(self): db = JobsDB(readonly=False) - jobs = db.get_all(self.app_config['ydl_server'].get('max_log_entries', 100)) - not_endeds = [job for job in jobs if job['status'] == "Pending" - or job['status'] == 'Running'] + jobs = db.get_all(self.app_config["ydl_server"].get("max_log_entries", 100)) + not_endeds = [job for job in jobs if job["status"] == "Pending" or job["status"] == "Running"] for pending in not_endeds: if int(pending["type"]) == JobType.YDL_UPDATE: - self.jobshandler.put((Actions.SET_STATUS, - (pending["id"], Job.FAILED))) + self.jobshandler.put((Actions.SET_STATUS, (pending["id"], Job.FAILED))) else: - job = Job(pending["name"], - Job.PENDING, "Queue stopped", - int(pending["type"]), - pending["format"], pending["url"]) + job = Job( + pending["name"], + Job.PENDING, + "Queue stopped", + int(pending["type"]), + pending["format"], + pending["url"], + ) job.id = pending["id"] self.jobshandler.put((Actions.RESUME, job)) @@ -231,7 +222,8 @@ def get_ydl_version(self): return self.ydl_module.version.__version__ def get_ydl_extractors(self): - return [ie.IE_NAME for ie in self.ydl_module.extractor - .list_extractors( - self.app_config['ydl_options'].get('age-limit') - ) if ie._WORKING] + return [ + ie.IE_NAME + for ie in self.ydl_module.extractor.list_extractors(self.app_config["ydl_options"].get("age-limit")) + if ie._WORKING + ] diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 5250c5f3..3190c5d9 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -21,9 +21,9 @@ JobsDB.check_db_latest() JobsDB.init_db() - middleware = [Middleware(CORSMiddleware, allow_origins=['*'])] + middleware = [Middleware(CORSMiddleware, allow_origins=["*"])] - app = Starlette(routes=routes, debug=app_config['ydl_server'].get('debug', False), middleware=middleware) + app = Starlette(routes=routes, debug=app_config["ydl_server"].get("debug", False), middleware=middleware) app.state.jobshandler = JobsHandler(app_config) app.state.ydlhandler = YdlHandler(app_config, app.state.jobshandler) @@ -33,20 +33,20 @@ app.state.jobshandler.start(app.state.ydlhandler.queue) print("Started jobs manager thread") - print("Updating youtube-dl to the newest version") job = Job("Youtube-dl at Boot Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) app.state.jobshandler.put((Actions.INSERT, job)) app.state.ydlhandler.resume_pending() - - uvicorn.run(app, - host=app_config['ydl_server'].get('host'), - port=app_config['ydl_server'].get('port'), - log_level=('debug' if app_config['ydl_server'].get( - 'debug', False) else 'info'), - forwarded_allow_ips=app_config['ydl_server'].get('forwarded_allow_ips', None), - proxy_headers=app_config['ydl_server'].get('proxy_headers', True)) + + uvicorn.run( + app, + host=app_config["ydl_server"].get("host"), + port=app_config["ydl_server"].get("port"), + log_level=("debug" if app_config["ydl_server"].get("debug", False) else "info"), + forwarded_allow_ips=app_config["ydl_server"].get("forwarded_allow_ips", None), + proxy_headers=app_config["ydl_server"].get("proxy_headers", True), + ) app.state.ydlhandler.finish() app.state.jobshandler.finish() From dd4d3c745f3b4cfdf33842a654a11f50d8dc3d25 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 24 Aug 2021 02:04:54 +0000 Subject: [PATCH 185/570] Set Alpine version to 3.13 for docker --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e83ec8b8..327e1257 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ # https://github.com/nbr23/youtube-dl-server # -FROM python:alpine +FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 From ad9055c7443e9a0d6a0780de7dd8249085c63d55 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 4 Sep 2021 15:45:45 +0000 Subject: [PATCH 186/570] Update Dockerfile to install crypto lib --- Dockerfile | 8 ++++++++ ydl_server/ydlhandler.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 327e1257..c2a188e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,11 +3,19 @@ # # https://github.com/nbr23/youtube-dl-server # +FROM python:alpine3.13 AS base + +RUN apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo +RUN pip install cryptography pycryptodome FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 +COPY --from=base /root/.cache /root/.cache + +RUN pip install cryptography pycryptodome && rm -rf /root/.cache + RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley; fi diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index f38322ce..4584f42f 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -47,7 +47,7 @@ def __init__(self, app_config, jobshandler): self.app_config["ydl_last_update"] = datetime.now() - modules = ["youtube-dl", "youtube-dlc"] + modules = ["youtube-dl", "youtube-dlc", "yt-dlp"] if os.environ.get("YOUTUBE_DL") in modules: self.ydl_module = importlib.import_module(os.environ.get("YOUTUBE_DL").replace("-", "_")) From a51d24b2ee2e0831a6b4340cf0086eafceb2c1ee Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 7 Sep 2021 03:00:19 +0000 Subject: [PATCH 187/570] Update github workflows with yt_dlp --- .github/workflows/docker-images.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml index b29b63d7..957aad4f 100644 --- a/.github/workflows/docker-images.yml +++ b/.github/workflows/docker-images.yml @@ -32,6 +32,16 @@ jobs: platforms: linux/amd64,linux/arm,linux/arm64 push: true tags: nbr23/youtube-dl-server:latest,nbr23/youtube-dl-server:youtube-dl + - + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + build-args: | + YOUTUBE_DL=yt_dlp + platforms: linux/amd64,linux/arm,linux/arm64 + push: true + tags: nbr23/youtube-dl-server:yt-dlp - name: Build and push uses: docker/build-push-action@v2 @@ -42,3 +52,14 @@ jobs: platforms: linux/amd64,linux/arm,linux/arm64 push: true tags: nbr23/youtube-dl-server:atomicparsley,nbr23/youtube-dl-server:youtube-dl_atomicparsley + - + name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + build-args: | + ATOMICPARSLEY=1 + YOUTUBE_DL=yt_dlp + platforms: linux/amd64,linux/arm,linux/arm64 + push: true + tags: nbr23/youtube-dl-server:yt-dlp_atomicparsley From 91efeb808c4a55baeecc95e31c0d7e8be5603778 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 8 Sep 2021 21:31:06 +0000 Subject: [PATCH 188/570] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ee39b4e0..8ca8ff0b 100644 --- a/README.md +++ b/README.md @@ -127,11 +127,11 @@ to download the required front-end libraries (jquery, bootstrap). python3 -u ./youtube-dl-server.py ``` -To force a specific `youtube-dl` version/fork (eg `youtube-dlc`), use the +To force a specific `youtube-dl` version/fork (eg `youtube-dlc` or `yt-dlp`), use the variable `YOUTUBE_DL`: ```shell -YOUTUBE_DL=youtube-dlc python3 -u ./youtube-dl-server.py +YOUTUBE_DL=yt-dlp python3 -u ./youtube-dl-server.py ``` ## Usage From 636331925c521bdb2c171cfba124c593e0386a66 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 13 Sep 2021 23:34:03 +0000 Subject: [PATCH 189/570] Add ydl_server option to set default format selection Fixes #54 --- config.yml | 1 + ydl_server/config.py | 26 ++++++++++++++++++++++++++ ydl_server/templates/index.html | 30 +++++++----------------------- ydl_server/views.py | 4 +++- 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/config.yml b/config.yml index c170ce43..2fdee67c 100644 --- a/config.yml +++ b/config.yml @@ -8,6 +8,7 @@ ydl_server: # youtube-dl-server specific settings max_log_entries: 100 # Maximum number of job log history to keep forwarded_allow_ips: None # uvicorn Comma seperated list of IPs to trust with proxy headers. proxy_headers: True # uvicorn flag Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info. + default_format: video/best # Default format selection ydl_options: # youtube-dl options output: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # output directory template diff --git a/ydl_server/config.py b/ydl_server/config.py index 07cdb847..4845eb5d 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -2,6 +2,32 @@ import yaml import shutil +YDL_FORMATS = { + 'Video': { + 'video/best': 'Best', + 'video/bestvideo': 'Best Video', + 'video/mp4': 'MP4', + 'video/flv': 'Flash Video (FLV)', + 'video/webm': 'WebM', + 'video/ogg': 'Ogg', + 'video/mkv': 'Matroska (MKV)', + 'video/avi': 'AVI', + }, + 'Audio': { + 'bestaudio/best': 'Best Audio', + 'audio/aac': 'AAC', + 'audio/flac': 'FLAC', + 'audio/mp3': 'MP3', + 'audio/m4a': 'M4A', + 'audio/opus': 'Opus', + 'audio/vorbis': 'Vorbis', + 'audio/wav': 'WAV' + }, + 'Metadata only': + { + 'metadata': 'Metadata' + } +} def copy_default_config(config_file_path): try: diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html index 957e41f7..7e923380 100644 --- a/ydl_server/templates/index.html +++ b/ydl_server/templates/index.html @@ -11,31 +11,15 @@

youtube-dl

+ aria-describedby="button-submit" id="url" autofocus/>
diff --git a/ydl_server/views.py b/ydl_server/views.py index 479cc47b..93124178 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -3,7 +3,7 @@ from operator import itemgetter from pathlib import Path -from ydl_server.config import app_config, get_finished_path +from ydl_server.config import app_config, get_finished_path, YDL_FORMATS from ydl_server.logdb import JobsDB, Job, Actions, JobType from datetime import datetime import os @@ -19,6 +19,8 @@ async def front_index(request): "ydl_version": request.app.state.ydlhandler.get_ydl_version(), "ydl_name": request.app.state.ydlhandler.ydl_module_name, "ydl_website": request.app.state.ydlhandler.ydl_website, + "ydl_formats": YDL_FORMATS, + "ydl_default_format": app_config["ydl_server"].get("default_format", 'video/best'), } return templates.TemplateResponse("index.html", context=context) From 7acc1ead2ffcd40809170acc442b405051ffc6a4 Mon Sep 17 00:00:00 2001 From: FS <2019363+blackerking@users.noreply.github.com> Date: Tue, 14 Sep 2021 14:47:02 +0200 Subject: [PATCH 190/570] Update finished.html Setting icons in a more native color --- ydl_server/templates/finished.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 77e200d6..b30a99c7 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -20,13 +20,13 @@

Finished Files

- + - + @@ -63,13 +63,13 @@

Finished Files

- + - + From bdf69959ff3296e5dbc656e53c9c3cc60fb21e4f Mon Sep 17 00:00:00 2001 From: FS <2019363+blackerking@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:26:48 +0200 Subject: [PATCH 191/570] Update finished.html Using native / bootstrap colors --- ydl_server/templates/finished.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index b30a99c7..012ae5ee 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -20,13 +20,13 @@

Finished Files

- + - + @@ -63,13 +63,13 @@

Finished Files

- + - + From 99f161ddaa39fd5f2c1efe74a075ce5c24e4b0ee Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 20 Sep 2021 23:45:39 +0000 Subject: [PATCH 192/570] Update dockerfile --- Dockerfile | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c2a188e3..c758aa8e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,18 +3,23 @@ # # https://github.com/nbr23/youtube-dl-server # + +ARG YOUTUBE_DL=youtube_dl +ARG ATOMICPARSLEY=0 + + FROM python:alpine3.13 AS base +ARG YOUTUBE_DL -RUN apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo -RUN pip install cryptography pycryptodome +RUN mkdir /root/.cache && if [ "$YOUTUBE_DL" == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo && pip install cryptography pycryptodome; fi FROM python:alpine3.13 -ARG YOUTUBE_DL=youtube_dl -ARG ATOMICPARSLEY=0 +ARG YOUTUBE_DL +ARG ATOMICPARSLEY COPY --from=base /root/.cache /root/.cache -RUN pip install cryptography pycryptodome && rm -rf /root/.cache +RUN if [ "$YOUTUBE_DL" == "yt-dlp" ]; then pip install cryptography pycryptodome && rm -rf /root/.cache; fi RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From 05de6b434790cb2090b4225bf00a595564fb671c Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 21 Sep 2021 00:27:22 +0000 Subject: [PATCH 193/570] Fix Dockerfile support for yt_dlp --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c758aa8e..24493a5f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ ARG ATOMICPARSLEY=0 FROM python:alpine3.13 AS base ARG YOUTUBE_DL -RUN mkdir /root/.cache && if [ "$YOUTUBE_DL" == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo && pip install cryptography pycryptodome; fi +RUN mkdir /root/.cache && if [ "$YOUTUBE_DL" == "yt_dlp" ] || [ "$YOUTUBE_DL" == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo && pip install cryptography pycryptodome; fi FROM python:alpine3.13 ARG YOUTUBE_DL @@ -19,7 +19,7 @@ ARG ATOMICPARSLEY COPY --from=base /root/.cache /root/.cache -RUN if [ "$YOUTUBE_DL" == "yt-dlp" ]; then pip install cryptography pycryptodome && rm -rf /root/.cache; fi +RUN if [ "$YOUTUBE_DL" == "yt_dlp" ] || [ "$YOUTUBE_DL" == "yt-dlp" ]; then pip install cryptography pycryptodome && rm -rf /root/.cache; fi RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From 23e112ac0b72b599b4576313c747df5035ddc379 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 21 Sep 2021 04:12:49 +0000 Subject: [PATCH 194/570] Revert Dockerfile --- Dockerfile | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24493a5f..c2a188e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,23 +3,18 @@ # # https://github.com/nbr23/youtube-dl-server # - -ARG YOUTUBE_DL=youtube_dl -ARG ATOMICPARSLEY=0 - - FROM python:alpine3.13 AS base -ARG YOUTUBE_DL -RUN mkdir /root/.cache && if [ "$YOUTUBE_DL" == "yt_dlp" ] || [ "$YOUTUBE_DL" == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo && pip install cryptography pycryptodome; fi +RUN apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo +RUN pip install cryptography pycryptodome FROM python:alpine3.13 -ARG YOUTUBE_DL -ARG ATOMICPARSLEY +ARG YOUTUBE_DL=youtube_dl +ARG ATOMICPARSLEY=0 COPY --from=base /root/.cache /root/.cache -RUN if [ "$YOUTUBE_DL" == "yt_dlp" ] || [ "$YOUTUBE_DL" == "yt-dlp" ]; then pip install cryptography pycryptodome && rm -rf /root/.cache; fi +RUN pip install cryptography pycryptodome && rm -rf /root/.cache RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From 47deb2f9ae363d968732146922c8f3652ffbe2df Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 26 Sep 2021 01:11:50 +0000 Subject: [PATCH 195/570] Fix update message --- youtube-dl-server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 3190c5d9..b84c1d8d 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -33,7 +33,7 @@ app.state.jobshandler.start(app.state.ydlhandler.queue) print("Started jobs manager thread") - print("Updating youtube-dl to the newest version") + print("Updating %s to the newest version" % app.state.ydlhandler.ydl_module_name) job = Job("Youtube-dl at Boot Update", Job.PENDING, "", JobType.YDL_UPDATE, None, None) app.state.jobshandler.put((Actions.INSERT, job)) From 4855344e1ebe094e1c7e464891df49b3b1e951e4 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 16 Oct 2021 16:09:21 +0000 Subject: [PATCH 196/570] Update dockerfile to embed gcc and rust --- Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c2a188e3..158215fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,18 +3,15 @@ # # https://github.com/nbr23/youtube-dl-server # -FROM python:alpine3.13 AS base -RUN apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo -RUN pip install cryptography pycryptodome FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 -COPY --from=base /root/.cache /root/.cache -RUN pip install cryptography pycryptodome && rm -rf /root/.cache +RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo; fi +RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install cryptography pycryptodome; fi RUN mkdir -p /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap From 8252daface1b95c2e197ac30b9a506f50b2a8fdf Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 17 Oct 2021 20:49:34 +0000 Subject: [PATCH 197/570] Fix python module env var handling YOUTUBE_DL --- ydl_server/ydlhandler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 4584f42f..69a2c039 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -47,14 +47,14 @@ def __init__(self, app_config, jobshandler): self.app_config["ydl_last_update"] = datetime.now() - modules = ["youtube-dl", "youtube-dlc", "yt-dlp"] + modules = ["youtube_dl", "youtube_dlc", "yt_dlp"] - if os.environ.get("YOUTUBE_DL") in modules: + if os.environ.get("YOUTUBE_DL").replace("-", "_") in modules: self.ydl_module = importlib.import_module(os.environ.get("YOUTUBE_DL").replace("-", "_")) else: for module in modules: try: - self.ydl_module = importlib.import_module(module.replace("-", "_")) + self.ydl_module = importlib.import_module(module) break except ImportError: pass From 29523bd7ef5277dfc63a471990b699770c0b9b5b Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 17 Oct 2021 23:57:17 +0000 Subject: [PATCH 198/570] Disable cache in build workflow --- .github/workflows/docker-images.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml index 957aad4f..0f913ce2 100644 --- a/.github/workflows/docker-images.yml +++ b/.github/workflows/docker-images.yml @@ -31,6 +31,7 @@ jobs: context: . platforms: linux/amd64,linux/arm,linux/arm64 push: true + no-cache: true tags: nbr23/youtube-dl-server:latest,nbr23/youtube-dl-server:youtube-dl - name: Build and push @@ -41,6 +42,7 @@ jobs: YOUTUBE_DL=yt_dlp platforms: linux/amd64,linux/arm,linux/arm64 push: true + no-cache: true tags: nbr23/youtube-dl-server:yt-dlp - name: Build and push @@ -51,6 +53,7 @@ jobs: ATOMICPARSLEY=1 platforms: linux/amd64,linux/arm,linux/arm64 push: true + no-cache: true tags: nbr23/youtube-dl-server:atomicparsley,nbr23/youtube-dl-server:youtube-dl_atomicparsley - name: Build and push @@ -62,4 +65,5 @@ jobs: YOUTUBE_DL=yt_dlp platforms: linux/amd64,linux/arm,linux/arm64 push: true + no-cache: true tags: nbr23/youtube-dl-server:yt-dlp_atomicparsley From 88bf77a4161d84eeca38699ac10b4959dacd401b Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 19 Oct 2021 01:21:04 +0000 Subject: [PATCH 199/570] Add build badge to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8ca8ff0b..e3aed544 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ![Docker Stars Shield](https://img.shields.io/docker/stars/nbr23/youtube-dl-server.svg?style=flat-square) ![Docker Pulls Shield](https://img.shields.io/docker/pulls/nbr23/youtube-dl-server.svg?style=flat-square) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://raw.githubusercontent.com/nbr23/youtube-dl-server/master/LICENSE) +[![ci](https://github.com/nbr23/youtube-dl-server/actions/workflows/docker-images.yml/badge.svg)](https://github.com/nbr23/youtube-dl-server/actions/workflows/docker-images.yml) # youtube-dl-server From 8d83a1e7b060d467bd35a81e2f233d7a3164d6a1 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 21 Oct 2021 01:55:56 +0000 Subject: [PATCH 200/570] Update python path environment var in dockerfile --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 158215fc..58b892d7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,10 @@ FROM python:alpine3.13 ARG YOUTUBE_DL=youtube_dl ARG ATOMICPARSLEY=0 +ARG YDL_PYTHONPATH='/youtube-dl/.python' +VOLUME "/youtube-dl" +VOLUME "/app_config" RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then apk add --no-cache musl-dev python3-dev gcc libffi-dev openssl-dev rust cargo; fi RUN if [ $YOUTUBE_DL == "yt_dlp" ] || [ $YOUTUBE_DL == "yt-dlp" ]; then pip install cryptography pycryptodome; fi @@ -31,9 +34,7 @@ RUN apk add --no-cache wget && ./bootstrap.sh && apk del wget EXPOSE 8080 -VOLUME "/youtube-dl" -VOLUME "/app_config" - ENV YOUTUBE_DL=$YOUTUBE_DL ENV YDL_CONFIG_PATH='/app_config' +ENV YDL_PYTHONPATH=$YDL_PYTHONPATH CMD [ "python", "-u", "./youtube-dl-server.py" ] From a8f110bd90f3d028d9fe667c19fd5c85365b187c Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 21 Oct 2021 02:03:05 +0000 Subject: [PATCH 201/570] Update log api format value returned in null case --- ydl_server/logdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index ba10dccf..118d418b 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -163,7 +163,7 @@ def get_all(self, limit=50): 'name': escape(name), 'status': STATUS_NAME[status], 'log': escape(log), - 'format': escape(format), + 'format': escape(format) if format is not None else None, 'last_update': last_update, 'type': jobtype, 'url': escape(url)}) From 39f374536edf98b02025bd104f7cc92fc7db25c6 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 13 Nov 2021 22:04:49 +0000 Subject: [PATCH 202/570] Fix youtube-dl updates and python paths in docker --- Dockerfile | 3 +- docker_run.sh | 4 +++ ydl_server/views.py | 8 ++--- ydl_server/ydlhandler.py | 72 ++++++++++++++++++++-------------------- 4 files changed, 46 insertions(+), 41 deletions(-) create mode 100755 docker_run.sh diff --git a/Dockerfile b/Dockerfile index 58b892d7..9c2cbc43 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,6 +23,7 @@ COPY ./requirements.txt /usr/src/app/ RUN sed -i s/youtube-dl/${YOUTUBE_DL}/ /usr/src/app/requirements.txt && pip install --no-cache-dir -r /usr/src/app/requirements.txt COPY ./bootstrap.sh /usr/src/app/ +COPY ./docker_run.sh /usr/src/app/ COPY ./config.yml /usr/src/app/default_config.yml COPY ./ydl_server /usr/src/app/ydl_server COPY ./youtube-dl-server.py /usr/src/app/ @@ -37,4 +38,4 @@ EXPOSE 8080 ENV YOUTUBE_DL=$YOUTUBE_DL ENV YDL_CONFIG_PATH='/app_config' ENV YDL_PYTHONPATH=$YDL_PYTHONPATH -CMD [ "python", "-u", "./youtube-dl-server.py" ] +CMD [ "./docker_run.sh" ] diff --git a/docker_run.sh b/docker_run.sh new file mode 100755 index 00000000..d34d5075 --- /dev/null +++ b/docker_run.sh @@ -0,0 +1,4 @@ +#! /usr/bin/env sh + +pip install --no-cache-dir -t $YDL_PYTHONPATH --upgrade $YOUTUBE_DL +PYTHONPATH="${PYTHONPATH}:${YDL_PYTHONPATH}" python -u ./youtube-dl-server.py \ No newline at end of file diff --git a/ydl_server/views.py b/ydl_server/views.py index 93124178..9369c8fe 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -16,7 +16,7 @@ async def front_index(request): context = { "request": request, - "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_version": request.app.state.ydlhandler.ydl_version, "ydl_name": request.app.state.ydlhandler.ydl_module_name, "ydl_website": request.app.state.ydlhandler.ydl_website, "ydl_formats": YDL_FORMATS, @@ -28,7 +28,7 @@ async def front_index(request): async def front_logs(request): context = { "request": request, - "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_version": request.app.state.ydlhandler.ydl_version, "ydl_name": request.app.state.ydlhandler.ydl_module_name, "ydl_website": request.app.state.ydlhandler.ydl_website, } @@ -62,7 +62,7 @@ async def front_finished(request): context = { "request": request, - "ydl_version": request.app.state.ydlhandler.get_ydl_version(), + "ydl_version": request.app.state.ydlhandler.ydl_version, "ydl_name": request.app.state.ydlhandler.ydl_module_name, "ydl_website": request.app.state.ydlhandler.ydl_website, "finished_files": sorted(files, key=itemgetter("modified"), reverse=True), @@ -91,7 +91,7 @@ async def api_delete_file(request): async def api_list_extractors(request): - return JSONResponse(request.app.state.ydlhandler.get_ydl_extractors()) + return JSONResponse(request.app.state.ydlhandler.ydl_extractors) async def api_queue_size(request): diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 69a2c039..c3c9969c 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -13,13 +13,7 @@ from ydl_server.logdb import JobsDB, Job, Actions, JobType -def reload_youtube_dl(): - for module in list(sys.modules.keys()): - if "youtube" in module: - try: - importlib.reload(sys.modules[module]) - except ModuleNotFoundError: - print("ModuleNotFoundError:\n" + module) +YDL_MODULES = ["youtube_dl", "youtube_dlc", "yt_dlp"] def get_ydl_website(ydl_module_name): @@ -36,33 +30,47 @@ def read_proc_stdout(proc, strio): class YdlHandler: + + def import_ydl_module(self): + ydl_module = None + if os.environ.get("YOUTUBE_DL").replace("-", "_") in YDL_MODULES: + ydl_module = importlib.import_module(os.environ.get("YOUTUBE_DL").replace("-", "_")) + else: + for module in YDL_MODULES: + try: + ydl_module = importlib.import_module(module) + break + except ImportError: + pass + if ydl_module is None: + raise ImportError("No youtube_dl implementation found") + + self.ydl_module_name = ydl_module.__name__.replace("_", "-") + self.ydl_website = get_ydl_website(self.ydl_module_name) + + importlib.reload(ydl_module.version) + importlib.reload(ydl_module.extractor) + + self.ydl_version = ydl_module.version.__version__ + self.ydl_extractors = [ + ie.IE_NAME + for ie in ydl_module.extractor.list_extractors(self.app_config["ydl_options"].get("age-limit")) + if ie._WORKING + ] + def __init__(self, app_config, jobshandler): self.queue = Queue() self.thread = None self.done = False - self.ydl_module = None self.ydl_module_name = None + self.ydl_version = None + self.ydl_extractors = [] self.app_config = app_config self.jobshandler = jobshandler self.app_config["ydl_last_update"] = datetime.now() - modules = ["youtube_dl", "youtube_dlc", "yt_dlp"] - - if os.environ.get("YOUTUBE_DL").replace("-", "_") in modules: - self.ydl_module = importlib.import_module(os.environ.get("YOUTUBE_DL").replace("-", "_")) - else: - for module in modules: - try: - self.ydl_module = importlib.import_module(module) - break - except ImportError: - pass - if self.ydl_module is None: - raise ImportError("No youtube_dl implementation found") - self.ydl_module_name = self.ydl_module.__name__.replace("_", "-") - - self.ydl_website = get_ydl_website(self.ydl_module_name) + self.import_ydl_module() print("Using {} module".format(self.ydl_module_name)) @@ -97,6 +105,7 @@ def worker(self): self.queue.task_done() def update(self): + print(f"Updating: Current {self.ydl_module_name} version: {self.ydl_version}") if os.environ.get("YDL_PYTHONPATH"): command = [ "pip", @@ -113,7 +122,8 @@ def update(self): out, err = proc.communicate() if proc.wait() == 0: self.app_config["ydl_last_update"] = datetime.now() - reload_youtube_dl() + self.import_ydl_module() + print(f"Updating: New {self.ydl_module_name} version: {self.ydl_version}") return proc.returncode, str(out.decode("utf-8")) def get_ydl_options(self, ydl_config, request_options): @@ -216,14 +226,4 @@ def resume_pending(self): def join(self): if self.thread is not None: - return self.thread.join() - - def get_ydl_version(self): - return self.ydl_module.version.__version__ - - def get_ydl_extractors(self): - return [ - ie.IE_NAME - for ie in self.ydl_module.extractor.list_extractors(self.app_config["ydl_options"].get("age-limit")) - if ie._WORKING - ] + return self.thread.join() \ No newline at end of file From 17fff67f63ff2811d46a2be2ad42a743cfc42b75 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 15 Nov 2021 10:16:08 +0000 Subject: [PATCH 203/570] Fix syntax on finished.html page --- ydl_server/templates/finished.html | 110 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 012ae5ee..4eadff44 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -13,75 +13,75 @@

Finished Files

Name Date
- - - - - - - - - - - - - {{ c.name }}{{ c.modified }}
- + - + {{ f.name }}{{ f.modified }}{{ c.name }}{{ c.modified }}
+ + + + + + + + + + + + + {{ f.name }}{{ f.modified }}
From 3e9a38288d8726c2f533fe2f9cc412759c74a1bf Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 16 Nov 2021 01:19:05 +0000 Subject: [PATCH 204/570] Fix url encoding in finished page --- ydl_server/templates/finished.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ydl_server/templates/finished.html b/ydl_server/templates/finished.html index 4eadff44..db542df6 100644 --- a/ydl_server/templates/finished.html +++ b/ydl_server/templates/finished.html @@ -26,7 +26,7 @@

Finished Files

- + @@ -41,20 +41,20 @@

Finished Files

- + - + {{ c.name }}{{ c.name }} {{ c.modified }}
- + - + {{ f.name }}{{ f.name }} {{ f.modified }}
ActionNameNameSize Date
{{ c.name }}{{ c.name }}{{ c.size }} {{ c.modified }}
{{ f.name }}{{ f.name }}{{ f.size }} {{ f.modified }}
" + row.last_update + "" + row.name + "" + (row.format != null ? row.format : "") + " " + row.status + " / Retry " + row.status + ` × " + row.status + "" + row.log.replace(/\n|\r/g, '
') + "
" + row.last_update + "" + row.name + "" + (row.format != null ? row.format : "") + " " + row.status + " / Retry " + row.status + ` × " + row.status + "" + row.log.replace(/\n|\r/g, '
') + "
- - - - - - - - - {% for f in finished_files %} - {% if f.directory %} - {% set dirnum = loop.index %} - - - - - - - - {% for c in f.children %} - - - - - - - - - {% endfor %} - {% else %} - - - - - - - - - {% endif %} - {% endfor %} -
ActionNameSizeDate
- - - - - - - - - - - - - {{ c.name }}{{ c.size }}{{ c.modified }}
- - - - - - - - - - - - - {{ f.name }}{{ f.size }}{{ f.modified }}
- - - - {% include 'footer.html' %} - - - - diff --git a/ydl_server/templates/footer.html b/ydl_server/templates/footer.html deleted file mode 100644 index b784262c..00000000 --- a/ydl_server/templates/footer.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

- Drag and Drop the Bookmarklet to your bookmark bar for easy access: Youtube-DL -
- Powered by {{ ydl_name }} version {{ ydl_version }}. - Code & issues on GitHub. -

-
- - - - diff --git a/ydl_server/templates/header.html b/ydl_server/templates/header.html deleted file mode 100644 index 88359cb7..00000000 --- a/ydl_server/templates/header.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - youtube-dl - - - -
- -
diff --git a/ydl_server/templates/index.html b/ydl_server/templates/index.html deleted file mode 100644 index c71238ef..00000000 --- a/ydl_server/templates/index.html +++ /dev/null @@ -1,87 +0,0 @@ -{% include 'header.html' %} - -
-
-
-
-

youtube-dl

-

Enter a video URL to download the video to the server. URL can be to YouTube or any - other supported site. The server will automatically download the highest quality version available.

-
-
- - -
- -
-
-
-
- - - - -
-
-
-
-
-{% include 'footer.html' %} - - - - \ No newline at end of file diff --git a/ydl_server/templates/logs.html b/ydl_server/templates/logs.html deleted file mode 100644 index d37d7bc4..00000000 --- a/ydl_server/templates/logs.html +++ /dev/null @@ -1,37 +0,0 @@ -{% include 'header.html' %} - -
-
-
-

Jobs History

- - - -
- - - - - - - - - - - - -
Last updateNameFormatStatusLog
-
-
-
- {% include 'footer.html' %} - - - - diff --git a/ydl_server/views.py b/ydl_server/views.py index 180eaa08..78025eaf 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -1,5 +1,4 @@ from starlette.responses import JSONResponse -from starlette.templating import Jinja2Templates from operator import itemgetter from pathlib import Path @@ -12,32 +11,7 @@ import humanize -templates = Jinja2Templates(directory=str(Path(__file__).parent / "templates")) - - -async def front_index(request): - context = { - "request": request, - "ydl_version": request.app.state.ydlhandler.ydl_version, - "ydl_name": request.app.state.ydlhandler.ydl_module_name, - "ydl_website": request.app.state.ydlhandler.ydl_website, - "ydl_formats": YDL_FORMATS, - "ydl_default_format": app_config["ydl_server"].get("default_format", 'video/best'), - } - return templates.TemplateResponse("index.html", context=context) - - -async def front_logs(request): - context = { - "request": request, - "ydl_version": request.app.state.ydlhandler.ydl_version, - "ydl_name": request.app.state.ydlhandler.ydl_module_name, - "ydl_website": request.app.state.ydlhandler.ydl_website, - } - return templates.TemplateResponse("logs.html", context=context) - - -async def front_finished(request): +async def api_finished(request): root_dir = Path(get_finished_path()) matches = root_dir.glob("*") @@ -62,16 +36,7 @@ async def front_finished(request): for f1 in matches if not f1.name.startswith(".") ] - - context = { - "request": request, - "ydl_version": request.app.state.ydlhandler.ydl_version, - "ydl_name": request.app.state.ydlhandler.ydl_module_name, - "ydl_website": request.app.state.ydlhandler.ydl_website, - "finished_files": sorted(files, key=itemgetter("modified"), reverse=True), - } - return templates.TemplateResponse("finished.html", context=context) - + return JSONResponse(files) async def api_delete_file(request): fname = request.path_params["fname"] @@ -162,7 +127,7 @@ async def api_jobs_stop(request): async def api_queue_download(request): - data = await request.form() + data = await request.json() url = data.get("url") options = {"format": data.get("format")} @@ -177,8 +142,8 @@ async def api_queue_download(request): async def api_metadata_fetch(request): - data = await request.form() + data = await request.json() rc, stdout = request.app.state.ydlhandler.fetch_metadata(data.get("url")) if rc == 0: return JSONResponse(stdout) - return JSONResponse({}, status_code=404) + return JSONResponse({"success": False}, status_code=404) diff --git a/youtube-dl-server.py b/youtube-dl-server.py index 03da9329..6f636db7 100644 --- a/youtube-dl-server.py +++ b/youtube-dl-server.py @@ -1,13 +1,10 @@ from __future__ import unicode_literals from starlette.applications import Starlette -from starlette.staticfiles import StaticFiles -from starlette.responses import HTMLResponse -from starlette.templating import Jinja2Templates from starlette.middleware import Middleware from starlette.middleware.cors import CORSMiddleware import uvicorn -from ydl_server.logdb import JobsDB, Job, Actions, JobType +from ydl_server.logdb import JobsDB from ydl_server.ydlhandler import YdlHandler from ydl_server.jobshandler import JobsHandler @@ -20,7 +17,7 @@ JobsDB.check_db_latest() JobsDB.init_db() - middleware = [Middleware(CORSMiddleware, allow_origins=["*"])] + middleware = [Middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"])] app = Starlette(routes=routes, debug=app_config["ydl_server"].get("debug", False), middleware=middleware) From c6401db13d9023cbb114bceefaf8a6b052502a3f Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 26 Mar 2023 21:13:29 -0400 Subject: [PATCH 260/570] Cleanup bootstrap stuff --- Dockerfile | 4 ---- Dockerfile-ytdlp | 3 --- bootstrap.sh | 10 ---------- 3 files changed, 17 deletions(-) delete mode 100755 bootstrap.sh diff --git a/Dockerfile b/Dockerfile index ac687d01..3062915a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,7 +34,6 @@ RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinel COPY ./requirements.txt /usr/src/app/ RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v yt-dlp) -COPY ./bootstrap.sh /usr/src/app/ COPY ./config.yml /usr/src/app/default_config.yml COPY ./ydl_server /usr/src/app/ydl_server COPY ./youtube-dl-server.py /usr/src/app/ @@ -43,9 +42,6 @@ COPY --from=nodebuild /app/dist /usr/src/app/ydl_server/static WORKDIR /usr/src/app -RUN apk add --no-cache wget && ./bootstrap.sh && apk del wget - - EXPOSE 8080 ENV YOUTUBE_DL=$YOUTUBE_DL diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index 679f719e..ea4eaf57 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -51,7 +51,6 @@ RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinel COPY ./requirements.txt /usr/src/app/ RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) -COPY ./bootstrap.sh /usr/src/app/ COPY ./config.yml /usr/src/app/default_config.yml COPY ./ydl_server /usr/src/app/ydl_server COPY ./youtube-dl-server.py /usr/src/app/ @@ -60,8 +59,6 @@ COPY --from=nodebuild /app/dist /usr/src/app/ydl_server/static WORKDIR /usr/src/app -RUN apk add --no-cache wget && ./bootstrap.sh && apk del wget - EXPOSE 8080 diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 47231e24..00000000 --- a/bootstrap.sh +++ /dev/null @@ -1,10 +0,0 @@ -#! /usr/bin/env sh - -BOOTSTRAP_VERSION=5.2.3 - -# Download required web frontend libraries -wget -q https://code.jquery.com/jquery-3.6.3.min.js -O ydl_server/static/js/jquery.min.js -wget -q https://github.com/twbs/bootstrap/releases/download/v$BOOTSTRAP_VERSION/bootstrap-$BOOTSTRAP_VERSION-dist.zip -O bootstrap.zip -unzip -jo bootstrap.zip *.css *.css.map -d ydl_server/static/css/ -unzip -jo bootstrap.zip *.js *.js.map -d ydl_server/static/js/ -rm -f bootstrap.zip From 8b5d72c9613f2893e56b4874e403ddc4f0334bd3 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 26 Mar 2023 21:20:09 -0400 Subject: [PATCH 261/570] Faster builds --- Dockerfile | 2 +- Dockerfile-ytdlp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3062915a..4432a5ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ # https://github.com/nbr23/youtube-dl-server # -FROM node:19-alpine as nodebuild +FROM --platform=$BUILDPLATFORM node:19-alpine as nodebuild WORKDIR /app COPY ./front/package*.json /app diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp index ea4eaf57..4b5e6298 100644 --- a/Dockerfile-ytdlp +++ b/Dockerfile-ytdlp @@ -4,7 +4,7 @@ # https://github.com/nbr23/youtube-dl-server # -FROM node:19-alpine as nodebuild +FROM --platform=$BUILDPLATFORM node:19-alpine as nodebuild WORKDIR /app COPY ./front/package*.json /app From 5015a561ba98ec1aceb79d425dd53fbd62e2c9dc Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 27 Mar 2023 07:55:19 -0400 Subject: [PATCH 262/570] Fix api calls --- front/src/components/Finished.vue | 4 ++-- front/src/components/Footer.vue | 2 ++ front/src/components/Header.vue | 4 +++- front/src/components/Home.vue | 12 +++++++----- front/src/components/Logs.vue | 10 ++++++---- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/front/src/components/Finished.vue b/front/src/components/Finished.vue index 014bd75f..f8b3fc6c 100644 --- a/front/src/components/Finished.vue +++ b/front/src/components/Finished.vue @@ -17,7 +17,7 @@ export default { methods: { async deleteFinishedFile(file_name) { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/finished/${file_name}` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/finished/${file_name}` fetch(url, { method: 'DELETE', headers: { @@ -27,7 +27,7 @@ export default { this.fetchFinished(true) }, async fetchFinished(once = false) { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/finished` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/finished` this.finished = await (await fetch(url)).json() if (!once && this.mounted) { setTimeout(() => { diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue index 1adb5c34..0a6bf67b 100644 --- a/front/src/components/Footer.vue +++ b/front/src/components/Footer.vue @@ -2,8 +2,10 @@ export default { data: () => ({ server_info: {}, + VITE_YOUTUBE_DL_SERVER_API_URL: '', }), mounted() { + this.VITE_YOUTUBE_DL_SERVER_API_URL = import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL || ''; this.fetchServerInfo(); this.setBookmarklet(); }, diff --git a/front/src/components/Header.vue b/front/src/components/Header.vue index 1c7343b3..ab87cd9b 100644 --- a/front/src/components/Header.vue +++ b/front/src/components/Header.vue @@ -2,14 +2,16 @@ export default { data: () => ({ stats: {}, + VITE_YOUTUBE_DL_SERVER_API_URL: '', }), mounted() { + this.VITE_YOUTUBE_DL_SERVER_API_URL = import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL || ''; this.fetchStats(); }, methods: { async fetchStats() { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads/stats` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads/stats` this.stats = (await (await fetch(url)).json()).stats || {} setTimeout(() => { this.fetchStats() diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index 1d4bf23b..3d357735 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -11,9 +11,11 @@ export default { extractorsModal: null, urlBox: null, selectedFormat: null, - metadata: null + metadata: null, + VITE_YOUTUBE_DL_SERVER_API_URL: '', }), mounted() { + this.VITE_YOUTUBE_DL_SERVER_API_URL = import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL || ''; this.extractorsModal = new Modal('#extractorsModal'); this.metadataModal = new Modal('#metadataModal'); this.urlBox = document.getElementById('url'); @@ -68,16 +70,16 @@ export default { this.metadataModal.show(); }, async fetchExtractors() { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/extractors` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/extractors` this.extractors = await (await fetch(url)).json() }, async fetchAvailableFormats() { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/formats` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/formats` this.formats = await (await fetch(url)).json() }, async submitVideo() { if (this.selectedFormat.value != 'metadata') { - fetch(`${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads`, { + fetch(`${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads`, { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -106,7 +108,7 @@ export default { }); } else { - fetch(`${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/metadata`, { + fetch(`${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/metadata`, { method: 'POST', headers: { 'Content-Type': 'application/json' diff --git a/front/src/components/Logs.vue b/front/src/components/Logs.vue index c4963333..3ab8b256 100644 --- a/front/src/components/Logs.vue +++ b/front/src/components/Logs.vue @@ -12,8 +12,10 @@ export default { Running: 'badge bg-info', Completed: 'badge bg-success' }, + VITE_YOUTUBE_DL_SERVER_API_URL: '', }), mounted() { + this.VITE_YOUTUBE_DL_SERVER_API_URL = import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL || ''; this.mounted = true; this.fetchLogs(); }, @@ -23,7 +25,7 @@ export default { methods: { abortDownload(job_id) { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/jobs/${job_id}/stop` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/jobs/${job_id}/stop` fetch(url, { method: 'POST', headers: { @@ -34,7 +36,7 @@ export default { }, retryDownload(url, format) { console.log(url, format) - const apiurl = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` + const apiurl = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` fetch(apiurl, { method: 'POST', headers: { @@ -48,7 +50,7 @@ export default { this.fetchLogs(true) }, purgeLogs() { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` fetch(url, { method: 'DELETE', headers: { @@ -58,7 +60,7 @@ export default { this.fetchLogs(true) }, async fetchLogs(once = false) { - const url = `${import.meta.env.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` + const url = `${this.VITE_YOUTUBE_DL_SERVER_API_URL}/api/downloads` this.logs = await (await fetch(url)).json() if (!once && this.mounted) { setTimeout(() => { From 3e77ffcb9bbfeaec7903920b1f63b38d450b1918 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 27 Mar 2023 07:56:01 -0400 Subject: [PATCH 263/570] Swap builds --- Jenkinsfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 48ff1cb0..7370044e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,18 +25,17 @@ pipeline { } } } - stage('Build Youtube-dl Image') { + stage('Build Youtube-dl yt_dlp Image') { steps { sh """ - docker buildx build --pull --builder \$BUILDX_BUILDER --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:latest -t nbr23/youtube-dl-server:youtube-dl -t nbr23/youtube-dl-server:youtube-dl_atomicparsley ${ "$GIT_BRANCH" == "master" ? "--push" : ""} . + docker buildx build --pull --builder \$BUILDX_BUILDER --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley -f Dockerfile-ytdlp ${ "$GIT_BRANCH" == "master" ? "--push" : ""} . """ } } - - stage('Build Youtube-dl yt_dlp Image') { + stage('Build Youtube-dl Image') { steps { sh """ - docker buildx build --pull --builder \$BUILDX_BUILDER --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg YOUTUBE_DL=yt_dlp --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:yt-dlp -t nbr23/youtube-dl-server:yt-dlp_atomicparsley -f Dockerfile-ytdlp ${ "$GIT_BRANCH" == "master" ? "--push" : ""} . + docker buildx build --pull --builder \$BUILDX_BUILDER --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg ATOMICPARSLEY=1 -t nbr23/youtube-dl-server:latest -t nbr23/youtube-dl-server:youtube-dl -t nbr23/youtube-dl-server:youtube-dl_atomicparsley ${ "$GIT_BRANCH" == "master" ? "--push" : ""} . """ } } From bbae00449e4c1d8fb288ba89ebcc6511d6fe2472 Mon Sep 17 00:00:00 2001 From: Maxence Date: Mon, 27 Mar 2023 08:43:29 -0400 Subject: [PATCH 264/570] Fix frontend --- front/src/components/Finished.vue | 7 ++++--- front/src/components/Footer.vue | 13 ++++++++----- front/src/components/Header.vue | 5 ++++- front/src/components/Home.vue | 3 +-- front/src/components/Logs.vue | 6 ++++-- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/front/src/components/Finished.vue b/front/src/components/Finished.vue index f8b3fc6c..a2690f89 100644 --- a/front/src/components/Finished.vue +++ b/front/src/components/Finished.vue @@ -1,5 +1,7 @@ + @@ -104,6 +104,17 @@ export default { logs + +
diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index 505b1fae..9ee23a53 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -282,13 +282,8 @@ def get_job_by_id(self, job_id): def get_jobs_with_logs(self, limit=50, status=None): cursor = self.conn.cursor() - if status is not None: - statuses = [ - STATUS_NAME.index(status.capitalize()), - STATUS_NAME.index(status.capitalize()), - ] - if status == 'FAILED': - statuses[1] = STATUS_NAME.index('Aborted') + status = STATUS_NAME.index(status.capitalize()) if status and status.capitalize() in STATUS_NAME else -1 + if status >= 0: cursor.execute( """ SELECT @@ -296,10 +291,10 @@ def get_jobs_with_logs(self, limit=50, status=None): FROM jobs WHERE - status in (?, ?) + status = ? ORDER BY last_update DESC LIMIT ?; """, - (statuses[0], statuses[1], str(limit),), + (status, str(limit),), ) else: cursor.execute( @@ -341,13 +336,8 @@ def get_jobs_with_logs(self, limit=50, status=None): def get_jobs(self, limit=50, status=None): cursor = self.conn.cursor() - if status is not None: - statuses = [ - STATUS_NAME.index(status.capitalize()), - STATUS_NAME.index(status.capitalize()), - ] - if status == 'FAILED': - statuses[1] = STATUS_NAME.index('Aborted') + status = STATUS_NAME.index(status.capitalize()) if status and status.capitalize() in STATUS_NAME else -1 + if status >= 0: cursor.execute( """ SELECT @@ -355,10 +345,10 @@ def get_jobs(self, limit=50, status=None): FROM jobs WHERE - status in (?, ?) + status = ? ORDER BY last_update DESC LIMIT ?; """, - (statuses[0], statuses[1], str(limit),), + (status, str(limit),), ) else: cursor.execute( From a017eb7ddb42fb7b47d7a81d7352e8bcf5773413 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 4 Feb 2024 16:11:49 -0500 Subject: [PATCH 432/570] add log entry delete --- front/src/components/Logs.vue | 13 +++++++++++-- ydl_server/jobshandler.py | 2 ++ ydl_server/logdb.py | 12 +++++++++++- ydl_server/routes.py | 6 ++++++ ydl_server/views.py | 8 +++++++- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/front/src/components/Logs.vue b/front/src/components/Logs.vue index 1512cda4..a408f658 100644 --- a/front/src/components/Logs.vue +++ b/front/src/components/Logs.vue @@ -64,12 +64,20 @@ export default { this.fetchLogs(true) }, retryDownload(job_id) { - console.log(job_id) const apiurl = getAPIUrl(`api/jobs/${job_id}/retry`, import.meta.env); fetch(apiurl, { method: 'POST' + }).then(() => { + this.fetchLogs(true); + }) + }, + deleteLog(job_id) { + const apiurl = getAPIUrl(`api/jobs/${job_id}`, import.meta.env); + fetch(apiurl, { + method: 'DELETE' + }).then(() => { + this.fetchLogs(true); }) - this.fetchLogs(true) }, purgeLogs() { const url = getAPIUrl(`api/downloads`, import.meta.env); @@ -206,6 +214,7 @@ export default { + diff --git a/ydl_server/jobshandler.py b/ydl_server/jobshandler.py index c953b07f..3ce3c57d 100644 --- a/ydl_server/jobshandler.py +++ b/ydl_server/jobshandler.py @@ -54,6 +54,8 @@ def worker(self, dl_queue): db.set_job_pid(job_id, pid) elif action == Actions.CLEAN_LOGS: db.clean_old_jobs() + elif action == Actions.DELETE_LOG_SAFE: + db.delete_job_safe(job["id"]) elif action == Actions.DELETE_LOG: db.delete_job(job["id"]) self.queue.task_done() diff --git a/ydl_server/logdb.py b/ydl_server/logdb.py index 9ee23a53..0d5855ad 100644 --- a/ydl_server/logdb.py +++ b/ydl_server/logdb.py @@ -19,6 +19,7 @@ class Actions: CLEAN_LOGS = 9 SET_PID = 10 DELETE_LOG = 11 + DELETE_LOG_SAFE = 12 class JobType: @@ -213,7 +214,7 @@ def purge_jobs(self): self.conn.commit() self.conn.execute("VACUUM") - def delete_job(self, job_id): + def delete_job_safe(self, job_id): cursor = self.conn.cursor() cursor.execute( "DELETE FROM jobs WHERE id = ? AND ( status = ? OR status = ? );", @@ -222,6 +223,15 @@ def delete_job(self, job_id): self.conn.commit() self.conn.execute("VACUUM") + def delete_job(self, job_id): + cursor = self.conn.cursor() + cursor.execute( + "DELETE FROM jobs WHERE id = ?;", + (str(job_id),), + ) + self.conn.commit() + self.conn.execute("VACUUM") + def clean_old_jobs(self, limit=10): cursor = self.conn.cursor() cursor.execute( diff --git a/ydl_server/routes.py b/ydl_server/routes.py index 735b742a..4be1b76f 100644 --- a/ydl_server/routes.py +++ b/ydl_server/routes.py @@ -54,6 +54,12 @@ name="api_jobs_retry", methods=["POST"], ), + Route( + "/api/jobs/{job_id:str}", + views.api_jobs_delete, + name="api_jobs_delete", + methods=["DELETE"], + ), Mount("/api/finished/", finished_files, name="api_finished"), Mount("/", static, name="static"), ] diff --git a/ydl_server/views.py b/ydl_server/views.py index e5be4856..b522aa92 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -179,11 +179,17 @@ async def api_jobs_retry(request): job["name"], Job.PENDING, "", JobType.YDL_DOWNLOAD, job["format"], job["urls"] ) - request.app.state.jobshandler.put((Actions.DELETE_LOG, job)) + request.app.state.jobshandler.put((Actions.DELETE_LOG_SAFE, job)) request.app.state.jobshandler.put((Actions.INSERT, new_job)) return JSONResponse({"success": True}) +async def api_jobs_delete(request): + job_id = request.path_params["job_id"] + if job_id is not None: + request.app.state.jobshandler.put((Actions.DELETE_LOG, {'id': job_id})) + return JSONResponse({"success": True}) + return JSONResponse({"success": False}) async def api_queue_download(request): if request.headers.get("Content-Type") == "application/x-www-form-urlencoded": From f36fdca2acbcb8b9f4f8f8fb5c4c9743dbfef684 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 9 Feb 2024 03:14:09 +0000 Subject: [PATCH 433/570] Update dependency vue to v3.4.18 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 126 ++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index f346c593..cc894e66 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -32,9 +32,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -744,49 +744,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", - "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.18.tgz", + "integrity": "sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==", "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/shared": "3.4.15", + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", - "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.18.tgz", + "integrity": "sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==", "dependencies": { - "@vue/compiler-core": "3.4.15", - "@vue/shared": "3.4.15" + "@vue/compiler-core": "3.4.18", + "@vue/shared": "3.4.18" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz", - "integrity": "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==", - "dependencies": { - "@babel/parser": "^7.23.6", - "@vue/compiler-core": "3.4.15", - "@vue/compiler-dom": "3.4.15", - "@vue/compiler-ssr": "3.4.15", - "@vue/shared": "3.4.15", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.18.tgz", + "integrity": "sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.18", + "@vue/compiler-dom": "3.4.18", + "@vue/compiler-ssr": "3.4.18", + "@vue/shared": "3.4.18", "estree-walker": "^2.0.2", - "magic-string": "^0.30.5", + "magic-string": "^0.30.6", "postcss": "^8.4.33", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz", - "integrity": "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.18.tgz", + "integrity": "sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==", "dependencies": { - "@vue/compiler-dom": "3.4.15", - "@vue/shared": "3.4.15" + "@vue/compiler-dom": "3.4.18", + "@vue/shared": "3.4.18" } }, "node_modules/@vue/devtools-api": { @@ -795,48 +795,48 @@ "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.15.tgz", - "integrity": "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.18.tgz", + "integrity": "sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==", "dependencies": { - "@vue/shared": "3.4.15" + "@vue/shared": "3.4.18" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.15.tgz", - "integrity": "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.18.tgz", + "integrity": "sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==", "dependencies": { - "@vue/reactivity": "3.4.15", - "@vue/shared": "3.4.15" + "@vue/reactivity": "3.4.18", + "@vue/shared": "3.4.18" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz", - "integrity": "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.18.tgz", + "integrity": "sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==", "dependencies": { - "@vue/runtime-core": "3.4.15", - "@vue/shared": "3.4.15", + "@vue/runtime-core": "3.4.18", + "@vue/shared": "3.4.18", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.15.tgz", - "integrity": "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==", + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.18.tgz", + "integrity": "sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==", "dependencies": { - "@vue/compiler-ssr": "3.4.15", - "@vue/shared": "3.4.15" + "@vue/compiler-ssr": "3.4.18", + "@vue/shared": "3.4.18" }, "peerDependencies": { - "vue": "3.4.15" + "vue": "3.4.18" } }, "node_modules/@vue/shared": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", - "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==" + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.18.tgz", + "integrity": "sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==" }, "node_modules/acorn": { "version": "8.11.3", @@ -1635,9 +1635,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -2146,15 +2146,15 @@ } }, "node_modules/vue": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.15.tgz", - "integrity": "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==", - "dependencies": { - "@vue/compiler-dom": "3.4.15", - "@vue/compiler-sfc": "3.4.15", - "@vue/runtime-dom": "3.4.15", - "@vue/server-renderer": "3.4.15", - "@vue/shared": "3.4.15" + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.18.tgz", + "integrity": "sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==", + "dependencies": { + "@vue/compiler-dom": "3.4.18", + "@vue/compiler-sfc": "3.4.18", + "@vue/runtime-dom": "3.4.18", + "@vue/server-renderer": "3.4.18", + "@vue/shared": "3.4.18" }, "peerDependencies": { "typescript": "*" From 439625c3f3c77bb6f0637133ceda68d2ef8a0f95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 10 Feb 2024 02:15:20 +0000 Subject: [PATCH 434/570] Update dependency starlette to v0.37.1 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2f164bbf..5b946f81 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.36.2 +starlette==0.37.1 uvicorn==0.27.0.post1 aiofiles==23.2.1 Jinja2==3.1.3 From f8831b786dda1bca3f33ba6795b434a03c5aeb25 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 10 Feb 2024 16:16:30 +0000 Subject: [PATCH 435/570] Update dependency uvicorn to v0.27.1 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5b946f81..b64c306c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.37.1 -uvicorn==0.27.0.post1 +uvicorn==0.27.1 aiofiles==23.2.1 Jinja2==3.1.3 PyYAML==6.0.1 From 3b4ebbfa79bcb271b87f6cb8fbfcfbfe4ebe1c29 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 14 Feb 2024 19:07:26 -0500 Subject: [PATCH 436/570] Add stats link --- front/src/assets/style.css | 5 +++++ front/src/components/Header.vue | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/front/src/assets/style.css b/front/src/assets/style.css index fd49c3be..b21836ca 100644 --- a/front/src/assets/style.css +++ b/front/src/assets/style.css @@ -64,6 +64,11 @@ div.input-group>input.form-control { color: white; } +.stats-link { + color: white; + text-decoration: none; +} + .footer { width: 100%; } diff --git a/front/src/components/Header.vue b/front/src/components/Header.vue index 7cc537c5..1e9490ae 100644 --- a/front/src/components/Header.vue +++ b/front/src/components/Header.vue @@ -48,7 +48,7 @@ export default {
+ + + From 494a73248e505c9683d99d94f95563a65edbedaa Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 14 Feb 2024 19:22:57 -0500 Subject: [PATCH 438/570] bumps --- front/package-lock.json | 711 ++++++---------------------------------- front/package.json | 14 +- 2 files changed, 108 insertions(+), 617 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index cc894e66..47e9da2b 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -8,18 +8,18 @@ "name": "youtube-dl-server", "version": "0.0.0", "dependencies": { - "bootstrap": "^5.2.3", + "bootstrap": "^5.3.2", "lodash": "^4.17.21", - "vue": "^3.4.15", + "vue": "^3.4.19", "vue-cookies": "^1.8.3", - "vue-router": "^4.1.6" + "vue-router": "^4.2.5" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.0.3", - "eslint": "^8.42.0", + "@vitejs/plugin-vue": "^5.0.4", + "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.20.1", - "vite": "^5.0.12" + "eslint-plugin-vue": "^9.21.1", + "vite": "^5.1.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -42,150 +42,6 @@ "node": ">=6.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-arm64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", @@ -202,214 +58,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -549,75 +197,10 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz", + "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==", "cpu": [ "arm64" ], @@ -628,9 +211,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz", + "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==", "cpu": [ "arm64" ], @@ -640,84 +223,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -731,9 +236,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", - "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -744,36 +249,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.18.tgz", - "integrity": "sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.19.tgz", + "integrity": "sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==", "dependencies": { "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.18", + "@vue/shared": "3.4.19", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.18.tgz", - "integrity": "sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz", + "integrity": "sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==", "dependencies": { - "@vue/compiler-core": "3.4.18", - "@vue/shared": "3.4.18" + "@vue/compiler-core": "3.4.19", + "@vue/shared": "3.4.19" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.18.tgz", - "integrity": "sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz", + "integrity": "sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==", "dependencies": { "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.18", - "@vue/compiler-dom": "3.4.18", - "@vue/compiler-ssr": "3.4.18", - "@vue/shared": "3.4.18", + "@vue/compiler-core": "3.4.19", + "@vue/compiler-dom": "3.4.19", + "@vue/compiler-ssr": "3.4.19", + "@vue/shared": "3.4.19", "estree-walker": "^2.0.2", "magic-string": "^0.30.6", "postcss": "^8.4.33", @@ -781,12 +286,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.18.tgz", - "integrity": "sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz", + "integrity": "sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==", "dependencies": { - "@vue/compiler-dom": "3.4.18", - "@vue/shared": "3.4.18" + "@vue/compiler-dom": "3.4.19", + "@vue/shared": "3.4.19" } }, "node_modules/@vue/devtools-api": { @@ -795,48 +300,48 @@ "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.18.tgz", - "integrity": "sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.19.tgz", + "integrity": "sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==", "dependencies": { - "@vue/shared": "3.4.18" + "@vue/shared": "3.4.19" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.18.tgz", - "integrity": "sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.19.tgz", + "integrity": "sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==", "dependencies": { - "@vue/reactivity": "3.4.18", - "@vue/shared": "3.4.18" + "@vue/reactivity": "3.4.19", + "@vue/shared": "3.4.19" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.18.tgz", - "integrity": "sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.19.tgz", + "integrity": "sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==", "dependencies": { - "@vue/runtime-core": "3.4.18", - "@vue/shared": "3.4.18", + "@vue/runtime-core": "3.4.19", + "@vue/shared": "3.4.19", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.18.tgz", - "integrity": "sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.19.tgz", + "integrity": "sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==", "dependencies": { - "@vue/compiler-ssr": "3.4.18", - "@vue/shared": "3.4.18" + "@vue/compiler-ssr": "3.4.19", + "@vue/shared": "3.4.19" }, "peerDependencies": { - "vue": "3.4.18" + "vue": "3.4.19" } }, "node_modules/@vue/shared": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.18.tgz", - "integrity": "sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==" + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.19.tgz", + "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==" }, "node_modules/acorn": { "version": "8.11.3", @@ -1320,9 +825,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1382,20 +887,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1459,9 +950,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -1799,9 +1290,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "funding": [ { "type": "opencollective", @@ -1911,9 +1402,9 @@ } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz", + "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -1926,19 +1417,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.10.0", + "@rollup/rollup-android-arm64": "4.10.0", + "@rollup/rollup-darwin-arm64": "4.10.0", + "@rollup/rollup-darwin-x64": "4.10.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.10.0", + "@rollup/rollup-linux-arm64-gnu": "4.10.0", + "@rollup/rollup-linux-arm64-musl": "4.10.0", + "@rollup/rollup-linux-riscv64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-musl": "4.10.0", + "@rollup/rollup-win32-arm64-msvc": "4.10.0", + "@rollup/rollup-win32-ia32-msvc": "4.10.0", + "@rollup/rollup-win32-x64-msvc": "4.10.0", "fsevents": "~2.3.2" } }, @@ -1966,9 +1457,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2091,13 +1582,13 @@ "dev": true }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.2.tgz", + "integrity": "sha512-uwiFebQbTWRIGbCaTEBVAfKqgqKNKMJ2uPXsXeLIZxM8MVMjoS3j0cG8NrPxdDIadaWnPSjrkLWffLSC+uiP3Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", - "postcss": "^8.4.32", + "postcss": "^8.4.35", "rollup": "^4.2.0" }, "bin": { @@ -2146,15 +1637,15 @@ } }, "node_modules/vue": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.18.tgz", - "integrity": "sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==", - "dependencies": { - "@vue/compiler-dom": "3.4.18", - "@vue/compiler-sfc": "3.4.18", - "@vue/runtime-dom": "3.4.18", - "@vue/server-renderer": "3.4.18", - "@vue/shared": "3.4.18" + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.19.tgz", + "integrity": "sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==", + "dependencies": { + "@vue/compiler-dom": "3.4.19", + "@vue/compiler-sfc": "3.4.19", + "@vue/runtime-dom": "3.4.19", + "@vue/server-renderer": "3.4.19", + "@vue/shared": "3.4.19" }, "peerDependencies": { "typescript": "*" diff --git a/front/package.json b/front/package.json index 8b5f0c93..2d4ffe76 100644 --- a/front/package.json +++ b/front/package.json @@ -9,17 +9,17 @@ "preview": "vite preview" }, "dependencies": { - "bootstrap": "^5.2.3", + "bootstrap": "^5.3.2", "lodash": "^4.17.21", - "vue": "^3.4.15", + "vue": "^3.4.19", "vue-cookies": "^1.8.3", - "vue-router": "^4.1.6" + "vue-router": "^4.2.5" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.0.3", - "eslint": "^8.42.0", + "@vitejs/plugin-vue": "^5.0.4", + "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.20.1", - "vite": "^5.0.12" + "eslint-plugin-vue": "^9.21.1", + "vite": "^5.1.2" } } From ed11a6577c5122df932513d12e1aaf7fca866cac Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 17 Feb 2024 13:05:49 -0500 Subject: [PATCH 439/570] Add pretty spinner --- front/src/components/Home.vue | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index d1423ef9..5aa4c1b6 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -13,6 +13,7 @@ export default { urlBox: null, selectedFormat: null, metadata_list: null, + loading: false, }), mounted() { this.extractorsModal = new Modal('#extractorsModal'); @@ -108,6 +109,7 @@ export default { }); } else { + this.loading = true; const url = getAPIUrl('api/metadata', import.meta.env); fetch(url, { method: 'POST', @@ -133,6 +135,9 @@ export default { .catch((error) => { console.error(error); this.setDismissibleMessage(false, 'Could not gather metadata for this video.'); + }) + .finally(() => { + this.loading = false; }); } } @@ -161,7 +166,13 @@ export default {
- +
From 43e81b6d1ce8c879a16dd671acad3bf185caccbc Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 17 Feb 2024 20:50:57 -0500 Subject: [PATCH 440/570] fix dependencies --- front/package-lock.json | 565 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 537 insertions(+), 28 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 47e9da2b..4fe7f9b4 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -42,6 +42,150 @@ "node": ">=6.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-arm64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", @@ -58,6 +202,214 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -197,10 +549,75 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz", - "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", "cpu": [ "arm64" ], @@ -211,9 +628,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz", - "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", "cpu": [ "arm64" ], @@ -223,6 +640,84 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -295,9 +790,9 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", - "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { "version": "3.4.19", @@ -887,6 +1382,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1402,9 +1911,9 @@ } }, "node_modules/rollup": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz", - "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -1417,19 +1926,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.10.0", - "@rollup/rollup-android-arm64": "4.10.0", - "@rollup/rollup-darwin-arm64": "4.10.0", - "@rollup/rollup-darwin-x64": "4.10.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.10.0", - "@rollup/rollup-linux-arm64-gnu": "4.10.0", - "@rollup/rollup-linux-arm64-musl": "4.10.0", - "@rollup/rollup-linux-riscv64-gnu": "4.10.0", - "@rollup/rollup-linux-x64-gnu": "4.10.0", - "@rollup/rollup-linux-x64-musl": "4.10.0", - "@rollup/rollup-win32-arm64-msvc": "4.10.0", - "@rollup/rollup-win32-ia32-msvc": "4.10.0", - "@rollup/rollup-win32-x64-msvc": "4.10.0", + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", "fsevents": "~2.3.2" } }, @@ -1582,9 +2091,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.2.tgz", - "integrity": "sha512-uwiFebQbTWRIGbCaTEBVAfKqgqKNKMJ2uPXsXeLIZxM8MVMjoS3j0cG8NrPxdDIadaWnPSjrkLWffLSC+uiP3Q==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", + "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", "dev": true, "dependencies": { "esbuild": "^0.19.3", From ea8c590e6cbf8a3480cb0967b1476f592c15d43e Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 17 Feb 2024 21:09:44 -0500 Subject: [PATCH 441/570] consolidate dockerfile --- Dockerfile | 30 ++++++++++++++++++++------ Dockerfile-ytdlp | 56 ------------------------------------------------ Jenkinsfile | 4 ++-- 3 files changed, 25 insertions(+), 65 deletions(-) delete mode 100644 Dockerfile-ytdlp diff --git a/Dockerfile b/Dockerfile index cf9ca978..ae753b6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ # https://github.com/nbr23/youtube-dl-server # +ARG YOUTUBE_DL=yt-dlp FROM --platform=$BUILDPLATFORM node:21-alpine as nodebuild WORKDIR /app @@ -12,14 +13,16 @@ RUN npm ci COPY ./front /app RUN npm run build - FROM python:alpine3.18 as wheels RUN apk add --no-cache g++ -RUN pip install --upgrade --no-cache-dir pip && pip wheel --no-cache-dir --no-deps --wheel-dir /out/wheels brotli pycryptodomex websockets pyyaml +COPY ./requirements.txt . +RUN pip install --upgrade --no-cache-dir pip \ + && pip wheel --no-cache-dir --wheel-dir /out/wheels -r <(cat ./requirements.txt| grep -v youtube-dl | grep -v yt-dlp) \ + && pip wheel --no-cache-dir --wheel-dir /out/wheels-youtube-dl youtube-dl \ + && pip wheel --no-cache-dir --wheel-dir /out/wheels-yt-dlp yt-dlp -FROM python:alpine3.18 -ARG YOUTUBE_DL=youtube_dl +FROM python:alpine3.18 as base ARG ATOMICPARSLEY=0 ARG YDLS_VERSION ARG YDLS_RELEASE_DATE @@ -27,18 +30,31 @@ ARG YDLS_RELEASE_DATE ENV YDLS_VERSION=$YDLS_VERSION ENV YDLS_RELEASE_DATE=$YDLS_RELEASE_DATE +RUN mkdir -p /usr/src/app +RUN apk add --no-cache ffmpeg tzdata mailcap +RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi + VOLUME "/youtube-dl" VOLUME "/app_config" COPY --from=wheels /out/wheels /wheels RUN pip install --no-cache /wheels/* -RUN mkdir -p /usr/src/app -RUN apk add --no-cache ffmpeg tzdata mailcap -RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi COPY ./requirements.txt /usr/src/app/ + +FROM base as yt-dlp + +COPY --from=wheels /out/wheels-yt-dlp /wheels + +RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) + +FROM base as youtube-dl + +COPY --from=wheels /out/wheels-youtube-dl /wheels RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v yt-dlp) +FROM ${YOUTUBE_DL} + COPY ./config.yml /usr/src/app/default_config.yml COPY ./ydl_server /usr/src/app/ydl_server COPY ./youtube-dl-server.py /usr/src/app/ diff --git a/Dockerfile-ytdlp b/Dockerfile-ytdlp deleted file mode 100644 index d6648580..00000000 --- a/Dockerfile-ytdlp +++ /dev/null @@ -1,56 +0,0 @@ -# -# youtube-dl Server Dockerfile -# -# https://github.com/nbr23/youtube-dl-server -# - -FROM --platform=$BUILDPLATFORM node:21-alpine as nodebuild - -WORKDIR /app -COPY ./front/package*.json /app -RUN npm ci -COPY ./front /app -RUN npm run build - -FROM python:alpine3.18 as wheels - -RUN apk add --no-cache g++ gcc libffi-dev cargo -COPY ./requirements.txt . -RUN pip install --upgrade --no-cache-dir pip && pip wheel --no-cache-dir --wheel-dir /out/wheels -r <(cat ./requirements.txt| grep -v youtube-dl) - -FROM python:alpine3.18 -ARG YOUTUBE_DL=yt_dlp -ARG ATOMICPARSLEY=0 -ARG YDLS_VERSION -ARG YDLS_RELEASE_DATE - -ENV YDLS_VERSION=$YDLS_VERSION -ENV YDLS_RELEASE_DATE=$YDLS_RELEASE_DATE - -VOLUME "/youtube-dl" -VOLUME "/app_config" - -COPY --from=wheels /out/wheels /wheels -RUN pip install --upgrade --no-cache-dir pip && pip install --no-cache-dir /wheels/* - -RUN mkdir -p /usr/src/app -RUN apk add --no-cache ffmpeg tzdata mailcap -RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi -COPY ./requirements.txt /usr/src/app/ -RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) - -COPY ./config.yml /usr/src/app/default_config.yml -COPY ./ydl_server /usr/src/app/ydl_server -COPY ./youtube-dl-server.py /usr/src/app/ - -COPY --from=nodebuild /app/dist /usr/src/app/ydl_server/static - -WORKDIR /usr/src/app - - -EXPOSE 8080 - -ENV YOUTUBE_DL=$YOUTUBE_DL -ENV YDL_CONFIG_PATH='/app_config' -CMD [ "python", "-u", "./youtube-dl-server.py" ] -HEALTHCHECK CMD wget 127.0.0.1:8080/api/info --spider -q diff --git a/Jenkinsfile b/Jenkinsfile index 3afd9a9e..47675244 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -37,13 +37,12 @@ pipeline { --platform linux/amd64,linux/arm64,linux/arm/v7 \ --build-arg YDLS_VERSION=`git rev-parse --short HEAD` \ --build-arg YDLS_RELEASE_DATE="`git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'`" \ - --build-arg YOUTUBE_DL=yt_dlp \ + --build-arg YOUTUBE_DL=yt-dlp \ --build-arg ATOMICPARSLEY=1 \ -t nbr23/youtube-dl-server:yt-dlp \ -t nbr23/youtube-dl-server:`git rev-parse --short HEAD`-yt-dlp \ -t nbr23/youtube-dl-server:${GIT_COMMIT}-`date +%s`-yt-dlp \ -t nbr23/youtube-dl-server:yt-dlp_atomicparsley \ - -f Dockerfile-ytdlp \ ${ "$GIT_BRANCH" == "master" ? "--push" : ""} . """ } @@ -61,6 +60,7 @@ pipeline { --build-arg YDLS_VERSION=`git rev-parse --short HEAD` \ --build-arg YDLS_RELEASE_DATE="`git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'`" \ --build-arg ATOMICPARSLEY=1 \ + --build-arg YOUTUBE_DL=youtube-dl \ -t nbr23/youtube-dl-server:latest \ -t nbr23/youtube-dl-server:youtube-dl \ -t nbr23/youtube-dl-server:`git rev-parse --short HEAD`-youtube-dl \ From 567b765969207cdf4b89bfa9146ef5327bb3f659 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 17 Feb 2024 21:14:43 -0500 Subject: [PATCH 442/570] Update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a8cc221..89e25f6d 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ to download the required front-end libraries (jquery, bootstrap). python3 -u ./youtube-dl-server.py ``` -To force a specific `youtube-dl` version/fork (eg `youtube-dlc` or `yt-dlp`), use the +To force a specific `youtube-dl` version/fork (eg `yt-dlp`), use the variable `YOUTUBE_DL`: ```shell @@ -224,4 +224,4 @@ This docker image is based on ## Additional references -* [ytdl-k8s](https://github.com/droopy4096/ytdl-k8s) - `youtube-dl-server` Helm chart (uses `youtube-dl-server` image for kubernetes deployment) \ No newline at end of file +* [ytdl-k8s](https://github.com/droopy4096/ytdl-k8s) - `youtube-dl-server` Helm chart (uses `youtube-dl-server` image for kubernetes deployment) From 453b20086b728710c53216567da438501d55a5c7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 18 Feb 2024 10:13:13 -0500 Subject: [PATCH 443/570] Fix dockerfile --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae753b6b..299d706f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,12 +45,13 @@ COPY ./requirements.txt /usr/src/app/ FROM base as yt-dlp COPY --from=wheels /out/wheels-yt-dlp /wheels - +RUN pip install --no-cache /wheels/* RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) FROM base as youtube-dl -COPY --from=wheels /out/wheels-youtube-dl /wheels +COPY --from=wheels /out/wheels-youtube-dl /wheels/ +RUN pip install --no-cache /wheels/* RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v yt-dlp) FROM ${YOUTUBE_DL} From de8dc1eb7a10bbc7f029489850b6015993ed1d92 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 18 Feb 2024 11:05:01 -0500 Subject: [PATCH 444/570] permit searching extractors --- front/src/components/Home.vue | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index 5aa4c1b6..93abe8da 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -14,6 +14,7 @@ export default { selectedFormat: null, metadata_list: null, loading: false, + extractorsFilter: '', }), mounted() { this.extractorsModal = new Modal('#extractorsModal'); @@ -25,6 +26,12 @@ export default { this.fetchAvailableFormats(); }, + computed: { + filteredExtractors() { + return this.extractorsFilter ? this.extractors.filter(extractor => extractor.toLowerCase().includes(this.extractorsFilter.toLowerCase())) : this.extractors; + } + }, + methods: { prettySize(size_b) { if (size_b == null) { @@ -187,9 +194,10 @@ export default {
diff --git a/ydl_server/config.py b/ydl_server/config.py index 898d9544..db2e72ad 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -23,7 +23,6 @@ "audio/vorbis": "Vorbis", "audio/wav": "WAV", }, - "Metadata only": {"metadata": "Metadata"}, } From 1761b347ee346d2ec6013b9159511324053c8966 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 18 Feb 2024 11:25:04 -0500 Subject: [PATCH 446/570] add home route --- front/src/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/front/src/main.js b/front/src/main.js index 4d79886a..76b632ca 100644 --- a/front/src/main.js +++ b/front/src/main.js @@ -13,6 +13,7 @@ import Finished from './components/Finished.vue'; const routes = [ { path: '/', component: Home }, + { path: '/home', component: Home }, { path: '/logs', component: Logs }, { path: '/finished', component: Finished }, ]; From d98395d2c43a11185bf47e2250480f521c29a215 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 21 Feb 2024 18:59:51 -0500 Subject: [PATCH 447/570] bump --- front/package-lock.json | 32 ++++++++++++++++---------------- front/package.json | 6 +++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 4fe7f9b4..b57316ba 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -8,18 +8,18 @@ "name": "youtube-dl-server", "version": "0.0.0", "dependencies": { - "bootstrap": "^5.3.2", + "bootstrap": "^5.3.3", "lodash": "^4.17.21", "vue": "^3.4.19", "vue-cookies": "^1.8.3", - "vue-router": "^4.2.5" + "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", "eslint-plugin-vue": "^9.21.1", - "vite": "^5.1.2" + "vite": "^5.1.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -918,9 +918,9 @@ "dev": true }, "node_modules/bootstrap": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", - "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "funding": [ { "type": "github", @@ -1371,9 +1371,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/fs.realpath": { @@ -2091,9 +2091,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz", - "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -2195,11 +2195,11 @@ } }, "node_modules/vue-router": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", - "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz", + "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==", "dependencies": { - "@vue/devtools-api": "^6.5.0" + "@vue/devtools-api": "^6.5.1" }, "funding": { "url": "https://github.com/sponsors/posva" diff --git a/front/package.json b/front/package.json index 2d4ffe76..ecf9b61a 100644 --- a/front/package.json +++ b/front/package.json @@ -9,17 +9,17 @@ "preview": "vite preview" }, "dependencies": { - "bootstrap": "^5.3.2", + "bootstrap": "^5.3.3", "lodash": "^4.17.21", "vue": "^3.4.19", "vue-cookies": "^1.8.3", - "vue-router": "^4.2.5" + "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "eslint": "^8.56.0", "eslint-config-google": "^0.14.0", "eslint-plugin-vue": "^9.21.1", - "vite": "^5.1.2" + "vite": "^5.1.4" } } From 9facbc67d437bba59de8b52e975715751392c6c9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 21 Feb 2024 20:09:45 -0500 Subject: [PATCH 448/570] cleanups --- Dockerfile | 8 +++----- README.md | 6 ------ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 299d706f..d4d04e1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN npm ci COPY ./front /app RUN npm run build -FROM python:alpine3.18 as wheels +FROM python:alpine as wheels RUN apk add --no-cache g++ COPY ./requirements.txt . @@ -22,7 +22,7 @@ RUN pip install --upgrade --no-cache-dir pip \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-youtube-dl youtube-dl \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-yt-dlp yt-dlp -FROM python:alpine3.18 as base +FROM python:alpine as base ARG ATOMICPARSLEY=0 ARG YDLS_VERSION ARG YDLS_RELEASE_DATE @@ -30,7 +30,7 @@ ARG YDLS_RELEASE_DATE ENV YDLS_VERSION=$YDLS_VERSION ENV YDLS_RELEASE_DATE=$YDLS_RELEASE_DATE -RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app RUN apk add --no-cache ffmpeg tzdata mailcap RUN if [ $ATOMICPARSLEY == 1 ]; then apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing atomicparsley; ln /usr/bin/atomicparsley /usr/bin/AtomicParsley || true; fi @@ -62,8 +62,6 @@ COPY ./youtube-dl-server.py /usr/src/app/ COPY --from=nodebuild /app/dist /usr/src/app/ydl_server/static -WORKDIR /usr/src/app - EXPOSE 8080 ENV YOUTUBE_DL=$YOUTUBE_DL diff --git a/README.md b/README.md index 89e25f6d..e6e0744e 100644 --- a/README.md +++ b/README.md @@ -123,12 +123,6 @@ Install the python dependencies from `requirements.txt`: pip install -r requirements.txt ``` -OR, if using `yt-dlp`: - -```shell -pip install -r requirements-yt-dlp.txt -``` - You can run [bootstrap.sh](https://github.com/nbr23/youtube-dl-server/blob/master/bootstrap.sh) to download the required front-end libraries (jquery, bootstrap). From 1bce96e9ca9157af34cccc85022076ae743b49b7 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 29 Feb 2024 20:34:53 -0500 Subject: [PATCH 449/570] Better output_playlist default in config.yml --- config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yml b/config.yml index 1bc53cb3..697ae948 100644 --- a/config.yml +++ b/config.yml @@ -3,7 +3,7 @@ ydl_server: # youtube-dl-server specific settings host: 0.0.0.0 # IP youtube-dl-server should bind to debug: False # Enable/Disable debug mode metadata_db_path: '/youtube-dl/.ydl-metadata.db' # Path to metadata DB - output_playlist: '/youtube-dl/%(title)s [%(id)s].%(ext)s' # Playlist output directory template + output_playlist: '/youtube-dl/%(playlist_title)s [%(playlist_id)s]/%(title)s.%(ext)s' # Playlist output directory template max_log_entries: 100 # Maximum number of job log history to keep forwarded_allow_ips: None # uvicorn Comma seperated list of IPs to trust with proxy headers. proxy_headers: True # uvicorn flag Enable/Disable X-Forwarded-Proto, X-Forwarded-For, X-Forwarded-Port to populate remote address info. From 9c372d194b89a96688b90540077868c2fe6d9961 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 8 Mar 2024 20:42:24 -0500 Subject: [PATCH 450/570] README cleanup --- README.md | 37 ++++++++----------------------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e6e0744e..739e5436 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Simple Web and REST interface for downloading youtube videos onto a server. [`starlette`](https://www.starlette.io/) + -[`youtube-dl`](https://github.com/rg3/youtube-dl) +[`youtube-dl`](https://github.com/rg3/youtube-dl) / [yt-dlp](https://github.com/yt-dlp/yt-dlp) Forked from [manbearwiz/youtube-dl-server](https://github.com/manbearwiz/youtube-dl-server). @@ -20,15 +20,9 @@ Forked from [manbearwiz/youtube-dl-server](https://github.com/manbearwiz/youtube For easier deployment, a docker image is available on [dockerhub](https://hub.docker.com/r/nbr23/youtube-dl-server): -- `nbr23/youtube-dl-server:latest` to use `youtube-dl` +- `nbr23/youtube-dl-server:youtube-dl` to use `youtube-dl` - `nbr23/youtube-dl-server:yt-dlp` to use `yt-dlp` -### Ansible - -The ansible role -[ansible-role-youtubedl-server](https://github.com/nbr23/ansible-role-youtubedl-server) -deploys `youtube-dl-server` using `docker` and `nginx`. - ### Docker CLI This example uses the docker run command to create the container to run the @@ -57,11 +51,6 @@ This is an example service definition that could be put in `docker-compose.yml`. - ./config.yml:/app_config/config.yml:ro # Overwrite the container's config file with your own configuration restart: always ``` -### HomeAssistant Addon - -In the addons store add the repository (https://github.com/unofficial-skills/addons) or click the buton [![adds addon repo.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Funofficial-skills%2Faddons). - -Once the addon repository has been added, you should be able to install (YouTube Dl Server) from the Unofficial-skills section. ## Configuration @@ -199,23 +188,13 @@ javascript:(function(){document.body.innerHTML += '
Date: Sun, 10 Mar 2024 12:17:10 +0000 Subject: [PATCH 451/570] Update dependency uvicorn to v0.28.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b64c306c..415c81c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.37.1 -uvicorn==0.27.1 +uvicorn==0.28.0 aiofiles==23.2.1 Jinja2==3.1.3 PyYAML==6.0.1 From 11766cb648547cb1bd289394b2b04bbd4bfabbb3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 12 Mar 2024 01:24:15 +0000 Subject: [PATCH 452/570] Update dependency yt-dlp to v2024 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 415c81c6..39032190 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,4 @@ aiofiles==23.2.1 Jinja2==3.1.3 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2023.12.30 +yt-dlp==2024.3.10 From 2573ecdaf06d47be78feeb0cf5163471e1a3dfb1 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Mar 2024 23:08:52 -0400 Subject: [PATCH 453/570] Add doc about profiles --- README.md | 34 ++++++++++++++++++++++++++++++++++ config.yml | 13 +++++++++++++ 2 files changed, 47 insertions(+) diff --git a/README.md b/README.md index 739e5436..1accf16f 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,8 @@ ydl_options: cache-dir: '/youtube-dl/.cache' ``` +### Extra options + Additional youtube-dl parameters can be set in the `ydl_options` sections. To do this, simply add regular youtube-dl parameters, removing the leading `--`. @@ -101,6 +103,37 @@ ydl_options: sub-lang: es ``` +### Profiles + +You can also define profiles. They allow you to define configuration sets that can be selected in the UI. + +Sample: + +```yaml +profiles: + podcast: + name: 'Audio Podcasts' + ydl_options: + output: '/youtube-dl/Podcast/%(title)s [%(id)s].%(ext)s' + format: bestaudio/best + write-thumbnail: True + embed-thumbnail: True + add-metadata: True + audio-quality: 0 + extract-audio: True + audio-format: mp3 + philosophy_lectures: + name: 'Philosophy Lectures' + ydl_options: + output: '/youtube-dl/Lectures/Philosophy/%(title)s [%(id)s].%(ext)s' + write-thumbnail: True + embed-thumbnail: True + add-metadata: True + verbose: True +``` + +![screenshot][3] + ## Python If you have python ^3.3.0 installed in your PATH you can simply run like this, @@ -198,3 +231,4 @@ scenarios. [1]:youtube-dl-server.png [2]:youtube-dl-server-logs.png +[3]:youtube-dl-server-profiles.png diff --git a/config.yml b/config.yml index 697ae948..3fc68dbe 100644 --- a/config.yml +++ b/config.yml @@ -15,3 +15,16 @@ ydl_options: # youtube-dl options cache-dir: '/youtube-dl/.cache' # youtube-dl cache directory ignore-errors: True # instruct youtube-dl to skip errors age-limit: 6 # minimal age requirement / parental control setting + +profiles: + podcast: + name: 'Audio Podcasts' + ydl_options: + output: '/youtube-dl/Podcast/%(title)s [%(id)s].%(ext)s' + format: bestaudio/best + write-thumbnail: True + embed-thumbnail: True + add-metadata: True + audio-quality: 0 + extract-audio: True + audio-format: mp3 From d1e0ed6c3684ba69319c72ab060f5926166c8fcc Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Mar 2024 23:11:40 -0400 Subject: [PATCH 454/570] missing screenshot --- youtube-dl-server-profiles.png | Bin 0 -> 197608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 youtube-dl-server-profiles.png diff --git a/youtube-dl-server-profiles.png b/youtube-dl-server-profiles.png new file mode 100644 index 0000000000000000000000000000000000000000..cd194eaa9996369a634e2602d9486dd8a179b858 GIT binary patch literal 197608 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 literal 0 HcmV?d00001 From dbd504731cc2a4d3a6bdc980069cbd0ebb2368e9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 22 Mar 2024 23:13:20 -0400 Subject: [PATCH 455/570] dependency bumps --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 39032190..5a530e53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -starlette==0.37.1 -uvicorn==0.28.0 +starlette==0.37.2 +uvicorn==0.29.0 aiofiles==23.2.1 Jinja2==3.1.3 PyYAML==6.0.1 From 7265f6d74fc776975178546ea668538c9c2ce143 Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 29 Mar 2024 00:07:20 -0400 Subject: [PATCH 456/570] Fix log detail links --- front/src/components/Logs.vue | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/front/src/components/Logs.vue b/front/src/components/Logs.vue index bf33a465..5e661694 100644 --- a/front/src/components/Logs.vue +++ b/front/src/components/Logs.vue @@ -166,20 +166,20 @@ export default {

- - - - + + + + - + - + + + +
No {{ status == null ? '' : status.toLowerCase() + ' ' }}jobs found
{{ log.last_update }} {{ log.name }}
No {{ status == null ? '' : status.toLowerCase() + ' ' }}jobs found
{{ log.last_update }}{{ log.name }}{{ log.format }}
{{ log.last_update }}{{ log.name }}{{ log.format }} - - {{ + + {{ log.status }} / Retry - + {{ log.status }} × + >× From 73f0055d70bba111c30a92d4b1a155399a456fed Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 29 Mar 2024 00:08:41 -0400 Subject: [PATCH 457/570] bump npm stuff --- front/package-lock.json | 517 +++++++++++++++++++++------------------- front/package.json | 8 +- 2 files changed, 277 insertions(+), 248 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index b57316ba..e52e6241 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -10,16 +10,16 @@ "dependencies": { "bootstrap": "^5.3.3", "lodash": "^4.17.21", - "vue": "^3.4.19", + "vue": "^3.4.21", "vue-cookies": "^1.8.3", "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.21.1", - "vite": "^5.1.4" + "eslint-plugin-vue": "^9.24.0", + "vite": "^5.2.7" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -32,9 +32,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -43,9 +43,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -59,9 +59,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -75,9 +75,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -91,9 +91,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -107,9 +107,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -123,9 +123,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -139,9 +139,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -155,9 +155,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -171,9 +171,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -187,9 +187,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -203,9 +203,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -219,9 +219,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -235,9 +235,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -251,9 +251,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -267,9 +267,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -283,9 +283,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -299,9 +299,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -315,9 +315,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -331,9 +331,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -347,9 +347,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -363,9 +363,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -379,9 +379,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -395,9 +395,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -458,9 +458,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -550,9 +550,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", + "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", "cpu": [ "arm" ], @@ -563,9 +563,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", + "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", "cpu": [ "arm64" ], @@ -576,9 +576,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", + "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", "cpu": [ "arm64" ], @@ -589,9 +589,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", + "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", "cpu": [ "x64" ], @@ -602,9 +602,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", + "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", "cpu": [ "arm" ], @@ -615,9 +615,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", + "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", "cpu": [ "arm64" ], @@ -628,9 +628,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", + "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", "cpu": [ "arm64" ], @@ -640,10 +640,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", + "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", + "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", "cpu": [ "riscv64" ], @@ -653,10 +666,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", + "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", + "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", "cpu": [ "x64" ], @@ -667,9 +693,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", + "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", "cpu": [ "x64" ], @@ -680,9 +706,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", + "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", "cpu": [ "arm64" ], @@ -693,9 +719,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", + "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", "cpu": [ "ia32" ], @@ -706,9 +732,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", + "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", "cpu": [ "x64" ], @@ -744,49 +770,49 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.19.tgz", - "integrity": "sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", "dependencies": { "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.19", + "@vue/shared": "3.4.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.19.tgz", - "integrity": "sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", "dependencies": { - "@vue/compiler-core": "3.4.19", - "@vue/shared": "3.4.19" + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.19.tgz", - "integrity": "sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", "dependencies": { "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.19", - "@vue/compiler-dom": "3.4.19", - "@vue/compiler-ssr": "3.4.19", - "@vue/shared": "3.4.19", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.6", - "postcss": "^8.4.33", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.19.tgz", - "integrity": "sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", "dependencies": { - "@vue/compiler-dom": "3.4.19", - "@vue/shared": "3.4.19" + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/devtools-api": { @@ -795,48 +821,48 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.19.tgz", - "integrity": "sha512-+VcwrQvLZgEclGZRHx4O2XhyEEcKaBi50WbxdVItEezUf4fqRh838Ix6amWTdX0CNb/b6t3Gkz3eOebfcSt+UA==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", "dependencies": { - "@vue/shared": "3.4.19" + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.19.tgz", - "integrity": "sha512-/Z3tFwOrerJB/oyutmJGoYbuoadphDcJAd5jOuJE86THNZji9pYjZroQ2NFsZkTxOq0GJbb+s2kxTYToDiyZzw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", "dependencies": { - "@vue/reactivity": "3.4.19", - "@vue/shared": "3.4.19" + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.19.tgz", - "integrity": "sha512-IyZzIDqfNCF0OyZOauL+F4yzjMPN2rPd8nhqPP2N1lBn3kYqJpPHHru+83Rkvo2lHz5mW+rEeIMEF9qY3PB94g==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", "dependencies": { - "@vue/runtime-core": "3.4.19", - "@vue/shared": "3.4.19", + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.19.tgz", - "integrity": "sha512-eAj2p0c429RZyyhtMRnttjcSToch+kTWxFPHlzGMkR28ZbF1PDlTcmGmlDxccBuqNd9iOQ7xPRPAGgPVj+YpQw==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", "dependencies": { - "@vue/compiler-ssr": "3.4.19", - "@vue/shared": "3.4.19" + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { - "vue": "3.4.19" + "vue": "3.4.21" } }, "node_modules/@vue/shared": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.19.tgz", - "integrity": "sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==" + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" }, "node_modules/acorn": { "version": "8.11.3", @@ -1072,9 +1098,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -1084,29 +1110,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escape-string-regexp": { @@ -1122,16 +1148,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1189,16 +1215,17 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.21.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.21.1.tgz", - "integrity": "sha512-XVtI7z39yOVBFJyi8Ljbn7kY9yHzznKXL02qQYn+ta63Iy4A9JFBw6o4OSB9hyD2++tVT+su9kQqetUyCCwhjw==", + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz", + "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.13", - "semver": "^7.5.4", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.0", "vue-eslint-parser": "^9.4.2", "xml-name-validator": "^4.0.0" }, @@ -1635,9 +1662,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -1799,9 +1826,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -1819,16 +1846,16 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1911,9 +1938,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", + "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -1926,19 +1953,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.13.2", + "@rollup/rollup-android-arm64": "4.13.2", + "@rollup/rollup-darwin-arm64": "4.13.2", + "@rollup/rollup-darwin-x64": "4.13.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", + "@rollup/rollup-linux-arm64-gnu": "4.13.2", + "@rollup/rollup-linux-arm64-musl": "4.13.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", + "@rollup/rollup-linux-riscv64-gnu": "4.13.2", + "@rollup/rollup-linux-s390x-gnu": "4.13.2", + "@rollup/rollup-linux-x64-gnu": "4.13.2", + "@rollup/rollup-linux-x64-musl": "4.13.2", + "@rollup/rollup-win32-arm64-msvc": "4.13.2", + "@rollup/rollup-win32-ia32-msvc": "4.13.2", + "@rollup/rollup-win32-x64-msvc": "4.13.2", "fsevents": "~2.3.2" } }, @@ -2002,9 +2031,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -2091,14 +2120,14 @@ "dev": true }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", + "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -2146,15 +2175,15 @@ } }, "node_modules/vue": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.19.tgz", - "integrity": "sha512-W/7Fc9KUkajFU8dBeDluM4sRGc/aa4YJnOYck8dkjgZoXtVsn3OeTGni66FV1l3+nvPA7VBFYtPioaGKUmEADw==", - "dependencies": { - "@vue/compiler-dom": "3.4.19", - "@vue/compiler-sfc": "3.4.19", - "@vue/runtime-dom": "3.4.19", - "@vue/server-renderer": "3.4.19", - "@vue/shared": "3.4.19" + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" }, "peerDependencies": { "typescript": "*" diff --git a/front/package.json b/front/package.json index ecf9b61a..50b6ab17 100644 --- a/front/package.json +++ b/front/package.json @@ -11,15 +11,15 @@ "dependencies": { "bootstrap": "^5.3.3", "lodash": "^4.17.21", - "vue": "^3.4.19", + "vue": "^3.4.21", "vue-cookies": "^1.8.3", "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.21.1", - "vite": "^5.1.4" + "eslint-plugin-vue": "^9.24.0", + "vite": "^5.2.7" } } From d859d130fe1e8c9b76cd59fc977f3631e0610933 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 6 Apr 2024 09:09:39 -0400 Subject: [PATCH 458/570] use vue router for log status links --- front/src/components/Logs.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/front/src/components/Logs.vue b/front/src/components/Logs.vue index 5e661694..dbcf6acf 100644 --- a/front/src/components/Logs.vue +++ b/front/src/components/Logs.vue @@ -116,12 +116,12 @@ export default { Status {{ ['COMPLETED', 'FAILED', 'PENDING', 'RUNNING', 'ABORTED'].includes(status) ? `(${capitalize(status)})` : '(All)' }}
From 53f3a620c9618a6ec073f104337661bee46e753d Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 9 Apr 2024 21:20:50 -0400 Subject: [PATCH 459/570] bump yt-dlp 2024.4.09 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5a530e53..24f5e23f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,4 @@ aiofiles==23.2.1 Jinja2==3.1.3 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.3.10 +yt-dlp==2024.4.09 From 2546fb553a8ac64c312996db1b92ed22304f0435 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 9 Apr 2024 21:22:37 -0400 Subject: [PATCH 460/570] handle profiles better --- ydl_server/views.py | 9 +++++++-- ydl_server/ydlhandler.py | 38 ++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/ydl_server/views.py b/ydl_server/views.py index b522aa92..f66d47f3 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -198,7 +198,12 @@ async def api_queue_download(request): data = await request.json() url = data.get("url") urls = data.get("urls", []) - options = {"format": data.get("format")} + profile = data.get("profile") + format_str = data.get("format") + + if profile: + format_str = ','.join([format_str, profile]) + options = {"format": format_str} if url: urls.append(url) @@ -209,7 +214,7 @@ async def api_queue_download(request): ) job = Job( - ", ".join(urls), Job.PENDING, "", JobType.YDL_DOWNLOAD, data.get("format"), urls + ", ".join(urls), Job.PENDING, "", JobType.YDL_DOWNLOAD, format_str, urls ) request.app.state.jobshandler.put((Actions.INSERT, job)) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 280d9c1f..ba0a7bb5 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -121,22 +121,31 @@ def worker(self, thread_id): ) self.jobshandler.put((Actions.UPDATE, job)) + def get_format_and_profile(self, format_string): + f, p = None, None + for s in format_string.split(","): + if s.startswith("profile/"): + p = s + else: + f = s + return f, p + + def get_profile(self, profile_str): + if not profile_str: + return {} + profile_name = "/".join(profile_str.split("/")[1:]) + profile = self.app_config.get("profiles", {}).get(profile_name, {}).get('ydl_options') + if not profile: + raise Exception("Unknown profile ", profile_str) + return profile + def get_ydl_options(self, ydl_config, request_options): ydl_config = ydl_config.copy() - req_format = request_options.get("format") - - profile = None - if req_format.startswith("profile/"): - profile_name = "/".join(req_format.split("/")[1:]) - profile = ( - self.app_config.get("profiles", {}) - .get(profile_name, {}) - .get("ydl_options") - ) - if not profile: - raise Exception("Unknown profile ", profile_name) - req_format = profile.get("format") - profile = {k: v for k, v in profile.items() if k != "format"} + req_format, req_profile = self.get_format_and_profile(request_options.get("format")) + + profile = self.get_profile(req_profile) + if profile: + req_format = profile.get("format") if req_format is None else req_format if req_format is None: req_format = "video/best" @@ -150,6 +159,7 @@ def get_ydl_options(self, ydl_config, request_options): else: ydl_config.update({"format": req_format}) if profile: + profile = {k: v for k, v in profile.items() if k != "format"} ydl_config.update(profile) return ydl_config From 4fd2978fe6a571fab6888e44ce7cab571f2dec63 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 9 Apr 2024 21:28:32 -0400 Subject: [PATCH 461/570] queue items from inspect popup --- front/src/components/Home.vue | 57 ++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index c6a8683a..91a60549 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -116,6 +116,35 @@ export default { this.loading = false; }); }, + async queueVideo(videoUrl, format) { + const url = getAPIUrl('api/downloads', import.meta.env); + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + urls: [videoUrl], + format + }) + }) + .then(response => { + if (response.status == 200) { + return response.json(); + } + else { + throw new Error(response.statusText); + } + }) + .then(data => { + this.setDismissibleMessage(data.success, data.success ? (this.escapeHtml(videoUrl) + " added to the queue.") : data.error); + this.urlBox.value = ''; + }) + .catch((error) => { + console.error(error); + this.setDismissibleMessage(false, 'Could not add the url to the queue.'); + }); + }, async submitVideo() { const url = getAPIUrl('api/downloads', import.meta.env); fetch(url, { @@ -240,16 +269,30 @@ export default {

- {{ entry.title - }} + + + + + + Queue  + {{ entry.title }} +
- - {{ format.ext }} {{ format.format }} - {{ prettySize(format.filesize) }} - + + + + + + Queue  + {{ format.ext }} {{ format.format }} - {{ prettySize(format.filesize) }} +

From 26c31a313f2e11c2beeb643807cd9c0eeb1268bf Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 9 Apr 2024 21:30:15 -0400 Subject: [PATCH 462/570] npm bumps --- front/package-lock.json | 170 ++++++++++++++++++++-------------------- front/package.json | 6 +- 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index e52e6241..a91e85bb 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -11,15 +11,15 @@ "bootstrap": "^5.3.3", "lodash": "^4.17.21", "vue": "^3.4.21", - "vue-cookies": "^1.8.3", + "vue-cookies": "^1.8.4", "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "eslint": "^8.57.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.24.0", - "vite": "^5.2.7" + "eslint-plugin-vue": "^9.24.1", + "vite": "^5.2.8" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -32,9 +32,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -494,9 +494,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@jridgewell/sourcemap-codec": { @@ -550,9 +550,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", "cpu": [ "arm" ], @@ -563,9 +563,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", "cpu": [ "arm64" ], @@ -576,9 +576,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", "cpu": [ "arm64" ], @@ -589,9 +589,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", "cpu": [ "x64" ], @@ -602,9 +602,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", "cpu": [ "arm" ], @@ -615,9 +615,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", "cpu": [ "arm64" ], @@ -628,9 +628,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", "cpu": [ "arm64" ], @@ -641,9 +641,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", "cpu": [ "ppc64le" ], @@ -654,9 +654,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", "cpu": [ "riscv64" ], @@ -667,9 +667,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", "cpu": [ "s390x" ], @@ -680,9 +680,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", "cpu": [ "x64" ], @@ -693,9 +693,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", "cpu": [ "x64" ], @@ -706,9 +706,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", "cpu": [ "arm64" ], @@ -719,9 +719,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", "cpu": [ "ia32" ], @@ -732,9 +732,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", "cpu": [ "x64" ], @@ -1215,9 +1215,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz", - "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==", + "version": "9.24.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.1.tgz", + "integrity": "sha512-wk3SuwmS1pZdcuJlokGYEi/buDOwD6KltvhIZyOnpJ/378dcQ4zchu9PAMbbLAaydCz1iYc5AozszcOOgZIIOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -1233,7 +1233,7 @@ "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-scope": { @@ -1662,9 +1662,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -1938,9 +1938,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -1953,21 +1953,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", "fsevents": "~2.3.2" } }, @@ -2120,9 +2120,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", - "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -2195,9 +2195,9 @@ } }, "node_modules/vue-cookies": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.8.3.tgz", - "integrity": "sha512-VBRsyRMVdahBgFfh389TMHPmDdr4URDJNMk4FKSCfuNITs7+jitBDhwyL4RJd3WUsfOYNNjPAkfbehyH9AFuoA==" + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.8.4.tgz", + "integrity": "sha512-9zjvACKE4W0kEb8OQtXzpizKhf6zfFOG/Z1TEUjSJn4Z4rintuAHo8y/FpCUhTWHMmPe8E+Fko+/tiXVM+5jOw==" }, "node_modules/vue-eslint-parser": { "version": "9.4.2", diff --git a/front/package.json b/front/package.json index 50b6ab17..8e243606 100644 --- a/front/package.json +++ b/front/package.json @@ -12,14 +12,14 @@ "bootstrap": "^5.3.3", "lodash": "^4.17.21", "vue": "^3.4.21", - "vue-cookies": "^1.8.3", + "vue-cookies": "^1.8.4", "vue-router": "^4.3.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", "eslint": "^8.57.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-vue": "^9.24.0", - "vite": "^5.2.7" + "eslint-plugin-vue": "^9.24.1", + "vite": "^5.2.8" } } From 0dfe6e9577ef45e4dcc806b5ec8d2003a4c0eaa2 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 10 Apr 2024 22:54:36 -0400 Subject: [PATCH 463/570] prettier format display --- front/src/components/Logs.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/front/src/components/Logs.vue b/front/src/components/Logs.vue index dbcf6acf..353fed72 100644 --- a/front/src/components/Logs.vue +++ b/front/src/components/Logs.vue @@ -52,6 +52,9 @@ export default { } }, methods: { + getFormatBadgeClass(format) { + return format.startsWith('profile/') ? 'badge bg-warning me-1' : 'badge bg-success me-1' + }, showCurrentLogDetails(logId) { this.currentLogDetailId = logId this.currentLogDetailsModal.show(); @@ -169,7 +172,7 @@ export default {
{{ log.last_update }} {{ log.name }}{{ log.format }}{{ fmt }} {{ From 9bd46abd11b80dd8832cd60a24e3042d6bbb2938 Mon Sep 17 00:00:00 2001 From: Maxence Date: Thu, 11 Apr 2024 22:41:21 -0400 Subject: [PATCH 464/570] handle cherry picking audio --- front/src/components/Home.vue | 17 +++++++++++----- ydl_server/views.py | 3 +++ ydl_server/ydlhandler.py | 37 ++++++++++++++++++++++------------- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index 91a60549..28d3daad 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -116,7 +116,13 @@ export default { this.loading = false; }); }, - async queueVideo(videoUrl, format) { + getParamsFromSelection(format) { + return { + format: format.resolution == "audio only" ? this.selectedFormat.value : format.format_id, + audio_format: format.resolution == "audio only" ? format.format_id : null + } + }, + async queueVideo(videoUrl, params) { const url = getAPIUrl('api/downloads', import.meta.env); fetch(url, { method: 'POST', @@ -125,7 +131,7 @@ export default { }, body: JSON.stringify({ urls: [videoUrl], - format + ...params }) }) .then(response => { @@ -270,7 +276,7 @@ export default {
- + @@ -283,8 +289,9 @@ export default { - + diff --git a/ydl_server/views.py b/ydl_server/views.py index f66d47f3..1b5aa892 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -199,10 +199,13 @@ async def api_queue_download(request): url = data.get("url") urls = data.get("urls", []) profile = data.get("profile") + audio_format = data.get("audio_format") format_str = data.get("format") if profile: format_str = ','.join([format_str, profile]) + if audio_format: + format_str = ',audio/'.join([format_str, audio_format]) options = {"format": format_str} if url: diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index ba0a7bb5..3379cf80 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -122,13 +122,15 @@ def worker(self, thread_id): self.jobshandler.put((Actions.UPDATE, job)) def get_format_and_profile(self, format_string): - f, p = None, None + fmt, audio, profile = None, None, None for s in format_string.split(","): if s.startswith("profile/"): - p = s + profile = s + elif s.startswith("audio/") or s.startswith("bestaudio/"): + audio = s else: - f = s - return f, p + fmt = s + return fmt, audio, profile def get_profile(self, profile_str): if not profile_str: @@ -141,23 +143,30 @@ def get_profile(self, profile_str): def get_ydl_options(self, ydl_config, request_options): ydl_config = ydl_config.copy() - req_format, req_profile = self.get_format_and_profile(request_options.get("format")) + req_format, req_audio, req_profile = self.get_format_and_profile(request_options.get("format")) profile = self.get_profile(req_profile) if profile: req_format = profile.get("format") if req_format is None else req_format - if req_format is None: - req_format = "video/best" - if req_format.startswith("audio/"): + if req_audio is not None and req_format is None: ydl_config.update({"extract-audio": None}) - ydl_config.update({"audio-format": req_format.split("/")[-1]}) - elif req_format.startswith("video/"): - # youtube-dl downloads BEST video and audio by default - if req_format != "video/best": - ydl_config.update({"format": req_format.split("/")[-1]}) - else: + ydl_config.update({"audio-format": req_audio.split("/")[-1]}) + + if req_format is not None: + if req_format == "video/best": + req_format = "video/bestvideo" + if req_format.startswith("video/"): + # youtube-dl downloads BEST video and audio by default + if req_format != "video/best": + req_format = req_format.split("/")[-1] + if req_audio is not None: + req_format = req_format + "+" + req_audio.split("/")[-1] ydl_config.update({"format": req_format}) + + if req_format is None and req_audio is None: + ydl_config.update({"format": "video/best"}) + if profile: profile = {k: v for k, v in profile.items() if k != "format"} ydl_config.update(profile) From 4848ae7c4f30cc3289986cd0e09c5405555ef2bc Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 12 Apr 2024 22:05:46 -0400 Subject: [PATCH 465/570] cleanup --- renovate.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 renovate.json diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 7190a60b..00000000 --- a/renovate.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json" -} From 5a1c794754fcddf07139d70720db31ba95ae4e5b Mon Sep 17 00:00:00 2001 From: Maxence Date: Fri, 12 Apr 2024 22:26:47 -0400 Subject: [PATCH 466/570] use proper ydl module name in ui --- front/src/components/Footer.vue | 2 +- front/src/components/Header.vue | 16 ++++++++++++++-- front/src/components/Home.vue | 8 +++++++- front/src/main.js | 1 - 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue index 669f7ead..8789bc49 100644 --- a/front/src/components/Footer.vue +++ b/front/src/components/Footer.vue @@ -38,7 +38,7 @@ export default {

Drag and Drop the Bookmarklet to your bookmark bar for easy access: Youtube-DL + href="">{{ server_info.ydl_module_name }}
Powered by {{ diff --git a/front/src/components/Header.vue b/front/src/components/Header.vue index 1e9490ae..a36430b5 100644 --- a/front/src/components/Header.vue +++ b/front/src/components/Header.vue @@ -1,5 +1,6 @@ @@ -41,7 +41,7 @@ export default { }, prettySize(size_b) { if (size_b == null) { - return "NaN"; + return undefined; } var sizes = ['B', 'KB', 'MB', 'GB', 'TB']; var i = 0; @@ -304,7 +304,7 @@ export default { Queue  - {{ format.ext }} {{ format.format }} - {{ prettySize(format.filesize) }} + {{ [format.ext,format.format, prettySize(format.filesize)].filter(x => !isEmpty(x)).join(' - ') }}

From e6167e384e0bdd982a5c0bf12d8b6e83815fba5e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 28 May 2024 00:42:24 +0000 Subject: [PATCH 476/570] Update dependency yt-dlp to v2024.5.27 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0df3f535..38241b93 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==23.2.1 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.5.26 +yt-dlp==2024.5.27 python-multipart==0.0.9 From 039f2f8271eabca78d758c6565b501d542b52c07 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 28 May 2024 11:24:26 +0000 Subject: [PATCH 477/570] Update dependency uvicorn to v0.30.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 38241b93..b5eda22e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.37.2 -uvicorn==0.29.0 +uvicorn==0.30.0 aiofiles==23.2.1 Jinja2==3.1.4 PyYAML==6.0.1 From ac8d37382b00c381f4d6328dd4d198375bba8d95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Jun 2024 01:50:23 +0000 Subject: [PATCH 478/570] Update dependency eslint to v9.4.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 55 +++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 123ea0d9..1984e470 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -437,6 +437,21 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", + "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -461,26 +476,23 @@ } }, "node_modules/@eslint/js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", + "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "node_modules/@eslint/object-schema": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", + "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -496,12 +508,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "node_modules/@humanwhocodes/retry": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", @@ -1159,16 +1165,17 @@ } }, "node_modules/eslint": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", - "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", + "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", + "@eslint/config-array": "^0.15.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.3.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint/js": "9.4.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", From 76a493fd0bb322649c516a46f400f6c060b76477 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Jun 2024 01:50:56 +0000 Subject: [PATCH 479/570] Update dependency vite to v5.2.12 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 1984e470..57731036 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2047,10 +2047,11 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", + "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", From 5fbcd9d2269cd10151e123703302ae1c82cfd747 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Jun 2024 01:51:19 +0000 Subject: [PATCH 480/570] Update dependency @vitejs/plugin-vue to v5.0.5 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 57731036..0fc9b819 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -786,10 +786,11 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, From 0246d12c7960c7b996d7240e8bf6ad30ee3b74f4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Jun 2024 19:11:01 +0000 Subject: [PATCH 481/570] Update dependency uvicorn to v0.30.1 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b5eda22e..d3f1ea4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.37.2 -uvicorn==0.30.0 +uvicorn==0.30.1 aiofiles==23.2.1 Jinja2==3.1.4 PyYAML==6.0.1 From 2deac93d6cd9d861019f92ab77fe3a6bea6d9c81 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 6 Jun 2024 17:58:25 +0200 Subject: [PATCH 482/570] Update Dockerfile Don't use proxy for wget in healthcheck --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 98b55960..37f5d40f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,4 +68,4 @@ ENV YOUTUBE_DL=$YOUTUBE_DL ENV YDL_CONFIG_PATH='/app_config' CMD [ "python", "-u", "./youtube-dl-server.py" ] -HEALTHCHECK CMD wget 127.0.0.1:8080/api/info --spider -q +HEALTHCHECK CMD wget 127.0.0.1:8080/api/info --spider -q -Y off From c38aa1a7ae5397472141b2b3cd5af49ebabcff2f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 9 Jun 2024 20:01:04 +0000 Subject: [PATCH 483/570] Update dependency vite to v5.2.13 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 0fc9b819..db8f798c 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2048,9 +2048,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", - "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", + "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", "dev": true, "license": "MIT", "dependencies": { From 9da21e1a0491bf1c4b95a992707df67bfea30752 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 13 Jun 2024 01:49:41 +0000 Subject: [PATCH 484/570] Update dependency vue-router to v4.3.3 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index db8f798c..ce3afe71 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2198,9 +2198,10 @@ } }, "node_modules/vue-router": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz", - "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz", + "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==", + "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.5.1" }, From 34ac39116ef39f42356d3f7f3753095d63372d65 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 14 Jun 2024 01:26:28 +0000 Subject: [PATCH 485/570] Update dependency vite to v5.3.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 222 ++++++++++++++++++++++------------------ 1 file changed, 123 insertions(+), 99 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index ce3afe71..49c46a03 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -34,13 +34,14 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -50,13 +51,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -66,13 +68,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -82,13 +85,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -98,13 +102,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -114,13 +119,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -130,13 +136,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -146,13 +153,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -162,13 +170,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -178,13 +187,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -194,13 +204,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -210,13 +221,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -226,13 +238,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -242,13 +255,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -258,13 +272,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -274,13 +289,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -290,13 +306,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -306,13 +323,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -322,13 +340,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -338,13 +357,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -354,13 +374,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -370,13 +391,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -386,13 +408,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1116,11 +1139,12 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1128,29 +1152,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escape-string-regexp": { @@ -2048,13 +2072,13 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", - "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.0.tgz", + "integrity": "sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, From dff30ed861896fddef59296e78e0151f3b341fb6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 15 Jun 2024 22:33:28 +0000 Subject: [PATCH 486/570] Update dependency vite to v5.3.1 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 49c46a03..0d2da762 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2072,9 +2072,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.0.tgz", - "integrity": "sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", "dev": true, "license": "MIT", "dependencies": { From 16c7e70f639834e10245b87a4ca29ad87d5a6342 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 15 Jun 2024 22:33:45 +0000 Subject: [PATCH 487/570] Update dependency vue to v3.4.29 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 127 ++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 57 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 0d2da762..1df3d4c3 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -23,9 +23,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", - "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -823,36 +824,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.29.tgz", + "integrity": "sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.29", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.29.tgz", + "integrity": "sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==", + "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-core": "3.4.29", + "@vue/shared": "3.4.29" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", - "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.29.tgz", + "integrity": "sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==", + "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.27", - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.29", + "@vue/compiler-dom": "3.4.29", + "@vue/compiler-ssr": "3.4.29", + "@vue/shared": "3.4.29", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -860,12 +864,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", - "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.29.tgz", + "integrity": "sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==", + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-dom": "3.4.29", + "@vue/shared": "3.4.29" } }, "node_modules/@vue/devtools-api": { @@ -874,48 +879,54 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", - "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.29.tgz", + "integrity": "sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==", + "license": "MIT", "dependencies": { - "@vue/shared": "3.4.27" + "@vue/shared": "3.4.29" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", - "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.29.tgz", + "integrity": "sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==", + "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/reactivity": "3.4.29", + "@vue/shared": "3.4.29" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", - "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.29.tgz", + "integrity": "sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==", + "license": "MIT", "dependencies": { - "@vue/runtime-core": "3.4.27", - "@vue/shared": "3.4.27", + "@vue/reactivity": "3.4.29", + "@vue/runtime-core": "3.4.29", + "@vue/shared": "3.4.29", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", - "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.29.tgz", + "integrity": "sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==", + "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-ssr": "3.4.29", + "@vue/shared": "3.4.29" }, "peerDependencies": { - "vue": "3.4.27" + "vue": "3.4.29" } }, "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.29.tgz", + "integrity": "sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==", + "license": "MIT" }, "node_modules/acorn": { "version": "8.11.3", @@ -1131,6 +1142,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -2128,15 +2140,16 @@ } }, "node_modules/vue": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", - "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", + "version": "3.4.29", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.29.tgz", + "integrity": "sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==", + "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-sfc": "3.4.27", - "@vue/runtime-dom": "3.4.27", - "@vue/server-renderer": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-dom": "3.4.29", + "@vue/compiler-sfc": "3.4.29", + "@vue/runtime-dom": "3.4.29", + "@vue/server-renderer": "3.4.29", + "@vue/shared": "3.4.29" }, "peerDependencies": { "typescript": "*" From b7b718a5e8590e422442aba3b142e0fe00fd5333 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 15 Jun 2024 22:34:02 +0000 Subject: [PATCH 488/570] Update dependency eslint to v9.5.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 1df3d4c3..4c8dd0e6 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -462,13 +462,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", - "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.16.0.tgz", + "integrity": "sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.3", + "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -500,9 +500,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", - "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz", + "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", "dev": true, "license": "MIT", "engines": { @@ -510,9 +510,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", - "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1202,17 +1202,17 @@ } }, "node_modules/eslint": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", - "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.5.0.tgz", + "integrity": "sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/config-array": "^0.15.1", + "@eslint/config-array": "^0.16.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.4.0", + "@eslint/js": "9.5.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -1224,7 +1224,7 @@ "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.1", - "esquery": "^1.4.2", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -1250,7 +1250,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" } }, "node_modules/eslint-config-google": { From fc440a6a441329a1054dc7667a84bb22a432412a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 22 Jun 2024 14:19:19 +0000 Subject: [PATCH 489/570] Update dependency vue-router to v4.4.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 4c8dd0e6..1fe7d038 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2235,9 +2235,9 @@ } }, "node_modules/vue-router": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz", - "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", + "integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.5.1" From 8d75f68b5690f63216b6c6dfed5876bc0c5c8c97 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 23 Jun 2024 18:43:34 +0000 Subject: [PATCH 490/570] Update dependency vue to v3.4.30 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 1fe7d038..f0a81eb7 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -824,39 +824,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.29.tgz", - "integrity": "sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", + "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.29", + "@vue/shared": "3.4.30", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.29.tgz", - "integrity": "sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", + "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-core": "3.4.30", + "@vue/shared": "3.4.30" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.29.tgz", - "integrity": "sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", + "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.29", - "@vue/compiler-dom": "3.4.29", - "@vue/compiler-ssr": "3.4.29", - "@vue/shared": "3.4.29", + "@vue/compiler-core": "3.4.30", + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -864,13 +864,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.29.tgz", - "integrity": "sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", + "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-dom": "3.4.30", + "@vue/shared": "3.4.30" } }, "node_modules/@vue/devtools-api": { @@ -879,53 +879,53 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.29.tgz", - "integrity": "sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", + "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.29" + "@vue/shared": "3.4.30" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.29.tgz", - "integrity": "sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", + "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/reactivity": "3.4.30", + "@vue/shared": "3.4.30" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.29.tgz", - "integrity": "sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", + "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.29", - "@vue/runtime-core": "3.4.29", - "@vue/shared": "3.4.29", + "@vue/reactivity": "3.4.30", + "@vue/runtime-core": "3.4.30", + "@vue/shared": "3.4.30", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.29.tgz", - "integrity": "sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", + "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30" }, "peerDependencies": { - "vue": "3.4.29" + "vue": "3.4.30" } }, "node_modules/@vue/shared": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.29.tgz", - "integrity": "sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", + "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==", "license": "MIT" }, "node_modules/acorn": { @@ -2140,16 +2140,16 @@ } }, "node_modules/vue": { - "version": "3.4.29", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.29.tgz", - "integrity": "sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==", + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", + "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.29", - "@vue/compiler-sfc": "3.4.29", - "@vue/runtime-dom": "3.4.29", - "@vue/server-renderer": "3.4.29", - "@vue/shared": "3.4.29" + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-sfc": "3.4.30", + "@vue/runtime-dom": "3.4.30", + "@vue/server-renderer": "3.4.30", + "@vue/shared": "3.4.30" }, "peerDependencies": { "typescript": "*" From 8339d19a07d9b3b193b25c9c1d354047ca35bde4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 2 Jul 2024 02:23:56 +0000 Subject: [PATCH 491/570] Update dependency yt-dlp to v2024.7.1 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d3f1ea4a..c36fd33c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==23.2.1 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.5.27 +yt-dlp==2024.7.1 python-multipart==0.0.9 From a93418951d29267b4e4ffd044127d0a277a6a709 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 2 Jul 2024 19:29:49 -0400 Subject: [PATCH 492/570] lint --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 37f5d40f..ce7f4551 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ # ARG YOUTUBE_DL=yt-dlp -FROM --platform=$BUILDPLATFORM node:22-alpine as nodebuild +FROM --platform=$BUILDPLATFORM node:22-alpine AS nodebuild WORKDIR /app COPY ./front/package*.json /app @@ -13,7 +13,7 @@ RUN npm ci COPY ./front /app RUN npm run build -FROM python:alpine as wheels +FROM python:alpine AS wheels RUN apk add --no-cache g++ COPY ./requirements.txt . @@ -22,7 +22,7 @@ RUN pip install --upgrade --no-cache-dir pip \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-youtube-dl youtube-dl \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-yt-dlp yt-dlp -FROM python:alpine as base +FROM python:alpine AS base ARG ATOMICPARSLEY=0 ARG YDLS_VERSION ARG YDLS_RELEASE_DATE @@ -42,13 +42,13 @@ RUN pip install --no-cache /wheels/* COPY ./requirements.txt /usr/src/app/ -FROM base as yt-dlp +FROM base AS yt-dlp COPY --from=wheels /out/wheels-yt-dlp /wheels RUN pip install --no-cache /wheels/* RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) -FROM base as youtube-dl +FROM base AS youtube-dl COPY --from=wheels /out/wheels-youtube-dl /wheels/ RUN pip install --no-cache /wheels/* From c787d9fc2d2309cf3d1fce26253b1732e8c97cd5 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 2 Jul 2024 19:47:07 -0400 Subject: [PATCH 493/570] cleanup + bumps --- Dockerfile | 7 +++---- Jenkinsfile | 2 +- requirements.txt | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index ce7f4551..1c159f13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,8 +17,7 @@ FROM python:alpine AS wheels RUN apk add --no-cache g++ COPY ./requirements.txt . -RUN pip install --upgrade --no-cache-dir pip \ - && pip wheel --no-cache-dir --wheel-dir /out/wheels -r <(cat ./requirements.txt| grep -v youtube-dl | grep -v yt-dlp) \ +RUN pip wheel --no-cache-dir --wheel-dir /out/wheels -r <(cat ./requirements.txt| grep -v youtube-dl | grep -v yt-dlp) \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-youtube-dl youtube-dl \ && pip wheel --no-cache-dir --wheel-dir /out/wheels-yt-dlp yt-dlp @@ -46,13 +45,13 @@ FROM base AS yt-dlp COPY --from=wheels /out/wheels-yt-dlp /wheels RUN pip install --no-cache /wheels/* -RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) +RUN pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v youtube-dl) FROM base AS youtube-dl COPY --from=wheels /out/wheels-youtube-dl /wheels/ RUN pip install --no-cache /wheels/* -RUN pip install --upgrade pip && pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v yt-dlp) +RUN pip install --no-cache-dir -r <(cat /usr/src/app/requirements.txt| grep -v yt-dlp) FROM ${YOUTUBE_DL} diff --git a/Jenkinsfile b/Jenkinsfile index 47675244..d0f2d16e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,7 +25,7 @@ pipeline { } } } - stage('Build Youtube-dl yt_dlp Image') { + stage('Build yt_dlp Image') { steps { withCredentials([usernamePassword(credentialsId: 'dockerhub', usernameVariable: 'DOCKERHUB_CREDENTIALS_USR', passwordVariable: 'DOCKERHUB_CREDENTIALS_PSW')]) { sh 'docker login -u $DOCKERHUB_CREDENTIALS_USR -p "$DOCKERHUB_CREDENTIALS_PSW"' diff --git a/requirements.txt b/requirements.txt index c36fd33c..eb2fed51 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ starlette==0.37.2 uvicorn==0.30.1 -aiofiles==23.2.1 +aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 From 33aad0256760a37acfa3c41e15a6597c1f20f0b0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 4 Jul 2024 01:11:29 +0000 Subject: [PATCH 494/570] Update dependency yt-dlp to v2024.7.2 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index eb2fed51..c287ac4c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.1 +yt-dlp==2024.7.2 python-multipart==0.0.9 From f244db58c59e52c058b71dcfcc0f6b38695e1310 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 7 Jul 2024 23:16:08 +0000 Subject: [PATCH 495/570] Update dependency yt-dlp to v2024.7.7 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c287ac4c..715dc693 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.2 +yt-dlp==2024.7.7 python-multipart==0.0.9 From b598b514ce294ccbf2d7253e7f481a2032a49128 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 9 Jul 2024 01:49:58 +0000 Subject: [PATCH 496/570] Update dependency yt-dlp to v2024.7.8 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 715dc693..159ec980 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.7 +yt-dlp==2024.7.8 python-multipart==0.0.9 From 82e6c77d0c660a9eca12e14759d531e6f14c18f8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 9 Jul 2024 01:50:24 +0000 Subject: [PATCH 497/570] Update dependency vue to v3.4.31 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index f0a81eb7..52985c5d 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -824,39 +824,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", - "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.30", + "@vue/shared": "3.4.31", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", - "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", - "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.30", - "@vue/compiler-dom": "3.4.30", - "@vue/compiler-ssr": "3.4.30", - "@vue/shared": "3.4.30", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -864,13 +864,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", - "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/devtools-api": { @@ -879,53 +879,53 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", - "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.30" + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", - "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", - "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.30", - "@vue/runtime-core": "3.4.30", - "@vue/shared": "3.4.30", + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", - "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { - "vue": "3.4.30" + "vue": "3.4.31" } }, "node_modules/@vue/shared": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", - "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", "license": "MIT" }, "node_modules/acorn": { @@ -2140,16 +2140,16 @@ } }, "node_modules/vue": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", - "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.30", - "@vue/compiler-sfc": "3.4.30", - "@vue/runtime-dom": "3.4.30", - "@vue/server-renderer": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { "typescript": "*" From 15a7a92df14381f1a20f2468a0645bfd1052255f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 9 Jul 2024 01:51:00 +0000 Subject: [PATCH 498/570] Update dependency eslint-plugin-vue to v9.27.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 52985c5d..fa5beb3d 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -1266,10 +1266,11 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", - "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz", + "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -1277,7 +1278,7 @@ "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.0", - "vue-eslint-parser": "^9.4.2", + "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { @@ -1292,6 +1293,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2166,10 +2168,11 @@ "integrity": "sha512-9zjvACKE4W0kEb8OQtXzpizKhf6zfFOG/Z1TEUjSJn4Z4rintuAHo8y/FpCUhTWHMmPe8E+Fko+/tiXVM+5jOw==" }, "node_modules/vue-eslint-parser": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", From 79613c8cc1dc2645e563d931f76be6283a90adf4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 9 Jul 2024 01:51:27 +0000 Subject: [PATCH 499/570] Update dependency eslint to v9.6.0 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- front/package-lock.json | 42 +++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index fa5beb3d..9bbe9745 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -462,15 +462,15 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.16.0.tgz", - "integrity": "sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.0.tgz", + "integrity": "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", - "minimatch": "^3.0.5" + "minimatch": "^3.1.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -500,9 +500,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz", - "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz", + "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==", "dev": true, "license": "MIT", "engines": { @@ -929,10 +929,11 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1202,17 +1203,17 @@ } }, "node_modules/eslint": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.5.0.tgz", - "integrity": "sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/config-array": "^0.16.0", + "@eslint/config-array": "^0.17.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.5.0", + "@eslint/js": "9.6.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -1223,7 +1224,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.1", "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", + "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1333,12 +1334,13 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" }, From 68c0781e0a5018bd194d6ab0a33ed6254728fea9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 10 Jul 2024 02:38:57 +0000 Subject: [PATCH 500/570] Update dependency yt-dlp to v2024.7.9 Co-authored-by: Renovate Bot Co-committed-by: Renovate Bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 159ec980..d2ba6007 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.8 +yt-dlp==2024.7.9 python-multipart==0.0.9 From 05328b27d477f305aead9b17c6674aff36217d36 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 9 Jul 2024 02:55:37 +0000 Subject: [PATCH 501/570] Update dependency vite to v5.3.3 --- front/package-lock.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 9bbe9745..67805cf7 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -1811,9 +1811,9 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -1828,9 +1828,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -2088,14 +2089,14 @@ "dev": true }, "node_modules/vite": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", - "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { From 249cecbc7a71b631b4f2b10d95c81fbe19fea3fa Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 16 Jul 2024 22:55:37 +0000 Subject: [PATCH 502/570] Update dependency yt-dlp to v2024.7.16 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d2ba6007..af9cc976 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.9 +yt-dlp==2024.7.16 python-multipart==0.0.9 From c60c33a0284d50c0686f61a8b0a908f7956a8bd8 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 16 Jul 2024 22:23:37 -0400 Subject: [PATCH 503/570] fix linting --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index d0f2d16e..6fd9d0ec 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,7 +14,7 @@ pipeline { stage('Linting') { steps { script { - sh "ruff ."; + sh "ruff check ."; } } } From ced32795cc3af8b895454ed18d2f4a79f9150421 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 20 Jul 2024 10:55:31 +0000 Subject: [PATCH 504/570] Update dependency uvicorn to v0.30.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index af9cc976..38e1e450 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.37.2 -uvicorn==0.30.1 +uvicorn==0.30.3 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 From 0d511a76052d22e2a8aa6c94b01f54851e14441c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 20 Jul 2024 22:56:02 +0000 Subject: [PATCH 505/570] Update dependency starlette to v0.38.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 38e1e450..b4bb0206 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.37.2 +starlette==0.38.0 uvicorn==0.30.3 aiofiles==24.1.0 Jinja2==3.1.4 From 0c3c58244e5054032876172763c67b67e93e3faf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 21 Jul 2024 16:55:52 +0000 Subject: [PATCH 506/570] Update dependency eslint to v9.7.0 --- front/package-lock.json | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 67805cf7..f5e572bd 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -453,10 +453,11 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -500,9 +501,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.6.0.tgz", - "integrity": "sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", + "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", "dev": true, "license": "MIT", "engines": { @@ -1203,17 +1204,17 @@ } }, "node_modules/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", + "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", + "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.17.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.6.0", + "@eslint/js": "9.7.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -1222,7 +1223,7 @@ "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", + "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", @@ -1306,10 +1307,11 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" From 35c6b28f5017c70d2e8319f119d464a7f776c137 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 24 Jul 2024 16:55:45 +0000 Subject: [PATCH 507/570] Update dependency vue to v3.4.34 --- front/package-lock.json | 108 ++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index f5e572bd..342da11c 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -825,53 +825,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", - "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.34.tgz", + "integrity": "sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.31", + "@vue/shared": "3.4.34", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", - "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.34.tgz", + "integrity": "sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-core": "3.4.34", + "@vue/shared": "3.4.34" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", - "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.34.tgz", + "integrity": "sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.31", - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31", + "@vue/compiler-core": "3.4.34", + "@vue/compiler-dom": "3.4.34", + "@vue/compiler-ssr": "3.4.34", + "@vue/shared": "3.4.34", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", - "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.34.tgz", + "integrity": "sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.4.34", + "@vue/shared": "3.4.34" } }, "node_modules/@vue/devtools-api": { @@ -880,53 +880,53 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", - "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.34.tgz", + "integrity": "sha512-ua+Lo+wBRlBEX9TtgPOShE2JwIO7p6BTZ7t1KZVPoaBRfqbC7N3c8Mpzicx173fXxx5VXeU6ykiHo7WgLzJQDA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.31" + "@vue/shared": "3.4.34" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", - "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.34.tgz", + "integrity": "sha512-PXhkiRPwcPGJ1BnyBZFI96GfInCVskd0HPNIAZn7i3YOmLbtbTZpB7/kDTwC1W7IqdGPkTVC63IS7J2nZs4Ebg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/reactivity": "3.4.34", + "@vue/shared": "3.4.34" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", - "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.34.tgz", + "integrity": "sha512-dXqIe+RqFAK2Euak4UsvbIupalrhc67OuQKpD7HJ3W2fv8jlqvI7szfBCsAEcE8o/wyNpkloxB6J8viuF/E3gw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.31", - "@vue/runtime-core": "3.4.31", - "@vue/shared": "3.4.31", + "@vue/reactivity": "3.4.34", + "@vue/runtime-core": "3.4.34", + "@vue/shared": "3.4.34", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", - "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.34.tgz", + "integrity": "sha512-GeyEUfMVRZMD/mZcNONEqg7MiU10QQ1DB3O/Qr6+8uXpbwdlmVgQ5Qs1/ZUAFX1X2UUtqMoGrDRbxdWfOJFT7Q==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-ssr": "3.4.34", + "@vue/shared": "3.4.34" }, "peerDependencies": { - "vue": "3.4.31" + "vue": "3.4.34" } }, "node_modules/@vue/shared": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", - "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.34.tgz", + "integrity": "sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==", "license": "MIT" }, "node_modules/acorn": { @@ -2147,16 +2147,16 @@ } }, "node_modules/vue": { - "version": "3.4.31", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", - "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.34.tgz", + "integrity": "sha512-VZze05HWlA3ItreQ/ka7Sx7PoD0/3St8FEiSlSTVgb6l4hL+RjtP2/8g5WQBzZgyf8WG2f+g1bXzC7zggLhAJA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.31", - "@vue/compiler-sfc": "3.4.31", - "@vue/runtime-dom": "3.4.31", - "@vue/server-renderer": "3.4.31", - "@vue/shared": "3.4.31" + "@vue/compiler-dom": "3.4.34", + "@vue/compiler-sfc": "3.4.34", + "@vue/runtime-dom": "3.4.34", + "@vue/server-renderer": "3.4.34", + "@vue/shared": "3.4.34" }, "peerDependencies": { "typescript": "*" From ee9413ebba269837605ccff42fa5d16db160352d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 25 Jul 2024 04:55:36 +0000 Subject: [PATCH 508/570] Update dependency yt-dlp to v2024.7.25 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b4bb0206..974b8c26 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.16 +yt-dlp==2024.7.25 python-multipart==0.0.9 From 756e212738179e0ac341da29d0b02edcc33e88b8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 24 Jul 2024 02:21:47 +0000 Subject: [PATCH 509/570] Update dependency starlette to v0.38.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 974b8c26..9230124b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.38.0 +starlette==0.38.1 uvicorn==0.30.3 aiofiles==24.1.0 Jinja2==3.1.4 From 35822b8c685cb67bb7e514708bf9db2df65d9b94 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 27 Jul 2024 02:55:33 +0000 Subject: [PATCH 510/570] Update dependency vite to v5.3.5 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 342da11c..7ee3e639 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2091,9 +2091,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", "dev": true, "license": "MIT", "dependencies": { From 05a594f78f972aea00449fdc46c58b83e52ee9bb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 27 Jul 2024 10:55:43 +0000 Subject: [PATCH 511/570] Update dependency @vitejs/plugin-vue to v5.1.1 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 7ee3e639..451d3c7b 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -811,9 +811,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.1.tgz", + "integrity": "sha512-sDckXxlHpMsjRQbAH9WanangrfrblsOd3pNifePs+FOHjJg1jfWq5L/P0PsBRndEt3nmdUnmvieP8ULDeX5AvA==", "dev": true, "license": "MIT", "engines": { From a977ab2e9c2e3359f1e2d845d3ee4abe1965d5ef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 27 Jul 2024 02:55:52 +0000 Subject: [PATCH 512/570] Update dependency eslint to v9.8.0 --- front/package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 451d3c7b..b21a3cd5 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -463,9 +463,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.0.tgz", - "integrity": "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -501,9 +501,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.7.0.tgz", - "integrity": "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", + "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", "dev": true, "license": "MIT", "engines": { @@ -1204,17 +1204,17 @@ } }, "node_modules/eslint": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.7.0.tgz", - "integrity": "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", + "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.0", + "@eslint/config-array": "^0.17.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.7.0", + "@eslint/js": "9.8.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", From c1395ebc22a52f7b728a7a794a28923396adc9b1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 27 Jul 2024 18:55:28 +0000 Subject: [PATCH 513/570] Update dependency starlette to v0.38.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9230124b..96db6298 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.38.1 +starlette==0.38.2 uvicorn==0.30.3 aiofiles==24.1.0 Jinja2==3.1.4 From 7581fcfc5c48c35f11608ef8b7c3c56925baf0bc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 31 Jul 2024 22:55:45 +0000 Subject: [PATCH 514/570] Update dependency uvicorn to v0.30.4 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 96db6298..ab274e65 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.38.2 -uvicorn==0.30.3 +uvicorn==0.30.4 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 From 1ff5a3718d0af4650b1521622742f55532e05413 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 1 Aug 2024 16:56:05 +0000 Subject: [PATCH 515/570] Update dependency yt-dlp to v2024.8.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ab274e65..60a088b8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.7.25 +yt-dlp==2024.8.1 python-multipart==0.0.9 From 2bf374a5b9c42ebde2361b4cb80db3da947910d9 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 2 Aug 2024 10:55:52 +0000 Subject: [PATCH 516/570] Update dependency uvicorn to v0.30.5 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 60a088b8..7be1a755 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.38.2 -uvicorn==0.30.4 +uvicorn==0.30.5 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 From 527e2ef6f1085b0f70509fe869de54f33ea6e0c3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 3 Aug 2024 02:55:57 +0000 Subject: [PATCH 517/570] Update dependency vue to v3.4.35 --- front/package-lock.json | 114 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index b21a3cd5..9dc2cd9b 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -825,53 +825,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.34.tgz", - "integrity": "sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", + "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.34", + "@vue/shared": "3.4.35", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.34.tgz", - "integrity": "sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", + "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.34", - "@vue/shared": "3.4.34" + "@vue/compiler-core": "3.4.35", + "@vue/shared": "3.4.35" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.34.tgz", - "integrity": "sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.35.tgz", + "integrity": "sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.34", - "@vue/compiler-dom": "3.4.34", - "@vue/compiler-ssr": "3.4.34", - "@vue/shared": "3.4.34", + "@vue/compiler-core": "3.4.35", + "@vue/compiler-dom": "3.4.35", + "@vue/compiler-ssr": "3.4.35", + "@vue/shared": "3.4.35", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.34.tgz", - "integrity": "sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz", + "integrity": "sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.34", - "@vue/shared": "3.4.34" + "@vue/compiler-dom": "3.4.35", + "@vue/shared": "3.4.35" } }, "node_modules/@vue/devtools-api": { @@ -880,53 +880,53 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.34.tgz", - "integrity": "sha512-ua+Lo+wBRlBEX9TtgPOShE2JwIO7p6BTZ7t1KZVPoaBRfqbC7N3c8Mpzicx173fXxx5VXeU6ykiHo7WgLzJQDA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.35.tgz", + "integrity": "sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.34" + "@vue/shared": "3.4.35" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.34.tgz", - "integrity": "sha512-PXhkiRPwcPGJ1BnyBZFI96GfInCVskd0HPNIAZn7i3YOmLbtbTZpB7/kDTwC1W7IqdGPkTVC63IS7J2nZs4Ebg==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.35.tgz", + "integrity": "sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.34", - "@vue/shared": "3.4.34" + "@vue/reactivity": "3.4.35", + "@vue/shared": "3.4.35" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.34.tgz", - "integrity": "sha512-dXqIe+RqFAK2Euak4UsvbIupalrhc67OuQKpD7HJ3W2fv8jlqvI7szfBCsAEcE8o/wyNpkloxB6J8viuF/E3gw==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz", + "integrity": "sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.34", - "@vue/runtime-core": "3.4.34", - "@vue/shared": "3.4.34", + "@vue/reactivity": "3.4.35", + "@vue/runtime-core": "3.4.35", + "@vue/shared": "3.4.35", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.34.tgz", - "integrity": "sha512-GeyEUfMVRZMD/mZcNONEqg7MiU10QQ1DB3O/Qr6+8uXpbwdlmVgQ5Qs1/ZUAFX1X2UUtqMoGrDRbxdWfOJFT7Q==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.35.tgz", + "integrity": "sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.34", - "@vue/shared": "3.4.34" + "@vue/compiler-ssr": "3.4.35", + "@vue/shared": "3.4.35" }, "peerDependencies": { - "vue": "3.4.34" + "vue": "3.4.35" } }, "node_modules/@vue/shared": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.34.tgz", - "integrity": "sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", + "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==", "license": "MIT" }, "node_modules/acorn": { @@ -1813,9 +1813,9 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", "funding": [ { "type": "opencollective", @@ -2147,16 +2147,16 @@ } }, "node_modules/vue": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.34.tgz", - "integrity": "sha512-VZze05HWlA3ItreQ/ka7Sx7PoD0/3St8FEiSlSTVgb6l4hL+RjtP2/8g5WQBzZgyf8WG2f+g1bXzC7zggLhAJA==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.35.tgz", + "integrity": "sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.34", - "@vue/compiler-sfc": "3.4.34", - "@vue/runtime-dom": "3.4.34", - "@vue/server-renderer": "3.4.34", - "@vue/shared": "3.4.34" + "@vue/compiler-dom": "3.4.35", + "@vue/compiler-sfc": "3.4.35", + "@vue/runtime-dom": "3.4.35", + "@vue/server-renderer": "3.4.35", + "@vue/shared": "3.4.35" }, "peerDependencies": { "typescript": "*" From d5f6097943ad05bca951baa1f4b109c25058580d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 3 Aug 2024 02:56:06 +0000 Subject: [PATCH 518/570] Update dependency vue-router to v4.4.2 --- front/package-lock.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 9dc2cd9b..0e0ba822 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -875,9 +875,10 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", + "license": "MIT" }, "node_modules/@vue/reactivity": { "version": "3.4.35", @@ -2243,12 +2244,12 @@ } }, "node_modules/vue-router": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", - "integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.2.tgz", + "integrity": "sha512-1qNybkn2L7QsLzaXs8nvlQmRKp8XF8DCxZys/Jr1JpQcHsKUxTKzTxCVA1G7NfBfwRIBgCJPoujOG5lHCCNUxw==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.5.1" + "@vue/devtools-api": "^6.6.3" }, "funding": { "url": "https://github.com/sponsors/posva" From fbb847d9666e6fe79764d61b6cb2bcb25d01957d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Aug 2024 04:33:05 +0000 Subject: [PATCH 519/570] Update dependency yt-dlp to v2024.8.6 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7be1a755..7f03ef4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.1 youtube-dl==2021.12.17 -yt-dlp==2024.8.1 +yt-dlp==2024.8.6 python-multipart==0.0.9 From 6ec23148e47eaf98e82c5b893f74f9bd3bd94244 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Aug 2024 20:55:58 +0000 Subject: [PATCH 520/570] Update dependency PyYAML to v6.0.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7f03ef4a..2ba889e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ starlette==0.38.2 uvicorn==0.30.5 aiofiles==24.1.0 Jinja2==3.1.4 -PyYAML==6.0.1 +PyYAML==6.0.2 youtube-dl==2021.12.17 yt-dlp==2024.8.6 python-multipart==0.0.9 From 8b43538fb2d804341f1cc61745d9134fda739643 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Aug 2024 14:55:57 +0000 Subject: [PATCH 521/570] Update dependency vue to v3.4.36 --- front/package-lock.json | 114 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 0e0ba822..3b6c861b 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -825,39 +825,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", - "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.36.tgz", + "integrity": "sha512-qBkndgpwFKdupmOPoiS10i7oFdN7a+4UNDlezD0GlQ1kuA1pNrscg9g12HnB5E8hrWSuEftRsbJhL1HI2zpJhg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.35", - "entities": "^4.5.0", + "@vue/shared": "3.4.36", + "entities": "^5.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", - "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.36.tgz", + "integrity": "sha512-eEIjy4GwwZTFon/Y+WO8tRRNGqylaRlA79T1RLhUpkOzJ7EtZkkb8MurNfkqY6x6Qiu0R7ESspEF7GkPR/4yYg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-core": "3.4.36", + "@vue/shared": "3.4.36" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.35.tgz", - "integrity": "sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.36.tgz", + "integrity": "sha512-rhuHu7qztt/rNH90dXPTzhB7hLQT2OC4s4GrPVqmzVgPY4XBlfWmcWzn4bIPEWNImt0CjO7kfHAf/1UXOtx3vw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.35", - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35", + "@vue/compiler-core": "3.4.36", + "@vue/compiler-dom": "3.4.36", + "@vue/compiler-ssr": "3.4.36", + "@vue/shared": "3.4.36", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.40", @@ -865,13 +865,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz", - "integrity": "sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.36.tgz", + "integrity": "sha512-Wt1zyheF0zVvRJyhY74uxQbnkXV2Le/JPOrAxooR4rFYKC7cFr+cRqW6RU3cM/bsTy7sdZ83IDuy/gLPSfPGng==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-dom": "3.4.36", + "@vue/shared": "3.4.36" } }, "node_modules/@vue/devtools-api": { @@ -881,53 +881,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.35.tgz", - "integrity": "sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.36.tgz", + "integrity": "sha512-wN1aoCwSoqrt1yt8wO0gc13QaC+Vk1o6AoSt584YHNnz6TGDhh1NCMUYgAnvp4HEIkLdGsaC1bvu/P+wpoDEXw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.35" + "@vue/shared": "3.4.36" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.35.tgz", - "integrity": "sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.36.tgz", + "integrity": "sha512-9+TR14LAVEerZWLOm/N/sG2DVYhrH2bKgFrbH/FVt/Q8Jdw4OtdcGMRC6Tx8VAo0DA1eqAqrZaX0fbOaOxxZ4A==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/reactivity": "3.4.36", + "@vue/shared": "3.4.36" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz", - "integrity": "sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.36.tgz", + "integrity": "sha512-2Qe2fKkLxgZBVvHrG0QMNLL4bsx7Ae88pyXebY2WnQYABpOnGYvA+axMbcF9QwM4yxnsv+aELbC0eiNVns7mGw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/runtime-core": "3.4.35", - "@vue/shared": "3.4.35", + "@vue/reactivity": "3.4.36", + "@vue/runtime-core": "3.4.36", + "@vue/shared": "3.4.36", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.35.tgz", - "integrity": "sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.36.tgz", + "integrity": "sha512-2XW90Rq8+Y7S1EIsAuubZVLm0gCU8HYb5mRAruFdwfC3XSOU5/YKePz29csFzsch8hXaY5UHh7ZMddmi1XTJEA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-ssr": "3.4.36", + "@vue/shared": "3.4.36" }, "peerDependencies": { - "vue": "3.4.35" + "vue": "3.4.36" } }, "node_modules/@vue/shared": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", - "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.36.tgz", + "integrity": "sha512-fdPLStwl1sDfYuUftBaUVn2pIrVFDASYerZSrlBvVBfylObPA1gtcWJHy5Ox8jLEJ524zBibss488Q3SZtU1uA==", "license": "MIT" }, "node_modules/acorn": { @@ -1142,9 +1142,9 @@ "dev": true }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-5.0.0.tgz", + "integrity": "sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -2148,16 +2148,16 @@ } }, "node_modules/vue": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.35.tgz", - "integrity": "sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.36.tgz", + "integrity": "sha512-mIFvbLgjODfx3Iy1SrxOsiPpDb8Bo3EU+87ioimOZzZTOp15IEdAels70IjBOLO3ZFlLW5AhdwY4dWbXVQKYow==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-sfc": "3.4.35", - "@vue/runtime-dom": "3.4.35", - "@vue/server-renderer": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-dom": "3.4.36", + "@vue/compiler-sfc": "3.4.36", + "@vue/runtime-dom": "3.4.36", + "@vue/server-renderer": "3.4.36", + "@vue/shared": "3.4.36" }, "peerDependencies": { "typescript": "*" From 64c8181388d4d655dde5aa63cccdaa3aaa68f200 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 6 Aug 2024 16:56:01 +0000 Subject: [PATCH 522/570] Update dependency vue-router to v4.4.3 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 3b6c861b..bcbc3afd 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2244,9 +2244,9 @@ } }, "node_modules/vue-router": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.2.tgz", - "integrity": "sha512-1qNybkn2L7QsLzaXs8nvlQmRKp8XF8DCxZys/Jr1JpQcHsKUxTKzTxCVA1G7NfBfwRIBgCJPoujOG5lHCCNUxw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", + "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.6.3" From 0942803668a67fbae8a9bbb66b16f8cf51b7f870 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 7 Aug 2024 16:55:56 +0000 Subject: [PATCH 523/570] Update dependency vite to v5.4.0 --- front/package-lock.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index bcbc3afd..19adf43c 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2092,14 +2092,14 @@ "dev": true }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "rollup": "^4.13.0" }, "bin": { @@ -2119,6 +2119,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -2136,6 +2137,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, From ac84fc1ff0d68d052d8e0324c32bc0cd9bb5333b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 7 Aug 2024 02:55:53 +0000 Subject: [PATCH 524/570] Update dependency @vitejs/plugin-vue to v5.1.2 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 19adf43c..e61c7485 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -811,9 +811,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.1.tgz", - "integrity": "sha512-sDckXxlHpMsjRQbAH9WanangrfrblsOd3pNifePs+FOHjJg1jfWq5L/P0PsBRndEt3nmdUnmvieP8ULDeX5AvA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz", + "integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==", "dev": true, "license": "MIT", "engines": { From b2b29e06cf1627ae6ad77850b74dbeaf40db7193 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 13 Aug 2024 10:55:47 +0000 Subject: [PATCH 525/570] Update dependency uvicorn to v0.30.6 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2ba889e1..ca74ef5b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.38.2 -uvicorn==0.30.5 +uvicorn==0.30.6 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 From 4cfd62b97bfef9456c662f6eee441c90cc15dbd4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 9 Aug 2024 20:55:55 +0000 Subject: [PATCH 526/570] Update dependency eslint to v9.9.0 --- front/package-lock.json | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index e61c7485..74ff4bf3 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -501,9 +501,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", - "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", + "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", "dev": true, "license": "MIT", "engines": { @@ -1205,9 +1205,9 @@ } }, "node_modules/eslint": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", - "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", + "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", "dev": true, "license": "MIT", "dependencies": { @@ -1215,7 +1215,7 @@ "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.17.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.8.0", + "@eslint/js": "9.9.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -1254,6 +1254,14 @@ }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-google": { From 84e43e0727df293f74690776fe0a2182b7a20084 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 8 Aug 2024 14:55:52 +0000 Subject: [PATCH 527/570] Update dependency vue to v3.4.37 --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 74ff4bf3..be23c6e9 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -825,39 +825,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.36.tgz", - "integrity": "sha512-qBkndgpwFKdupmOPoiS10i7oFdN7a+4UNDlezD0GlQ1kuA1pNrscg9g12HnB5E8hrWSuEftRsbJhL1HI2zpJhg==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.37.tgz", + "integrity": "sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.36", + "@vue/shared": "3.4.37", "entities": "^5.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.36.tgz", - "integrity": "sha512-eEIjy4GwwZTFon/Y+WO8tRRNGqylaRlA79T1RLhUpkOzJ7EtZkkb8MurNfkqY6x6Qiu0R7ESspEF7GkPR/4yYg==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.37.tgz", + "integrity": "sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.36", - "@vue/shared": "3.4.36" + "@vue/compiler-core": "3.4.37", + "@vue/shared": "3.4.37" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.36.tgz", - "integrity": "sha512-rhuHu7qztt/rNH90dXPTzhB7hLQT2OC4s4GrPVqmzVgPY4XBlfWmcWzn4bIPEWNImt0CjO7kfHAf/1UXOtx3vw==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.37.tgz", + "integrity": "sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.36", - "@vue/compiler-dom": "3.4.36", - "@vue/compiler-ssr": "3.4.36", - "@vue/shared": "3.4.36", + "@vue/compiler-core": "3.4.37", + "@vue/compiler-dom": "3.4.37", + "@vue/compiler-ssr": "3.4.37", + "@vue/shared": "3.4.37", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.40", @@ -865,13 +865,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.36.tgz", - "integrity": "sha512-Wt1zyheF0zVvRJyhY74uxQbnkXV2Le/JPOrAxooR4rFYKC7cFr+cRqW6RU3cM/bsTy7sdZ83IDuy/gLPSfPGng==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.37.tgz", + "integrity": "sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.36", - "@vue/shared": "3.4.36" + "@vue/compiler-dom": "3.4.37", + "@vue/shared": "3.4.37" } }, "node_modules/@vue/devtools-api": { @@ -881,53 +881,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.36.tgz", - "integrity": "sha512-wN1aoCwSoqrt1yt8wO0gc13QaC+Vk1o6AoSt584YHNnz6TGDhh1NCMUYgAnvp4HEIkLdGsaC1bvu/P+wpoDEXw==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.37.tgz", + "integrity": "sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.36" + "@vue/shared": "3.4.37" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.36.tgz", - "integrity": "sha512-9+TR14LAVEerZWLOm/N/sG2DVYhrH2bKgFrbH/FVt/Q8Jdw4OtdcGMRC6Tx8VAo0DA1eqAqrZaX0fbOaOxxZ4A==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.37.tgz", + "integrity": "sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.36", - "@vue/shared": "3.4.36" + "@vue/reactivity": "3.4.37", + "@vue/shared": "3.4.37" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.36.tgz", - "integrity": "sha512-2Qe2fKkLxgZBVvHrG0QMNLL4bsx7Ae88pyXebY2WnQYABpOnGYvA+axMbcF9QwM4yxnsv+aELbC0eiNVns7mGw==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.37.tgz", + "integrity": "sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.36", - "@vue/runtime-core": "3.4.36", - "@vue/shared": "3.4.36", + "@vue/reactivity": "3.4.37", + "@vue/runtime-core": "3.4.37", + "@vue/shared": "3.4.37", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.36.tgz", - "integrity": "sha512-2XW90Rq8+Y7S1EIsAuubZVLm0gCU8HYb5mRAruFdwfC3XSOU5/YKePz29csFzsch8hXaY5UHh7ZMddmi1XTJEA==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.37.tgz", + "integrity": "sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.36", - "@vue/shared": "3.4.36" + "@vue/compiler-ssr": "3.4.37", + "@vue/shared": "3.4.37" }, "peerDependencies": { - "vue": "3.4.36" + "vue": "3.4.37" } }, "node_modules/@vue/shared": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.36.tgz", - "integrity": "sha512-fdPLStwl1sDfYuUftBaUVn2pIrVFDASYerZSrlBvVBfylObPA1gtcWJHy5Ox8jLEJ524zBibss488Q3SZtU1uA==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.37.tgz", + "integrity": "sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==", "license": "MIT" }, "node_modules/acorn": { @@ -2160,16 +2160,16 @@ } }, "node_modules/vue": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.36.tgz", - "integrity": "sha512-mIFvbLgjODfx3Iy1SrxOsiPpDb8Bo3EU+87ioimOZzZTOp15IEdAels70IjBOLO3ZFlLW5AhdwY4dWbXVQKYow==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.37.tgz", + "integrity": "sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.36", - "@vue/compiler-sfc": "3.4.36", - "@vue/runtime-dom": "3.4.36", - "@vue/server-renderer": "3.4.36", - "@vue/shared": "3.4.36" + "@vue/compiler-dom": "3.4.37", + "@vue/compiler-sfc": "3.4.37", + "@vue/runtime-dom": "3.4.37", + "@vue/server-renderer": "3.4.37", + "@vue/shared": "3.4.37" }, "peerDependencies": { "typescript": "*" From ee5f33330334c37cb9e235d083c1e9d75f4ede73 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 1 Sep 2024 16:56:01 +0000 Subject: [PATCH 528/570] Update dependency starlette to v0.38.4 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ca74ef5b..4f7b9581 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.38.2 +starlette==0.38.4 uvicorn==0.30.6 aiofiles==24.1.0 Jinja2==3.1.4 From 9b1e9d92de252db73668c81ff58d0bcede6165c2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Sep 2024 00:56:23 +0000 Subject: [PATCH 529/570] Update dependency vue to v3.4.38 --- front/package-lock.json | 114 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index be23c6e9..ffbd02ce 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -825,39 +825,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.37.tgz", - "integrity": "sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz", + "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.37", - "entities": "^5.0.0", + "@vue/shared": "3.4.38", + "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.37.tgz", - "integrity": "sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz", + "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.37", - "@vue/shared": "3.4.37" + "@vue/compiler-core": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.37.tgz", - "integrity": "sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz", + "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.37", - "@vue/compiler-dom": "3.4.37", - "@vue/compiler-ssr": "3.4.37", - "@vue/shared": "3.4.37", + "@vue/compiler-core": "3.4.38", + "@vue/compiler-dom": "3.4.38", + "@vue/compiler-ssr": "3.4.38", + "@vue/shared": "3.4.38", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.40", @@ -865,13 +865,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.37.tgz", - "integrity": "sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz", + "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.37", - "@vue/shared": "3.4.37" + "@vue/compiler-dom": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/devtools-api": { @@ -881,53 +881,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.37.tgz", - "integrity": "sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz", + "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.37" + "@vue/shared": "3.4.38" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.37.tgz", - "integrity": "sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz", + "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.37", - "@vue/shared": "3.4.37" + "@vue/reactivity": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.37.tgz", - "integrity": "sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz", + "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.37", - "@vue/runtime-core": "3.4.37", - "@vue/shared": "3.4.37", + "@vue/reactivity": "3.4.38", + "@vue/runtime-core": "3.4.38", + "@vue/shared": "3.4.38", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.37.tgz", - "integrity": "sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz", + "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.37", - "@vue/shared": "3.4.37" + "@vue/compiler-ssr": "3.4.38", + "@vue/shared": "3.4.38" }, "peerDependencies": { - "vue": "3.4.37" + "vue": "3.4.38" } }, "node_modules/@vue/shared": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.37.tgz", - "integrity": "sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz", + "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==", "license": "MIT" }, "node_modules/acorn": { @@ -1142,9 +1142,9 @@ "dev": true }, "node_modules/entities": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-5.0.0.tgz", - "integrity": "sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -2160,16 +2160,16 @@ } }, "node_modules/vue": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.37.tgz", - "integrity": "sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz", + "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.37", - "@vue/compiler-sfc": "3.4.37", - "@vue/runtime-dom": "3.4.37", - "@vue/server-renderer": "3.4.37", - "@vue/shared": "3.4.37" + "@vue/compiler-dom": "3.4.38", + "@vue/compiler-sfc": "3.4.38", + "@vue/runtime-dom": "3.4.38", + "@vue/server-renderer": "3.4.38", + "@vue/shared": "3.4.38" }, "peerDependencies": { "typescript": "*" From 64cd4dc8f0f6b667117f9090a4b97c3cd1819190 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Sep 2024 08:56:06 +0000 Subject: [PATCH 530/570] Update dependency vite to v5.4.2 --- front/package-lock.json | 167 ++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 75 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index ffbd02ce..ca66bdbd 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -597,208 +597,224 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1822,9 +1838,9 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", "funding": [ { "type": "opencollective", @@ -1920,10 +1936,11 @@ } }, "node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -1935,22 +1952,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", "fsevents": "~2.3.2" } }, @@ -2100,15 +2117,15 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", - "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.40", - "rollup": "^4.13.0" + "postcss": "^8.4.41", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" From 0553152cdefc71a1f7247025074aa86e74397ed1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Sep 2024 12:55:55 +0000 Subject: [PATCH 531/570] Update dependency @vitejs/plugin-vue to v5.1.3 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index ca66bdbd..3cdc75cb 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -827,9 +827,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz", - "integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", + "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", "dev": true, "license": "MIT", "engines": { From 0f4d72876421567f4fdae656125d0b3a60799a36 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 2 Sep 2024 12:56:04 +0000 Subject: [PATCH 532/570] Update dependency eslint to v9.9.1 --- front/package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 3cdc75cb..7713b3cd 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -463,9 +463,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -501,9 +501,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", - "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", + "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", "dev": true, "license": "MIT", "engines": { @@ -1221,17 +1221,17 @@ } }, "node_modules/eslint": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", - "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", + "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", + "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.0", + "@eslint/js": "9.9.1", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", From 2baac2cd0bb9f5d4ae5778ebd842e876fcc662f7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 3 Sep 2024 14:56:02 +0000 Subject: [PATCH 533/570] Update dependency vue to v3.5.0 --- front/package-lock.json | 180 +++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 67 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 7713b3cd..d1b45d96 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -22,11 +22,32 @@ "vite": "^5.2.11" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -34,6 +55,20 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -547,9 +582,10 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -841,53 +877,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz", - "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.0.tgz", + "integrity": "sha512-ja7cpqAOfw4tyFAxgBz70Z42miNDeaqTxExTsnXDLomRpqfyCgyvZvFp482fmsElpfvsoMJUsvzULhvxUTW6Iw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.38", + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.0", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz", - "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.0.tgz", + "integrity": "sha512-xYjUybWZXl+1R/toDy815i4PbeehL2hThiSGkcpmIOCy2HoYyeeC/gAWK/Y/xsoK+GSw198/T5O31bYuQx5uvQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-core": "3.5.0", + "@vue/shared": "3.5.0" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz", - "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.0.tgz", + "integrity": "sha512-B9DgLtrqok2GLuaFjLlSL15ZG3ZDBiitUH1ecex9guh/ZcA5MCdwuVE6nsfQxktuZY/QY0awJ35/ripIviCQTQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.38", - "@vue/compiler-dom": "3.4.38", - "@vue/compiler-ssr": "3.4.38", - "@vue/shared": "3.4.38", + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.0", + "@vue/compiler-dom": "3.5.0", + "@vue/compiler-ssr": "3.5.0", + "@vue/shared": "3.5.0", "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.40", + "magic-string": "^0.30.11", + "postcss": "^8.4.44", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz", - "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.0.tgz", + "integrity": "sha512-E263QZmA1dqRd7c3u/sWTLRMpQOT0aZ8av/L9SoD/v/BVMZaWFHPUUBswS+bzrfvG2suJF8vSLKx6k6ba5SUdA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-dom": "3.5.0", + "@vue/shared": "3.5.0" } }, "node_modules/@vue/devtools-api": { @@ -897,53 +933,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz", - "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.0.tgz", + "integrity": "sha512-Ew3F5riP3B3ZDGjD3ZKb9uZylTTPSqt8hAf4sGbvbjrjDjrFb3Jm15Tk1/w7WwTE5GbQ2Qhwxx1moc9hr8A/OQ==", "license": "MIT", "dependencies": { - "@vue/shared": "3.4.38" + "@vue/shared": "3.5.0" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz", - "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.0.tgz", + "integrity": "sha512-mQyW0F9FaNRdt8ghkAs+BMG3iQ7LGgWKOpkzUzR5AI5swPNydHGL5hvVTqFaeMzwecF1g0c86H4yFQsSxJhH1w==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/reactivity": "3.5.0", + "@vue/shared": "3.5.0" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz", - "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.0.tgz", + "integrity": "sha512-NQQXjpdXgyYVJ2M56FJ+lSJgZiecgQ2HhxhnQBN95FymXegRNY/N2htI7vOTwpP75pfxhIeYOJ8mE8sW8KAW6A==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.38", - "@vue/runtime-core": "3.4.38", - "@vue/shared": "3.4.38", + "@vue/reactivity": "3.5.0", + "@vue/runtime-core": "3.5.0", + "@vue/shared": "3.5.0", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz", - "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.0.tgz", + "integrity": "sha512-HyDIFUg+l7L4PKrEnJlCYWHUOlm6NxZhmSxIefZ5MTYjkIPfDfkwhX7hqxAQHfgIAE1uLMLQZwuNR/ozI0NhZg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-ssr": "3.5.0", + "@vue/shared": "3.5.0" }, "peerDependencies": { - "vue": "3.4.38" + "vue": "3.5.0" } }, "node_modules/@vue/shared": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz", - "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.0.tgz", + "integrity": "sha512-m9IgiteBpCkFaMNwCOBkFksA7z8QiKc30ooRuoXWUFRDu0mGyNPlFHmbncF0/Kra1RlX8QrmBbRaIxVvikaR0Q==", "license": "MIT" }, "node_modules/acorn": { @@ -1695,11 +1731,12 @@ "dev": true }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/minimatch": { @@ -2077,6 +2114,15 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2177,16 +2223,16 @@ } }, "node_modules/vue": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz", - "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.0.tgz", + "integrity": "sha512-1t70favYoFijwfWJ7g81aTd32obGaAnKYE9FNyMgnEzn3F4YncRi/kqAHHKloG0VXTD8vBYMhbgLKCA+Sk6QDw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.38", - "@vue/compiler-sfc": "3.4.38", - "@vue/runtime-dom": "3.4.38", - "@vue/server-renderer": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-dom": "3.5.0", + "@vue/compiler-sfc": "3.5.0", + "@vue/runtime-dom": "3.5.0", + "@vue/server-renderer": "3.5.0", + "@vue/shared": "3.5.0" }, "peerDependencies": { "typescript": "*" From 1b7cafaf30f643b0129477141dd9cfe33eecced8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 3 Sep 2024 16:56:04 +0000 Subject: [PATCH 534/570] Update dependency vite to v5.4.3 --- front/package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index d1b45d96..21c67ef7 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2163,14 +2163,14 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.41", + "postcss": "^8.4.43", "rollup": "^4.20.0" }, "bin": { From b3d3dfc4a37446333896506a1a64dab9cb4bd88b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 8 Sep 2024 10:55:51 +0000 Subject: [PATCH 535/570] Update dependency starlette to v0.38.5 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4f7b9581..a4bef01a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.38.4 +starlette==0.38.5 uvicorn==0.30.6 aiofiles==24.1.0 Jinja2==3.1.4 From 5251d340746fe2170d497230d5a6ed4a63b5b94b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 25 Sep 2024 04:56:10 +0000 Subject: [PATCH 536/570] Update dependency vite to v5.4.8 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 21c67ef7..72536a1a 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2163,9 +2163,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", - "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, "license": "MIT", "dependencies": { From c3ff1a2073e6615f34ea50334294b7be77b52434 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 21 Sep 2024 14:56:03 +0000 Subject: [PATCH 537/570] Update dependency python-multipart to v0.0.10 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a4bef01a..fde31ba9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 yt-dlp==2024.8.6 -python-multipart==0.0.9 +python-multipart==0.0.10 From c4697232ecf1fd3a23f08ee6cb7f1be4523702e4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 25 Sep 2024 16:56:33 +0000 Subject: [PATCH 538/570] Update dependency starlette to v0.39.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fde31ba9..58eaebf0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.38.5 +starlette==0.39.1 uvicorn==0.30.6 aiofiles==24.1.0 Jinja2==3.1.4 From 0242d71d48f7ab9e95fd2fb674e2a78f9e42319e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 26 Sep 2024 12:56:16 +0000 Subject: [PATCH 539/570] Update dependency vue to v3.5.9 --- front/package-lock.json | 132 ++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 72536a1a..5f90d22f 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -877,53 +877,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.0.tgz", - "integrity": "sha512-ja7cpqAOfw4tyFAxgBz70Z42miNDeaqTxExTsnXDLomRpqfyCgyvZvFp482fmsElpfvsoMJUsvzULhvxUTW6Iw==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.9.tgz", + "integrity": "sha512-KE1sCdwqSKq0CQ/ltg3XnlMTKeinjegIkuFsuq9DKvNPmqLGdmI51ChZdGBBRXIvEYTLm8X/JxOuBQ1HqF/+PA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.0", + "@vue/shared": "3.5.9", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.0.tgz", - "integrity": "sha512-xYjUybWZXl+1R/toDy815i4PbeehL2hThiSGkcpmIOCy2HoYyeeC/gAWK/Y/xsoK+GSw198/T5O31bYuQx5uvQ==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.9.tgz", + "integrity": "sha512-gEAURwPo902AsJF50vl59VaWR+Cx6cX9SoqLYHu1jq9hDbmQlXvpZyYNIIbxa2JTJ+FD/oBQweVUwuTQv79KTg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.0", - "@vue/shared": "3.5.0" + "@vue/compiler-core": "3.5.9", + "@vue/shared": "3.5.9" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.0.tgz", - "integrity": "sha512-B9DgLtrqok2GLuaFjLlSL15ZG3ZDBiitUH1ecex9guh/ZcA5MCdwuVE6nsfQxktuZY/QY0awJ35/ripIviCQTQ==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.9.tgz", + "integrity": "sha512-kp9qawcTXakYm0TN6YAwH24IurSywoXh4fWhRbLu0at4UVyo994bhEzJlQn82eiyqtut4GjkQodSfn8drFbpZQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.0", - "@vue/compiler-dom": "3.5.0", - "@vue/compiler-ssr": "3.5.0", - "@vue/shared": "3.5.0", + "@vue/compiler-core": "3.5.9", + "@vue/compiler-dom": "3.5.9", + "@vue/compiler-ssr": "3.5.9", + "@vue/shared": "3.5.9", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", - "postcss": "^8.4.44", + "postcss": "^8.4.47", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.0.tgz", - "integrity": "sha512-E263QZmA1dqRd7c3u/sWTLRMpQOT0aZ8av/L9SoD/v/BVMZaWFHPUUBswS+bzrfvG2suJF8vSLKx6k6ba5SUdA==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.9.tgz", + "integrity": "sha512-fb1g2mQv32QzIei76rlXRTz08Grw+ZzBXSQfHo4StGFutm/flyebw3dGJkexKwcU3GjX9s5fIGjEv/cjO8j8Yw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.0", - "@vue/shared": "3.5.0" + "@vue/compiler-dom": "3.5.9", + "@vue/shared": "3.5.9" } }, "node_modules/@vue/devtools-api": { @@ -933,53 +933,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.0.tgz", - "integrity": "sha512-Ew3F5riP3B3ZDGjD3ZKb9uZylTTPSqt8hAf4sGbvbjrjDjrFb3Jm15Tk1/w7WwTE5GbQ2Qhwxx1moc9hr8A/OQ==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.9.tgz", + "integrity": "sha512-88ApgNZ6yPYpyYkTfXzcbWk6O8+LrPRIpa/U4AdeTzpfRUO+EUt5jemnTBVSlAUNmlYY96xa5feUNEq+BouLog==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.0" + "@vue/shared": "3.5.9" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.0.tgz", - "integrity": "sha512-mQyW0F9FaNRdt8ghkAs+BMG3iQ7LGgWKOpkzUzR5AI5swPNydHGL5hvVTqFaeMzwecF1g0c86H4yFQsSxJhH1w==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.9.tgz", + "integrity": "sha512-YAeP0zNkjSl5mEc1NxOg9qoAhLNbREElHAhfYbMXT57oF0ixehEEJWBhg2uvVxslCGh23JhpEAyMvJrJHW9WGg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.0", - "@vue/shared": "3.5.0" + "@vue/reactivity": "3.5.9", + "@vue/shared": "3.5.9" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.0.tgz", - "integrity": "sha512-NQQXjpdXgyYVJ2M56FJ+lSJgZiecgQ2HhxhnQBN95FymXegRNY/N2htI7vOTwpP75pfxhIeYOJ8mE8sW8KAW6A==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.9.tgz", + "integrity": "sha512-5Oq/5oenpB9lw94moKvOHqBDEaMSyDmcu2HS8AtAT6/pwdo/t9fR9aVtLh6FzYGGqZR9yRfoHAN6P7goblq1aA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.0", - "@vue/runtime-core": "3.5.0", - "@vue/shared": "3.5.0", + "@vue/reactivity": "3.5.9", + "@vue/runtime-core": "3.5.9", + "@vue/shared": "3.5.9", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.0.tgz", - "integrity": "sha512-HyDIFUg+l7L4PKrEnJlCYWHUOlm6NxZhmSxIefZ5MTYjkIPfDfkwhX7hqxAQHfgIAE1uLMLQZwuNR/ozI0NhZg==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.9.tgz", + "integrity": "sha512-tbuUsZfMWGazR9LXLNiiDSTwkO8K9sLyR70diY+FbQmKmh7236PPz4jkTxymelV8D89IJUGtbfe4VdmpHkmuxg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.0", - "@vue/shared": "3.5.0" + "@vue/compiler-ssr": "3.5.9", + "@vue/shared": "3.5.9" }, "peerDependencies": { - "vue": "3.5.0" + "vue": "3.5.9" } }, "node_modules/@vue/shared": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.0.tgz", - "integrity": "sha512-m9IgiteBpCkFaMNwCOBkFksA7z8QiKc30ooRuoXWUFRDu0mGyNPlFHmbncF0/Kra1RlX8QrmBbRaIxVvikaR0Q==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.9.tgz", + "integrity": "sha512-8wiT/m0mnsLhTME0mPgc57jv+4TipRBSAAmheUdYgiOaO6AobZPNOmm87ub4np65VVDgLcWxc+Edc++5Wyz1uA==", "license": "MIT" }, "node_modules/acorn": { @@ -1870,14 +1870,15 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" }, "node_modules/postcss": { - "version": "8.4.44", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", - "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -1895,8 +1896,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2065,9 +2066,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2223,16 +2225,16 @@ } }, "node_modules/vue": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.0.tgz", - "integrity": "sha512-1t70favYoFijwfWJ7g81aTd32obGaAnKYE9FNyMgnEzn3F4YncRi/kqAHHKloG0VXTD8vBYMhbgLKCA+Sk6QDw==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.9.tgz", + "integrity": "sha512-nHzQhZ5cjFKynAY2beAm7XtJ5C13VKAFTLTgRYXy+Id1KEKBeiK6hO2RcW1hUjdbHMadz1YzxyHgQigOC54wug==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.0", - "@vue/compiler-sfc": "3.5.0", - "@vue/runtime-dom": "3.5.0", - "@vue/server-renderer": "3.5.0", - "@vue/shared": "3.5.0" + "@vue/compiler-dom": "3.5.9", + "@vue/compiler-sfc": "3.5.9", + "@vue/runtime-dom": "3.5.9", + "@vue/server-renderer": "3.5.9", + "@vue/shared": "3.5.9" }, "peerDependencies": { "typescript": "*" From 61a4177069a59d95075ed78dfb12a657cbe36a46 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Sep 2024 06:56:13 +0000 Subject: [PATCH 540/570] Update dependency vue-router to v4.4.5 --- front/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 5f90d22f..9935a5d6 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -927,9 +927,9 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, "node_modules/@vue/reactivity": { @@ -2321,12 +2321,12 @@ } }, "node_modules/vue-router": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", - "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", + "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.6.3" + "@vue/devtools-api": "^6.6.4" }, "funding": { "url": "https://github.com/sponsors/posva" From 3691d106f38c4e46a5a5268d8e1cd0a5d9a2303e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 18 Sep 2024 02:56:00 +0000 Subject: [PATCH 541/570] Update dependency @vitejs/plugin-vue to v5.1.4 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 9935a5d6..a40ab873 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -863,9 +863,9 @@ "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", - "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", "dev": true, "license": "MIT", "engines": { From 5a7b46b35c55d3878de63ddd64d901aad39e080b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 28 Sep 2024 00:56:13 +0000 Subject: [PATCH 542/570] Update dependency yt-dlp to v2024.9.27 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 58eaebf0..cf0d0535 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 -yt-dlp==2024.8.6 +yt-dlp==2024.9.27 python-multipart==0.0.10 From b5c87cc3b35e3fc1bc203a973b5fbf9b8793242d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 27 Sep 2024 20:56:09 +0000 Subject: [PATCH 543/570] Update dependency uvicorn to v0.31.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cf0d0535..b3d8e95f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.39.1 -uvicorn==0.30.6 +uvicorn==0.31.0 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 From 411d5c478241ddff08da82ecee1913739aa77e94 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Sep 2024 22:56:03 +0000 Subject: [PATCH 544/570] Update dependency starlette to v0.39.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b3d8e95f..407ffdaf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.39.1 +starlette==0.39.2 uvicorn==0.31.0 aiofiles==24.1.0 Jinja2==3.1.4 From 5da16e4148924cf61cab755700fe6d620ddfd7a8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Sep 2024 22:55:58 +0000 Subject: [PATCH 545/570] Update dependency python-multipart to v0.0.12 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 407ffdaf..3c135228 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 yt-dlp==2024.9.27 -python-multipart==0.0.10 +python-multipart==0.0.12 From 1918a3ab3ff394e54542f2d4b7c7135f4588573f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Sep 2024 22:56:13 +0000 Subject: [PATCH 546/570] Update dependency vue to v3.5.10 --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index a40ab873..1047544b 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -877,39 +877,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.9.tgz", - "integrity": "sha512-KE1sCdwqSKq0CQ/ltg3XnlMTKeinjegIkuFsuq9DKvNPmqLGdmI51ChZdGBBRXIvEYTLm8X/JxOuBQ1HqF/+PA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz", + "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.9", + "@vue/shared": "3.5.10", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.9.tgz", - "integrity": "sha512-gEAURwPo902AsJF50vl59VaWR+Cx6cX9SoqLYHu1jq9hDbmQlXvpZyYNIIbxa2JTJ+FD/oBQweVUwuTQv79KTg==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz", + "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.9", - "@vue/shared": "3.5.9" + "@vue/compiler-core": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.9.tgz", - "integrity": "sha512-kp9qawcTXakYm0TN6YAwH24IurSywoXh4fWhRbLu0at4UVyo994bhEzJlQn82eiyqtut4GjkQodSfn8drFbpZQ==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz", + "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.9", - "@vue/compiler-dom": "3.5.9", - "@vue/compiler-ssr": "3.5.9", - "@vue/shared": "3.5.9", + "@vue/compiler-core": "3.5.10", + "@vue/compiler-dom": "3.5.10", + "@vue/compiler-ssr": "3.5.10", + "@vue/shared": "3.5.10", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.47", @@ -917,13 +917,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.9.tgz", - "integrity": "sha512-fb1g2mQv32QzIei76rlXRTz08Grw+ZzBXSQfHo4StGFutm/flyebw3dGJkexKwcU3GjX9s5fIGjEv/cjO8j8Yw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz", + "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.9", - "@vue/shared": "3.5.9" + "@vue/compiler-dom": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/devtools-api": { @@ -933,53 +933,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.9.tgz", - "integrity": "sha512-88ApgNZ6yPYpyYkTfXzcbWk6O8+LrPRIpa/U4AdeTzpfRUO+EUt5jemnTBVSlAUNmlYY96xa5feUNEq+BouLog==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz", + "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.9" + "@vue/shared": "3.5.10" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.9.tgz", - "integrity": "sha512-YAeP0zNkjSl5mEc1NxOg9qoAhLNbREElHAhfYbMXT57oF0ixehEEJWBhg2uvVxslCGh23JhpEAyMvJrJHW9WGg==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz", + "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.9", - "@vue/shared": "3.5.9" + "@vue/reactivity": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.9.tgz", - "integrity": "sha512-5Oq/5oenpB9lw94moKvOHqBDEaMSyDmcu2HS8AtAT6/pwdo/t9fR9aVtLh6FzYGGqZR9yRfoHAN6P7goblq1aA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz", + "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.9", - "@vue/runtime-core": "3.5.9", - "@vue/shared": "3.5.9", + "@vue/reactivity": "3.5.10", + "@vue/runtime-core": "3.5.10", + "@vue/shared": "3.5.10", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.9.tgz", - "integrity": "sha512-tbuUsZfMWGazR9LXLNiiDSTwkO8K9sLyR70diY+FbQmKmh7236PPz4jkTxymelV8D89IJUGtbfe4VdmpHkmuxg==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz", + "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.9", - "@vue/shared": "3.5.9" + "@vue/compiler-ssr": "3.5.10", + "@vue/shared": "3.5.10" }, "peerDependencies": { - "vue": "3.5.9" + "vue": "3.5.10" } }, "node_modules/@vue/shared": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.9.tgz", - "integrity": "sha512-8wiT/m0mnsLhTME0mPgc57jv+4TipRBSAAmheUdYgiOaO6AobZPNOmm87ub4np65VVDgLcWxc+Edc++5Wyz1uA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz", + "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==", "license": "MIT" }, "node_modules/acorn": { @@ -2225,16 +2225,16 @@ } }, "node_modules/vue": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.9.tgz", - "integrity": "sha512-nHzQhZ5cjFKynAY2beAm7XtJ5C13VKAFTLTgRYXy+Id1KEKBeiK6hO2RcW1hUjdbHMadz1YzxyHgQigOC54wug==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz", + "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.9", - "@vue/compiler-sfc": "3.5.9", - "@vue/runtime-dom": "3.5.9", - "@vue/server-renderer": "3.5.9", - "@vue/shared": "3.5.9" + "@vue/compiler-dom": "3.5.10", + "@vue/compiler-sfc": "3.5.10", + "@vue/runtime-dom": "3.5.10", + "@vue/server-renderer": "3.5.10", + "@vue/shared": "3.5.10" }, "peerDependencies": { "typescript": "*" From 8ebba56aebcbe4d89ac9c6da3cd993a1f2a88323 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 3 Oct 2024 16:56:01 +0000 Subject: [PATCH 547/570] Update dependency vue to v3.5.11 --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 1047544b..ce21c4fc 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -877,39 +877,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz", - "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.11.tgz", + "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.10", + "@vue/shared": "3.5.11", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz", - "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz", + "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-core": "3.5.11", + "@vue/shared": "3.5.11" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz", - "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz", + "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.10", - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10", + "@vue/compiler-core": "3.5.11", + "@vue/compiler-dom": "3.5.11", + "@vue/compiler-ssr": "3.5.11", + "@vue/shared": "3.5.11", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.47", @@ -917,13 +917,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz", - "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz", + "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-dom": "3.5.11", + "@vue/shared": "3.5.11" } }, "node_modules/@vue/devtools-api": { @@ -933,53 +933,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz", - "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.11.tgz", + "integrity": "sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.10" + "@vue/shared": "3.5.11" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz", - "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.11.tgz", + "integrity": "sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/reactivity": "3.5.11", + "@vue/shared": "3.5.11" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz", - "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz", + "integrity": "sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/runtime-core": "3.5.10", - "@vue/shared": "3.5.10", + "@vue/reactivity": "3.5.11", + "@vue/runtime-core": "3.5.11", + "@vue/shared": "3.5.11", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz", - "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.11.tgz", + "integrity": "sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-ssr": "3.5.11", + "@vue/shared": "3.5.11" }, "peerDependencies": { - "vue": "3.5.10" + "vue": "3.5.11" } }, "node_modules/@vue/shared": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz", - "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.11.tgz", + "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==", "license": "MIT" }, "node_modules/acorn": { @@ -2225,16 +2225,16 @@ } }, "node_modules/vue": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz", - "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.11.tgz", + "integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-sfc": "3.5.10", - "@vue/runtime-dom": "3.5.10", - "@vue/server-renderer": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-dom": "3.5.11", + "@vue/compiler-sfc": "3.5.11", + "@vue/runtime-dom": "3.5.11", + "@vue/server-renderer": "3.5.11", + "@vue/shared": "3.5.11" }, "peerDependencies": { "typescript": "*" From 3e95081c54ae9a48ac943281a60be3fa50c0d000 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 23:17:53 +0000 Subject: [PATCH 548/570] Bump rollup from 4.21.2 to 4.24.0 in /front Bumps [rollup](https://github.com/rollup/rollup) from 4.21.2 to 4.24.0. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.21.2...v4.24.0) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --- front/package-lock.json | 159 ++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 88 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index ce21c4fc..db49a0ae 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -633,233 +633,217 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@vitejs/plugin-vue": { @@ -1974,13 +1958,12 @@ } }, "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -1990,22 +1973,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, From bdb3bc629a389bb9e548a14e99c27bdd4deb92dd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 8 Oct 2024 00:52:49 +0000 Subject: [PATCH 549/570] Update dependency yt-dlp to v2024.10.7 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3c135228..04f47c5b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 -yt-dlp==2024.9.27 +yt-dlp==2024.10.7 python-multipart==0.0.12 From 8c91a057c165fd5ae563b0628106a63c70558e48 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sat, 12 Oct 2024 22:30:19 -0400 Subject: [PATCH 550/570] handle bad app_config permissions better --- ydl_server/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ydl_server/config.py b/ydl_server/config.py index db2e72ad..e6b3ee64 100644 --- a/ydl_server/config.py +++ b/ydl_server/config.py @@ -63,7 +63,11 @@ def load_config(): config_file_path ) ) - copy_default_config(config_file_path) + try: + copy_default_config(config_file_path) + except Exception: + print("Error copying default config file, loading it directly") + config_file_path = "./default_config.yml" with open(config_file_path) as configfile: config = yaml.load(configfile, Loader=yaml.SafeLoader) From 9e390ad0b17f361f390cc9aec6c90ee6d50fca12 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 13 Oct 2024 02:56:08 +0000 Subject: [PATCH 551/570] Update dependency vue to v3.5.12 --- front/package-lock.json | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index db49a0ae..7b5aad81 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -861,39 +861,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.11.tgz", - "integrity": "sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.11", + "@vue/shared": "3.5.12", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz", - "integrity": "sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz", - "integrity": "sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.11", - "@vue/compiler-dom": "3.5.11", - "@vue/compiler-ssr": "3.5.11", - "@vue/shared": "3.5.11", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.47", @@ -901,13 +901,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz", - "integrity": "sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/devtools-api": { @@ -917,53 +917,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.11.tgz", - "integrity": "sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.11" + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.11.tgz", - "integrity": "sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz", - "integrity": "sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.11", - "@vue/runtime-core": "3.5.11", - "@vue/shared": "3.5.11", + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.11.tgz", - "integrity": "sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { - "vue": "3.5.11" + "vue": "3.5.12" } }, "node_modules/@vue/shared": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.11.tgz", - "integrity": "sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", "license": "MIT" }, "node_modules/acorn": { @@ -2208,16 +2208,16 @@ } }, "node_modules/vue": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.11.tgz", - "integrity": "sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.11", - "@vue/compiler-sfc": "3.5.11", - "@vue/runtime-dom": "3.5.11", - "@vue/server-renderer": "3.5.11", - "@vue/shared": "3.5.11" + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { "typescript": "*" From e0d1d06a4bd3c04f27220dcf05394473b5224308 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 9 Oct 2024 20:55:56 +0000 Subject: [PATCH 552/570] Update dependency uvicorn to v0.31.1 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 04f47c5b..84b4cabf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.39.2 -uvicorn==0.31.0 +uvicorn==0.31.1 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 From 93a91e132cae4f69cbbd445e3ebe45eaf5c4fb2a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 15 Oct 2024 18:56:24 +0000 Subject: [PATCH 553/570] Update dependency starlette to v0.41.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 84b4cabf..e5e1b570 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -starlette==0.39.2 +starlette==0.41.0 uvicorn==0.31.1 aiofiles==24.1.0 Jinja2==3.1.4 From a95f2a1a1eb4addac40c485e12a38519aac0134e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 16 Oct 2024 01:51:44 +0000 Subject: [PATCH 554/570] Update dependency uvicorn to v0.32.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e5e1b570..8a7016b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ starlette==0.41.0 -uvicorn==0.31.1 +uvicorn==0.32.0 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 From d590bdab3d04264a49de6802e8e55a68e9308236 Mon Sep 17 00:00:00 2001 From: Maxence Date: Wed, 16 Oct 2024 20:29:36 -0400 Subject: [PATCH 555/570] Fix handling of subfolders in finished page --- front/src/components/FileTreeItem.vue | 106 ++++++++++++++++++++++ front/src/components/Finished.vue | 125 ++++++-------------------- ydl_server/views.py | 27 ++---- 3 files changed, 138 insertions(+), 120 deletions(-) create mode 100644 front/src/components/FileTreeItem.vue diff --git a/front/src/components/FileTreeItem.vue b/front/src/components/FileTreeItem.vue new file mode 100644 index 00000000..91cdfaf0 --- /dev/null +++ b/front/src/components/FileTreeItem.vue @@ -0,0 +1,106 @@ + + + diff --git a/front/src/components/Finished.vue b/front/src/components/Finished.vue index 5904fab6..02693bdd 100644 --- a/front/src/components/Finished.vue +++ b/front/src/components/Finished.vue @@ -1,6 +1,7 @@ @@ -112,104 +127,16 @@ export default {
diff --git a/ydl_server/views.py b/ydl_server/views.py index 02c4fc73..1a030fc9 100644 --- a/ydl_server/views.py +++ b/ydl_server/views.py @@ -10,8 +10,7 @@ import shutil -async def api_finished(request): - root_dir = Path(get_finished_path()) +def build_finished_tree(root_dir): matches = root_dir.glob("*") files = [ @@ -21,31 +20,17 @@ async def api_finished(request): "created": datetime.fromtimestamp(f1.stat().st_ctime).strftime("%H:%m %D"), "size": f1.stat().st_size if not f1.is_dir() else None, "directory": f1.is_dir(), - "children": sorted( - [ - { - "name": f2.name, - "size": f2.stat().st_size, - "modified": datetime.fromtimestamp(f2.stat().st_mtime).strftime( - "%H:%m %D" - ), - "created": datetime.fromtimestamp(f2.stat().st_ctime).strftime( - "%H:%m %D" - ), - } - for f2 in f1.iterdir() - if not f2.name.startswith(".") - ], - key=itemgetter("modified"), - reverse=True, - ) + "children": sorted(build_finished_tree(f1), key=itemgetter("modified"), reverse=True) if f1.is_dir() else None, } for f1 in matches if not f1.name.startswith(".") ] - return JSONResponse(files) + return files + +async def api_finished(request): + return JSONResponse(build_finished_tree(Path(get_finished_path()))) async def api_delete_file(request): From 02dcccc84264b4204a2914ce6e2b2883ce4069c7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 17 Oct 2024 00:56:09 +0000 Subject: [PATCH 556/570] Update dependency vite to v5.4.9 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 7b5aad81..3eb46bed 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2148,9 +2148,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "license": "MIT", "dependencies": { From 3ba31cd0d0734b5422d8b26fb0d997a8a19f99b5 Mon Sep 17 00:00:00 2001 From: Maxence Date: Tue, 22 Oct 2024 22:37:10 -0400 Subject: [PATCH 557/570] bump yt-dlp --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8a7016b5..ed325e9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,5 @@ aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 -yt-dlp==2024.10.7 +yt-dlp[default]==2024.10.22 python-multipart==0.0.12 From 49fb2afd5344346bf20a0cb3be8d7c973385d0d0 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 27 Oct 2024 09:46:54 -0400 Subject: [PATCH 558/570] bump python requirements --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index ed325e9c..a1304426 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ -starlette==0.41.0 +starlette==0.41.2 uvicorn==0.32.0 aiofiles==24.1.0 Jinja2==3.1.4 PyYAML==6.0.2 youtube-dl==2021.12.17 yt-dlp[default]==2024.10.22 -python-multipart==0.0.12 +python-multipart==0.0.16 From c4bac189070ff90cedcf251ed9b6168c9c5e775a Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 27 Oct 2024 11:21:43 -0400 Subject: [PATCH 559/570] fix ydl url --- ydl_server/ydlhandler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ydl_server/ydlhandler.py b/ydl_server/ydlhandler.py index 6d508ac5..194760e2 100644 --- a/ydl_server/ydlhandler.py +++ b/ydl_server/ydlhandler.py @@ -20,7 +20,14 @@ def get_ydl_website(ydl_module_name): info = list(pipshow.search_packages_info([ydl_module_name])) if len(info) < 1: return "" - return getattr(info[0], "home-page", getattr(info[0], "homepage", "")) + info = info[0] + url = getattr(info, "home-page", None) or getattr(info, "homepage", None) + if not url: + urls = getattr(info, "project_urls", None) + if urls: + urls = {v.split(",")[0].strip(): v.split(",")[1].strip() for v in urls if "," in v} + url = urls.get("Homepage") or urls.get("Documentation") or urls.get("Repository") + return url def read_proc_stdout(proc, strio): From 0889e478e0595f1a2167539708f64c3fc5cb07eb Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 27 Oct 2024 16:56:08 +0000 Subject: [PATCH 560/570] Update dependency vite to v5.4.10 --- front/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/front/package-lock.json b/front/package-lock.json index 3eb46bed..6b0eeadf 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -2148,9 +2148,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", "dev": true, "license": "MIT", "dependencies": { From 081f89c65e85ef57dbfc267797ffb62ab73cc9f9 Mon Sep 17 00:00:00 2001 From: Maxence Date: Sun, 27 Oct 2024 15:23:54 -0400 Subject: [PATCH 561/570] fetch server info only once --- front/src/App.vue | 16 ++++++++++++++++ front/src/components/Footer.vue | 9 ++------- front/src/components/Header.vue | 7 ++----- front/src/components/Home.vue | 7 ++----- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/front/src/App.vue b/front/src/App.vue index 5356ae75..7d80ccf9 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -1,6 +1,22 @@