[scripts/init] use 'args' directly

This commit is contained in:
Mike Fährmann
2025-08-05 21:06:24 +02:00
parent a01c0f99fd
commit 3dd1372a0b

View File

@@ -29,40 +29,40 @@ LICENSE = """\
""" """
def init_extractor_module(opts): def init_extractor_module(args):
if opts["init_module"]: if args.init_module:
try: try:
create_extractor_module(opts) create_extractor_module(args)
except FileExistsError: except FileExistsError:
LOG.warning("… already present") LOG.warning("… already present")
except Exception as exc: except Exception as exc:
LOG.error("%s: %s", exc.__class__.__name__, exc, exc_info=exc) LOG.error("%s: %s", exc.__class__.__name__, exc, exc_info=exc)
if msg := insert_into_modules_list(opts): if msg := insert_into_modules_list(args):
LOG.warning(msg) LOG.warning(msg)
try: try:
create_test_results_file(opts) create_test_results_file(args)
except FileExistsError: except FileExistsError:
LOG.warning("… already present") LOG.warning("… already present")
except Exception as exc: except Exception as exc:
LOG.error("%s: %s", exc.__class__.__name__, exc, exc_info=exc) LOG.error("%s: %s", exc.__class__.__name__, exc, exc_info=exc)
if opts.get("site_name"): if args.site_name:
if msg := insert_into_supportedsites(opts): if msg := insert_into_supportedsites(args):
LOG.warning(msg) LOG.warning(msg)
############################################################################### ###############################################################################
# File Creation ############################################################### # File Creation ###############################################################
def create_extractor_module(opts=NONE): def create_extractor_module(args):
category = opts["category"] category = args.category
path = util.path("gallery_dl", "extractor", f"{category}.py") path = util.path("gallery_dl", "extractor", f"{category}.py")
LOG.info("Creating '%s'", trim_path(path)) LOG.info("Creating '%s'", trim_path(path))
type = opts.get("type") type = args.type
if type == "manga": if type == "manga":
generate_extractors = generate_extractors_manga generate_extractors = generate_extractors_manga
elif type == "user": elif type == "user":
@@ -70,56 +70,55 @@ def create_extractor_module(opts=NONE):
else: else:
generate_extractors = generate_extractors_basic generate_extractors = generate_extractors_basic
with util.open(path, opts["open_mode"]) as fp: with util.open(path, args.open_mode) as fp:
if copyright := opts.get("copyright", ""): if copyright := args.copyright:
copyright = f"\n# Copyright {dt.date.today().year} {copyright}\n#" copyright = f"\n# Copyright {dt.date.today().year} {copyright}\n#"
fp.write(f'''\ fp.write(f'''\
{ENCODING}{copyright} {ENCODING}{copyright}
{LICENSE} {LICENSE}
"""Extractors for {opts["root"]}/""" """Extractors for {args.root}/"""
{generate_extractors(opts)}\ {generate_extractors(args)}\
''') ''')
def generate_extractors_basic(opts): def generate_extractors_basic(args):
cat = opts["category"] cat = args.category
root = opts["root"]
return f'''\ return f'''\
from .common import Extractor, Message from .common import Extractor, Message
from .. import text from .. import text
{build_base_pattern(opts)} {build_base_pattern(args)}
class {cat.capitalize()}Extractor(Extractor): class {cat.capitalize()}Extractor(Extractor):
"""Base class for {cat} extractors""" """Base class for {cat} extractors"""
category = "{cat}" category = "{cat}"
root = "{root}" root = "{args.root}"
''' '''
def generate_extractors_manga(opts): def generate_extractors_manga(args):
cat = opts["category"] cat = args.category
ccat = cat.capitalize() ccat = cat.capitalize()
return f'''\ return f'''\
from .common import ChapterExtractor, MangaExtractor from .common import ChapterExtractor, MangaExtractor
from .. import text from .. import text
{build_base_pattern(opts)} {build_base_pattern(args)}
class {ccat}Base(): class {ccat}Base():
"""Base class for {cat} extractors""" """Base class for {cat} extractors"""
category = "{cat}" category = "{cat}"
root = "{opts["root"]}" root = "{args.root}"
class {ccat}ChapterExtractor({ccat}Base, ChapterExtractor): class {ccat}ChapterExtractor({ccat}Base, ChapterExtractor):
"""Extractor for {cat} manga chapters""" """Extractor for {cat} manga chapters"""
pattern = rf"{{BASE_PATTERN}}/PATH" pattern = rf"{{BASE_PATTERN}}/PATH"
example = "" example = "{args.root}/..."
def __init__(self, match): def __init__(self, match):
url = f"{{self.root}}/PATH" url = f"{{self.root}}/PATH"
@@ -151,7 +150,7 @@ class {ccat}MangaExtractor({ccat}Base, MangaExtractor):
"""Extractor for {cat} manga""" """Extractor for {cat} manga"""
chapterclass = {ccat}ChapterExtractor chapterclass = {ccat}ChapterExtractor
pattern = rf"{{BASE_PATTERN}}/PATH" pattern = rf"{{BASE_PATTERN}}/PATH"
example = "" example = "{args.root}/..."
def __init__(self, match): def __init__(self, match):
url = f"{{self.root}}/PATH" url = f"{{self.root}}/PATH"
@@ -167,28 +166,27 @@ class {ccat}MangaExtractor({ccat}Base, MangaExtractor):
''' '''
def generate_extractors_user(opts): def generate_extractors_user(args):
cat = opts["category"] cat = args.category
ccat = cat.capitalize() ccat = cat.capitalize()
root = opts["root"]
return f'''\ return f'''\
from .common import Extractor, Message, Dispatch from .common import Extractor, Message, Dispatch
from .. import text from .. import text
{build_base_pattern(opts)} {build_base_pattern(args)}
USER_PATTERN = rf"{{BASE_PATTERN}}/([^/?#]+)" USER_PATTERN = rf"{{BASE_PATTERN}}/([^/?#]+)"
class {ccat}Extractor(Extractor): class {ccat}Extractor(Extractor):
"""Base class for {cat} extractors""" """Base class for {cat} extractors"""
category = "{cat}" category = "{cat}"
root = "{root}" root = "{args.root}"
class {ccat}UserExtractor(Dispatch, {ccat}Extractor) class {ccat}UserExtractor(Dispatch, {ccat}Extractor)
"""Extractor for {ccat} user profiles""" """Extractor for {cat} user profiles"""
pattern = rf"{{USER_PATTERN}}/?(?:$|\\?|#)" pattern = rf"{{USER_PATTERN}}/?(?:$|\\?|#)"
example = "{root}/USER/" example = "{args.root}/USER/"
def items(self): def items(self):
base = f"{{self.root}}/" base = f"{{self.root}}/"
@@ -198,8 +196,8 @@ class {ccat}UserExtractor(Dispatch, {ccat}Extractor)
''' '''
def build_base_pattern(opts): def build_base_pattern(args):
domain = opts["domain"] domain = args.domain
if domain.count(".") > 1: if domain.count(".") > 1:
subdomain, domain, tld = domain.rsplit(".", 2) subdomain, domain, tld = domain.rsplit(".", 2)
domain = f"{domain}.{tld}" domain = f"{domain}.{tld}"
@@ -218,11 +216,11 @@ BASE_PATTERN = r"(?:https?://)?{subdomain}{re.escape(domain)}"
############################################################################### ###############################################################################
# Test Results ################################################################ # Test Results ################################################################
def create_test_results_file(opts=NONE): def create_test_results_file(args):
path = util.path("test", "results", f"{opts['category']}.py") path = util.path("test", "results", f"{args.category}.py")
LOG.info("Creating '%s'", trim_path(path)) LOG.info("Creating '%s'", trim_path(path))
import_stmt = generate_test_result_import(opts) import_stmt = generate_test_result_import(args)
with util.open(path, "x") as fp: with util.open(path, "x") as fp:
fp.write(f"""\ fp.write(f"""\
{ENCODING} {ENCODING}
@@ -230,22 +228,21 @@ def create_test_results_file(opts=NONE):
{import_stmt} {import_stmt}
__tests__ = ( __tests__ = (
) )
""") """)
def generate_test_result_import(opts): def generate_test_result_import(args):
category = opts["category"] cat = args.category
if category[0].isdecimal(): if cat[0].isdecimal():
import_stmt = f"""\ import_stmt = f"""\
gallery_dl = __import__("gallery_dl.extractor.{category}") gallery_dl = __import__("gallery_dl.extractor.{cat}")
_{category} = getattr(gallery_dl.extractor, "{category}") _{cat} = getattr(gallery_dl.extractor, "{cat}")
""" """
else: else:
import_stmt = f"""\ import_stmt = f"""\
from gallery_dl.extractor import {category} from gallery_dl.extractor import {cat}
""" """
return import_stmt return import_stmt
@@ -254,8 +251,8 @@ from gallery_dl.extractor import {category}
############################################################################### ###############################################################################
# Code Modification ########################################################### # Code Modification ###########################################################
def insert_into_modules_list(opts=NONE): def insert_into_modules_list(args):
category = opts["category"] category = args.category
LOG.info("Adding '%s' to gallery_dl/extractor/__init__.py modules list", LOG.info("Adding '%s' to gallery_dl/extractor/__init__.py modules list",
category) category)
@@ -283,8 +280,8 @@ def insert_into_modules_list(opts=NONE):
fp.writelines(lines) fp.writelines(lines)
def insert_into_supportedsites(opts): def insert_into_supportedsites(args):
category = opts["category"] category = args.category
LOG.info("Adding '%s' to scripts/supportedsites.py category list", LOG.info("Adding '%s' to scripts/supportedsites.py category list",
category) category)
@@ -304,7 +301,7 @@ def insert_into_supportedsites(opts):
compare = True compare = True
ws = " " * max(15 - len(category), 0) ws = " " * max(15 - len(category), 0)
line = f''' "{category}"{ws}: "{opts['site_name']}",\n''' line = f''' "{category}"{ws}: "{args.site_name}",\n'''
lines.insert(idx, line) lines.insert(idx, line)
with util.lazy(path) as fp: with util.lazy(path) as fp:
@@ -321,47 +318,38 @@ def trim_path(path):
def parse_args(args=None): def parse_args(args=None):
parser = argparse.ArgumentParser(args) parser = argparse.ArgumentParser(args)
parser.add_argument("-s", "--site", metavar="TITLE") parser.add_argument(
parser.add_argument("-c", "--copyright", metavar="NAME") "-s", "--site",
dest="site_name", metavar="TITLE")
parser.add_argument(
"-c", "--copyright",
dest="copyright", metavar="NAME")
parser.add_argument( parser.add_argument(
"-C", "-C",
action="store_const", const="Mike Fährmann", dest="copyright") dest="copyright", action="store_const", const="Mike Fährmann")
parser.add_argument( parser.add_argument(
"-F", "--force", "-F", "--force",
action="store_const", const="w", default="x", dest="open_mode") dest="open_mode", action="store_const", const="w", default="x")
parser.add_argument( parser.add_argument(
"-M", "--no-module", "-M", "--no-module",
dest="module", action="store_false") dest="init_module", action="store_false")
parser.add_argument(
parser.add_argument("-t", "--type", metavar="TYPE") "-t", "--type",
dest="type", metavar="TYPE")
parser.add_argument( parser.add_argument(
"--manga", "--manga",
action="store_const", const="manga", dest="type") dest="type", action="store_const", const="manga")
parser.add_argument( parser.add_argument(
"--base", "--base",
action="store_const", const="base", dest="type") dest="type", action="store_const", const="base")
parser.add_argument( parser.add_argument(
"--user", "--user",
action="store_const", const="user", dest="type") dest="type", action="store_const", const="user")
parser.add_argument("category") parser.add_argument("category")
parser.add_argument("root", nargs="?") parser.add_argument("root", nargs="?")
return parser.parse_args() args = parser.parse_args()
def parse_opts(args=None):
args = parse_args(args)
opts = {
"category" : args.category,
"site_name" : args.site,
"type" : args.type,
"open_mode" : args.open_mode,
"copyright" : args.copyright,
"init_module": args.module,
}
if root := args.root: if root := args.root:
if "://" in root: if "://" in root:
@@ -375,17 +363,19 @@ def parse_opts(args=None):
if domain.startswith("www."): if domain.startswith("www."):
domain = domain[4:] domain = domain[4:]
opts["root"] = root args.root = root
opts["domain"] = domain args.domain = domain
elif args.init_module:
parser.error("'root' URL required")
else: else:
opts["root"] = opts["domain"] = "" args.domain = ""
return opts return args
def main(): def main():
opts = parse_opts() args = parse_args()
init_extractor_module(opts) init_extractor_module(args)
if __name__ == "__main__": if __name__ == "__main__":