From 93482a1f885d8e2e152ea98c671de036bd4e8235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sun, 3 Dec 2017 01:38:24 +0100 Subject: [PATCH] implement 'util.advance()' --- gallery_dl/extractor/seiga.py | 21 ++++++++------------- gallery_dl/util.py | 8 ++++++++ test/test_util.py | 12 ++++++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/gallery_dl/extractor/seiga.py b/gallery_dl/extractor/seiga.py index f85751d8..210ea303 100644 --- a/gallery_dl/extractor/seiga.py +++ b/gallery_dl/extractor/seiga.py @@ -11,7 +11,6 @@ from .common import Extractor, Message from .. import text, util, exception from ..cache import cache -import itertools class SeigaExtractor(Extractor): @@ -21,20 +20,16 @@ class SeigaExtractor(Extractor): def __init__(self): Extractor.__init__(self) - self.startimg = 0 + self.start_image = 0 def items(self): self.login() images = iter(self.get_images()) data = next(images) - if self.startimg: - # consume elements up to 'startimg' - next(itertools.islice(images, self.startimg, self.startimg), None) - yield Message.Version, 1 yield Message.Directory, data - for image in images: + for image in util.advance(images, self.start_image): data.update(image) data["extension"] = None yield Message.Url, self.get_image_url(data["image_id"]), data @@ -91,12 +86,12 @@ class SeigaUserExtractor(SeigaExtractor): def __init__(self, match): SeigaExtractor.__init__(self) self.user_id, self.order = match.groups() - self.startpage = 1 + self.start_page = 1 def skip(self, num): pages, images = divmod(num, 40) - self.startpage += pages - self.startimg += images + self.start_page += pages + self.start_image += images return num def get_metadata(self, page): @@ -122,14 +117,14 @@ class SeigaUserExtractor(SeigaExtractor): def get_images(self): url = "http://seiga.nicovideo.jp/user/illust/" + self.user_id - params = {"sort": self.order, "page": self.startpage, + params = {"sort": self.order, "page": self.start_page, "target": "illust_all"} while True: cnt = 0 page = self.request(url, params=params).text - if params["page"] == self.startpage: + if params["page"] == self.start_page: yield self.get_metadata(page) for info in text.extract_iter( @@ -174,7 +169,7 @@ class SeigaImageExtractor(SeigaExtractor): self.image_id = match.group(1) def skip(self, num): - self.startimg += num + self.start_image += num return num def get_images(self): diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 3cf3000c..6834916d 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -20,6 +20,7 @@ import string import _string import hashlib import datetime +import itertools import urllib.parse from . import text, exception @@ -100,6 +101,13 @@ def parse_bytes(value, suffixes="bkmgtp"): return 0 +def advance(iterable, num): + """"Advance the iterable by 'num' steps""" + iterator = iter(iterable) + next(itertools.islice(iterator, num, num), None) + return iterator + + def combine_dict(a, b): """Recursively combine the contents of b into a""" for key, value in b.items(): diff --git a/test/test_util.py b/test/test_util.py index 137a0f8d..cf972e36 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -205,6 +205,18 @@ class TestOther(unittest.TestCase): self.assertEqual(util.parse_bytes("invalid"), 0) self.assertEqual(util.parse_bytes(" 123 kb "), 0) + def test_advance(self): + items = range(5) + + self.assertCountEqual( + util.advance(items, 0), items) + self.assertCountEqual( + util.advance(items, 3), range(3, 5)) + self.assertCountEqual( + util.advance(items, 9), []) + self.assertCountEqual( + util.advance(util.advance(items, 1), 2), range(3, 5)) + def test_combine_dict(self): self.assertEqual( util.combine_dict({}, {}),