1
0
mirror of https://github.com/mikf/gallery-dl.git synced 2024-11-23 11:12:40 +01:00
gallery-dl/gallery_dl/extractor/common.py

96 lines
2.4 KiB
Python
Raw Normal View History

2015-04-08 01:43:25 +02:00
# -*- coding: utf-8 -*-
# Copyright 2014, 2015 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.
"""Common classes and constants used by extractor modules."""
2015-04-08 01:46:04 +02:00
import time
2014-10-12 21:56:44 +02:00
import queue
import requests
2015-04-08 01:46:04 +02:00
import threading
2015-11-24 19:47:51 +01:00
from .message import Message
from .. import config
2015-04-08 01:46:04 +02:00
2015-04-08 01:43:25 +02:00
class Extractor():
category = ""
subcategory = ""
2015-11-29 23:41:43 +01:00
directory_fmt = [""]
filename_fmt = ""
2015-04-08 01:43:25 +02:00
def __init__(self):
self.session = requests.Session()
2014-10-12 21:56:44 +02:00
def __iter__(self):
2015-04-08 01:43:25 +02:00
return self.items()
def items(self):
yield Message.Version, 1
2014-10-12 21:56:44 +02:00
def request(self, url, encoding=None, *args, **kwargs):
response = safe_request(self.session, url, *args, **kwargs)
if encoding:
response.encoding = encoding
return response
2014-10-12 21:56:44 +02:00
2015-04-08 01:43:25 +02:00
class AsynchronousExtractor(Extractor):
2014-10-12 21:56:44 +02:00
def __init__(self):
2015-04-08 01:43:25 +02:00
Extractor.__init__(self)
queue_size = int(config.get(("queue-size",), default=5))
2015-04-08 01:43:25 +02:00
self.__queue = queue.Queue(maxsize=queue_size)
self.__thread = threading.Thread(target=self.async_items, daemon=True)
2014-10-12 21:56:44 +02:00
def __iter__(self):
2015-04-08 01:43:25 +02:00
get = self.__queue.get
2014-10-12 21:56:44 +02:00
done = self.__queue.task_done
self.__thread.start()
while True:
task = get()
if task is None:
return
if isinstance(task, Exception):
raise task
2014-10-12 21:56:44 +02:00
yield task
done()
2015-04-08 01:43:25 +02:00
def async_items(self):
2014-10-12 21:56:44 +02:00
put = self.__queue.put
try:
2015-04-08 01:43:25 +02:00
for task in self.items():
2014-10-12 21:56:44 +02:00
put(task)
except Exception as e:
put(e)
2014-10-12 21:56:44 +02:00
put(None)
2015-04-08 01:46:04 +02:00
def safe_request(session, url, method="GET", *args, **kwargs):
tries = 0
while True:
# try to connect to remote source
try:
r = session.request(method, url, *args, **kwargs)
except requests.exceptions.ConnectionError:
tries += 1
time.sleep(1)
if tries == 5:
raise
continue
# reject error-status-codes
if r.status_code != requests.codes.ok:
tries += 1
time.sleep(1)
if tries == 5:
r.raise_for_status()
continue
# everything ok -- proceed to download
return r