yield 3-tuples for Message.Directory

adapt tuples to the same length and semantics as other messages
This commit is contained in:
Mike Fährmann
2025-12-05 21:39:52 +01:00
parent 80878c1501
commit 968597a302
166 changed files with 237 additions and 237 deletions

View File

@@ -42,7 +42,7 @@ class _2chThreadExtractor(Extractor):
"title" : text.unescape(title)[:50],
}
yield Message.Directory, thread
yield Message.Directory, "", thread
for post in posts:
if files := post.get("files"):
post["post_name"] = post["name"]

View File

@@ -31,7 +31,7 @@ class _2chanThreadExtractor(Extractor):
f"/{self.board}/res/{self.thread}.htm")
page = self.request(url).text
data = self.metadata(page)
yield Message.Directory, data
yield Message.Directory, "", data
for post in self.posts(page):
if "filename" not in post:
continue

View File

@@ -31,7 +31,7 @@ class _2chenThreadExtractor(Extractor):
url = f"{self.root}/{self.board}/{self.thread}"
page = self.request(url, encoding="utf-8", notfound="thread").text
data = self.metadata(page)
yield Message.Directory, data
yield Message.Directory, "", data
for post in self.posts(page):

View File

@@ -29,7 +29,7 @@ class _35photoExtractor(Extractor):
url = photo["url"]
if first:
first = False
yield Message.Directory, photo
yield Message.Directory, "", photo
yield Message.Url, url, text.nameext_from_url(url, photo)
def metadata(self):

View File

@@ -38,7 +38,7 @@ class _4archiveThreadExtractor(Extractor):
for post in posts:
post.update(data)
post["time"] = int(dt.to_ts(post["date"]))
yield Message.Directory, post
yield Message.Directory, "", post
if "url" in post:
yield Message.Url, post["url"], text.nameext_from_url(
post["filename"], post)

View File

@@ -38,7 +38,7 @@ class _4chanThreadExtractor(Extractor):
"title" : text.unescape(title)[:50],
}
yield Message.Directory, data
yield Message.Directory, "", data
for post in posts:
if "filename" in post:
post.update(data)

View File

@@ -40,7 +40,7 @@ class _4chanarchivesThreadExtractor(Extractor):
for post in posts:
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
if "url" in post:
yield Message.Url, post["url"], post

View File

@@ -31,7 +31,7 @@ class _500pxExtractor(Extractor):
photo["extension"] = photo["image_format"]
if data:
photo.update(data)
yield Message.Directory, photo
yield Message.Directory, "", photo
yield Message.Url, url, photo
def metadata(self):

View File

@@ -91,7 +91,7 @@ class _8chanThreadExtractor(_8chanExtractor):
# download files
posts = thread.pop("posts", ())
yield Message.Directory, thread
yield Message.Directory, "", thread
for post in itertools.chain((thread,), posts):
files = post.pop("files", ())
if not files:

View File

