diff --git a/gallery_dl/__init__.py b/gallery_dl/__init__.py
index 6b5cfd05..9ab61e54 100644
--- a/gallery_dl/__init__.py
+++ b/gallery_dl/__init__.py
@@ -121,14 +121,12 @@ def main():
util.compile_expression = util.compile_expression_defaultdict
# format string separator
- separator = config.get((), "format-separator")
- if separator:
+ if separator := config.get((), "format-separator"):
from . import formatter
formatter._SEPARATOR = separator
# eval globals
- path = config.get((), "globals")
- if path:
+ if path := config.get((), "globals"):
util.GLOBALS.update(util.import_file(path).__dict__)
# loglevels
@@ -140,13 +138,12 @@ def main():
import platform
import requests
- extra = ""
if util.EXECUTABLE:
extra = f" - Executable ({version.__variant__})"
+ elif git_head := util.git_head():
+ extra = " - Git HEAD: " + git_head
else:
- git_head = util.git_head()
- if git_head:
- extra = " - Git HEAD: " + git_head
+ extra = ""
log.debug("Version %s%s", __version__, extra)
log.debug("Python %s - %s",
@@ -256,8 +253,7 @@ def main():
))
else:
- input_files = config.get((), "input-files")
- if input_files:
+ if input_files := config.get((), "input-files"):
for input_file in input_files:
if isinstance(input_file, str):
input_file = (input_file, None)
@@ -287,17 +283,15 @@ def main():
input_manager.log = input_log = logging.getLogger("inputfile")
# unsupported file logging handler
- handler = output.setup_logging_handler(
- "unsupportedfile", fmt="{message}")
- if handler:
+ if handler := output.setup_logging_handler(
+ "unsupportedfile", fmt="{message}"):
ulog = job.Job.ulog = logging.getLogger("unsupported")
ulog.addHandler(handler)
ulog.propagate = False
# error file logging handler
- handler = output.setup_logging_handler(
- "errorfile", fmt="{message}", mode="a")
- if handler:
+ if handler := output.setup_logging_handler(
+ "errorfile", fmt="{message}", mode="a"):
elog = input_manager.err = logging.getLogger("errorfile")
elog.addHandler(handler)
elog.propagate = False
@@ -319,8 +313,7 @@ def main():
args.loglevel < logging.ERROR:
input_manager.progress(pformat)
- catmap = config.interpolate(("extractor",), "category-map")
- if catmap:
+ if catmap := config.interpolate(("extractor",), "category-map"):
if catmap == "compat":
catmap = {
"coomer" : "coomerparty",
diff --git a/gallery_dl/config.py b/gallery_dl/config.py
index 4f686821..1873634e 100644
--- a/gallery_dl/config.py
+++ b/gallery_dl/config.py
@@ -103,14 +103,12 @@ def open_extern():
openers = ("explorer", "notepad")
else:
openers = ("xdg-open", "open")
- editor = os.environ.get("EDITOR")
- if editor:
+ if editor := os.environ.get("EDITOR"):
openers = (editor,) + openers
import shutil
for opener in openers:
- opener = shutil.which(opener)
- if opener:
+ if opener := shutil.which(opener):
break
else:
log.warning("Unable to find a program to open '%s' with", path)
@@ -211,8 +209,7 @@ def load(files=None, strict=False, loads=util.json_loads):
_files.append(pathfmt)
if "subconfigs" in conf:
- subconfigs = conf["subconfigs"]
- if subconfigs:
+ if subconfigs := conf["subconfigs"]:
if isinstance(subconfigs, str):
subconfigs = (subconfigs,)
load(subconfigs, strict, loads)
@@ -284,8 +281,7 @@ def accumulate(path, key, conf=_config):
result = []
try:
if key in conf:
- value = conf[key]
- if value:
+ if value := conf[key]:
if isinstance(value, list):
result.extend(value)
else:
@@ -293,8 +289,7 @@ def accumulate(path, key, conf=_config):
for p in path:
conf = conf[p]
if key in conf:
- value = conf[key]
- if value:
+ if value := conf[key]:
if isinstance(value, list):
result[:0] = value
else:
diff --git a/gallery_dl/downloader/common.py b/gallery_dl/downloader/common.py
index dc1219f0..7cd8d10f 100644
--- a/gallery_dl/downloader/common.py
+++ b/gallery_dl/downloader/common.py
@@ -21,8 +21,7 @@ class DownloaderBase():
extractor = job.extractor
self.log = job.get_logger("downloader." + self.scheme)
- opts = self._extractor_config(extractor)
- if opts:
+ if opts := self._extractor_config(extractor):
self.opts = opts
self.config = self.config_opts
@@ -60,8 +59,7 @@ class DownloaderBase():
opts = {}
for cat, sub in reversed(path):
- popts = self._extractor_opts(cat, sub)
- if popts:
+ if popts := self._extractor_opts(cat, sub):
opts.update(popts)
return opts
@@ -70,12 +68,10 @@ class DownloaderBase():
if not cfg:
return None
- copts = cfg.get(self.scheme)
- if copts:
+ if copts := cfg.get(self.scheme):
if subcategory in cfg:
try:
- sopts = cfg[subcategory].get(self.scheme)
- if sopts:
+ if sopts := cfg[subcategory].get(self.scheme):
opts = copts.copy()
opts.update(sopts)
return opts
diff --git a/gallery_dl/downloader/http.py b/gallery_dl/downloader/http.py
index cc05552a..45954834 100644
--- a/gallery_dl/downloader/http.py
+++ b/gallery_dl/downloader/http.py
@@ -71,8 +71,7 @@ class HttpDownloader(DownloaderBase):
self.chunk_size = chunk_size
if self.rate:
func = util.build_selection_func(self.rate, 0, text.parse_bytes)
- rmax = func.args[1] if hasattr(func, "args") else func()
- if rmax:
+ if rmax := func.args[1] if hasattr(func, "args") else func():
if rmax < self.chunk_size:
# reduce chunk_size to allow for one iteration each second
self.chunk_size = rmax
@@ -141,15 +140,13 @@ class HttpDownloader(DownloaderBase):
# collect HTTP headers
headers = {"Accept": "*/*"}
# file-specific headers
- extra = kwdict.get("_http_headers")
- if extra:
+ if extra := kwdict.get("_http_headers"):
headers.update(extra)
# general headers
if self.headers:
headers.update(self.headers)
# partial content
- file_size = pathfmt.part_size()
- if file_size:
+ if file_size := pathfmt.part_size():
headers["Range"] = f"bytes={file_size}-"
# connect to (remote) source
@@ -424,8 +421,7 @@ class HttpDownloader(DownloaderBase):
if mtype in MIME_TYPES:
return MIME_TYPES[mtype]
- ext = mimetypes.guess_extension(mtype, strict=False)
- if ext:
+ if ext := mimetypes.guess_extension(mtype, strict=False):
return ext[1:]
self.log.warning("Unknown MIME type '%s'", mtype)
diff --git a/gallery_dl/downloader/ytdl.py b/gallery_dl/downloader/ytdl.py
index 8016f134..69a59ffc 100644
--- a/gallery_dl/downloader/ytdl.py
+++ b/gallery_dl/downloader/ytdl.py
@@ -80,8 +80,7 @@ class YoutubeDLDownloader(DownloaderBase):
if not info_dict:
url = url[5:]
try:
- manifest = kwdict.pop("_ytdl_manifest", None)
- if manifest:
+ if manifest := kwdict.pop("_ytdl_manifest", None):
info_dict = self._extract_manifest(
ytdl_instance, url, manifest,
kwdict.pop("_ytdl_manifest_data", None),
@@ -103,8 +102,7 @@ class YoutubeDLDownloader(DownloaderBase):
else:
info_dict = info_dict["entries"][index]
- extra = kwdict.get("_ytdl_extra")
- if extra:
+ if extra := kwdict.get("_ytdl_extra"):
info_dict.update(extra)
return self._download_video(ytdl_instance, pathfmt, info_dict)
diff --git a/gallery_dl/extractor/2ch.py b/gallery_dl/extractor/2ch.py
index e2903f9d..f5bb7b70 100644
--- a/gallery_dl/extractor/2ch.py
+++ b/gallery_dl/extractor/2ch.py
@@ -40,8 +40,7 @@ class _2chThreadExtractor(Extractor):
yield Message.Directory, thread
for post in posts:
- files = post.get("files")
- if files:
+ if files := post.get("files"):
post["post_name"] = post["name"]
post["date"] = text.parse_timestamp(post["timestamp"])
del post["files"]
diff --git a/gallery_dl/extractor/8muses.py b/gallery_dl/extractor/8muses.py
index a98561da..120cd8a2 100644
--- a/gallery_dl/extractor/8muses.py
+++ b/gallery_dl/extractor/8muses.py
@@ -37,8 +37,7 @@ class _8musesAlbumExtractor(Extractor):
self.request(url).text,
'id="ractive-public" type="text/plain">', ''))
- images = data.get("pictures")
- if images:
+ if images := data.get("pictures"):
count = len(images)
album = self._make_album(data["album"])
yield Message.Directory, {"album": album, "count": count}
@@ -54,8 +53,7 @@ class _8musesAlbumExtractor(Extractor):
}
yield Message.Url, url, img
- albums = data.get("albums")
- if albums:
+ if albums := data.get("albums"):
for album in albums:
permalink = album.get("permalink")
if not permalink:
diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index f51a6063..6ecba9bc 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -235,8 +235,7 @@ modules = [
def find(url):
"""Find a suitable extractor for the given URL"""
for cls in _list_classes():
- match = cls.pattern.match(url)
- if match:
+ if match := cls.pattern.match(url):
return cls(match)
return None
@@ -251,8 +250,7 @@ def add(cls):
def add_module(module):
"""Add all extractors in 'module' to the list of available extractors"""
- classes = _get_classes(module)
- if classes:
+ if classes := _get_classes(module):
if isinstance(classes[0].pattern, str):
for cls in classes:
cls.pattern = re_compile(cls.pattern)
diff --git a/gallery_dl/extractor/ao3.py b/gallery_dl/extractor/ao3.py
index 805b081f..2652acb2 100644
--- a/gallery_dl/extractor/ao3.py
+++ b/gallery_dl/extractor/ao3.py
@@ -205,8 +205,7 @@ class Ao3WorkExtractor(Ao3Extractor):
}
data["language"] = util.code_to_language(data["lang"])
- series = data["series"]
- if series:
+ if series := data["series"]:
extr = text.extract_from(series)
data["series"] = {
"prev" : extr(' class="previous" href="/works/', '"'),
diff --git a/gallery_dl/extractor/arcalive.py b/gallery_dl/extractor/arcalive.py
index 1c941120..1df7e0fc 100644
--- a/gallery_dl/extractor/arcalive.py
+++ b/gallery_dl/extractor/arcalive.py
@@ -86,8 +86,7 @@ class ArcalivePostExtractor(ArcaliveExtractor):
fallback = ()
query = f"?type=orig&{query}"
- orig = text.extr(media, 'data-orig="', '"')
- if orig:
+ if orig := text.extr(media, 'data-orig="', '"'):
path, _, ext = url.rpartition(".")
if ext != orig:
fallback = (url + query,)
diff --git a/gallery_dl/extractor/aryion.py b/gallery_dl/extractor/aryion.py
index 904f37a3..8a7cb047 100644
--- a/gallery_dl/extractor/aryion.py
+++ b/gallery_dl/extractor/aryion.py
@@ -61,8 +61,7 @@ class AryionExtractor(Extractor):
data = self.metadata()
for post_id in self.posts():
- post = self._parse_post(post_id)
- if post:
+ if post := self._parse_post(post_id):
if data:
post.update(data)
yield Message.Directory, post
diff --git a/gallery_dl/extractor/batoto.py b/gallery_dl/extractor/batoto.py
index 9f7f061d..50e0c5d7 100644
--- a/gallery_dl/extractor/batoto.py
+++ b/gallery_dl/extractor/batoto.py
@@ -152,8 +152,7 @@ class BatotoMangaExtractor(BatotoBase, MangaExtractor):
def chapters(self, page):
extr = text.extract_from(page)
- warning = extr(' class="alert alert-warning">', "")
- if warning:
+ if warning := extr(' class="alert alert-warning">', ""):
self.log.warning("'%s'", text.remove_html(warning))
data = {
diff --git a/gallery_dl/extractor/behance.py b/gallery_dl/extractor/behance.py
index 1ed89934..d5967ca2 100644
--- a/gallery_dl/extractor/behance.py
+++ b/gallery_dl/extractor/behance.py
@@ -93,8 +93,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
def _init(self):
BehanceExtractor._init(self)
- modules = self.config("modules")
- if modules:
+ if modules := self.config("modules"):
if isinstance(modules, str):
modules = modules.split(",")
self.modules = set(modules)
@@ -208,8 +207,8 @@ class BehanceGalleryExtractor(BehanceExtractor):
break
elif mtype == "embed":
- embed = module.get("originalEmbed") or module.get("fluidEmbed")
- if embed:
+ if embed := (module.get("originalEmbed") or
+ module.get("fluidEmbed")):
embed = text.unescape(text.extr(embed, 'src="', '"'))
module["extension"] = "mp4"
results.append(("ytdl:" + embed, module))
diff --git a/gallery_dl/extractor/bluesky.py b/gallery_dl/extractor/bluesky.py
index 268f3a88..e2c5334d 100644
--- a/gallery_dl/extractor/bluesky.py
+++ b/gallery_dl/extractor/bluesky.py
@@ -26,8 +26,7 @@ class BlueskyExtractor(Extractor):
root = "https://bsky.app"
def _init(self):
- meta = self.config("metadata") or ()
- if meta:
+ if meta := self.config("metadata") or ():
if isinstance(meta, str):
meta = meta.replace(" ", "").split(",")
elif not isinstance(meta, (list, tuple)):
diff --git a/gallery_dl/extractor/booru.py b/gallery_dl/extractor/booru.py
index 7e26f38b..3b97e9ab 100644
--- a/gallery_dl/extractor/booru.py
+++ b/gallery_dl/extractor/booru.py
@@ -27,8 +27,7 @@ class BooruExtractor(BaseExtractor):
notes = self.config("notes", False)
fetch_html = tags or notes
- url_key = self.config("url")
- if url_key:
+ if url_key := self.config("url"):
if isinstance(url_key, (list, tuple)):
self._file_url = self._file_url_list
self._file_url_keys = url_key
diff --git a/gallery_dl/extractor/boosty.py b/gallery_dl/extractor/boosty.py
index 5baaa1ab..e0383bfe 100644
--- a/gallery_dl/extractor/boosty.py
+++ b/gallery_dl/extractor/boosty.py
@@ -144,8 +144,7 @@ class BoostyExtractor(Extractor):
url = block["url"]
sep = "&" if "?" in url else "?"
- signed_query = post.get("signedQuery")
- if signed_query:
+ if signed_query := post.get("signedQuery"):
url += sep + signed_query[1:]
sep = "&"
@@ -280,8 +279,7 @@ class BoostyAPI():
}
if not access_token:
- auth = self.extractor.cookies.get("auth", domain=".boosty.to")
- if auth:
+ if auth := self.extractor.cookies.get("auth", domain=".boosty.to"):
access_token = text.extr(
auth, "%22accessToken%22%3A%22", "%22")
if access_token:
diff --git a/gallery_dl/extractor/civitai.py b/gallery_dl/extractor/civitai.py
index a1c0ca01..89c2aeba 100644
--- a/gallery_dl/extractor/civitai.py
+++ b/gallery_dl/extractor/civitai.py
@@ -35,8 +35,7 @@ class CivitaiExtractor(Extractor):
self.log.debug("Using tRPC API")
self.api = CivitaiTrpcAPI(self)
- quality = self.config("quality")
- if quality:
+ if quality := self.config("quality"):
if not isinstance(quality, str):
quality = ",".join(quality)
self._image_quality = quality
@@ -45,8 +44,7 @@ class CivitaiExtractor(Extractor):
self._image_quality = "original=true"
self._image_ext = "png"
- quality_video = self.config("quality-videos")
- if quality_video:
+ if quality_video := self.config("quality-videos"):
if not isinstance(quality_video, str):
quality_video = ",".join(quality_video)
if quality_video[0] == "+":
@@ -59,8 +57,7 @@ class CivitaiExtractor(Extractor):
self._video_quality = "quality=100"
self._video_ext = "webm"
- metadata = self.config("metadata")
- if metadata:
+ if metadata := self.config("metadata"):
if isinstance(metadata, str):
metadata = metadata.split(",")
elif not isinstance(metadata, (list, tuple)):
@@ -73,16 +70,14 @@ class CivitaiExtractor(Extractor):
False
def items(self):
- models = self.models()
- if models:
+ if models := self.models():
data = {"_extractor": CivitaiModelExtractor}
for model in models:
url = f"{self.root}/models/{model['id']}"
yield Message.Queue, url, data
return
- posts = self.posts()
- if posts:
+ if posts := self.posts():
for post in posts:
if "images" in post:
@@ -107,8 +102,7 @@ class CivitaiExtractor(Extractor):
yield Message.Url, file["url"], file
return
- images = self.images()
- if images:
+ if images := self.images():
for file in images:
data = {
@@ -230,8 +224,7 @@ class CivitaiExtractor(Extractor):
def _extract_meta_version(self, item, is_post=True):
try:
- version_id = self._extract_version_id(item, is_post)
- if version_id:
+ if version_id := self._extract_version_id(item, is_post):
version = self.api.model_version(version_id).copy()
return version.pop("model", None), version
except Exception as exc:
@@ -569,8 +562,7 @@ class CivitaiRestAPI():
self.root = extractor.root + "/api"
self.headers = {"Content-Type": "application/json"}
- api_key = extractor.config("api-key")
- if api_key:
+ if api_key := extractor.config("api-key"):
extractor.log.debug("Using api_key authentication")
self.headers["Authorization"] = "Bearer " + api_key
@@ -648,8 +640,7 @@ class CivitaiTrpcAPI():
"x-client" : "web",
"x-fingerprint" : "undefined",
}
- api_key = extractor.config("api-key")
- if api_key:
+ if api_key := extractor.config("api-key"):
extractor.log.debug("Using api_key authentication")
self.headers["Authorization"] = "Bearer " + api_key
diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py
index 4f7d4751..d46152b4 100644
--- a/gallery_dl/extractor/common.py
+++ b/gallery_dl/extractor/common.py
@@ -136,11 +136,10 @@ class Extractor():
if first:
first = False
values = config.accumulate(extr + path, key)
- else:
- conf = config.get(extr, path[0])
- if conf:
- values[:0] = config.accumulate(
- (self.subcategory,), key, conf=conf)
+ elif conf := config.get(extr, path[0]):
+ values[:0] = config.accumulate(
+ (self.subcategory,), key, conf=conf)
+
return values
def request(self, url, method="GET", session=None,
@@ -455,8 +454,7 @@ class Extractor():
if ZSTD:
headers["Accept-Encoding"] += ", zstd"
- referer = self.config("referer", self.referer)
- if referer:
+ if referer := self.config("referer", self.referer):
if isinstance(referer, str):
headers["Referer"] = referer
elif self.root:
@@ -471,8 +469,7 @@ class Extractor():
custom_ua is not config.get(("extractor",), "user-agent"):
headers["User-Agent"] = custom_ua
- custom_headers = self.config("headers")
- if custom_headers:
+ if custom_headers := self.config("headers"):
if isinstance(custom_headers, str):
if custom_headers in HEADERS:
custom_headers = HEADERS[custom_headers]
@@ -482,8 +479,7 @@ class Extractor():
custom_headers = ()
headers.update(custom_headers)
- custom_ciphers = self.config("ciphers")
- if custom_ciphers:
+ if custom_ciphers := self.config("ciphers"):
if isinstance(custom_ciphers, list):
ssl_ciphers = ":".join(custom_ciphers)
elif custom_ciphers in CIPHERS:
@@ -491,8 +487,7 @@ class Extractor():
else:
ssl_ciphers = custom_ciphers
- source_address = self.config("source-address")
- if source_address:
+ if source_address := self.config("source-address"):
if isinstance(source_address, str):
source_address = (source_address, 0)
else:
@@ -526,10 +521,8 @@ class Extractor():
if self.cookies_domain is None:
return
- cookies = self.config("cookies")
- if cookies:
- select = self.config("cookies-select")
- if select:
+ if cookies := self.config("cookies"):
+ if select := self.config("cookies-select"):
if select == "rotate":
cookies = cookies[self.cookies_index % len(cookies)]
Extractor.cookies_index += 1
@@ -975,8 +968,7 @@ class BaseExtractor(Extractor):
@classmethod
def update(cls, instances):
- extra_instances = config.get(("extractor",), cls.basecategory)
- if extra_instances:
+ if extra_instances := config.get(("extractor",), cls.basecategory):
for category, info in extra_instances.items():
if isinstance(info, dict) and "root" in info:
instances[category] = info
@@ -984,8 +976,7 @@ class BaseExtractor(Extractor):
pattern_list = []
instance_list = cls.instances = []
for category, info in instances.items():
- root = info["root"]
- if root:
+ if root := info["root"]:
root = root.rstrip("/")
instance_list.append((category, root, info))
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py
index 2aca34fb..ff071c57 100644
--- a/gallery_dl/extractor/danbooru.py
+++ b/gallery_dl/extractor/danbooru.py
@@ -49,8 +49,7 @@ class DanbooruExtractor(BaseExtractor):
def items(self):
# 'includes' initialization must be done here and not in '_init()'
# or it'll cause an exception with e621 when 'metadata' is enabled
- includes = self.config("metadata")
- if includes:
+ if includes := self.config("metadata"):
if isinstance(includes, (list, tuple)):
includes = ",".join(includes)
elif not isinstance(includes, str):
diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py
index f30b4346..66e2a1ea 100644
--- a/gallery_dl/extractor/deviantart.py
+++ b/gallery_dl/extractor/deviantart.py
@@ -55,8 +55,7 @@ class DeviantartExtractor(Extractor):
self.group = False
self._premium_cache = {}
- unwatch = self.config("auto-unwatch")
- if unwatch:
+ if self.config("auto-unwatch"):
self.unwatch = []
self.finalize = self._unwatch_premium
else:
@@ -118,10 +117,8 @@ class DeviantartExtractor(Extractor):
def items(self):
if self.user:
- group = self.config("group", True)
- if group:
- user = _user_details(self, self.user)
- if user:
+ if group := self.config("group", True):
+ if user := _user_details(self, self.user):
self.user = user["username"]
self.group = False
elif group == "skip":
@@ -179,8 +176,7 @@ class DeviantartExtractor(Extractor):
yield self.commit(deviation, deviation["flash"])
if self.commit_journal:
- journal = self._extract_journal(deviation)
- if journal:
+ if journal := self._extract_journal(deviation):
if self.extra:
deviation["_journal"] = journal["html"]
deviation["is_original"] = True
@@ -389,8 +385,7 @@ class DeviantartExtractor(Extractor):
deviations = state["@@entities"]["deviation"]
content = deviations.popitem()[1]["textContent"]
- html = self._textcontent_to_html(deviation, content)
- if html:
+ if html := self._textcontent_to_html(deviation, content):
return {"html": html}
return {"html": content["excerpt"].replace("\n", "
")}
@@ -432,8 +427,7 @@ class DeviantartExtractor(Extractor):
type = content["type"]
if type == "paragraph":
- children = content.get("content")
- if children:
+ if children := content.get("content"):
html.append('
\
for fmt in media["types"]
}
- tokens = media.get("token") or ()
- if tokens:
+ if tokens := media.get("token") or ():
if len(tokens) <= 1:
fmt = formats[format]
if "c" in fmt:
@@ -1057,8 +1048,7 @@ class DeviantartStashExtractor(DeviantartExtractor):
page = self._limited_request(url).text
if stash_id[0] == "0":
- uuid = text.extr(page, '//deviation/', '"')
- if uuid:
+ if uuid := text.extr(page, '//deviation/', '"'):
deviation = self.api.deviation(uuid)
deviation["_page"] = page
deviation["index"] = text.parse_int(text.extr(
@@ -1081,8 +1071,7 @@ class DeviantartStashExtractor(DeviantartExtractor):
yield deviation
return
- stash_data = text.extr(page, ',\\"stash\\":', ',\\"@@')
- if stash_data:
+ if stash_data := text.extr(page, ',\\"stash\\":', ',\\"@@'):
stash_data = util.json_loads(self._unescape_json(stash_data))
for sid in text.extract_iter(
@@ -1461,8 +1450,7 @@ class DeviantartOAuthAPI():
self.folders = extractor.config("folders", False)
self.public = extractor.config("public", True)
- client_id = extractor.config("client-id")
- if client_id:
+ if client_id := extractor.config("client-id"):
self.client_id = str(client_id)
self.client_secret = extractor.config("client-secret")
else:
diff --git a/gallery_dl/extractor/e621.py b/gallery_dl/extractor/e621.py
index 30aaa8f9..71c3b30f 100644
--- a/gallery_dl/extractor/e621.py
+++ b/gallery_dl/extractor/e621.py
@@ -24,8 +24,7 @@ class E621Extractor(danbooru.DanbooruExtractor):
request_interval_min = 1.0
def items(self):
- includes = self.config("metadata") or ()
- if includes:
+ if includes := self.config("metadata") or ():
if isinstance(includes, str):
includes = includes.split(",")
elif not isinstance(includes, (list, tuple)):
diff --git a/gallery_dl/extractor/exhentai.py b/gallery_dl/extractor/exhentai.py
index e0d6b8d4..f147959a 100644
--- a/gallery_dl/extractor/exhentai.py
+++ b/gallery_dl/extractor/exhentai.py
@@ -246,8 +246,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
def metadata_from_page(self, page):
extr = text.extract_from(page)
- api_url = extr('var api_url = "', '"')
- if api_url:
+ if api_url := extr('var api_url = "', '"'):
self.api_url = api_url
data = {
@@ -419,8 +418,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
def _validate_signature(self, signature):
"""Return False if all file signature bytes are zero"""
if signature:
- byte = signature[0]
- if byte:
+ if byte := signature[0]:
# 60 == b"<"
if byte == 60 and b"= fee]
- if fees:
+ if fees := [f for f in plans if f >= fee]:
plan = plans[min(fees)]
else:
plan = plans[0].copy()
@@ -217,8 +215,7 @@ class FanboxExtractor(Extractor):
def _get_urls_from_post(self, content_body, post):
num = 0
- cover_image = post.get("coverImageUrl")
- if cover_image:
+ if cover_image := post.get("coverImageUrl"):
cover_image = util.re("/c/[0-9a-z_]+").sub("", cover_image)
final_post = post.copy()
final_post["isCoverImage"] = True
diff --git a/gallery_dl/extractor/fapachi.py b/gallery_dl/extractor/fapachi.py
index 71b22755..7ff71b05 100644
--- a/gallery_dl/extractor/fapachi.py
+++ b/gallery_dl/extractor/fapachi.py
@@ -58,8 +58,7 @@ class FapachiUserExtractor(Extractor):
url = f"{self.root}/{self.user}/page/{self.num}"
page = self.request(url).text
for post in text.extract_iter(page, 'model-media-prew">', ">"):
- path = text.extr(post, 'Next page' not in page:
diff --git a/gallery_dl/extractor/flickr.py b/gallery_dl/extractor/flickr.py
index d545370e..35263a31 100644
--- a/gallery_dl/extractor/flickr.py
+++ b/gallery_dl/extractor/flickr.py
@@ -457,8 +457,7 @@ class FlickrAPI(oauth.OAuth1API):
def _pagination(self, method, params, key="photos"):
extras = ("description,date_upload,tags,views,media,"
"path_alias,owner_name,")
- includes = self.extractor.config("metadata")
- if includes:
+ if includes := self.extractor.config("metadata"):
if isinstance(includes, (list, tuple)):
includes = ",".join(includes)
elif not isinstance(includes, str):
diff --git a/gallery_dl/extractor/foolfuuka.py b/gallery_dl/extractor/foolfuuka.py
index 97c2bd2a..dc234886 100644
--- a/gallery_dl/extractor/foolfuuka.py
+++ b/gallery_dl/extractor/foolfuuka.py
@@ -164,8 +164,7 @@ class FoolfuukaThreadExtractor(FoolfuukaExtractor):
def posts(self):
op = (self.data["op"],)
- posts = self.data.get("posts")
- if posts:
+ if posts := self.data.get("posts"):
posts = list(posts.values())
posts.sort(key=lambda p: p["timestamp"])
return itertools.chain(op, posts)
diff --git a/gallery_dl/extractor/furaffinity.py b/gallery_dl/extractor/furaffinity.py
index 2c8d576e..0d24f839 100644
--- a/gallery_dl/extractor/furaffinity.py
+++ b/gallery_dl/extractor/furaffinity.py
@@ -51,8 +51,7 @@ class FuraffinityExtractor(Extractor):
def items(self):
metadata = self.metadata()
for post_id in util.advance(self.posts(), self.offset):
- post = self._parse_post(post_id)
- if post:
+ if post := self._parse_post(post_id):
if metadata:
post.update(metadata)
yield Message.Directory, post
@@ -117,8 +116,7 @@ class FuraffinityExtractor(Extractor):
data["folders"] = folders = []
for folder in extr(
"
Listed in Folders
", "").split(""):
- folder = rh(folder)
- if folder:
+ if folder := rh(folder):
folders.append(folder)
else:
# old site layout
@@ -280,8 +278,7 @@ class FuraffinityFavoriteExtractor(FuraffinityExtractor):
return self._pagination_favorites()
def _parse_post(self, post_id):
- post = FuraffinityExtractor._parse_post(self, post_id)
- if post:
+ if post := FuraffinityExtractor._parse_post(self, post_id):
post["favorite_id"] = self._favorite_id
return post
diff --git a/gallery_dl/extractor/girlswithmuscle.py b/gallery_dl/extractor/girlswithmuscle.py
index 38be246d..51b979f3 100644
--- a/gallery_dl/extractor/girlswithmuscle.py
+++ b/gallery_dl/extractor/girlswithmuscle.py
@@ -73,8 +73,7 @@ class GirlswithmusclePostExtractor(GirlswithmuscleExtractor):
metadata = self.metadata(page)
- url = text.extr(page, 'class="main-image" src="', '"')
- if url:
+ if url := text.extr(page, 'class="main-image" src="', '"'):
metadata["type"] = "picture"
else:
url = text.extr(page, 'Post ID:", "<")
created = extr(' title="', '"')
- file_url = extr('>Original:', 'id=')
- if file_url:
+ if file_url := extr('>Original:', 'id='):
file_url = extr(' href="', '"')
width = extr(">", "x")
height = extr("", " ")
diff --git a/gallery_dl/extractor/imagebam.py b/gallery_dl/extractor/imagebam.py
index 4264c575..171feea4 100644
--- a/gallery_dl/extractor/imagebam.py
+++ b/gallery_dl/extractor/imagebam.py
@@ -75,8 +75,7 @@ class ImagebamGalleryExtractor(ImagebamExtractor):
paths += findall(page)
pos = page.find('rel="next" aria-label="Next')
if pos > 0:
- url = text.rextr(page, 'href="', '"', pos)
- if url:
+ if url := text.rextr(page, 'href="', '"', pos):
page = self.request(url).text
continue
return paths
diff --git a/gallery_dl/extractor/imagechest.py b/gallery_dl/extractor/imagechest.py
index f3ae2bcb..464e4897 100644
--- a/gallery_dl/extractor/imagechest.py
+++ b/gallery_dl/extractor/imagechest.py
@@ -28,8 +28,7 @@ class ImagechestGalleryExtractor(GalleryExtractor):
GalleryExtractor.__init__(self, match, url)
def _init(self):
- access_token = self.config("access-token")
- if access_token:
+ if access_token := self.config("access-token"):
self.api = ImagechestAPI(self, access_token)
self.page_url = None
self.metadata = self._metadata_api
diff --git a/gallery_dl/extractor/imagefap.py b/gallery_dl/extractor/imagefap.py
index 975add54..993af7c6 100644
--- a/gallery_dl/extractor/imagefap.py
+++ b/gallery_dl/extractor/imagefap.py
@@ -28,8 +28,7 @@ class ImagefapExtractor(Extractor):
response = Extractor.request(self, url, **kwargs)
if response.history and response.url.endswith("/human-verification"):
- msg = text.extr(response.text, '")[2].split())
raise exception.AbortExtraction(f"'{msg}'")
self.log.warning("HTTP redirect to %s", response.url)
diff --git a/gallery_dl/extractor/inkbunny.py b/gallery_dl/extractor/inkbunny.py
index 435f98e0..45ae52ed 100644
--- a/gallery_dl/extractor/inkbunny.py
+++ b/gallery_dl/extractor/inkbunny.py
@@ -109,8 +109,7 @@ class InkbunnyPoolExtractor(InkbunnyExtractor):
def __init__(self, match):
InkbunnyExtractor.__init__(self, match)
- pid = match[1]
- if pid:
+ if pid := match[1]:
self.pool_id = pid
self.orderby = "pool_order"
else:
@@ -142,8 +141,7 @@ class InkbunnyFavoriteExtractor(InkbunnyExtractor):
def __init__(self, match):
InkbunnyExtractor.__init__(self, match)
- uid = match[1]
- if uid:
+ if uid := match[1]:
self.user_id = uid
self.orderby = self.config("orderby", "fav_datetime")
else:
@@ -218,8 +216,7 @@ class InkbunnySearchExtractor(InkbunnyExtractor):
params["dayslimit"] = pop("days", None)
params["username"] = pop("artist", None)
- favsby = pop("favsby", None)
- if favsby:
+ if favsby := pop("favsby", None):
# get user_id from user profile
url = f"{self.root}/{favsby}"
page = self.request(url).text
diff --git a/gallery_dl/extractor/instagram.py b/gallery_dl/extractor/instagram.py
index 40e9758e..6213e9ac 100644
--- a/gallery_dl/extractor/instagram.py
+++ b/gallery_dl/extractor/instagram.py
@@ -55,8 +55,7 @@ class InstagramExtractor(Extractor):
self.login()
data = self.metadata()
- videos = self.config("videos", True)
- if videos:
+ if videos := self.config("videos", True):
videos_dash = (videos != "merged")
videos_headers = {"User-Agent": "Mozilla/5.0"}
previews = self.config("previews", False)
@@ -91,8 +90,7 @@ class InstagramExtractor(Extractor):
for file in files:
file.update(post)
- url = file.get("video_url")
- if url:
+ if url := file.get("video_url"):
if videos:
file["_http_headers"] = videos_headers
text.nameext_from_url(url, file)
@@ -144,8 +142,7 @@ class InstagramExtractor(Extractor):
if www_claim is not None:
self.www_claim = www_claim
- csrf_token = response.cookies.get("csrftoken")
- if csrf_token:
+ if csrf_token := response.cookies.get("csrftoken"):
self.csrf_token = csrf_token
return response
@@ -164,8 +161,7 @@ class InstagramExtractor(Extractor):
if "items" in post: # story or highlight
items = post["items"]
reel_id = str(post["id"]).rpartition(":")[2]
- expires = post.get("expiring_at")
- if expires:
+ if expires := post.get("expiring_at"):
post_url = f"{self.root}/stories/{post['user']['username']}/"
else:
post_url = f"{self.root}/stories/highlights/{reel_id}/"
@@ -193,20 +189,17 @@ class InstagramExtractor(Extractor):
caption = post["caption"]
data["description"] = caption["text"] if caption else ""
- tags = self._find_tags(data["description"])
- if tags:
+ if tags := self._find_tags(data["description"]):
data["tags"] = sorted(set(tags))
- location = post.get("location")
- if location:
+ if location := post.get("location"):
slug = location["short_name"].replace(" ", "-").lower()
data["location_id"] = location["pk"]
data["location_slug"] = slug
data["location_url"] = \
f"{self.root}/explore/locations/{location['pk']}/{slug}/"
- coauthors = post.get("coauthor_producers")
- if coauthors:
+ if coauthors := post.get("coauthor_producers"):
data["coauthors"] = [
{"id" : user["pk"],
"username" : user["username"],
@@ -214,8 +207,7 @@ class InstagramExtractor(Extractor):
for user in coauthors
]
- items = post.get("carousel_media")
- if items:
+ if items := post.get("carousel_media"):
data["sidecar_media_id"] = data["post_id"]
data["sidecar_shortcode"] = data["post_shortcode"]
else:
@@ -237,8 +229,7 @@ class InstagramExtractor(Extractor):
data["post_shortcode"])
continue
- video_versions = item.get("video_versions")
- if video_versions:
+ if video_versions := item.get("video_versions"):
video = max(
video_versions,
key=lambda x: (x["width"], x["height"], x["type"]),
@@ -281,8 +272,7 @@ class InstagramExtractor(Extractor):
"edge_sidecar_to_children" not in post:
post = self.api.media(post["id"])[0]
- pinned = post.get("pinned_for_users", ())
- if pinned:
+ if pinned := post.get("pinned_for_users", ()):
for index, user in enumerate(pinned):
pinned[index] = int(user["id"])
@@ -306,19 +296,16 @@ class InstagramExtractor(Extractor):
}
data["date"] = data["post_date"]
- tags = self._find_tags(data["description"])
- if tags:
+ if tags := self._find_tags(data["description"]):
data["tags"] = sorted(set(tags))
- location = post.get("location")
- if location:
+ if location := post.get("location"):
data["location_id"] = location["id"]
data["location_slug"] = location["slug"]
data["location_url"] = (f"{self.root}/explore/locations/"
f"{location['id']}/{location['slug']}/")
- coauthors = post.get("coauthor_producers")
- if coauthors:
+ if coauthors := post.get("coauthor_producers"):
data["coauthors"] = [
{"id" : user["id"],
"username": user["username"]}
@@ -365,32 +352,28 @@ class InstagramExtractor(Extractor):
def _extract_tagged_users(self, src, dest):
dest["tagged_users"] = tagged_users = []
- edges = src.get("edge_media_to_tagged_user")
- if edges:
+ if edges := src.get("edge_media_to_tagged_user"):
for edge in edges["edges"]:
user = edge["node"]["user"]
tagged_users.append({"id" : user["id"],
"username" : user["username"],
"full_name": user["full_name"]})
- usertags = src.get("usertags")
- if usertags:
+ if usertags := src.get("usertags"):
for tag in usertags["in"]:
user = tag["user"]
tagged_users.append({"id" : user["pk"],
"username" : user["username"],
"full_name": user["full_name"]})
- mentions = src.get("reel_mentions")
- if mentions:
+ if mentions := src.get("reel_mentions"):
for mention in mentions:
user = mention["user"]
tagged_users.append({"id" : user.get("pk"),
"username" : user["username"],
"full_name": user["full_name"]})
- stickers = src.get("story_bloks_stickers")
- if stickers:
+ if stickers := src.get("story_bloks_stickers"):
for sticker in stickers:
sticker = sticker["bloks_sticker"]
if sticker["bloks_sticker_type"] == "mention":
@@ -698,8 +681,7 @@ class InstagramAvatarExtractor(InstagramExtractor):
url = user.get("profile_pic_url_hd") or user["profile_pic_url"]
avatar = {"url": url, "width": 0, "height": 0}
- pk = user.get("profile_pic_id")
- if pk:
+ if pk := user.get("profile_pic_id"):
pk = pk.partition("_")[0]
code = shortcode_from_id(pk)
else:
@@ -753,8 +735,7 @@ class InstagramRestAPI():
def highlights_media(self, user_id, chunk_size=5):
reel_ids = [hl["id"] for hl in self.highlights_tray(user_id)]
- order = self.extractor.config("order-posts")
- if order:
+ if order := self.extractor.config("order-posts"):
if order in ("desc", "reverse"):
reel_ids.reverse()
elif order in ("id", "id_asc"):
diff --git a/gallery_dl/extractor/itaku.py b/gallery_dl/extractor/itaku.py
index e188abb2..d8ba4f66 100644
--- a/gallery_dl/extractor/itaku.py
+++ b/gallery_dl/extractor/itaku.py
@@ -39,8 +39,7 @@ class ItakuExtractor(Extractor):
sections = []
for s in post["sections"]:
- group = s["group"]
- if group:
+ if group := s["group"]:
sections.append(group["title"] + "/" + s["title"])
else:
sections.append(s["title"])
diff --git a/gallery_dl/extractor/jschan.py b/gallery_dl/extractor/jschan.py
index 6a3f4abb..5f3e75a3 100644
--- a/gallery_dl/extractor/jschan.py
+++ b/gallery_dl/extractor/jschan.py
@@ -41,8 +41,7 @@ class JschanThreadExtractor(JschanExtractor):
yield Message.Directory, thread
for post in itertools.chain((thread,), posts):
- files = post.pop("files", ())
- if files:
+ if files := post.pop("files", ()):
thread.update(post)
thread["count"] = len(files)
for num, file in enumerate(files):
diff --git a/gallery_dl/extractor/keenspot.py b/gallery_dl/extractor/keenspot.py
index 35aa3b57..f55a930e 100644
--- a/gallery_dl/extractor/keenspot.py
+++ b/gallery_dl/extractor/keenspot.py
@@ -75,8 +75,7 @@ class KeenspotComicExtractor(Extractor):
self._image = '
'
return "http://brawlinthefamily.keenspot.com/comic/theshowdown/"
- url = text.extr(page, '
'):
data["_multi"] = self._extract_images_art(art_images, data)
return data
@@ -544,8 +542,7 @@ class NewgroundsSearchExtractor(NewgroundsExtractor):
self.query = text.parse_query(query)
def posts(self):
- suitabilities = self.query.get("suitabilities")
- if suitabilities:
+ if suitabilities := self.query.get("suitabilities"):
data = {"view_suitability_" + s: "on"
for s in suitabilities.split(",")}
self.request(self.root + "/suitabilities",
diff --git a/gallery_dl/extractor/nitter.py b/gallery_dl/extractor/nitter.py
index ceb44ab9..69d82999 100644
--- a/gallery_dl/extractor/nitter.py
+++ b/gallery_dl/extractor/nitter.py
@@ -30,8 +30,7 @@ class NitterExtractor(BaseExtractor):
def items(self):
retweets = self.config("retweets", False)
- videos = self.config("videos", True)
- if videos:
+ if videos := self.config("videos", True):
ytdl = (videos == "ytdl")
videos = True
self.cookies.set("hlsPlayback", "on", domain=self.cookies_domain)
@@ -42,8 +41,7 @@ class NitterExtractor(BaseExtractor):
self.log.debug("Skipping %s (retweet)", tweet["tweet_id"])
continue
- attachments = tweet.pop("_attach", "")
- if attachments:
+ if attachments := tweet.pop("_attach", ""):
files = []
for url in text.extract_iter(
attachments, 'href="', '"'):
diff --git a/gallery_dl/extractor/oauth.py b/gallery_dl/extractor/oauth.py
index ad4367cf..2d9a061c 100644
--- a/gallery_dl/extractor/oauth.py
+++ b/gallery_dl/extractor/oauth.py
@@ -74,8 +74,7 @@ class OAuthBase(Extractor):
"""Open 'url' in browser amd return response parameters"""
url += "?" + urllib.parse.urlencode(params)
- browser = self.config("browser", True)
- if browser:
+ if browser := self.config("browser", True):
try:
import webbrowser
browser = webbrowser.get()
@@ -83,8 +82,7 @@ class OAuthBase(Extractor):
browser = None
if browser and browser.open(url):
- name = getattr(browser, "name", None)
- if name:
+ if name := getattr(browser, "name", None):
self.log.info("Opening URL with %s:", name.capitalize())
else:
self.log.info("Please open this URL in your browser:")
diff --git a/gallery_dl/extractor/patreon.py b/gallery_dl/extractor/patreon.py
index c019218b..11e2418b 100644
--- a/gallery_dl/extractor/patreon.py
+++ b/gallery_dl/extractor/patreon.py
@@ -295,12 +295,10 @@ class PatreonExtractor(Extractor):
if bootstrap:
return util.json_loads(bootstrap + "}")
- bootstrap = text.extr(page, "window.patreon.bootstrap,", "});")
- if bootstrap:
+ if bootstrap := text.extr(page, "window.patreon.bootstrap,", "});"):
return util.json_loads(bootstrap + "}")
- data = text.extr(page, "window.patreon = {", "};\n")
- if data:
+ if data := text.extr(page, "window.patreon = {", "};\n"):
try:
return util.json_loads(f"{{{data}}}")["bootstrap"]
except Exception:
@@ -340,8 +338,7 @@ class PatreonCreatorExtractor(PatreonExtractor):
if creator and creator.startswith("id:"):
return creator[3:]
- campaign_id = query.get("c") or query.get("campaign_id")
- if campaign_id:
+ if campaign_id := query.get("c") or query.get("campaign_id"):
return campaign_id
if user_id := query.get("u"):
diff --git a/gallery_dl/extractor/philomena.py b/gallery_dl/extractor/philomena.py
index 9cc099b8..8891dc06 100644
--- a/gallery_dl/extractor/philomena.py
+++ b/gallery_dl/extractor/philomena.py
@@ -165,12 +165,10 @@ class PhilomenaAPI():
def _pagination(self, endpoint, params):
extr = self.extractor
- api_key = extr.config("api-key")
- if api_key:
+ if api_key := extr.config("api-key"):
params["key"] = api_key
- filter_id = extr.config("filter")
- if filter_id:
+ if filter_id := extr.config("filter"):
params["filter_id"] = filter_id
elif not api_key:
params["filter_id"] = extr.config_instance("filter_id") or "2"
diff --git a/gallery_dl/extractor/pinterest.py b/gallery_dl/extractor/pinterest.py
index 7ceb613c..9c335ad7 100644
--- a/gallery_dl/extractor/pinterest.py
+++ b/gallery_dl/extractor/pinterest.py
@@ -60,8 +60,7 @@ class PinterestExtractor(Extractor):
"closeup_description",
"closeup_unified_description",
):
- value = pin.get(key)
- if value:
+ if value := pin.get(key):
pin[key] = value.strip()
yield Message.Directory, pin
@@ -93,8 +92,7 @@ class PinterestExtractor(Extractor):
if story_pin_data and self.stories:
return self._extract_story(pin, story_pin_data)
- carousel_data = pin.get("carousel_data")
- if carousel_data:
+ if carousel_data := pin.get("carousel_data"):
return self._extract_carousel(pin, carousel_data)
videos = pin.get("videos")
@@ -270,8 +268,7 @@ class PinterestUserExtractor(PinterestExtractor):
def items(self):
for board in self.api.boards(self.user):
- url = board.get("url")
- if url:
+ if url := board.get("url"):
board["_extractor"] = PinterestBoardExtractor
yield Message.Queue, self.root + url, board
diff --git a/gallery_dl/extractor/pixeldrain.py b/gallery_dl/extractor/pixeldrain.py
index 4e76f2ee..73f4b1fb 100644
--- a/gallery_dl/extractor/pixeldrain.py
+++ b/gallery_dl/extractor/pixeldrain.py
@@ -21,8 +21,7 @@ class PixeldrainExtractor(Extractor):
archive_fmt = "{id}"
def _init(self):
- api_key = self.config("api-key")
- if api_key:
+ if api_key := self.config("api-key"):
self.session.auth = util.HTTPBasicAuth("", api_key)
def parse_datetime(self, date_string):
diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py
index 477a9cd1..b430e23d 100644
--- a/gallery_dl/extractor/pixiv.py
+++ b/gallery_dl/extractor/pixiv.py
@@ -89,8 +89,7 @@ class PixivExtractor(Extractor):
if tag["is_registered"]]
if self.meta_captions and not work.get("caption") and \
not work.get("_mypixiv") and not work.get("_ajax"):
- body = self._request_ajax("/illust/" + str(work["id"]))
- if body:
+ if body := self._request_ajax("/illust/" + str(work["id"])):
work["caption"] = self._sanitize_ajax_caption(
body["illustComment"])
@@ -293,8 +292,7 @@ class PixivExtractor(Extractor):
def _extract_ajax_url(self, body):
try:
- original = body["urls"]["original"]
- if original:
+ if original := body["urls"]["original"]:
return original
except Exception:
pass
@@ -699,8 +697,7 @@ class PixivRankingExtractor(PixivExtractor):
except KeyError:
raise exception.AbortExtraction(f"Invalid mode '{mode}'")
- date = query.get("date")
- if date:
+ if date := query.get("date"):
if len(date) == 8 and date.isdecimal():
date = f"{date[0:4]}-{date[4:6]}-{date[6:8]}"
else:
diff --git a/gallery_dl/extractor/reddit.py b/gallery_dl/extractor/reddit.py
index 3ea20c1b..c87430b1 100644
--- a/gallery_dl/extractor/reddit.py
+++ b/gallery_dl/extractor/reddit.py
@@ -33,8 +33,7 @@ class RedditExtractor(Extractor):
previews = self.config("previews", True)
embeds = self.config("embeds", True)
- videos = self.config("videos", True)
- if videos:
+ if videos := self.config("videos", True):
if videos == "ytdl":
self._extract_video = self._extract_video_ytdl
elif videos == "dash":
@@ -139,8 +138,7 @@ class RedditExtractor(Extractor):
)):
continue
- match = match_submission(url)
- if match:
+ if match := match_submission(url):
extra.append(match[1])
elif not match_user(url) and not match_subreddit(url):
if previews and "comment" not in data and \
@@ -181,8 +179,7 @@ class RedditExtractor(Extractor):
submission["id"], item["media_id"], data.get("status"))
continue
src = data["s"]
- url = src.get("u") or src.get("gif") or src.get("mp4")
- if url:
+ if url := src.get("u") or src.get("gif") or src.get("mp4"):
yield url.partition("?")[0].replace("/preview.", "/i.", 1)
else:
self.log.error(
@@ -202,8 +199,7 @@ class RedditExtractor(Extractor):
submission["id"], mid, data.get("status"))
continue
src = data["s"]
- url = src.get("u") or src.get("gif") or src.get("mp4")
- if url:
+ if url := src.get("u") or src.get("gif") or src.get("mp4"):
yield url.partition("?")[0].replace("/preview.", "/i.", 1)
else:
self.log.error(
@@ -242,8 +238,7 @@ class RedditExtractor(Extractor):
try:
for image in post["preview"]["images"]:
- variants = image.get("variants")
- if variants:
+ if variants := image.get("variants"):
if "gif" in variants:
yield variants["gif"]["source"]["url"]
if "mp4" in variants:
diff --git a/gallery_dl/extractor/redgifs.py b/gallery_dl/extractor/redgifs.py
index 07fe0ae9..4098c54b 100644
--- a/gallery_dl/extractor/redgifs.py
+++ b/gallery_dl/extractor/redgifs.py
@@ -40,8 +40,7 @@ class RedgifsExtractor(Extractor):
for gif in self.gifs():
- gallery = gif.get("gallery")
- if gallery:
+ if gallery := gif.get("gallery"):
gifs = self.api.gallery(gallery)["gifs"]
enum = 1
cnt = len(gifs)
@@ -71,8 +70,7 @@ class RedgifsExtractor(Extractor):
def _formats(self, gif):
urls = gif["urls"]
for fmt in self.formats:
- url = urls.get(fmt)
- if url:
+ if url := urls.get(fmt):
url = url.replace("//thumbs2.", "//thumbs3.", 1)
text.nameext_from_url(url, gif)
yield url
diff --git a/gallery_dl/extractor/rule34xyz.py b/gallery_dl/extractor/rule34xyz.py
index d63f9cc8..05915ba7 100644
--- a/gallery_dl/extractor/rule34xyz.py
+++ b/gallery_dl/extractor/rule34xyz.py
@@ -39,8 +39,7 @@ class Rule34xyzExtractor(BooruExtractor):
}
def _init(self):
- formats = self.config("format")
- if formats:
+ if formats := self.config("format"):
if isinstance(formats, str):
formats = formats.split(",")
self.formats = formats
diff --git a/gallery_dl/extractor/sankaku.py b/gallery_dl/extractor/sankaku.py
index dc201e65..1c93cbfb 100644
--- a/gallery_dl/extractor/sankaku.py
+++ b/gallery_dl/extractor/sankaku.py
@@ -78,8 +78,7 @@ class SankakuExtractor(BooruExtractor):
def _tags(self, post, page):
tags = collections.defaultdict(list)
for tag in self.api.tags(post["id"]):
- name = tag["name"]
- if name:
+ if name := tag["name"]:
tags[tag["type"]].append(name.lower().replace(" ", "_"))
types = self.TAG_TYPES
for type, values in tags.items():
@@ -315,8 +314,7 @@ class SankakuAPI():
params["lang"] = "en"
params["limit"] = str(self.extractor.per_page)
- refresh = self.extractor.config("refresh", False)
- if refresh:
+ if refresh := self.extractor.config("refresh", False):
offset = expires = 0
from time import time
@@ -330,8 +328,7 @@ class SankakuAPI():
for post in posts:
if not expires:
- url = post["file_url"]
- if url:
+ if url := post["file_url"]:
expires = text.parse_int(
text.extr(url, "e=", "&")) - 60
diff --git a/gallery_dl/extractor/shimmie2.py b/gallery_dl/extractor/shimmie2.py
index 936cb4df..9afa7060 100644
--- a/gallery_dl/extractor/shimmie2.py
+++ b/gallery_dl/extractor/shimmie2.py
@@ -19,13 +19,11 @@ class Shimmie2Extractor(BaseExtractor):
archive_fmt = "{id}"
def _init(self):
- cookies = self.config_instance("cookies")
- if cookies:
+ if cookies := self.config_instance("cookies"):
domain = self.root.rpartition("/")[2]
self.cookies_update_dict(cookies, domain=domain)
- file_url = self.config_instance("file_url")
- if file_url:
+ if file_url := self.config_instance("file_url"):
self.file_url_fmt = file_url
if self.category == "giantessbooru":
diff --git a/gallery_dl/extractor/simplyhentai.py b/gallery_dl/extractor/simplyhentai.py
index a7393561..d6541b2b 100644
--- a/gallery_dl/extractor/simplyhentai.py
+++ b/gallery_dl/extractor/simplyhentai.py
@@ -90,8 +90,7 @@ class SimplyhentaiImageExtractor(Extractor):
url = extr('"image":"' , '&')
url = extr(""content":"", "&") or url
- tags = text.extr(descr, " tagged with ", " online for free ")
- if tags:
+ if tags := text.extr(descr, " tagged with ", " online for free "):
tags = tags.split(", ")
tags[-1] = tags[-1].partition(" ")[2]
else:
diff --git a/gallery_dl/extractor/skeb.py b/gallery_dl/extractor/skeb.py
index f892156e..1caafd1f 100644
--- a/gallery_dl/extractor/skeb.py
+++ b/gallery_dl/extractor/skeb.py
@@ -162,8 +162,7 @@ class SkebExtractor(Extractor):
})
if self.article and "article_image_url" in resp:
- url = resp["article_image_url"]
- if url:
+ if url := resp["article_image_url"]:
files.append({
"content_category": "article",
"file_id" : "article",
diff --git a/gallery_dl/extractor/subscribestar.py b/gallery_dl/extractor/subscribestar.py
index 874a015b..989e6cc9 100644
--- a/gallery_dl/extractor/subscribestar.py
+++ b/gallery_dl/extractor/subscribestar.py
@@ -115,8 +115,7 @@ class SubscribestarExtractor(Extractor):
}
def check_errors(response):
- errors = response.json().get("errors")
- if errors:
+ if errors := response.json().get("errors"):
self.log.debug(errors)
try:
msg = f'"{errors.popitem()[1]}"'
@@ -146,8 +145,7 @@ class SubscribestarExtractor(Extractor):
def _media_from_post(self, html):
media = []
- gallery = text.extr(html, 'data-gallery="', '"')
- if gallery:
+ if gallery := text.extr(html, 'data-gallery="', '"'):
for item in util.json_loads(text.unescape(gallery)):
if "/previews" in item["url"]:
self._warn_preview()
diff --git a/gallery_dl/extractor/szurubooru.py b/gallery_dl/extractor/szurubooru.py
index c0b9a7e0..190ccbf6 100644
--- a/gallery_dl/extractor/szurubooru.py
+++ b/gallery_dl/extractor/szurubooru.py
@@ -26,10 +26,8 @@ class SzurubooruExtractor(booru.BooruExtractor):
"Content-Type": "application/json",
}
- username = self.config("username")
- if username:
- token = self.config("token")
- if token:
+ if username := self.config("username"):
+ if token := self.config("token"):
value = username + ":" + token
self.headers["Authorization"] = "Token " + \
binascii.b2a_base64(value.encode())[:-1].decode()
diff --git a/gallery_dl/extractor/tumblr.py b/gallery_dl/extractor/tumblr.py
index ea579686..d9f1ea28 100644
--- a/gallery_dl/extractor/tumblr.py
+++ b/gallery_dl/extractor/tumblr.py
@@ -34,8 +34,7 @@ class TumblrExtractor(Extractor):
def __init__(self, match):
Extractor.__init__(self, match)
- name = match[2]
- if name:
+ if name := match[2]:
self.blog = name + ".tumblr.com"
else:
self.blog = match[1] or match[3]
@@ -139,8 +138,7 @@ class TumblrExtractor(Extractor):
if url and url.startswith("https://a.tumblr.com/"):
posts.append(self._prepare(url, post.copy()))
- url = post.get("video_url") # type "video"
- if url:
+ if url := post.get("video_url"): # type "video"
posts.append(self._prepare(
self._original_video(url), post.copy()))
@@ -160,8 +158,7 @@ class TumblrExtractor(Extractor):
posts.append(self._prepare(url, post.copy()))
if self.external: # external links
- url = post.get("permalink_url") or post.get("url")
- if url:
+ if url := post.get("permalink_url") or post.get("url"):
post["extension"] = None
posts.append((Message.Queue, url, post.copy()))
del post["extension"]
@@ -191,8 +188,7 @@ class TumblrExtractor(Extractor):
types = types.split(",")
types = frozenset(types)
- invalid = types - POST_TYPES
- if invalid:
+ if invalid := types - POST_TYPES:
types = types & POST_TYPES
self.log.warning("Invalid post types: '%s'",
"', '".join(sorted(invalid)))
@@ -504,8 +500,7 @@ class TumblrAPI(oauth.OAuth1API):
f"{t.hour:02}:{t.minute:02}:{t.second:02}")
# hourly rate limit
- reset = response.headers.get("x-ratelimit-perhour-reset")
- if reset:
+ if reset := response.headers.get("x-ratelimit-perhour-reset"):
self.log.info("Hourly API rate limit exceeded")
self.extractor.wait(seconds=reset)
continue
diff --git a/gallery_dl/extractor/twibooru.py b/gallery_dl/extractor/twibooru.py
index cf67135b..4f9fe845 100644
--- a/gallery_dl/extractor/twibooru.py
+++ b/gallery_dl/extractor/twibooru.py
@@ -159,12 +159,10 @@ class TwibooruAPI():
def _pagination(self, endpoint, params):
extr = self.extractor
- api_key = extr.config("api-key")
- if api_key:
+ if api_key := extr.config("api-key"):
params["key"] = api_key
- filter_id = extr.config("filter")
- if filter_id:
+ if filter_id := extr.config("filter"):
params["filter_id"] = filter_id
elif not api_key:
params["filter_id"] = "2"
diff --git a/gallery_dl/extractor/twitter.py b/gallery_dl/extractor/twitter.py
index b8770724..7252d056 100644
--- a/gallery_dl/extractor/twitter.py
+++ b/gallery_dl/extractor/twitter.py
@@ -278,8 +278,7 @@ class TwitterExtractor(Extractor):
bvals = {bval["key"]: bval["value"]
for bval in card["binding_values"]}
- cbl = self.cards_blacklist
- if cbl:
+ if cbl := self.cards_blacklist:
if name in cbl:
return
if "vanity_url" in bvals:
@@ -339,8 +338,8 @@ class TwitterExtractor(Extractor):
response = self.request(url, fatal=False)
if response.status_code >= 400:
continue
- url = text.extr(response.text, 'name="twitter:image" value="', '"')
- if url:
+ if url := text.extr(
+ response.text, 'name="twitter:image" value="', '"'):
files.append({"url": url})
def _transform_tweet(self, tweet):
@@ -411,12 +410,10 @@ class TwitterExtractor(Extractor):
content = tget("full_text") or tget("text") or ""
entities = legacy["entities"]
- hashtags = entities.get("hashtags")
- if hashtags:
+ if hashtags := entities.get("hashtags"):
tdata["hashtags"] = [t["text"] for t in hashtags]
- mentions = entities.get("user_mentions")
- if mentions:
+ if mentions := entities.get("user_mentions"):
tdata["mentions"] = [{
"id": text.parse_int(u["id_str"]),
"name": u["screen_name"],
@@ -424,8 +421,7 @@ class TwitterExtractor(Extractor):
} for u in mentions]
content = text.unescape(content)
- urls = entities.get("urls")
- if urls:
+ if urls := entities.get("urls"):
for url in urls:
try:
content = content.replace(url["url"], url["expanded_url"])
@@ -496,8 +492,7 @@ class TwitterExtractor(Extractor):
}
descr = user["description"]
- urls = entities["description"].get("urls")
- if urls:
+ if urls := entities["description"].get("urls"):
for url in urls:
try:
descr = descr.replace(url["url"], url["expanded_url"])
@@ -922,8 +917,7 @@ class TwitterTweetExtractor(TwitterExtractor):
self.tweet_id = match[2]
def tweets(self):
- conversations = self.config("conversations")
- if conversations:
+ if conversations := self.config("conversations"):
self._accessible = (conversations == "accessible")
return self._tweets_conversation(self.tweet_id)
@@ -1563,8 +1557,7 @@ class TwitterAPI():
headers=self.headers, fatal=None)
# update 'x-csrf-token' header (#1170)
- csrf_token = response.cookies.get("ct0")
- if csrf_token:
+ if csrf_token := response.cookies.get("ct0"):
self.headers["x-csrf-token"] = csrf_token
remaining = int(response.headers.get("x-rate-limit-remaining", 6))
@@ -1639,8 +1632,7 @@ class TwitterAPI():
def _pagination_legacy(self, endpoint, params):
extr = self.extractor
- cursor = extr._init_cursor()
- if cursor:
+ if cursor := extr._init_cursor():
params["cursor"] = cursor
original_retweets = (extr.retweets == "original")
bottom = ("cursor-bottom-", "sq-cursor-bottom")
@@ -1721,8 +1713,7 @@ class TwitterAPI():
yield tweet
if "quoted_status_id_str" in tweet:
- quoted = tweets.get(tweet["quoted_status_id_str"])
- if quoted:
+ if quoted := tweets.get(tweet["quoted_status_id_str"]):
quoted = quoted.copy()
quoted["author"] = users[quoted["user_id_str"]]
quoted["quoted_by"] = tweet["user"]["screen_name"]
@@ -1742,8 +1733,7 @@ class TwitterAPI():
pinned_tweet = extr.pinned
params = {"variables": None}
- cursor = extr._init_cursor()
- if cursor:
+ if cursor := extr._init_cursor():
variables["cursor"] = cursor
if features is None:
features = self.features_pagination
@@ -1792,8 +1782,7 @@ class TwitterAPI():
except LookupError:
extr.log.debug(data)
- user = extr._user_obj
- if user:
+ if user := extr._user_obj:
user = user["legacy"]
if user.get("blocked_by"):
if self.headers["x-twitter-auth-type"] and \
@@ -1942,8 +1931,7 @@ class TwitterAPI():
def _pagination_users(self, endpoint, variables, path=None):
extr = self.extractor
- cursor = extr._init_cursor()
- if cursor:
+ if cursor := extr._init_cursor():
variables["cursor"] = cursor
params = {
"variables": None,
@@ -2018,8 +2006,7 @@ def _login_impl(extr, username, password):
method="POST", fatal=None)
# update 'x-csrf-token' header (#5945)
- csrf_token = response.cookies.get("ct0")
- if csrf_token:
+ if csrf_token := response.cookies.get("ct0"):
headers["x-csrf-token"] = csrf_token
try:
diff --git a/gallery_dl/extractor/vipergirls.py b/gallery_dl/extractor/vipergirls.py
index 58ec70bd..e53ecf48 100644
--- a/gallery_dl/extractor/vipergirls.py
+++ b/gallery_dl/extractor/vipergirls.py
@@ -25,8 +25,7 @@ class VipergirlsExtractor(Extractor):
cookies_names = ("vg_userid", "vg_password")
def _init(self):
- domain = self.config("domain")
- if domain:
+ if domain := self.config("domain"):
pos = domain.find("://")
if pos >= 0:
self.root = domain.rstrip("/")
@@ -45,8 +44,7 @@ class VipergirlsExtractor(Extractor):
forum_title = root[1].attrib["title"]
thread_title = root[2].attrib["title"]
- like = self.config("like")
- if like:
+ if like := self.config("like"):
user_hash = root[0].get("hash")
if len(user_hash) < 16:
self.log.warning("Login required to like posts")
diff --git a/gallery_dl/extractor/vk.py b/gallery_dl/extractor/vk.py
index c618d041..0f323e1b 100644
--- a/gallery_dl/extractor/vk.py
+++ b/gallery_dl/extractor/vk.py
@@ -112,8 +112,7 @@ class VkExtractor(Extractor):
if offset_next >= total:
# the last chunk of photos also contains the first few photos
# again if 'total' is not a multiple of 10
- extra = total - offset_next
- if extra:
+ if extra := total - offset_next:
del photos[extra:]
yield from photos
diff --git a/gallery_dl/extractor/wallpapercave.py b/gallery_dl/extractor/wallpapercave.py
index 10417fd1..65fca240 100644
--- a/gallery_dl/extractor/wallpapercave.py
+++ b/gallery_dl/extractor/wallpapercave.py
@@ -44,8 +44,7 @@ class WallpapercaveImageExtractor(Extractor):
if path is None:
for wp in text.extract_iter(
page, 'class="wallpaper" id="wp', ''):
- path = text.rextr(wp, ' src="', '"')
- if path:
+ if path := text.rextr(wp, ' src="', '"'):
image = text.nameext_from_url(path)
yield Message.Directory, image
yield Message.Url, self.root + path, image
diff --git a/gallery_dl/extractor/warosu.py b/gallery_dl/extractor/warosu.py
index e78fd949..8ae2a49a 100644
--- a/gallery_dl/extractor/warosu.py
+++ b/gallery_dl/extractor/warosu.py
@@ -94,8 +94,7 @@ class WarosuThreadExtractor(Extractor):
"", "<").rstrip().rpartition(".")[0])
extr("
", "")
- url = extr("
")
- if url:
+ if url := extr(""):
if url[0] == "/":
data["image"] = self.root + url
elif "warosu." not in url:
diff --git a/gallery_dl/extractor/weibo.py b/gallery_dl/extractor/weibo.py
index 22144181..823e8e03 100644
--- a/gallery_dl/extractor/weibo.py
+++ b/gallery_dl/extractor/weibo.py
@@ -111,8 +111,7 @@ class WeiboExtractor(Extractor):
self.log.warning("Unknown media type '%s'", type)
return
- pic_ids = status.get("pic_ids")
- if pic_ids:
+ if pic_ids := status.get("pic_ids"):
pics = status["pic_infos"]
for pic_id in pic_ids:
pic = pics[pic_id]
@@ -187,17 +186,15 @@ class WeiboExtractor(Extractor):
yield from statuses
# videos, newvideo
- cursor = data.get("next_cursor")
- if cursor:
+ if cursor := data.get("next_cursor"):
if cursor == -1:
return
params["cursor"] = cursor
continue
# album
- since_id = data.get("since_id")
- if since_id:
- params["sinceid"] = data["since_id"]
+ if since_id := data.get("since_id"):
+ params["sinceid"] = since_id
continue
# home, article
diff --git a/gallery_dl/extractor/ytdl.py b/gallery_dl/extractor/ytdl.py
index 34e0daf7..eb33b65c 100644
--- a/gallery_dl/extractor/ytdl.py
+++ b/gallery_dl/extractor/ytdl.py
@@ -82,8 +82,7 @@ class YoutubeDLExtractor(Extractor):
ytdl_module, self, user_opts, extr_opts)
# transfer cookies to ytdl
- cookies = self.cookies
- if cookies:
+ if cookies := self.cookies:
set_cookie = ytdl_instance.cookiejar.set_cookie
for cookie in cookies:
set_cookie(cookie)
diff --git a/gallery_dl/extractor/zerochan.py b/gallery_dl/extractor/zerochan.py
index 1f146236..3341594e 100644
--- a/gallery_dl/extractor/zerochan.py
+++ b/gallery_dl/extractor/zerochan.py
@@ -173,8 +173,7 @@ class ZerochanTagExtractor(ZerochanExtractor):
self.posts = self.posts_api
self.session.headers["User-Agent"] = util.USERAGENT
- exts = self.config("extensions")
- if exts:
+ if exts := self.config("extensions"):
if isinstance(exts, str):
exts = exts.split(",")
self.exts = exts
diff --git a/gallery_dl/job.py b/gallery_dl/job.py
index fb7c3eeb..3176eb45 100644
--- a/gallery_dl/job.py
+++ b/gallery_dl/job.py
@@ -48,15 +48,13 @@ class Job():
self.kwdict = {}
self.kwdict_eval = False
- cfgpath = self._build_config_path(parent)
- if cfgpath:
+ if cfgpath := self._build_config_path(parent):
if isinstance(cfgpath, list):
extr.config = extr._config_shared
extr.config_accumulate = extr._config_shared_accumulate
extr._cfgpath = cfgpath
- actions = extr.config("actions")
- if actions:
+ if actions := extr.config("actions"):
from .actions import LoggerAdapter, parse_logging
self._logger_adapter = LoggerAdapter
self._logger_actions = parse_logging(actions)
@@ -89,8 +87,7 @@ class Job():
"current_git_head": util.git_head()
}
# user-supplied metadata
- kwdict = extr.config("keywords")
- if kwdict:
+ if kwdict := extr.config("keywords"):
if extr.config("keywords-eval"):
self.kwdict_eval = []
for key, value in kwdict.items():
@@ -260,8 +257,7 @@ class Job():
if self.extractor.config(target + "-unique"):
predicates.append(util.UniquePredicate())
- pfilter = self.extractor.config(target + "-filter")
- if pfilter:
+ if pfilter := self.extractor.config(target + "-filter"):
try:
pred = util.FilterPredicate(pfilter, target)
except (SyntaxError, ValueError, TypeError) as exc:
@@ -269,8 +265,7 @@ class Job():
else:
predicates.append(pred)
- prange = self.extractor.config(target + "-range")
- if prange:
+ if prange := self.extractor.config(target + "-range"):
try:
pred = util.RangePredicate(prange)
except ValueError as exc:
@@ -411,12 +406,10 @@ class DownloadJob(Job):
return
self.visited.add(url)
- cls = kwdict.get("_extractor")
- if cls:
+ if cls := kwdict.get("_extractor"):
extr = cls.from_url(url)
else:
- extr = extractor.find(url)
- if extr:
+ if extr := extractor.find(url):
if self._extractor_filter is None:
self._extractor_filter = self._build_extractor_filter()
if not self._extractor_filter(extr):
@@ -432,8 +425,7 @@ class DownloadJob(Job):
else:
extr._parentdir = pextr._parentdir
- pmeta = pextr.config2("parent-metadata", "metadata-parent")
- if pmeta:
+ if pmeta := pextr.config2("parent-metadata", "metadata-parent"):
if isinstance(pmeta, str):
data = self.kwdict.copy()
if kwdict:
@@ -486,8 +478,7 @@ class DownloadJob(Job):
self.archive.finalize()
self.archive.close()
- pathfmt = self.pathfmt
- if pathfmt:
+ if pathfmt := self.pathfmt:
hooks = self.hooks
if "post-after" in hooks:
for callback in hooks["post-after"]:
@@ -523,8 +514,7 @@ class DownloadJob(Job):
def download(self, url):
"""Download 'url'"""
scheme = url.partition(":")[0]
- downloader = self.get_downloader(scheme)
- if downloader:
+ if downloader := self.get_downloader(scheme):
try:
return downloader.download(url, self.pathfmt)
except OSError as exc:
@@ -570,8 +560,7 @@ class DownloadJob(Job):
# monkey-patch method to do nothing and always return True
self.download = pathfmt.fix_extension
- archive_path = cfg("archive")
- if archive_path:
+ if archive_path := cfg("archive"):
archive_table = cfg("archive-table")
archive_prefix = cfg("archive-prefix")
if archive_prefix is None:
@@ -608,8 +597,7 @@ class DownloadJob(Job):
self._archive_write_file = ("file" in events)
self._archive_write_skip = ("skip" in events)
- skip = cfg("skip", True)
- if skip:
+ if skip := cfg("skip", True):
self._skipexc = None
if skip == "enumerate":
pathfmt.check_file = pathfmt._enum_file
@@ -623,8 +611,7 @@ class DownloadJob(Job):
self._skipexc = SystemExit
self._skipmax = text.parse_int(smax)
- skip_filter = cfg("skip-filter")
- if skip_filter:
+ if skip_filter := cfg("skip-filter"):
self._skipftr = util.compile_filter(skip_filter)
else:
self._skipftr = None
@@ -637,8 +624,7 @@ class DownloadJob(Job):
if not cfg("postprocess", True):
return
- postprocessors = extr.config_accumulate("postprocessors")
- if postprocessors:
+ if postprocessors := extr.config_accumulate("postprocessors"):
self.hooks = collections.defaultdict(list)
pp_log = self.get_logger("postprocessor")
@@ -867,8 +853,7 @@ class UrlJob(Job):
stdout_write("| " + url + "\n")
def handle_queue(self, url, kwdict):
- cls = kwdict.get("_extractor")
- if cls:
+ if cls := kwdict.get("_extractor"):
extr = cls.from_url(url)
else:
extr = extractor.find(url)
@@ -981,8 +966,7 @@ class DataJob(Job):
self.data.append((Message.Queue, url, self.filter(kwdict)))
def handle_queue_resolve(self, url, kwdict):
- cls = kwdict.get("_extractor")
- if cls:
+ if cls := kwdict.get("_extractor"):
extr = cls.from_url(url)
else:
extr = extractor.find(url)
diff --git a/gallery_dl/output.py b/gallery_dl/output.py
index a31f9d30..e4937f4e 100644
--- a/gallery_dl/output.py
+++ b/gallery_dl/output.py
@@ -121,8 +121,7 @@ class PathfmtProxy():
return pathfmt.__dict__.get(name) if pathfmt else None
def __str__(self):
- pathfmt = object.__getattribute__(self, "job").pathfmt
- if pathfmt:
+ if pathfmt := object.__getattribute__(self, "job").pathfmt:
return pathfmt.path or pathfmt.directory
return ""
@@ -235,8 +234,7 @@ def configure_logging(loglevel):
minlevel = handler.level
# file logging handler
- handler = setup_logging_handler("logfile", lvl=loglevel)
- if handler:
+ if handler := setup_logging_handler("logfile", lvl=loglevel):
root.addHandler(handler)
if minlevel > handler.level:
minlevel = handler.level
@@ -394,8 +392,7 @@ class PipeOutput(NullOutput):
class TerminalOutput():
def __init__(self):
- shorten = config.get(("output",), "shorten", True)
- if shorten:
+ if shorten := config.get(("output",), "shorten", True):
func = shorten_string_eaw if shorten == "eaw" else shorten_string
limit = shutil.get_terminal_size().columns - OFFSET
sep = CHAR_ELLIPSIES
@@ -460,8 +457,7 @@ class CustomOutput():
if isinstance(fmt_success, list):
off_success, fmt_success = fmt_success
- shorten = config.get(("output",), "shorten", True)
- if shorten:
+ if shorten := config.get(("output",), "shorten", True):
func = shorten_string_eaw if shorten == "eaw" else shorten_string
width = shutil.get_terminal_size().columns
diff --git a/gallery_dl/path.py b/gallery_dl/path.py
index e46cdc08..795564d5 100644
--- a/gallery_dl/path.py
+++ b/gallery_dl/path.py
@@ -202,8 +202,7 @@ class PathFormat():
"""Build directory path and create it if necessary"""
self.kwdict = kwdict
- segments = self.build_directory(kwdict)
- if segments:
+ if segments := self.build_directory(kwdict):
self.directory = directory = self.basedirectory + self.clean_path(
os.sep.join(segments) + os.sep)
else:
diff --git a/gallery_dl/postprocessor/common.py b/gallery_dl/postprocessor/common.py
index 3099547b..8da84176 100644
--- a/gallery_dl/postprocessor/common.py
+++ b/gallery_dl/postprocessor/common.py
@@ -22,8 +22,7 @@ class PostProcessor():
return self.__class__.__name__
def _init_archive(self, job, options, prefix=None):
- archive_path = options.get("archive")
- if archive_path:
+ if archive_path := options.get("archive"):
extr = job.extractor
archive_table = options.get("archive-table")
diff --git a/gallery_dl/postprocessor/compare.py b/gallery_dl/postprocessor/compare.py
index 58ad063b..c3d328d7 100644
--- a/gallery_dl/postprocessor/compare.py
+++ b/gallery_dl/postprocessor/compare.py
@@ -21,8 +21,7 @@ class ComparePP(PostProcessor):
self._compare = self._compare_size
self._equal_exc = self._equal_cnt = 0
- equal = options.get("equal")
- if equal:
+ if equal := options.get("equal"):
equal, _, emax = equal.partition(":")
self._equal_max = text.parse_int(emax)
if equal == "abort":
diff --git a/gallery_dl/postprocessor/metadata.py b/gallery_dl/postprocessor/metadata.py
index 701173f6..c74f92fb 100644
--- a/gallery_dl/postprocessor/metadata.py
+++ b/gallery_dl/postprocessor/metadata.py
@@ -55,8 +55,7 @@ class MetadataPP(PostProcessor):
self._json_encode = self._make_encoder(options, 4).encode
ext = "json"
- base_directory = options.get("base-directory")
- if base_directory:
+ if base_directory := options.get("base-directory"):
if base_directory is True:
self._base = lambda p: p.basedirectory
else:
@@ -181,8 +180,7 @@ class MetadataPP(PostProcessor):
try:
pathfmt.directory_formatters = self._directory_formatters
pathfmt.directory_conditions = ()
- segments = pathfmt.build_directory(pathfmt.kwdict)
- if segments:
+ if segments := pathfmt.build_directory(pathfmt.kwdict):
directory = pathfmt.clean_path(os.sep.join(segments) + os.sep)
else:
directory = "." + os.sep
@@ -244,8 +242,7 @@ class MetadataPP(PostProcessor):
fp.write(self._json_encode(kwdict) + "\n")
def _make_filter(self, options):
- include = options.get("include")
- if include:
+ if include := options.get("include"):
if isinstance(include, str):
include = include.split(",")
return lambda d: {k: d[k] for k in include if k in d}
diff --git a/gallery_dl/postprocessor/mtime.py b/gallery_dl/postprocessor/mtime.py
index d6a2d7a1..b1269dd5 100644
--- a/gallery_dl/postprocessor/mtime.py
+++ b/gallery_dl/postprocessor/mtime.py
@@ -17,8 +17,7 @@ class MtimePP(PostProcessor):
def __init__(self, job, options):
PostProcessor.__init__(self, job)
- value = options.get("value")
- if value:
+ if value := options.get("value"):
self._get = formatter.parse(value, None, util.identity).format_map
else:
key = options.get("key", "date")
diff --git a/gallery_dl/postprocessor/ugoira.py b/gallery_dl/postprocessor/ugoira.py
index c2b74191..33ebb75c 100644
--- a/gallery_dl/postprocessor/ugoira.py
+++ b/gallery_dl/postprocessor/ugoira.py
@@ -296,8 +296,7 @@ class UgoiraPP(PostProcessor):
def _exec(self, args):
self.log.debug(args)
out = None if self.output else subprocess.DEVNULL
- retcode = util.Popen(args, stdout=out, stderr=out).wait()
- if retcode:
+ if retcode := util.Popen(args, stdout=out, stderr=out).wait():
output.stderr_write("\n")
self.log.error("Non-zero exit status when running %s (%s)",
args, retcode)
diff --git a/gallery_dl/util.py b/gallery_dl/util.py
index 339acbfd..4027ac6f 100644
--- a/gallery_dl/util.py
+++ b/gallery_dl/util.py
@@ -320,20 +320,17 @@ def dump_response(response, fp, headers=False, content=True, hide_auth=True):
res_headers = response.headers.copy()
if hide_auth:
- authorization = req_headers.get("Authorization")
- if authorization:
+ if authorization := req_headers.get("Authorization"):
atype, sep, _ = str(authorization).partition(" ")
req_headers["Authorization"] = f"{atype} ***" if sep else "***"
- cookie = req_headers.get("Cookie")
- if cookie:
+ if cookie := req_headers.get("Cookie"):
req_headers["Cookie"] = ";".join(
c.partition("=")[0] + "=***"
for c in cookie.split(";")
)
- set_cookie = res_headers.get("Set-Cookie")
- if set_cookie:
+ if set_cookie := res_headers.get("Set-Cookie"):
res_headers["Set-Cookie"] = re(r"(^|, )([^ =]+)=[^,;]*").sub(
r"\1\2=***", set_cookie)
@@ -377,14 +374,11 @@ def extract_headers(response):
headers = response.headers
data = dict(headers)
- hcd = headers.get("content-disposition")
- if hcd:
- name = text.extr(hcd, 'filename="', '"')
- if name:
+ if hcd := headers.get("content-disposition"):
+ if name := text.extr(hcd, 'filename="', '"'):
text.nameext_from_url(name, data)
- hlm = headers.get("last-modified")
- if hlm:
+ if hlm := headers.get("last-modified"):
data["date"] = datetime.datetime(*parsedate_tz(hlm)[:6])
return data
diff --git a/gallery_dl/ytdl.py b/gallery_dl/ytdl.py
index 75899473..cfc6b501 100644
--- a/gallery_dl/ytdl.py
+++ b/gallery_dl/ytdl.py
@@ -258,8 +258,7 @@ def parse_command_line(module, argv):
None if opts.match_filter is None
else module.match_filter_func(opts.match_filter))
- cookiesfrombrowser = getattr(opts, "cookiesfrombrowser", None)
- if cookiesfrombrowser:
+ if cookiesfrombrowser := getattr(opts, "cookiesfrombrowser", None):
pattern = util.re(r"""(?x)
(?P[^+:]+)
(?:\s*\+\s*(?P[^:]+))?