diff --git a/src/App.tsx b/src/App.tsx index f711e85..8b67995 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -56,6 +56,7 @@ export default function App({ children }: { children: React.ReactNode }) { const YTDLP_UPDATE_CHANNEL = useSettingsPageStatesStore(state => state.settings.ytdlp_update_channel); const APP_THEME = useSettingsPageStatesStore(state => state.settings.theme); const MAX_PARALLEL_DOWNLOADS = useSettingsPageStatesStore(state => state.settings.max_parallel_downloads); + const MAX_RETRIES = useSettingsPageStatesStore(state => state.settings.max_retries); const DOWNLOAD_DIR = useSettingsPageStatesStore(state => state.settings.download_dir); const PREFER_VIDEO_OVER_PLAYLIST = useSettingsPageStatesStore(state => state.settings.prefer_video_over_playlist); const STRICT_DOWNLOADABILITY_CHECK = useSettingsPageStatesStore(state => state.settings.strict_downloadablity_check); @@ -202,6 +203,8 @@ export default function App({ children }: { children: React.ReactNode }) { selectedFormat, '--no-mtime', '--no-warnings', + '--retries', + MAX_RETRIES.toString(), ]; if (selectedSubtitles) { @@ -864,11 +867,13 @@ export default function App({ children }: { children: React.ReactNode }) { } }, [isErrored, isErrorExpected, erroredDownloadId, setIsErrored, setIsErrorExpected, setErroredDownloadId]); - // auto reset isErrorExpected state after 3 seconds + // auto reset error states after 3 seconds of expecting an error useEffect(() => { if (isErrorExpected) { const timeoutId = setTimeout(() => { + setIsErrored(false); setIsErrorExpected(false); + setErroredDownloadId(null); }, 3000); return () => clearTimeout(timeoutId); } diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx index 4b1f2ed..8d097ff 100644 --- a/src/pages/settings.tsx +++ b/src/pages/settings.tsx @@ -73,6 +73,7 @@ export default function SettingsPage() { const ytDlpAutoUpdate = useSettingsPageStatesStore(state => state.settings.ytdlp_auto_update); const appTheme = useSettingsPageStatesStore(state => state.settings.theme); const maxParallelDownloads = useSettingsPageStatesStore(state => state.settings.max_parallel_downloads); + const maxRetries = useSettingsPageStatesStore(state => state.settings.max_retries); const preferVideoOverPlaylist = useSettingsPageStatesStore(state => state.settings.prefer_video_over_playlist); const strictDownloadabilityCheck = useSettingsPageStatesStore(state => state.settings.strict_downloadablity_check); const useProxy = useSettingsPageStatesStore(state => state.settings.use_proxy); @@ -424,6 +425,19 @@ export default function SettingsPage() { onCheckedChange={(checked) => saveSettingsKey('strict_downloadablity_check', checked)} /> +
+

Max Retries

+

Set maximum number of retries for a download before giving up

+ saveSettingsKey('max_retries', value[0])} + /> + +
diff --git a/src/services/store.ts b/src/services/store.ts index e86b92a..896ec10 100644 --- a/src/services/store.ts +++ b/src/services/store.ts @@ -126,6 +126,7 @@ export const useSettingsPageStatesStore = create((set) prefer_video_over_playlist: true, strict_downloadablity_check: false, max_parallel_downloads: 2, + max_retries: 5, use_proxy: false, proxy_url: '', use_rate_limit: false, @@ -169,6 +170,7 @@ export const useSettingsPageStatesStore = create((set) prefer_video_over_playlist: true, strict_downloadablity_check: false, max_parallel_downloads: 2, + max_retries: 5, use_proxy: false, proxy_url: '', use_rate_limit: false, diff --git a/src/types/settings.ts b/src/types/settings.ts index 2721334..4a2d76d 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -9,6 +9,7 @@ export interface Settings { theme: 'dark' | 'light' | 'system'; download_dir: string; max_parallel_downloads: number; + max_retries: number; prefer_video_over_playlist: boolean; strict_downloadablity_check: boolean; use_proxy: boolean;