@@ -40,7 +40,7 @@ class _8musesAlbumExtractor(Extractor):
if images := data.get("pictures"):
count = len(images)
album = self._make_album(data["album"])
yield Message.Directory, {"album": album, "count": count}
yield Message.Directory, "", {"album": album, "count": count}
for num, image in enumerate(images, 1):
url = self.root + "/image/fl/" + image["publicUri"]
img = {

View File

@@ -220,7 +220,7 @@ class Ao3WorkExtractor(Ao3Extractor):
else:
data["series"] = None
yield Message.Directory, data
yield Message.Directory, "", data
for fmt in self.formats:
try:
url = text.urljoin(self.root, fmts[fmt])

View File

@@ -54,7 +54,7 @@ class ArcalivePostExtractor(ArcaliveExtractor):
f"{self.root}/b/{post['boardSlug']}/{post['id']}"
post["_http_headers"] = {"Referer": post_url + "?p=1"}
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
post.update(file)
url = file["url"]

View File

@@ -47,7 +47,7 @@ class ArtstationExtractor(Extractor):
asset.update(data)
adict = asset["asset"]
asset["num"] = num
yield Message.Directory, asset
yield Message.Directory, "", asset
if adict["has_embedded_player"]:
if url := self._extract_embed(asset):
@@ -333,7 +333,7 @@ class ArtstationChallengeExtractor(ArtstationExtractor):
update_url = f"{self.root}/contests/submission_updates.json"
challenge = self.request_json(challenge_url)
yield Message.Directory, {"challenge": challenge}
yield Message.Directory, "", {"challenge": challenge}
params = {"sorting": self.sorting}
for submission in self._pagination(submission_url, params):

View File

@@ -63,7 +63,7 @@ class AryionExtractor(Extractor):
if post := self._parse_post(post_id):
if data:
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, post["url"], post
elif post is False and self.recursive:
base = self.root + "/g4/view/"

View File

@@ -63,7 +63,7 @@ class AudiochanExtractor(Extractor):
post["_http_segmented"] = 600000
url = file["stream_url"]
yield Message.Directory, post
yield Message.Directory, "", post
text.nameext_from_name(file["filename"], post)
yield Message.Url, url, post

View File

@@ -109,7 +109,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
imgs = self.get_images(data)
data["count"] = len(imgs)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], (url, module) in enumerate(imgs, 1):
data["module"] = module
data["extension"] = (module.get("extension") or

View File

@@ -46,7 +46,7 @@ class BellazonExtractor(Extractor):
data = {"post": post}
post["count"] = data["count"] = len(urls)
yield Message.Directory, data
yield Message.Directory, "", data
data["num"] = data["num_internal"] = data["num_external"] = 0
for info, url, url_img in urls:
url = text.unescape(url or url_img)

View File

@@ -74,7 +74,7 @@ class BilibiliArticleExtractor(BilibiliExtractor):
pass
article["count"] = len(pics)
yield Message.Directory, article
yield Message.Directory, "", article
for article["num"], pic in enumerate(pics, 1):
url = pic["url"]
article.update(pic)

View File

@@ -72,7 +72,7 @@ class BloggerExtractor(BaseExtractor):
data = {"blog": blog, "post": post}
if metadata:
data.update(metadata)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], url in enumerate(files, 1):
data["url"] = url

View File

@@ -60,7 +60,7 @@ class BlueskyExtractor(Extractor):
self._prepare(post)
files = self._extract_files(post)
yield Message.Directory, post
yield Message.Directory, "", post
if files:
did = post["author"]["did"]
base = (f"{self.api.service_endpoint(did)}/xrpc"
@@ -336,7 +336,7 @@ class BlueskyInfoExtractor(BlueskyExtractor):
def items(self):
self._metadata_user = True
self.api._did_from_actor(self.groups[0])
return iter(((Message.Directory, self._user),))
return iter(((Message.Directory, "", self._user),))
class BlueskyAvatarExtractor(BlueskyExtractor):

View File

@@ -57,7 +57,7 @@ class BooruExtractor(BaseExtractor):
post.update(data)
self._prepare(post)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, url, post
def skip(self, num):

View File

@@ -63,7 +63,7 @@ class BoostyExtractor(Extractor):
"count": len(files),
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
data["file"] = file
url = file["url"]
@@ -260,7 +260,7 @@ class BoostyDirectMessagesExtractor(BoostyExtractor):
"count": len(files),
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
data["file"] = file
url = file["url"]

View File

@@ -83,7 +83,7 @@ class BoothItemExtractor(BoothExtractor):
item["count"] = 0
shop["uuid"] = util.NONE
yield Message.Directory, item
yield Message.Directory, "", item
for num, file in enumerate(files, 1):
url = file["url"]
file["num"] = num

View File

@@ -52,5 +52,5 @@ class CatboxFileExtractor(Extractor):
def items(self):
url = text.ensure_http_scheme(self.url)
file = text.nameext_from_url(url, {"url": url})
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, url, file

View File

@@ -32,7 +32,7 @@ class CfakeExtractor(Extractor):
kwdict["type_name"] = text.unquote(type_name).replace("_", " ")
kwdict["sub_id"] = text.parse_int(sub_id)
kwdict["page"] = pnum = text.parse_int(pnum, 1)
yield Message.Directory, {}
yield Message.Directory, "", {}
base = f"{self.root}/images/{type}/{type_name}/{type_id}"
if sub_id:

View File

@@ -84,7 +84,7 @@ class CheveretoImageExtractor(CheveretoExtractor):
}
text.nameext_from_url(file["url"], file)
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, file["url"], file
@@ -126,7 +126,7 @@ class CheveretoVideoExtractor(CheveretoExtractor):
pass
text.nameext_from_url(file["url"], file)
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, file["url"], file

View File

@@ -70,7 +70,7 @@ class CienArticleExtractor(CienExtractor):
except Exception:
pass
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
post.update(file)
if "extension" not in file:

View File

