From e0d686f22729c6702909155d2462ad955308fdaa Mon Sep 17 00:00:00 2001 From: ArabCoders Date: Mon, 4 Mar 2024 22:47:43 +0300 Subject: [PATCH 1/8] Changed theme icon. --- frontend/src/components/Page-Header.vue | 73 ++++++++++++++----------- frontend/src/main.js | 7 ++- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/frontend/src/components/Page-Header.vue b/frontend/src/components/Page-Header.vue index 7bb0a469..dff32460 100644 --- a/frontend/src/components/Page-Header.vue +++ b/frontend/src/components/Page-Header.vue @@ -19,9 +19,17 @@ @@ -45,36 +53,39 @@ defineProps({ const applyPreferredColorScheme = (scheme) => { for (var s = 0; s < document.styleSheets.length; s++) { for (var i = 0; i < document.styleSheets[s].cssRules.length; i++) { - const rule = document.styleSheets[s].cssRules[i]; - - if (rule && rule.media && rule.media.mediaText.includes("prefers-color-scheme")) { - switch (scheme) { - case "light": - rule.media.appendMedium("original-prefers-color-scheme"); - if (rule.media.mediaText.includes("light")) { - rule.media.deleteMedium("(prefers-color-scheme: light)"); - } - if (rule.media.mediaText.includes("dark")) { - rule.media.deleteMedium("(prefers-color-scheme: dark)"); - } - break; - case "dark": - rule.media.appendMedium("(prefers-color-scheme: light)"); - rule.media.appendMedium("(prefers-color-scheme: dark)"); - if (rule.media.mediaText.includes("original")) { - rule.media.deleteMedium("original-prefers-color-scheme"); - } - break; - default: - rule.media.appendMedium("(prefers-color-scheme: dark)"); - if (rule.media.mediaText.includes("light")) { - rule.media.deleteMedium("(prefers-color-scheme: light)"); - } - if (rule.media.mediaText.includes("original")) { - rule.media.deleteMedium("original-prefers-color-scheme"); - } - break; + try { + const rule = document.styleSheets[s].cssRules[i]; + if (rule && rule.media && rule.media.mediaText.includes("prefers-color-scheme")) { + switch (scheme) { + case "light": + rule.media.appendMedium("original-prefers-color-scheme"); + if (rule.media.mediaText.includes("light")) { + rule.media.deleteMedium("(prefers-color-scheme: light)"); + } + if (rule.media.mediaText.includes("dark")) { + rule.media.deleteMedium("(prefers-color-scheme: dark)"); + } + break; + case "dark": + rule.media.appendMedium("(prefers-color-scheme: light)"); + rule.media.appendMedium("(prefers-color-scheme: dark)"); + if (rule.media.mediaText.includes("original")) { + rule.media.deleteMedium("original-prefers-color-scheme"); + } + break; + default: + rule.media.appendMedium("(prefers-color-scheme: dark)"); + if (rule.media.mediaText.includes("light")) { + rule.media.deleteMedium("(prefers-color-scheme: light)"); + } + if (rule.media.mediaText.includes("original")) { + rule.media.deleteMedium("original-prefers-color-scheme"); + } + break; + } } + } catch (e) { + console.debug(e); } } } diff --git a/frontend/src/main.js b/frontend/src/main.js index 9156da27..820ca712 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -6,7 +6,7 @@ import { library } from '@fortawesome/fontawesome-svg-core' import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' import { faCog, faTrash, faLink, faPlus, faTrashCan, faCircleXmark, faCircleCheck, faRotateRight, faDownload, faUpRightFromSquare, - faSpinner, faArrowUp, faArrowDown, faTasks, faCalendar, faArrowUpAZ, faArrowDownAZ, faEject, faGlobe + faSpinner, faArrowUp, faArrowDown, faTasks, faCalendar, faArrowUpAZ, faArrowDownAZ, faEject, faGlobe, faMoon, faSun } from '@fortawesome/free-solid-svg-icons' import { faSquare, faSquareCheck } from '@fortawesome/free-regular-svg-icons' @@ -17,8 +17,9 @@ import './assets/css/bulma-dark.css' import './assets/css/style.css' import 'floating-vue/dist/style.css' -library.add(faCog, faTrash, faLink, faPlus, faTrashCan, faCircleXmark, faCircleCheck, faRotateRight, faDownload, faUpRightFromSquare, - faSquare, faSquareCheck, faSpinner, faArrowUp, faArrowDown, faTasks, faCalendar, faArrowUpAZ, faArrowDownAZ, faEject, faGlobe) +library.add(faCog, faTrash, faLink, faPlus, faTrashCan, faCircleXmark, faCircleCheck, faRotateRight, faDownload, + faUpRightFromSquare, faSquare, faSquareCheck, faSpinner, faArrowUp, faArrowDown, faTasks, faCalendar, faArrowUpAZ, + faArrowDownAZ, faEject, faGlobe, faMoon, faSun) const app = createApp(App); app.config.globalProperties.capitalize = s => s && s[0].toUpperCase() + s.slice(1); From abe5971f8cd9b6f5baa3977449c57a2617cac9a8 Mon Sep 17 00:00:00 2001 From: ArabCoders Date: Tue, 5 Mar 2024 14:13:00 +0300 Subject: [PATCH 2/8] fix --- app/DownloadQueue.py | 61 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/app/DownloadQueue.py b/app/DownloadQueue.py index 7701efed..49979746 100644 --- a/app/DownloadQueue.py +++ b/app/DownloadQueue.py @@ -217,47 +217,46 @@ class DownloadQueue: else: already.add(url) try: - with ThreadPoolExecutor(thread_name_prefix='extract_info') as pool: - LOG.debug(f'extracting info from {url=}') + LOG.debug(f'extracting info from {url=}') + entry = await asyncio.get_running_loop().run_in_executor( + None, + ExtractInfo, + mergeConfig(self.config.ytdl_options, ytdlp_config), + url, + bool(self.config.ytdl_debug) + ) + + if not entry: + if not self.config.keep_archive: + return { + 'status': 'error', + 'msg': 'No metadata, most likely video has been downloaded before.' if self.config.keep_archive else 'Unable to extract info check logs.' + } + + LOG.debug(f'No metadata, Rechecking with archive disabled. {url=}') entry = await asyncio.get_running_loop().run_in_executor( - pool, + None, ExtractInfo, mergeConfig(self.config.ytdl_options, ytdlp_config), url, - bool(self.config.ytdl_debug) + bool(self.config.ytdl_debug), + True ) if not entry: - if not self.config.keep_archive: - return { - 'status': 'error', - 'msg': 'No metadata, most likely video has been downloaded before.' if self.config.keep_archive else 'Unable to extract info check logs.' - } + return {'status': 'error', 'msg': 'Unable to extract info check logs.'} - LOG.debug(f'No metadata, Rechecking with archive disabled. {url=}') - entry = await asyncio.get_running_loop().run_in_executor( - pool, - ExtractInfo, - mergeConfig(self.config.ytdl_options, ytdlp_config), - url, - bool(self.config.ytdl_debug), - True - ) - - if not entry: - return {'status': 'error', 'msg': 'Unable to extract info check logs.'} - - if self.isDownloaded(entry): - LOG.info(f'[{entry.get("id")}: {entry.get("title")}]: has been downloaded already.') - return { - 'status': 'error', - 'msg': f'[{entry.get("id")}: {entry.get("title")}]: has been downloaded already.' - } + if self.isDownloaded(entry): + LOG.info(f'[{entry.get("id")}: {entry.get("title")}]: has been downloaded already.') + return { + 'status': 'error', + 'msg': f'[{entry.get("id")}: {entry.get("title")}]: has been downloaded already.' + } if self.isDownloaded(entry): raise yt_dlp.utils.ExistingVideoReached() - LOG.debug(f'extract_info length: {len(entry)}') + LOG.debug(f'extract_info for [{url=}] length: {len(entry)}') except yt_dlp.utils.ExistingVideoReached: return {'status': 'error', 'msg': 'Video has been downloaded already and recorded in archive.log file.'} except yt_dlp.utils.YoutubeDLError as exc: @@ -348,10 +347,8 @@ class DownloadQueue: LOG.info(f'Waiting for worker to be free.') await asyncio.sleep(1) - LOG.debug(f"Has '{executor.get_available_workers()}' free workers.") - while not self.queue.hasDownloads(): - LOG.info('Waiting for item to download.') + LOG.info(f"Waiting for item to download. '{executor.get_available_workers()}' free workers.") await self.event.wait() self.event.clear() LOG.debug(f"Cleared wait event.") From 9ff44f323455d272b92d7f9c3198900a7a515031 Mon Sep 17 00:00:00 2001 From: ArabCoders Date: Tue, 5 Mar 2024 14:45:22 +0300 Subject: [PATCH 3/8] added timeout limit to extract_info --- app/Config.py | 2 ++ app/DownloadQueue.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Config.py b/app/Config.py index 7f57051c..713c94c8 100644 --- a/app/Config.py +++ b/app/Config.py @@ -44,6 +44,8 @@ class Config: debug: bool = False new_version_available: bool = False + + extract_info_timeout: int = 70 _int_vars: tuple = ('port', 'max_workers',) _immutable: tuple = ('version', '__instance', 'ytdl_options', 'new_version_available') diff --git a/app/DownloadQueue.py b/app/DownloadQueue.py index 49979746..08fee794 100644 --- a/app/DownloadQueue.py +++ b/app/DownloadQueue.py @@ -218,7 +218,7 @@ class DownloadQueue: already.add(url) try: LOG.debug(f'extracting info from {url=}') - entry = await asyncio.get_running_loop().run_in_executor( + data = asyncio.get_running_loop().run_in_executor( None, ExtractInfo, mergeConfig(self.config.ytdl_options, ytdlp_config), @@ -226,6 +226,8 @@ class DownloadQueue: bool(self.config.ytdl_debug) ) + entry = await asyncio.wait_for(data, timeout=self.config.extract_info_timeout) + if not entry: if not self.config.keep_archive: return { @@ -234,7 +236,7 @@ class DownloadQueue: } LOG.debug(f'No metadata, Rechecking with archive disabled. {url=}') - entry = await asyncio.get_running_loop().run_in_executor( + data = await asyncio.get_running_loop().run_in_executor( None, ExtractInfo, mergeConfig(self.config.ytdl_options, ytdlp_config), @@ -242,6 +244,8 @@ class DownloadQueue: bool(self.config.ytdl_debug), True ) + + entry = await asyncio.wait_for(data, timeout=self.config.extract_info_timeout) if not entry: return {'status': 'error', 'msg': 'Unable to extract info check logs.'} @@ -261,6 +265,8 @@ class DownloadQueue: return {'status': 'error', 'msg': 'Video has been downloaded already and recorded in archive.log file.'} except yt_dlp.utils.YoutubeDLError as exc: return {'status': 'error', 'msg': str(exc)} + except asyncio.exceptions.TimeoutError as exc: + return {'status': 'error', 'msg': 'TimeoutError: Unable to extract info.'} return await self.__add_entry( entry=entry, From f0a538dad2e9ba1867f4f1fb806bde6fb909238b Mon Sep 17 00:00:00 2001 From: ArabCoders Date: Tue, 5 Mar 2024 15:25:30 +0300 Subject: [PATCH 4/8] Added reload button. --- frontend/src/App.vue | 6 ++++-- frontend/src/components/Page-Header.vue | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 041cf5f5..d7298841 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,5 +1,6 @@