aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/fanleaks.py
blob: 886e893483a35829030e6cf42b958176a9babff9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# -*- coding: utf-8 -*-

# 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://fanleaks.club/"""

from .common import Extractor, Message
from .. import text


class FanleaksExtractor(Extractor):
    """Base class for Fanleaks extractors"""
    category = "fanleaks"
    directory_fmt = ("{category}", "{model}")
    filename_fmt = "{model_id}_{id}.{extension}"
    archive_fmt = "{model_id}_{id}"
    root = "https://fanleaks.club"

    def __init__(self, match):
        Extractor.__init__(self, match)
        self.model_id = match.group(1)

    def extract_post(self, url):
        extr = text.extract_from(self.request(url, notfound="post").text)
        data = {
            "model_id": self.model_id,
            "model"   : text.unescape(extr('text-lg">', "</a>")),
            "id"      : text.parse_int(self.id),
            "type"    : extr('type="', '"')[:5] or "photo",
        }
        url = extr('src="', '"')
        yield Message.Directory, data
        yield Message.Url, url, text.nameext_from_url(url, data)


class FanleaksPostExtractor(FanleaksExtractor):
    """Extractor for individual posts on fanleaks.club"""
    subcategory = "post"
    pattern = r"(?:https?://)?(?:www\.)?fanleaks\.club/([^/?#]+)/(\d+)"
    example = "https://fanleaks.club/MODEL/12345"

    def __init__(self, match):
        FanleaksExtractor.__init__(self, match)
        self.id = match.group(2)

    def items(self):
        url = "{}/{}/{}".format(self.root, self.model_id, self.id)
        return self.extract_post(url)


class FanleaksModelExtractor(FanleaksExtractor):
    """Extractor for all posts from a fanleaks model"""
    subcategory = "model"
    pattern = (r"(?:https?://)?(?:www\.)?fanleaks\.club"
               r"/(?!latest/?$)([^/?#]+)/?$")
    example = "https://fanleaks.club/MODEL"

    def items(self):
        page_num = 1
        page = self.request(
            self.root + "/" + self.model_id, notfound="model").text
        data = {
            "model_id": self.model_id,
            "model"   : text.unescape(text.extr(page, 'mt-4">', "</h1>")),
            "type"    : "photo",
        }
        page_url = text.extr(page, "url: '", "'")
        while True:
            page = self.request("{}{}".format(page_url, page_num)).text
            if not page:
                return

            for item in text.extract_iter(page, '<a href="/', "</a>"):
                self.id = id = text.extr(item, "/", '"')
                if "/icon-play.svg" in item:
                    url = "{}/{}/{}".format(self.root, self.model_id, id)
                    yield from self.extract_post(url)
                    continue

                data["id"] = text.parse_int(id)
                url = text.extr(item, 'src="', '"').replace(
                    "/thumbs/", "/", 1)
                yield Message.Directory, data
                yield Message.Url, url, text.nameext_from_url(url, data)
            page_num += 1