@@ -96,7 +96,7 @@ class CivitaiExtractor(Extractor):
data["model"], data["version"] = \
self._extract_meta_version(post)
yield Message.Directory, data
yield Message.Directory, "", data
for file in self._image_results(images):
file.update(data)
yield Message.Url, file["url"], file
@@ -131,7 +131,7 @@ class CivitaiExtractor(Extractor):
data["extension"] = (
self._video_ext if file.get("type") == "video" else
self._image_ext)
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, data
return
@@ -292,7 +292,7 @@ class CivitaiModelExtractor(CivitaiExtractor):
"user" : user,
}
yield Message.Directory, data
yield Message.Directory, "", data
for file in self._extract_files(model, version, user):
file.update(data)
yield Message.Url, file["url"], file
@@ -599,7 +599,7 @@ class CivitaiGeneratedExtractor(CivitaiExtractor):
for gen in self.api.orchestrator_queryGeneratedImages():
gen["date"] = self.parse_datetime_iso(gen["createdAt"])
yield Message.Directory, gen
yield Message.Directory, "", gen
for step in gen.pop("steps", ()):
for image in step.pop("images", ()):
data = {"file": image, **step, **gen}

View File

@@ -800,7 +800,7 @@ class GalleryExtractor(Extractor):
enum = util.enumerate_reversed
images = enum(imgs, 1)
yield Message.Directory, data
yield Message.Directory, "", data
enum_key = self.enum
if assets:

View File

@@ -24,7 +24,7 @@ class CyberdropAlbumExtractor(lolisafe.LolisafeAlbumExtractor):
def items(self):
files, data = self.fetch_album(self.album_id)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
file.update(data)
text.nameext_from_url(file["name"], file)

View File

@@ -161,5 +161,5 @@ class CyberfileFileExtractor(CyberfileExtractor):
file["file_url"] = url = extr("openUrl('", "'")
text.nameext_from_url(file["name"] or url, file)
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, url, file

View File

@@ -63,7 +63,7 @@ class DanbooruExtractor(BaseExtractor):
except KeyError:
if self.external and post["source"]:
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Queue, post["source"], post
continue
@@ -106,7 +106,7 @@ class DanbooruExtractor(BaseExtractor):
url = self.root + url
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, url, post
def items_artists(self):

View File

@@ -82,7 +82,7 @@ class DesktopographyEntryExtractor(DesktopographyExtractor):
page = self.request(url).text
entry_data = {"entry": self.entry}
yield Message.Directory, entry_data
yield Message.Directory, "", entry_data
for image_data in text.extract_iter(
page,

View File

@@ -154,7 +154,7 @@ class DeviantartExtractor(Extractor):
deviation.update(data)
self.prepare(deviation)
yield Message.Directory, deviation
yield Message.Directory, "", deviation
if "content" in deviation:
content = self._extract_content(deviation)

View File

@@ -40,5 +40,5 @@ class DirectlinkExtractor(Extractor):
data["_http_headers"] = {
"Referer": self.url.encode("latin-1", "ignore")}
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, self.url, data

View File

@@ -120,7 +120,7 @@ class DiscordExtractor(Extractor):
text.nameext_from_url(file["url"], file)
file["num"] = num
yield Message.Directory, message_metadata
yield Message.Directory, "", message_metadata
for file in message_metadata["files"]:
message_metadata_file = message_metadata.copy()

View File

@@ -105,7 +105,7 @@ class DynastyscansSearchExtractor(DynastyscansBase, Extractor):
self.query = match[1] or ""
def items(self):
yield Message.Directory, {}
yield Message.Directory, "", {}
for image_id in self.images():
image = self._parse_image_page(image_id)
url = image["url"]

View File

@@ -54,7 +54,7 @@ class E621Extractor(danbooru.DanbooruExtractor):
post["date"] = self.parse_datetime_iso(post["created_at"])
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, file["url"], post
def items_artists(self):

View File

@@ -110,7 +110,7 @@ class EromeAlbumExtractor(EromeExtractor):
"_http_headers": {"Referer": url},
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], url in enumerate(urls, 1):
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -64,7 +64,7 @@ class EveriaPostExtractor(EveriaExtractor):
"count": len(urls),
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], url in enumerate(urls, 1):
url = text.unquote(url)
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -193,7 +193,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
self.data = data = self.get_metadata(gpage)
self.count = text.parse_int(data["filecount"])
yield Message.Directory, data
yield Message.Directory, "", data
images = itertools.chain(
(self.image_from_page(ipage),), self.images_from_api())
@@ -226,7 +226,7 @@ class ExhentaiGalleryExtractor(ExhentaiExtractor):
yield Message.Queue, url, data
def _items_metadata(self):
yield Message.Directory, self.metadata_from_api()
yield Message.Directory, "", self.metadata_from_api()
def get_metadata(self, page):
"""Extract gallery metadata"""

