summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/seiga.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2024-06-06 02:40:15 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2024-06-06 02:40:15 -0400
commit1c28712d865e30ed752988ba0b6944882250b665 (patch)
treee5d5083a418f5c19616cb940c090c2dfb646d3cb /gallery_dl/extractor/seiga.py
parent6e662211019a89caec44de8a57c675872b0b5498 (diff)
New upstream version 1.27.0.upstream/1.27.0
Diffstat (limited to 'gallery_dl/extractor/seiga.py')
-rw-r--r--gallery_dl/extractor/seiga.py58
1 files changed, 56 insertions, 2 deletions
diff --git a/gallery_dl/extractor/seiga.py b/gallery_dl/extractor/seiga.py
index edfe1dc..23ba340 100644
--- a/gallery_dl/extractor/seiga.py
+++ b/gallery_dl/extractor/seiga.py
@@ -10,6 +10,7 @@
from .common import Extractor, Message
from .. import text, util, exception
+from ..cache import cache
class SeigaExtractor(Extractor):
@@ -17,6 +18,7 @@ class SeigaExtractor(Extractor):
category = "seiga"
archive_fmt = "{image_id}"
cookies_domain = ".nicovideo.jp"
+ cookies_names = ("user_session",)
root = "https://seiga.nicovideo.jp"
def __init__(self, match):
@@ -24,8 +26,7 @@ class SeigaExtractor(Extractor):
self.start_image = 0
def items(self):
- if not self.cookies_check(("user_session",)):
- raise exception.StopExtraction("'user_session' cookie required")
+ self.login()
images = iter(self.get_images())
data = next(images)
@@ -50,6 +51,59 @@ class SeigaExtractor(Extractor):
"HTTP redirect to login page (%s)", location.partition("?")[0])
return location.replace("/o/", "/priv/", 1)
+ def login(self):
+ if self.cookies_check(self.cookies_names):
+ return
+
+ username, password = self._get_auth_info()
+ if username:
+ return self.cookies_update(self._login_impl(username, password))
+
+ raise exception.AuthorizationError(
+ "username & password or 'user_session' cookie required")
+
+ @cache(maxage=365*86400, keyarg=1)
+ def _login_impl(self, username, password):
+ self.log.info("Logging in as %s", username)
+
+ root = "https://account.nicovideo.jp"
+ response = self.request(root + "/login?site=seiga")
+ page = response.text
+
+ data = {
+ "mail_tel": username,
+ "password": password,
+ }
+ url = root + text.unescape(text.extr(page, '<form action="', '"'))
+ response = self.request(url, method="POST", data=data)
+
+ if "message=cant_login" in response.url:
+ raise exception.AuthenticationError()
+
+ if "/mfa" in response.url:
+ page = response.text
+ email = text.extr(page, 'class="userAccount">', "<")
+ code = self.input("Email Confirmation Code ({}): ".format(email))
+
+ data = {
+ "otp": code,
+ "loginBtn": "Login",
+ "device_name": "gdl",
+ }
+ url = root + text.unescape(text.extr(page, '<form action="', '"'))
+ response = self.request(url, method="POST", data=data)
+
+ if not response.history and \
+ b"Confirmation code is incorrect" in response.content:
+ raise exception.AuthenticationError(
+ "Incorrect Confirmation Code")
+
+ return {
+ cookie.name: cookie.value
+ for cookie in self.cookies
+ if cookie.expires and cookie.domain == self.cookies_domain
+ }
+
class SeigaUserExtractor(SeigaExtractor):
"""Extractor for images of a user from seiga.nicovideo.jp"""