mirror of https://github.com/morpheus65535/bazarr
122 lines
3.4 KiB
Python
122 lines
3.4 KiB
Python
from plex.lib.six.moves.urllib_parse import urlencode
|
|
|
|
from requests import Request
|
|
import json
|
|
|
|
|
|
class PlexRequest(object):
|
|
def __init__(self, client, **kwargs):
|
|
self.client = client
|
|
self.kwargs = kwargs
|
|
|
|
self.request = None
|
|
|
|
# Parsed Attributes
|
|
self.path = None
|
|
self.params = None
|
|
|
|
self.data = None
|
|
self.headers = None
|
|
self.method = None
|
|
|
|
def prepare(self):
|
|
self.request = Request()
|
|
|
|
self.transform_parameters()
|
|
self.request.url = self.construct_url()
|
|
|
|
self.request.data = self.transform_data()
|
|
self.request.headers = self.transform_headers()
|
|
self.request.method = self.transform_method()
|
|
|
|
return self.request.prepare()
|
|
|
|
def construct_url(self):
|
|
"""Construct a full plex request URI, with `params`."""
|
|
path = [self.path]
|
|
path.extend([str(x) for x in self.params])
|
|
|
|
url = self.client.base_url + '/'.join(x for x in path if x)
|
|
query = self.kwargs.get('query')
|
|
|
|
if query:
|
|
# Dict -> List
|
|
if type(query) is dict:
|
|
query = query.items()
|
|
|
|
# Remove items with `None` value
|
|
query = [
|
|
(k, v) for (k, v) in query
|
|
if v is not None
|
|
]
|
|
|
|
# Encode query, append to URL
|
|
url += '?' + urlencode(query)
|
|
|
|
return url
|
|
|
|
def transform_parameters(self):
|
|
# Transform `path`
|
|
self.path = self.kwargs.get('path')
|
|
|
|
if not self.path.startswith('/'):
|
|
self.path = '/' + self.path
|
|
|
|
if self.path.endswith('/'):
|
|
self.path = self.path[:-1]
|
|
|
|
# Transform `params` into list
|
|
self.params = self.kwargs.get('params') or []
|
|
|
|
if type(self.params) is not list:
|
|
self.params = [self.params]
|
|
|
|
def transform_data(self):
|
|
self.data = self.kwargs.get('data')
|
|
|
|
if self.data is None:
|
|
return None
|
|
|
|
return json.dumps(self.data)
|
|
|
|
def transform_headers(self):
|
|
self.headers = self.kwargs.get('headers') or {}
|
|
|
|
# Authentication
|
|
self.headers['X-Plex-Token'] = self.client.configuration['authentication.token']
|
|
|
|
# Client
|
|
self.headers['X-Plex-Client-Identifier'] = self.client.configuration['client.identifier']
|
|
|
|
self.headers['X-Plex-Product'] = self.client.configuration['client.product']
|
|
self.headers['X-Plex-Version'] = self.client.configuration['client.version']
|
|
|
|
# Device
|
|
self.headers['X-Device'] = self.client.configuration['device.system']
|
|
self.headers['X-Device-Name'] = self.client.configuration['device.name']
|
|
|
|
# Platform
|
|
self.headers['X-Platform'] = self.client.configuration['platform.name']
|
|
self.headers['X-Platform-Version'] = self.client.configuration['platform.version']
|
|
|
|
# Update with extra headers from configuration
|
|
c_headers = self.client.configuration['headers']
|
|
|
|
if c_headers:
|
|
self.headers.update(c_headers)
|
|
|
|
# Only return headers with valid values
|
|
return dict([
|
|
(k, v) for (k, v) in self.headers.items()
|
|
if v is not None
|
|
])
|
|
|
|
def transform_method(self):
|
|
self.method = self.kwargs.get('method')
|
|
|
|
# Pick `method` (if not provided)
|
|
if not self.method:
|
|
self.method = 'POST' if self.data else 'GET'
|
|
|
|
return self.method
|