View File

@@ -292,7 +292,7 @@ class FacebookExtractor(Extractor):
else:
retries = 0
photo.update(set_data)
yield Message.Directory, photo
yield Message.Directory, "", photo
yield Message.Url, photo["url"], photo
if not photo["next_photo_id"]:
@@ -408,7 +408,7 @@ class FacebookPhotoExtractor(FacebookExtractor):
directory = self.parse_set_page(set_page)
yield Message.Directory, directory
yield Message.Directory, "", directory
yield Message.Url, photo["url"], photo
if self.author_followups:
@@ -467,7 +467,7 @@ class FacebookVideoExtractor(FacebookExtractor):
if "url" not in video:
return
yield Message.Directory, video
yield Message.Directory, "", video
if self.videos == "ytdl":
yield Message.Url, "ytdl:" + video_url, video
@@ -486,7 +486,7 @@ class FacebookInfoExtractor(FacebookExtractor):
def items(self):
user = self._extract_profile(self.groups[0])
return iter(((Message.Directory, user),))
return iter(((Message.Directory, "", user),))
class FacebookAlbumsExtractor(FacebookExtractor):
@@ -558,7 +558,7 @@ class FacebookAvatarExtractor(FacebookExtractor):
set_page = self.request(set_url).text
directory = self.parse_set_page(set_page)
yield Message.Directory, directory
yield Message.Directory, "", directory
yield Message.Url, avatar["url"], avatar

View File

@@ -76,7 +76,7 @@ class FanboxExtractor(Extractor):
item["id"], exc.__class__.__name__, exc)
content_body, post = self._extract_post(item)
yield Message.Directory, post
yield Message.Directory, "", post
yield from self._get_urls_from_post(content_body, post)
def posts(self):

View File

@@ -37,7 +37,7 @@ class FanslyExtractor(Extractor):
post["count"] = len(files)
post["date"] = self.parse_timestamp(post["createdAt"])
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
post.update(file)
url = file["url"]

View File

@@ -48,7 +48,7 @@ class FantiaExtractor(Extractor):
for content in contents:
files = self._process_content(post, content)
yield Message.Directory, post
yield Message.Directory, "", post
if content["visible_status"] != "visible":
self.log.warning(

View File

@@ -34,7 +34,7 @@ class FapachiPostExtractor(Extractor):
page = self.request(f"{self.root}/{self.user}/media/{self.id}").text
url = self.root + text.extract(
page, 'data-src="', '"', page.index('class="media-img'))[0]
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -44,7 +44,7 @@ class FapelloPostExtractor(Extractor):
}
url = text.extr(page, 'src="', '"').replace(
".md", "").replace(".th", "")
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -45,7 +45,7 @@ class FlickrExtractor(Extractor):
else:
photo.update(data)
url = self._file_url(photo)
yield Message.Directory, photo
yield Message.Directory, "", photo
yield Message.Url, url, text.nameext_from_url(url, photo)
def metadata(self):
@@ -114,7 +114,7 @@ class FlickrImageExtractor(FlickrExtractor):
location[key] = value["_content"]
url = self._file_url(photo)
yield Message.Directory, photo
yield Message.Directory, "", photo
yield Message.Url, url, text.nameext_from_url(url, photo)

View File

@@ -31,7 +31,7 @@ class FoolfuukaExtractor(BaseExtractor):
self.fixup_redirect = False
def items(self):
yield Message.Directory, self.metadata()
yield Message.Directory, "", self.metadata()
for post in self.posts():
media = post["media"]
if not media:

View File

@@ -58,7 +58,7 @@ class FoolslideChapterExtractor(FoolslideExtractor):
data["count"] = len(imgs)
data["chapter_id"] = text.parse_int(imgs[0]["chapter_id"])
yield Message.Directory, data
yield Message.Directory, "", data
enum = util.enumerate_reversed if self.config(
"page-reverse") else enumerate
for data["page"], image in enum(imgs, 1):

View File

@@ -54,7 +54,7 @@ class FuraffinityExtractor(Extractor):
if post := self._parse_post(post_id):
if metadata:
post.update(metadata)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, post["url"], post
if self.external:

View File

