summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/itchio.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2023-04-30 16:45:21 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2023-04-30 16:45:21 -0400
commit33d4eae5a6df8aaf6757f52ae25f514ff1211c62 (patch)
tree7ad425b022dcc1daea1c84c720a266f0134db705 /gallery_dl/extractor/itchio.py
parentf98ab7aaca3c4acbd5a793267791749740330e9c (diff)
New upstream version 1.25.3.upstream/1.25.3
Diffstat (limited to 'gallery_dl/extractor/itchio.py')
-rw-r--r--gallery_dl/extractor/itchio.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/gallery_dl/extractor/itchio.py b/gallery_dl/extractor/itchio.py
new file mode 100644
index 0000000..6034d12
--- /dev/null
+++ b/gallery_dl/extractor/itchio.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2023 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 https://itch.io/"""
+
+from .common import Extractor, Message
+from .. import text
+
+
+class ItchioGameExtractor(Extractor):
+ """Extractor for itch.io games"""
+ category = "itchio"
+ subcategory = "game"
+ root = "https://itch.io"
+ directory_fmt = ("{category}", "{user[name]}")
+ filename_fmt = "{game[title]} ({id}).{extension}"
+ archive_fmt = "{id}"
+ pattern = r"(?:https?://)?(\w+).itch\.io/([\w-]+)"
+ test = (
+ ("https://sirtartarus.itch.io/a-craft-of-mine", {
+ "pattern": r"https://\w+\.ssl\.hwcdn\.net/upload2"
+ r"/game/1983311/7723751\?",
+ "count": 1,
+ "keyword": {
+ "extension": "",
+ "filename": "7723751",
+ "game": {
+ "id": 1983311,
+ "noun": "game",
+ "title": "A Craft Of Mine",
+ "url": "https://sirtartarus.itch.io/a-craft-of-mine",
+ },
+ "user": {
+ "id": 4060052,
+ "name": "SirTartarus",
+ "url": "https://sirtartarus.itch.io",
+ },
+ },
+ }),
+ )
+
+ def __init__(self, match):
+ self.user, self.slug = match.groups()
+ Extractor.__init__(self, match)
+
+ def items(self):
+ game_url = "https://{}.itch.io/{}".format(self.user, self.slug)
+ page = self.request(game_url).text
+
+ params = {
+ "source": "view_game",
+ "as_props": "1",
+ "after_download_lightbox": "true",
+ }
+ headers = {
+ "Referer": game_url,
+ "X-Requested-With": "XMLHttpRequest",
+ "Origin": "https://{}.itch.io".format(self.user),
+ }
+ data = {
+ "csrf_token": text.unquote(self.session.cookies["itchio_token"]),
+ }
+
+ for upload_id in text.extract_iter(page, 'data-upload_id="', '"'):
+ file_url = "{}/file/{}".format(game_url, upload_id)
+ info = self.request(file_url, method="POST", params=params,
+ headers=headers, data=data).json()
+
+ game = info["lightbox"]["game"]
+ user = info["lightbox"]["user"]
+ game["url"] = game_url
+ user.pop("follow_button", None)
+ game = {"game": game, "user": user, "id": upload_id}
+
+ url = info["url"]
+ yield Message.Directory, game
+ yield Message.Url, url, text.nameext_from_url(url, game)