diff --git a/gallery_dl/extractor/aryion.py b/gallery_dl/extractor/aryion.py index 686adb8e..c8e5ccbb 100644 --- a/gallery_dl/extractor/aryion.py +++ b/gallery_dl/extractor/aryion.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2020-2025 Mike Fährmann +# Copyright 2020-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -156,11 +156,11 @@ class AryionExtractor(Extractor): headers = response.headers # folder - if headers["content-type"] in ( + if headers["content-type"] in { "application/x-folder", "application/x-comic-folder", "application/x-comic-folder-nomerge", - ): + }: return False # get filename from 'Content-Disposition' header diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index 5879f425..794c5aae 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -784,7 +784,7 @@ class Extractor(): with open(path + ".txt", 'wb') as fp: util.dump_response( response, fp, - headers=(self._write_pages in ("all", "ALL")), + headers=(self._write_pages in {"all", "ALL"}), hide_auth=(self._write_pages != "ALL") ) self.log.info("Writing '%s' response to '%s'", diff --git a/gallery_dl/extractor/discord.py b/gallery_dl/extractor/discord.py index 6b91ae01..ef2943ec 100644 --- a/gallery_dl/extractor/discord.py +++ b/gallery_dl/extractor/discord.py @@ -60,7 +60,7 @@ class DiscordExtractor(Extractor): def extract_message(self, message): # https://discord.com/developers/docs/resources/message#message-object-message-types - if message["type"] in (0, 19, 21): + if message["type"] in {0, 19, 21}: message_metadata = {} message_metadata.update(self.server_metadata) message_metadata.update( @@ -92,7 +92,7 @@ class DiscordExtractor(Extractor): message_snapshots = [message] message_snapshots.extend( msg["message"] for msg in message.get("message_snapshots", []) - if msg["message"]["type"] in (0, 19, 21) + if msg["message"]["type"] in {0, 19, 21} ) for snapshot in message_snapshots: @@ -153,15 +153,15 @@ class DiscordExtractor(Extractor): ) # https://discord.com/developers/docs/resources/channel#channel-object-channel-types - if channel_type in (0, 5): + if channel_type in {0, 5}: yield from self.extract_channel_text(channel_id) if self.enabled_threads: yield from self.extract_channel_threads(channel_id) - elif channel_type in (1, 3, 10, 11, 12): + elif channel_type in {1, 3, 10, 11, 12}: yield from self.extract_channel_text(channel_id) - elif channel_type in (15, 16): + elif channel_type in {15, 16}: yield from self.extract_channel_threads(channel_id) - elif channel_type in (4,): + elif channel_type == 4: for channel in self.server_channels_metadata.copy().values(): if channel["parent_id"] == channel_id: yield from self.extract_channel( @@ -192,7 +192,7 @@ class DiscordExtractor(Extractor): "parent_type": parent_metadata["channel_type"] }) - if channel_metadata["channel_type"] in (1, 3): + if channel_metadata["channel_type"] in {1, 3}: channel_metadata.update({ "channel": "DMs", "recipients": ( @@ -355,7 +355,7 @@ class DiscordServerExtractor(DiscordExtractor): self.build_server_and_channels(server_id) for channel in self.server_channels_metadata.copy().values(): - if channel["channel_type"] in (0, 5, 15, 16): + if channel["channel_type"] in {0, 5, 15, 16}: yield from self.extract_channel( channel["channel_id"], safe=True) diff --git a/gallery_dl/extractor/fapello.py b/gallery_dl/extractor/fapello.py index 2bd7a1fc..4cd97a69 100644 --- a/gallery_dl/extractor/fapello.py +++ b/gallery_dl/extractor/fapello.py @@ -97,7 +97,7 @@ class FapelloPathExtractor(Extractor): def items(self): num = 1 - if self.path in ("top-likes", "top-followers"): + if self.path in {"top-likes", "top-followers"}: data = {"_extractor": FapelloModelExtractor} else: data = {"_extractor": FapelloPostExtractor} diff --git a/gallery_dl/extractor/gelbooru.py b/gallery_dl/extractor/gelbooru.py index ffba38ab..30e32f8c 100644 --- a/gallery_dl/extractor/gelbooru.py +++ b/gallery_dl/extractor/gelbooru.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2014-2025 Mike Fährmann +# Copyright 2014-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -217,7 +217,7 @@ class GelbooruFavoriteExtractor(GelbooruBase, "a" if order > 0 else "de") order_favs = self.config("order-posts") - if order_favs and order_favs[0] in ("r", "a"): + if order_favs and order_favs[0] in {"r", "a"}: self.log.debug("Returning them in reverse") order = -order diff --git a/gallery_dl/extractor/hotleak.py b/gallery_dl/extractor/hotleak.py index 9c849a8c..0cc6cd62 100644 --- a/gallery_dl/extractor/hotleak.py +++ b/gallery_dl/extractor/hotleak.py @@ -160,9 +160,9 @@ class HotleakCategoryExtractor(HotleakExtractor): def items(self): url = f"{self.root}/{self._category}" - if self._category in ("hot", "creators"): + if self._category in {"hot", "creators"}: data = {"_extractor": HotleakCreatorExtractor} - elif self._category in ("videos", "photos"): + elif self._category in {"videos", "photos"}: data = {"_extractor": HotleakPostExtractor} for item in self._pagination(url, self.params): diff --git a/gallery_dl/extractor/instagram.py b/gallery_dl/extractor/instagram.py index fa0b59b6..ce32587b 100644 --- a/gallery_dl/extractor/instagram.py +++ b/gallery_dl/extractor/instagram.py @@ -54,7 +54,7 @@ class InstagramExtractor(Extractor): self._warn_video = True if self.config("warn-videos", True) else False self._warn_image = ( 9 if not (wi := self.config("warn-images", True)) else - 1 if wi in ("all", "both") else + 1 if wi in {"all", "both"} else 0) def items(self): @@ -70,7 +70,7 @@ class InstagramExtractor(Extractor): max_posts = self.config("max-posts") order = self.config("order-files") - reverse = order[0] in ("r", "d") if order else False + reverse = order[0] in {"r", "d"} if order else False posts = self.posts() if max_posts: @@ -831,9 +831,9 @@ class InstagramRestAPI(): reel_ids = [hl["id"] for hl in self.highlights_tray(user_id)] if order := self.extractor.config("order-posts"): - if order in ("desc", "reverse"): + if order in {"desc", "reverse"}: reel_ids.reverse() - elif order in ("id", "id_asc"): + elif order in {"id", "id_asc"}: reel_ids.sort(key=lambda r: int(r[10:])) elif order == "id_desc": reel_ids.sort(key=lambda r: int(r[10:]), reverse=True) diff --git a/gallery_dl/extractor/kemono.py b/gallery_dl/extractor/kemono.py index 8387350f..85bb169e 100644 --- a/gallery_dl/extractor/kemono.py +++ b/gallery_dl/extractor/kemono.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2021-2025 Mike Fährmann +# Copyright 2021-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -42,7 +42,7 @@ class KemonoExtractor(Extractor): if self.revisions: self.revisions_unique = (self.revisions == "unique") order = self.config("order-revisions") - self.revisions_reverse = order[0] in ("r", "a") if order else False + self.revisions_reverse = order[0] in {"r", "a"} if order else False self._find_inline = text.re( r'src="(?:https?://(?:kemono\.cr|coomer\.st))?(/inline/[^"]+' @@ -352,7 +352,7 @@ class KemonoUserExtractor(KemonoExtractor): _, _, service, creator_id, query = self.groups params = text.parse_query(query) - if self.config("endpoint") in ("posts+", "legacy+"): + if self.config("endpoint") in {"posts+", "legacy+"}: endpoint = self.api.creator_posts_expand else: endpoint = self.api.creator_posts @@ -439,7 +439,7 @@ class KemonoDiscordExtractor(KemonoExtractor): archives = True if self.config("archives") else False exts_archive = util.EXTS_ARCHIVE - if (order := self.config("order-posts")) and order[0] in ("r", "d"): + if (order := self.config("order-posts")) and order[0] in {"r", "d"}: posts = self.api.discord_channel(channel_id, channel["post_count"]) else: posts = self.api.discord_channel(channel_id) diff --git a/gallery_dl/extractor/misskey.py b/gallery_dl/extractor/misskey.py index f37bcada..f9459dab 100644 --- a/gallery_dl/extractor/misskey.py +++ b/gallery_dl/extractor/misskey.py @@ -255,7 +255,7 @@ class MisskeyAPI(): date_min, date_max = extr._get_date_min_max() if (order := extr.config("order-posts")) and \ - order[0] in ("a", "r"): + order[0] in {"a", "r"}: key = "sinceId" data["sinceDate"] = 1 if date_min is None else date_min * 1000 date_stop = None if date_max is None else date_max diff --git a/gallery_dl/extractor/oauth.py b/gallery_dl/extractor/oauth.py index a0e3c9f9..38bb5eeb 100644 --- a/gallery_dl/extractor/oauth.py +++ b/gallery_dl/extractor/oauth.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2017-2025 Mike Fährmann +# Copyright 2017-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -454,7 +454,7 @@ class OAuthPixiv(OAuthBase): if "error" in data: stdout_write(f"\n{data}\n") - if data["error"] in ("invalid_request", "invalid_grant"): + if data["error"] in {"invalid_request", "invalid_grant"}: stdout_write("'code' expired, try again\n\n") return diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py index 8463d9b8..0a4f6b34 100644 --- a/gallery_dl/extractor/pixiv.py +++ b/gallery_dl/extractor/pixiv.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2014-2025 Mike Fährmann +# Copyright 2014-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -131,11 +131,11 @@ class PixivExtractor(Extractor): self.log.debug("%s: %s", work_id, url) limit_type = url.rpartition("/")[2] - if limit_type in ( + if limit_type in { "limit_", # for '_extend_sanity()' inserts "limit_unviewable_360.png", "limit_sanity_level_360.png", - ): + }: work["_ajax"] = True self.log.warning("%s: 'limit_sanity_level' warning", work_id) if self.sanity_workaround: diff --git a/gallery_dl/extractor/twitter.py b/gallery_dl/extractor/twitter.py index 30931a29..dc5cf11b 100644 --- a/gallery_dl/extractor/twitter.py +++ b/gallery_dl/extractor/twitter.py @@ -299,7 +299,7 @@ class TwitterExtractor(Extractor): if domain in cbl or name + ":" + domain in cbl: return - if name in ("summary", "summary_large_image"): + if name in {"summary", "summary_large_image"}: for prefix in ("photo_image_full_size_", "summary_photo_image_", "thumbnail_image_"): @@ -1080,7 +1080,7 @@ class TwitterTweetExtractor(TwitterExtractor): return self._tweets_conversation(self.tweet_id) endpoint = self.config("tweet-endpoint") - if endpoint == "detail" or endpoint in (None, "auto") and \ + if endpoint == "detail" or endpoint in {None, "auto"} and \ self.api.headers["x-twitter-auth-type"]: return self._tweets_detail(self.tweet_id) @@ -1402,7 +1402,7 @@ class TwitterAPI(): if tweet.get("__typename") == "TweetUnavailable": reason = tweet.get("reason") - if reason in ("NsfwViewerHasNoStatedAge", "NsfwLoggedOut"): + if reason in {"NsfwViewerHasNoStatedAge", "NsfwLoggedOut"}: raise exception.AuthRequired(message="NSFW Tweet") if reason == "Protected": raise exception.AuthRequired(message="Protected Tweet") @@ -1545,7 +1545,7 @@ class TwitterAPI(): } pgn = cfg("search-pagination") - if pgn in ("max_id", "maxid", "id"): + if pgn in {"max_id", "maxid", "id"}: update_variables = self._update_variables_search_maxid elif pgn in {"until", "date", "datetime", "dt"}: update_variables = self._update_variables_search_date @@ -1856,7 +1856,7 @@ class TwitterAPI(): if response.status_code < 400: return data - elif response.status_code in (403, 404) and \ + elif response.status_code in {403, 404} and \ not self.headers["x-twitter-auth-type"]: raise exception.AuthRequired( "authenticated cookies", "timeline") diff --git a/gallery_dl/extractor/utils/deviantart_tiptap.py b/gallery_dl/extractor/utils/deviantart_tiptap.py index 36dfc6af..893310c2 100644 --- a/gallery_dl/extractor/utils/deviantart_tiptap.py +++ b/gallery_dl/extractor/utils/deviantart_tiptap.py @@ -66,7 +66,7 @@ def process_content(html, content): html.append(level) html.append(">") - elif type in ("listItem", "bulletList", "orderedList", "blockquote"): + elif type in {"listItem", "bulletList", "orderedList", "blockquote"}: c = type[1] tag = ( "li" if c == "i" else diff --git a/gallery_dl/extractor/wikimedia.py b/gallery_dl/extractor/wikimedia.py index 97e6f2bd..1be211c3 100644 --- a/gallery_dl/extractor/wikimedia.py +++ b/gallery_dl/extractor/wikimedia.py @@ -30,7 +30,7 @@ class WikimediaExtractor(BaseExtractor): labels = self.root.split(".") self.lang = labels[-3][-2:] self.category = labels[-2] - elif self.category in ("fandom", "wikigg"): + elif self.category in {"fandom", "wikigg"}: self.lang = "en" self.format = "original" self.basesubcategory = self.category diff --git a/gallery_dl/extractor/xenforo.py b/gallery_dl/extractor/xenforo.py index 81a5d19a..3dd73c42 100644 --- a/gallery_dl/extractor/xenforo.py +++ b/gallery_dl/extractor/xenforo.py @@ -126,7 +126,7 @@ class XenforoExtractor(BaseExtractor): def items_media(self, path, pnum, callback=None): if (order := self.config("order-posts")) and \ - order[0] in ("d", "r"): + order[0] in {"d", "r"}: pages = self._pagination_reverse(path, pnum, callback) reverse = True else: @@ -491,7 +491,7 @@ class XenforoThreadExtractor(XenforoExtractor): pnum = self.groups[-1] if (order := self.config("order-posts")) and \ - order[0] not in ("d", "r"): + order[0] not in {"d", "r"}: params = "?order=reaction_score" if order[0] == "s" else "" pages = self._pagination(path, pnum, params=params) reverse = False diff --git a/gallery_dl/extractor/ytdl.py b/gallery_dl/extractor/ytdl.py index c1358967..ede7ae52 100644 --- a/gallery_dl/extractor/ytdl.py +++ b/gallery_dl/extractor/ytdl.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2021-2025 Mike Fährmann +# Copyright 2021-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -126,7 +126,7 @@ class YoutubeDLExtractor(Extractor): if not entry: continue - if entry.get("_type") in ("url", "url_transparent"): + if entry.get("_type") in {"url", "url_transparent"}: try: entry = ytdl_instance.extract_info( entry["url"], False, diff --git a/gallery_dl/extractor/zerochan.py b/gallery_dl/extractor/zerochan.py index 13e2f167..75060ea7 100644 --- a/gallery_dl/extractor/zerochan.py +++ b/gallery_dl/extractor/zerochan.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2022-2025 Mike Fährmann +# Copyright 2022-2026 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as @@ -294,7 +294,7 @@ class ZerochanImageExtractor(ZerochanExtractor): try: post = self._parse_entry_html(image_id) except exception.HttpError as exc: - if exc.status in (404, 410): + if exc.status in {404, 410}: if msg := text.extr(exc.response.text, "

", "<"): self.log.warning(f"'{msg}'") return ()