@@ -75,7 +75,7 @@ class GenericExtractor(Extractor):
pass
images = enumerate(imgs, 1)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], (url, imgdata) in images:
if imgdata:

View File

@@ -56,7 +56,7 @@ class GirlsreleasedSetExtractor(GirlsreleasedExtractor):
"count": len(json["images"]),
"url": "https://girlsreleased.com/set/" + json["id"],
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], image in enumerate(json["images"], 1):
text.nameext_from_url(image[5], data)
yield Message.Queue, image[3], data

View File

@@ -80,7 +80,7 @@ class GirlswithmusclePostExtractor(GirlswithmuscleExtractor):
metadata["type"] = "video"
text.nameext_from_url(url, metadata)
yield Message.Directory, metadata
yield Message.Directory, "", metadata
yield Message.Url, url, metadata
def metadata(self, page):

View File

@@ -39,7 +39,7 @@ class GofileFolderExtractor(Extractor):
self._get_website_token())
folder = self._get_content(self.content_id, password)
yield Message.Directory, folder
yield Message.Directory, "", folder
try:
contents = folder.pop("children")

View File

@@ -56,7 +56,7 @@ class HatenablogExtractor(Extractor):
"title": title,
"count": len(images),
}
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], url in enumerate(images, 1):
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -43,7 +43,7 @@ class HentaifoundryExtractor(Extractor):
for post_url in util.advance(self.posts(), self.start_post):
image = self._parse_post(post_url)
image.update(data)
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, image["src"], image
def skip(self, num):
@@ -324,7 +324,7 @@ class HentaifoundryImageExtractor(HentaifoundryExtractor):
f"/{self.index}/?enterAgree=1")
image = self._parse_post(post_url)
image["user"] = self.user
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, image["src"], image
@@ -339,7 +339,7 @@ class HentaifoundryStoriesExtractor(HentaifoundryExtractor):
self._init_site_filters()
for story_html in util.advance(self.stories(), self.start_post):
story = self._parse_story(story_html)
yield Message.Directory, story
yield Message.Directory, "", story
yield Message.Url, story["src"], story
def stories(self):
@@ -364,5 +364,5 @@ class HentaifoundryStoryExtractor(HentaifoundryExtractor):
story_url = (f"{self.root}/stories/user/{self.user}"
f"/{self.index}/x?enterAgree=1")
story = self._parse_story(self.request(story_url).text)
yield Message.Directory, story
yield Message.Directory, "", story
yield Message.Url, story["src"], story

View File

@@ -30,7 +30,7 @@ class HotleakExtractor(Extractor):
.replace("_thumb.", ".")
)
post["_http_expected_status"] = (404,)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, post["url"], post
def posts(self):

View File

@@ -56,7 +56,7 @@ class ImagebamGalleryExtractor(ImagebamExtractor):
data["count"] = len(images)
data["gallery_key"] = self.path.rpartition("/")[2]
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], path in enumerate(images, 1):
image = self._parse_image_page(path)
image.update(data)
@@ -94,5 +94,5 @@ class ImagebamImageExtractor(ImagebamExtractor):
path = ("/view/" if path[10] == "M" else "/image/") + path[10:]
image = self._parse_image_page(path)
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, image["url"], image

View File

@@ -51,7 +51,7 @@ class ImagefapGalleryExtractor(ImagefapExtractor):
url = f"{self.root}/gallery/{self.gid}"
page = self.request(url).text
data = self.get_job_metadata(page)
yield Message.Directory, data
yield Message.Directory, "", data
for url, image in self.get_images():
data.update(image)
yield Message.Url, url, data
@@ -119,7 +119,7 @@ class ImagefapImageExtractor(ImagefapExtractor):
def items(self):
url, data = self.get_image()
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, data
def get_image(self):

View File

@@ -74,7 +74,7 @@ class ImagehostImageExtractor(Extractor):
if self._validate is not None:
data["_http_validate"] = self._validate
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, data
def get_info(self, page):

View File

@@ -30,7 +30,7 @@ class ImgbbExtractor(Extractor):
for image in self.posts():
url = image["url"]
text.nameext_from_url(url, image)
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, url, image
def login(self):

View File

@@ -19,7 +19,7 @@ class ImgboxExtractor(Extractor):
def items(self):
data = self.get_job_metadata()
yield Message.Directory, data
yield Message.Directory, "", data
for image_key in self.get_image_keys():
imgpage = self.request(self.root + "/" + image_key).text

View File

