From 726327847d2374d771ca665b452b448b478f3dc6 Mon Sep 17 00:00:00 2001 From: Hellowlol Date: Tue, 8 Dec 2015 22:30:22 +0100 Subject: [PATCH] what was i smoking.. --- lib/requests_futures/__init__.py | 28 ++++++++++++ lib/requests_futures/sessions.py | 73 ++++++++++++++++++++++++++++++++ plexpy/pmsconnect.py | 18 ++------ 3 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 lib/requests_futures/__init__.py create mode 100644 lib/requests_futures/sessions.py diff --git a/lib/requests_futures/__init__.py b/lib/requests_futures/__init__.py new file mode 100644 index 00000000..04cd3527 --- /dev/null +++ b/lib/requests_futures/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +# Requests Futures + +""" +async requests HTTP library +~~~~~~~~~~~~~~~~~~~~~ + + +""" + +__title__ = 'requests-futures' +__version__ = '0.9.5' +__build__ = 0x000000 +__author__ = 'Ross McFarland' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2013 Ross McFarland' + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/lib/requests_futures/sessions.py b/lib/requests_futures/sessions.py new file mode 100644 index 00000000..ad2af1b0 --- /dev/null +++ b/lib/requests_futures/sessions.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +""" +requests_futures +~~~~~~~~~~~~~~~~ + +This module provides a small add-on for the requests http library. It makes use +of python 3.3's concurrent.futures or the futures backport for previous +releases of python. + + from requests_futures import FuturesSession + + session = FuturesSession() + # request is run in the background + future = session.get('http://httpbin.org/get') + # ... do other stuff ... + # wait for the request to complete, if it hasn't already + response = future.result() + print('response status: {0}'.format(response.status_code)) + print(response.content) + +""" + +from concurrent.futures import ThreadPoolExecutor +from requests import Session +from requests.adapters import DEFAULT_POOLSIZE, HTTPAdapter + +class FuturesSession(Session): + + def __init__(self, executor=None, max_workers=2, *args, **kwargs): + """Creates a FuturesSession + + Notes + ~~~~~ + + * ProcessPoolExecutor is not supported b/c Response objects are + not picklable. + + * If you provide both `executor` and `max_workers`, the latter is + ignored and provided executor is used as is. + """ + super(FuturesSession, self).__init__(*args, **kwargs) + if executor is None: + executor = ThreadPoolExecutor(max_workers=max_workers) + # set connection pool size equal to max_workers if needed + if max_workers > DEFAULT_POOLSIZE: + adapter_kwargs = dict(pool_connections=max_workers, + pool_maxsize=max_workers) + self.mount('https://', HTTPAdapter(**adapter_kwargs)) + self.mount('http://', HTTPAdapter(**adapter_kwargs)) + + self.executor = executor + + def request(self, *args, **kwargs): + """Maintains the existing api for Session.request. + + Used by all of the higher level methods, e.g. Session.get. + + The background_callback param allows you to do some processing on the + response in the background, e.g. call resp.json() so that json parsing + happens in the background thread. + """ + func = sup = super(FuturesSession, self).request + + background_callback = kwargs.pop('background_callback', None) + if background_callback: + def wrap(*args_, **kwargs_): + resp = sup(*args_, **kwargs_) + background_callback(self, resp) + return resp + + func = wrap + + return self.executor.submit(func, *args, **kwargs) diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 37935b87..f7183b1b 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -706,12 +706,11 @@ class PmsConnect(object): Returns a list of all unwatched shows named args: Used for enabled and disabling sorting/filtering - kwargs: Used for filtering inside the dicts. Adding type="movie" will only list movies + kwargs: Used for filtering inside the dicts. Adding type="movie" will only returns movies Output: List for dicts - # Adding all_params=1 Makes the call insane slow. """ # Add a cache? @@ -896,20 +895,11 @@ class PmsConnect(object): if kwargs: logger.debug('kwargs was given %s filtering the dicts based on them' % kwargs) if not all_params: - t_result = [d for d in t_result for k,v in kwargs.iteritems() if d.get(k) == maybe_number(kwargs.get(k))] + t_result = [d for d in t_result if any(d.get(k) == maybe_number(kwargs[k]) for k in kwargs)] else: logger.debug('All kwargs is required to be in the list') - all_params_result = [] - - # Please fix, i would like to do this - # faster but i don't know how to.. - for item in t_result: - if all([item.get(k) == maybe_number(kwargs.get(k)) for k,v in kwargs.iteritems() for i in t_result]): - all_params_result.append(item) - - if all_params_result: - t_result = all_params_result - + t_result = [d for d in t_result if all(d.get(k, None) == maybe_number(kwargs[k]) for k in kwargs)] + if use_watched_older_then_sort: t_result = [i for i in t_result if not i['viewCount'] or i['lastViewedAt'] <= watched_older_then]