summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/common.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/common.py')
-rw-r--r--gallery_dl/extractor/common.py65
1 files changed, 32 insertions, 33 deletions
diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py
index 5efea4a..15cc776 100644
--- a/gallery_dl/extractor/common.py
+++ b/gallery_dl/extractor/common.py
@@ -24,6 +24,7 @@ class Extractor():
category = ""
subcategory = ""
+ basecategory = ""
categorytransfer = False
directory_fmt = ("{category}",)
filename_fmt = "{filename}.{extension}"
@@ -31,8 +32,9 @@ class Extractor():
cookiedomain = ""
root = ""
test = None
- _request_last = 0
- _request_interval = 0
+ request_interval = 0.0
+ request_interval_min = 0.0
+ request_timestamp = 0.0
def __init__(self, match):
self.session = requests.Session()
@@ -48,11 +50,17 @@ class Extractor():
self._retries = self.config("retries", 4)
self._timeout = self.config("timeout", 30)
self._verify = self.config("verify", True)
- self._request_interval = self.config(
- "sleep-request", self._request_interval)
+ self.request_interval = self.config(
+ "sleep-request", self.request_interval)
if self._retries < 0:
self._retries = float("inf")
+ if self.request_interval < self.request_interval_min:
+ self.request_interval = self.request_interval_min
+
+ if self.basecategory:
+ self.config = self._config_shared
+ self.config_accumulate = self._config_shared_accumulate
self._init_headers()
self._init_cookies()
@@ -80,6 +88,19 @@ class Extractor():
def config_accumulate(self, key):
return config.accumulate(self._cfgpath, key)
+ def _config_shared(self, key, default=None):
+ return config.interpolate_common(("extractor",), (
+ (self.category, self.subcategory),
+ (self.basecategory, self.subcategory),
+ ), key, default)
+
+ def _config_shared_accumulate(self, key):
+ values = config.accumulate(self._cfgpath, key)
+ conf = config.get(("extractor",), self.basecategory)
+ if conf:
+ values[:0] = config.accumulate((self.subcategory,), key, conf=conf)
+ return values
+
def request(self, url, *, method="GET", session=None, retries=None,
encoding=None, fatal=True, notfound=None, **kwargs):
tries = 1
@@ -89,10 +110,10 @@ class Extractor():
kwargs.setdefault("verify", self._verify)
response = None
- if self._request_interval:
- seconds = (self._request_interval -
- (time.time() - Extractor._request_last))
- if seconds > 0:
+ if self.request_interval:
+ seconds = (self.request_interval -
+ (time.time() - Extractor.request_timestamp))
+ if seconds > 0.0:
self.log.debug("Sleeping for %.5s seconds", seconds)
time.sleep(seconds)
@@ -135,12 +156,12 @@ class Extractor():
if code < 500 and code != 429 and code != 430:
break
finally:
- Extractor._request_last = time.time()
+ Extractor.request_timestamp = time.time()
self.log.debug("%s (%s/%s)", msg, tries, retries+1)
if tries > retries:
break
- time.sleep(tries)
+ time.sleep(max(tries, self.request_interval))
tries += 1
raise exception.HttpError(msg, response)
@@ -506,28 +527,6 @@ class AsynchronousMixin():
messages.put(None)
-class SharedConfigMixin():
- """Enable sharing of config settings based on 'basecategory'"""
- basecategory = ""
-
- def config(self, key, default=None):
- return config.interpolate_common(
- ("extractor",), (
- (self.category, self.subcategory),
- (self.basecategory, self.subcategory),
- ), key, default,
- )
-
- def config_accumulate(self, key):
- values = config.accumulate(self._cfgpath, key)
-
- conf = config.get(("extractor",), self.basecategory)
- if conf:
- values[:0] = config.accumulate((self.subcategory,), key, conf=conf)
-
- return values
-
-
def generate_extractors(extractor_data, symtable, classes):
"""Dynamically generate Extractor classes"""
extractors = config.get(("extractor",), classes[0].basecategory)
@@ -539,7 +538,7 @@ def generate_extractors(extractor_data, symtable, classes):
for category, info in extractor_data.items():
- if not isinstance(info, dict):
+ if not isinstance(info, dict) or "root" not in info:
continue
root = info["root"]