@@ -54,7 +54,7 @@ class ImgpilePostExtractor(ImgpileExtractor):
data = {"post": post}
data["count"] = post["count"] = len(files)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
data.update(file)
url = file["url"]

View File

@@ -83,7 +83,7 @@ class ImgurImageExtractor(ImgurExtractor):
image.update(image["media"][0])
del image["media"]
url = self._prepare(image)
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, url, image
@@ -119,7 +119,7 @@ class ImgurAlbumExtractor(ImgurExtractor):
image["num"] = num
image["count"] = count
image["album"] = album
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, url, image

View File

@@ -48,7 +48,7 @@ class InkbunnyExtractor(Extractor):
del post["keywords"]
del post["files"]
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
post.update(file)
post["deleted"] = (file["deleted"] == "t")

View File

@@ -88,7 +88,7 @@ class InstagramExtractor(Extractor):
files = post.pop("_files")
post["count"] = len(files)
yield Message.Directory, post
yield Message.Directory, "", post
if "date" in post:
del post["date"]
@@ -759,7 +759,7 @@ class InstagramInfoExtractor(InstagramExtractor):
else:
user = self.api.user_by_name(screen_name)
return iter(((Message.Directory, user),))
return iter(((Message.Directory, "", user),))
class InstagramAvatarExtractor(InstagramExtractor):

View File

@@ -51,7 +51,7 @@ class ItakuExtractor(Extractor):
else:
url = image["image"]
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, url, text.nameext_from_url(url, image)
return
@@ -62,7 +62,7 @@ class ItakuExtractor(Extractor):
post["date"] = self.parse_datetime_iso(post["date_added"])
post["tags"] = [t["name"] for t in post["tags"]]
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], image in enumerate(images, 1):
post["file"] = image
image["date"] = self.parse_datetime_iso(

View File

@@ -57,5 +57,5 @@ class ItchioGameExtractor(Extractor):
game = {"game": game, "user": user, "id": upload_id}
url = info["url"]
yield Message.Directory, game
yield Message.Directory, "", game
yield Message.Url, url, text.nameext_from_url(url, game)

View File

@@ -47,7 +47,7 @@ class IwaraExtractor(Extractor):
group_info["type"] = "image"
group_info["count"] = len(files)
yield Message.Directory, group_info
yield Message.Directory, "", group_info
for num, file in enumerate(files, 1):
file_info = self.extract_media_info(file, None)
file_id = file_info["file_id"]
@@ -78,7 +78,7 @@ class IwaraExtractor(Extractor):
video["id"], exc.__class__.__name__, exc)
continue
yield Message.Directory, info
yield Message.Directory, "", info
yield Message.Url, f"https:{download_url}", info
def items_user(self, users, key=None):

View File

@@ -39,7 +39,7 @@ class JschanThreadExtractor(JschanExtractor):
thread["threadId"] = thread["postId"]
posts = thread.pop("replies", ())
yield Message.Directory, thread
yield Message.Directory, "", thread
for post in itertools.chain((thread,), posts):
if files := post.pop("files", ()):
thread.update(post)

View File

@@ -33,7 +33,7 @@ class KabeuchiUserExtractor(Extractor):
continue
post["date"] = self.parse_datetime_iso(post["created_at"])
yield Message.Directory, post
yield Message.Directory, "", post
for key in keys:
name = post[key]

View File

@@ -34,7 +34,7 @@ class KeenspotComicExtractor(Extractor):
def items(self):
data = {"comic": self.comic}
yield Message.Directory, data
yield Message.Directory, "", data
with self.request(self.root + "/") as response:
if response.history:

View File

@@ -182,7 +182,7 @@ class KemonoExtractor(Extractor):
files.append(file)
post["count"] = len(files)
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
if "id" in file:
del file["id"]
@@ -440,7 +440,7 @@ class KemonoDiscordExtractor(KemonoExtractor):
post.update(data)
post["date"] = self._parse_datetime(post["published"])
post["count"] = len(files)
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
post["hash"] = file["hash"]

View File

@@ -35,7 +35,7 @@ class KhinsiderSoundtrackExtractor(AsynchronousMixin, Extractor):
raise exception.NotFoundError("soundtrack")
data = self.metadata(page)
yield Message.Directory, data
yield Message.Directory, "", data
if self.config("covers", False):
for num, url in enumerate(self._extract_covers(page), 1):

View File

