# -*- coding: utf-8 -*- # Copyright 2023-2025 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 # published by the Free Software Foundation. """Extractors for Shimmie2 instances""" from .common import BaseExtractor, Message from .. import text class Shimmie2Extractor(BaseExtractor): """Base class for shimmie2 extractors""" basecategory = "shimmie2" filename_fmt = "{category}_{id}{md5:?_//}.{extension}" archive_fmt = "{id}" def _init(self): if cookies := self.config_instance("cookies"): domain = self.root.rpartition("/")[2] self.cookies_update_dict(cookies, domain=domain) if file_url := self.config_instance("file_url"): self.file_url_fmt = file_url if quote := self.config_instance("quote"): self._quote_type = lambda _: quote def items(self): data = self.metadata() for post in self.posts(): post["id"] = text.parse_int(post["id"]) post["width"] = text.parse_int(post["width"]) post["height"] = text.parse_int(post["height"]) post["tags"] = text.unquote(post["tags"]) post.update(data) url = post["file_url"] if "/index.php?" in url: post["filename"], _, post["extension"] = \ url.rpartition("/")[2].rpartition(".") else: text.nameext_from_url(url, post) yield Message.Directory, "", post yield Message.Url, url, post def metadata(self): """Return general metadata""" return () def posts(self): """Return an iterable containing data of all relevant posts""" return () def _quote_type(self, page): """Return quoting character used in 'page' (' or ")""" try: return page[page.index("").partition( " ")[0].strip("\"'"), "size" : 0, } if not post["md5"]: post["md5"] = text.extr(post["file_url"], "/_images/", "/") return (post,)