diff --git a/docs/configuration.rst b/docs/configuration.rst index 861297fc..1b8229f3 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -301,7 +301,8 @@ extractor.*.retries =========== ===== Type ``integer`` Default ``4`` -Description Number of times a failed HTTP request is retried before giving up. +Description Maximum number of times a failed HTTP request is retried before + giving up or ``-1`` for infinite retries. =========== ===== @@ -1024,7 +1025,8 @@ downloader.*.retries =========== ===== Type ``integer`` Default `extractor.*.retries`_ -Description Number of retries during file downloads. +Description Maximum number of retries during file downloads + or ``-1`` for infinite retries. =========== ===== diff --git a/gallery_dl/downloader/http.py b/gallery_dl/downloader/http.py index 87f745b2..82092c21 100644 --- a/gallery_dl/downloader/http.py +++ b/gallery_dl/downloader/http.py @@ -30,6 +30,8 @@ class HttpDownloader(DownloaderBase): self.downloading = False self.chunk_size = 16384 + if self.retries < 0: + self.retries = float("inf") if self.rate: self.rate = text.parse_bytes(self.rate) if not self.rate: diff --git a/gallery_dl/downloader/ytdl.py b/gallery_dl/downloader/ytdl.py index 7866f301..da579358 100644 --- a/gallery_dl/downloader/ytdl.py +++ b/gallery_dl/downloader/ytdl.py @@ -20,10 +20,11 @@ class YoutubeDLDownloader(DownloaderBase): def __init__(self, extractor, output): DownloaderBase.__init__(self, extractor, output) + retries = self.config("retries", extractor._retries) options = { "format": self.config("format") or None, "ratelimit": text.parse_bytes(self.config("rate"), None), - "retries": self.config("retries", extractor._retries), + "retries": retries+1 if retries >= 0 else float("inf"), "socket_timeout": self.config("timeout", extractor._timeout), "nocheckcertificate": not self.config("verify", extractor._verify), "nopart": not self.part, diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index 70428650..e883d33a 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -43,6 +43,9 @@ class Extractor(): self._timeout = self.config("timeout", 30) self._verify = self.config("verify", True) + if self._retries < 0: + self._retries = float("inf") + @classmethod def from_url(cls, url): if isinstance(cls.pattern, str): diff --git a/gallery_dl/option.py b/gallery_dl/option.py index d6470ed7..26dfd8ee 100644 --- a/gallery_dl/option.py +++ b/gallery_dl/option.py @@ -173,8 +173,9 @@ def build_parser(): ) downloader.add_argument( "-R", "--retries", - dest="retries", metavar="RETRIES", type=int, action=ConfigAction, - help="Number of retries (default: 4)", + dest="retries", metavar="N", type=int, action=ConfigAction, + help=("Maximum number of retries for failed HTTP requests " + "or -1 for infinite retries (default: 4)"), ) downloader.add_argument( "-A", "--abort",