@@ -37,7 +37,7 @@ class LeakgalleryExtractor(Extractor):
media["url"] = url = f"https://cdn.leakgallery.com/{path}"
text.nameext_from_url(url, media)
yield Message.Directory, media
yield Message.Directory, "", media
yield Message.Url, url, media
def _pagination(self, type, base, params=None, creator=None, pnum=1):
@@ -134,7 +134,7 @@ class LeakgalleryPostExtractor(LeakgalleryExtractor):
"url": url,
}
text.nameext_from_url(url, data)
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, url, data
except Exception as exc:
self.log.error("Failed to extract post page %s/%s: %s",

View File

@@ -123,5 +123,5 @@ class LensdumpImageExtractor(LensdumpBase, Extractor):
}
text.nameext_from_url(data["url"], data)
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, data["url"], data

View File

@@ -36,7 +36,7 @@ class LexicaSearchExtractor(Extractor):
image["filename"] = image["id"]
image["extension"] = "jpg"
image["search_tags"] = tags
yield Message.Directory, image
yield Message.Directory, "", image
yield Message.Url, base + image["id"], image
def posts(self):

View File

@@ -35,7 +35,7 @@ class LightroomGalleryExtractor(Extractor):
images = self.images(album)
for img in images:
url = img["url"]
yield Message.Directory, img
yield Message.Directory, "", img
yield Message.Url, url, text.nameext_from_url(url, img)
def metadata(self, album):

View File

@@ -27,7 +27,7 @@ class LivedoorExtractor(Extractor):
def items(self):
for post in self.posts():
if images := self._images(post):
yield Message.Directory, {"post": post}
yield Message.Directory, "", {"post": post}
for image in images:
yield Message.Url, image["url"], image

View File

@@ -63,7 +63,7 @@ class LofterExtractor(Extractor):
post["id"], post_type)
post["count"] = len(image_urls)
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], url in enumerate(image_urls, 1):
yield Message.Url, url, text.nameext_from_url(url, post)

View File

@@ -42,7 +42,7 @@ class LolisafeAlbumExtractor(LolisafeExtractor):
def items(self):
files, data = self.fetch_album(self.album_id)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
url = file["file"]
file.update(data)

View File

@@ -58,7 +58,7 @@ class LusciousAlbumExtractor(LusciousExtractor):
def items(self):
album = self.metadata()
yield Message.Directory, {"album": album}
yield Message.Directory, "", {"album": album}
for num, image in enumerate(self.images(), 1):
image["num"] = num
image["album"] = album

View File

@@ -48,7 +48,7 @@ class LynxchanThreadExtractor(LynxchanExtractor):
thread["postId"] = thread["threadId"]
posts = thread.pop("posts", ())
yield Message.Directory, thread
yield Message.Directory, "", thread
for post in itertools.chain((thread,), posts):
if files := post.pop("files", ()):
thread.update(post)

View File

@@ -88,5 +88,5 @@ class MadokamiMangaExtractor(MadokamiExtractor):
url = f"{self.root}{ch['path']}"
text.nameext_from_url(url, ch)
yield Message.Directory, ch
yield Message.Directory, "", ch
yield Message.Url, url, ch

View File

@@ -95,7 +95,7 @@ class MangadexCoversExtractor(MangadexExtractor):
name = data["cover"]
text.nameext_from_url(name, data)
data["cover_id"] = data["filename"]
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, f"{base}{name}", data
def _transform_cover(self, cover):
@@ -134,7 +134,7 @@ class MangadexChapterExtractor(MangadexExtractor):
f"available on MangaDex and can instead be read on the "
f"official publisher's website at {data['_external_url']}.")
yield Message.Directory, data
yield Message.Directory, "", data
if self.config("data-saver", False):
path = "data-saver"

View File

@@ -91,7 +91,7 @@ class MangoxoAlbumExtractor(MangoxoExtractor):
data = self.metadata(page)
imgs = self.images(url, page)
yield Message.Directory, data
yield Message.Directory, "", data
data["extension"] = None
for data["num"], path in enumerate(imgs, 1):

View File

@@ -66,7 +66,7 @@ class MastodonExtractor(BaseExtractor):
status["tags"] = [tag["name"] for tag in status["tags"]]
status["date"] = self.parse_datetime_iso(status["created_at"][:19])
yield Message.Directory, status
yield Message.Directory, "", status
for status["num"], media in enumerate(attachments, 1):
status["media"] = media
url = media["url"]

View File

@@ -20,7 +20,8 @@ class Message():
- Message.Directory:
- Sets the target directory for all following images
- 2nd element is a dictionary containing general metadata
- 2nd element is unused
- 3rd element is a dictionary containing general metadata
- Message.Url:
- Image URL and its metadata

View File

@@ -46,7 +46,7 @@ class MisskeyExtractor(BaseExtractor):
note["count"] = len(files)
note["date"] = self.parse_datetime_iso(note["createdAt"])
yield Message.Directory, note
yield Message.Directory, "", note
for note["num"], file in enumerate(files, 1):
file["date"] = self.parse_datetime_iso(file["createdAt"])
note["file"] = file
@@ -134,7 +134,7 @@ class MisskeyInfoExtractor(MisskeyExtractor):
def items(self):
user = self.api.users_show(self.groups[-1])
return iter(((Message.Directory, user),))
return iter(((Message.Directory, "", user),))
class MisskeyAvatarExtractor(MisskeyExtractor):

View File

@@ -160,7 +160,7 @@ class MotherlessMediaExtractor(MotherlessExtractor):
def items(self):
file = self._extract_media(self.groups[0])
url = file["url"]
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, url, text.nameext_from_url(url, file)
@@ -197,7 +197,7 @@ class MotherlessGalleryExtractor(MotherlessExtractor):
file["num"] = num
file["thumbnail"] = thumbnail
url = file["url"]
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, url, text.nameext_from_url(url, file)
@@ -235,5 +235,5 @@ class MotherlessGroupExtractor(MotherlessExtractor):
file["uploader"] = uploader
file["group"] = file["group_id"]
url = file["url"]
yield Message.Directory, file
yield Message.Directory, "", file
yield Message.Url, url, text.nameext_from_url(url, file)

View File

@@ -49,7 +49,7 @@ class MyportfolioGalleryExtractor(Extractor):
data = self.metadata(page)
imgs = self.images(page)
data["count"] = len(imgs)
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], url in enumerate(imgs, 1):
yield Message.Url, url, text.nameext_from_url(url, data)

View File

@@ -34,7 +34,7 @@ class NaverChzzkExtractor(Extractor):
data["date"] = self.parse_datetime(
data["createdDate"], "%Y%m%d%H%M%S")
yield Message.Directory, data
yield Message.Directory, "", data
for data["num"], file in enumerate(files, 1):
if extra := file.get("extraJson"):
file.update(util.json_loads(extra))

View File

@@ -42,7 +42,7 @@ class NekohousePostExtractor(NekohouseExtractor):
post["post_id"] = post_id
post["count"] = len(files)
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], file in enumerate(files, 1):
url = file["url"]
text.nameext_from_url(url, file)

View File

@@ -64,7 +64,7 @@ class NewgroundsExtractor(Extractor):
if url:
if metadata:
post.update(metadata)
yield Message.Directory, post
yield Message.Directory, "", post
post["num"] = 0
yield Message.Url, url, text.nameext_from_url(url, post)

View File

@@ -59,7 +59,7 @@ class NijieExtractor(AsynchronousMixin, BaseExtractor):
urls = self._extract_images(image_id, page)
data["count"] = len(urls)
yield Message.Directory, data
yield Message.Directory, "", data
for num, url in enumerate(urls):
image = text.nameext_from_url(url, {
"num": num,

View File

@@ -97,7 +97,7 @@ class NitterExtractor(BaseExtractor):
files = ()
tweet["count"] = len(files)
yield Message.Directory, tweet
yield Message.Directory, "", tweet
for tweet["num"], file in enumerate(files, 1):
url = file["url"]
file.update(tweet)

View File

@@ -60,7 +60,7 @@ class NozomiExtractor(Extractor):
if key in post:
del post[key]
yield Message.Directory, post
yield Message.Directory, "", post
for post["num"], image in enumerate(images, 1):
post["filename"] = post["dataid"] = did = image["dataid"]
post["is_video"] = video = \

View File

@@ -67,5 +67,5 @@ class NudostarImageExtractor(NudostarExtractor):
data["num"] = text.parse_int(self.groups[2])
data["url"] = img_url
yield Message.Directory, data
yield Message.Directory, "", data
yield Message.Url, img_url, data

View File

@@ -31,7 +31,7 @@ class PahealExtractor(Extractor):
post["width"] = text.parse_int(post["width"])
post["height"] = text.parse_int(post["height"])
post.update(data)
yield Message.Directory, post
yield Message.Directory, "", post
yield Message.Url, post["file_url"], post
def get_metadata(self):

Some files were not shown because too many files have changed in this diff Show More