Merge pull request #1925 from clinton-hall/resourceful

Resourceful
This commit is contained in:
Labrys of Knossos 2022-12-03 12:24:56 -05:00 committed by GitHub
commit 22a39bef4c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 99 additions and 47 deletions

View file

@ -23,10 +23,10 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
apikey = cfg['apikey']
ssl = int(cfg.get('ssl', 0))
web_root = cfg.get('web_root', '')
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
remote_path = int(cfg.get('remote_path', 0))
url = '{0}{1}:{2}{3}/api'.format(protocol, host, port, web_root)
url = core.utils.common.create_url(scheme, host, port, web_root)
if not server_responding(url):
logger.error('Server did not respond. Exiting', section)
return ProcessResult(

View file

@ -22,9 +22,9 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
ssl = int(cfg.get('ssl', 0))
web_root = cfg.get('web_root', '')
remote_path = int(cfg.get('remote_path'), 0)
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
url = '{0}{1}:{2}{3}/api'.format(protocol, host, port, web_root)
url = core.utils.common.create_url(scheme, host, port, web_root)
if not server_responding(url):
logger.error('Server did not respond. Exiting', section)
return ProcessResult(

View file

@ -22,9 +22,9 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
library = cfg.get('library')
ssl = int(cfg.get('ssl', 0))
web_root = cfg.get('web_root', '')
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
url = '{0}{1}:{2}{3}/api'.format(protocol, host, port, web_root)
url = core.utils.common.create_url(scheme, host, port, web_root)
if not server_responding(url):
logger.error('Server did not respond. Exiting', section)
return ProcessResult(

View file

@ -1,5 +1,6 @@
import time
import core.utils.common
from core import logger
from core.auto_process.common import ProcessResult
from core.auto_process.managers.sickbeard import SickBeard
@ -14,7 +15,13 @@ class PyMedusa(SickBeard):
super(PyMedusa, self).__init__(sb_init)
def _create_url(self):
return '{0}{1}:{2}{3}/home/postprocess/processEpisode'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root)
route = f'{self.sb_init.web_root}/home/postprocess/processEpisode'
return core.utils.common.create_url(
self.sb_init.protocol,
self.sb_init.host,
self.sb_init.port,
route,
)
class PyMedusaApiV1(SickBeard):
@ -24,7 +31,13 @@ class PyMedusaApiV1(SickBeard):
super(PyMedusaApiV1, self).__init__(sb_init)
def _create_url(self):
return '{0}{1}:{2}{3}/api/{4}/'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root, self.sb_init.apikey)
route = f'{self.sb_init.web_root}/api/{self.sb_init.apikey}/'
return core.utils.common.create_url(
self.sb_init.protocol,
self.sb_init.host,
self.sb_init.port,
route,
)
def api_call(self):
self._process_fork_prarams()
@ -69,7 +82,13 @@ class PyMedusaApiV2(SickBeard):
raise Exception('For the section SickBeard `fork = medusa-apiv2` you also need to configure an `apikey`')
def _create_url(self):
return '{0}{1}:{2}{3}/api/v2/postprocess'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root)
route = f'{self.sb_init.web_root}/api/v2/postprocess'
return core.utils.common.create_url(
self.sb_init.protocol,
self.sb_init.host,
self.sb_init.port,
route,
)
def _get_identifier_status(self, url):
# Loop through requesting medusa for the status on the queueitem.

View file

@ -15,9 +15,9 @@ from requests_oauthlib import OAuth2Session
class InitSickBeard:
"""Sickbeard init class.
"""SickBeard init class.
Used to determin which sickbeard fork object to initialize.
Used to determine which SickBeard fork object to initialize.
"""
def __init__(self, cfg, section, input_category):
@ -302,6 +302,7 @@ class InitSickBeard:
class SickBeard:
"""Sickbeard base class."""
sb_init: InitSickBeard
def __init__(self, sb_init):
"""SB constructor."""
@ -345,10 +346,17 @@ class SickBeard:
if client_agent == core.TORRENT_CLIENT_AGENT and core.USE_LINK == 'move-sym':
self.process_method = 'symlink'
def _create_url(self):
def _create_url(self) -> str:
if self.sb_init.apikey:
return '{0}{1}:{2}{3}/api/{4}/'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root, self.sb_init.apikey)
return '{0}{1}:{2}{3}/home/postprocess/processEpisode'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root)
route = f'{self.sb_init.web_root}/api/{self.sb_init.apikey}/'
else:
route = f'{self.sb_init.web_root}/home/postprocess/processEpisode'
return core.utils.common.create_url(
self.sb_init.protocol,
self.sb_init.host,
self.sb_init.port,
route
)
def _process_fork_prarams(self):
# configure SB params to pass
@ -432,7 +440,13 @@ class SickBeard:
try:
if not self.sb_init.apikey and self.sb_init.username and self.sb_init.password:
# If not using the api, we need to login using user/pass first.
login = '{0}{1}:{2}{3}/login'.format(self.sb_init.protocol, self.sb_init.host, self.sb_init.port, self.sb_init.web_root)
route = f'{self.sb_init.web_root}/login'
login = core.utils.common.create_url(
self.sb_init.protocol,
self.sb_init.host,
self.sb_init.port,
route,
)
login_params = {'username': self.sb_init.username, 'password': self.sb_init.password}
r = self.session.get(login, verify=False, timeout=(30, 60))
if r.status_code in [401, 403] and r.cookies.get('_xsrf'):

View file

@ -48,7 +48,7 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
ssl = int(cfg.get('ssl', 0))
web_root = cfg.get('web_root', '')
remote_path = int(cfg.get('remote_path', 0))
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
omdbapikey = cfg.get('omdbapikey', '')
no_status_check = int(cfg.get('no_status_check', 0))
status = int(status)
@ -59,13 +59,17 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
imdbid = find_imdbid(dir_name, input_name, omdbapikey)
if section == 'CouchPotato':
base_url = '{0}{1}:{2}{3}/api/{4}/'.format(protocol, host, port, web_root, apikey)
if section == 'Radarr':
base_url = '{0}{1}:{2}{3}/api/v3/command'.format(protocol, host, port, web_root)
url2 = '{0}{1}:{2}{3}/api/v3/config/downloadClient'.format(protocol, host, port, web_root)
route = f'{web_root}/api/{apikey}/'
elif section == 'Radarr':
route = f'{web_root}/api/v3/command'
route2 = f'{web_root}/api/v3/config/downloadClient'
url2 = core.utils.common.create_url(scheme, host, port, route2)
headers = {'X-Api-Key': apikey, 'Content-Type': 'application/json'}
if section == 'Watcher3':
base_url = '{0}{1}:{2}{3}/postprocessing'.format(protocol, host, port, web_root)
elif section == 'Watcher3':
route = f'{web_root}/postprocessing'
else:
route = web_root
base_url = core.utils.common.create_url(scheme, host, port, route)
if not apikey:
logger.info('No CouchPotato or Radarr apikey entered. Performing transcoder functions only')
release = None
@ -389,7 +393,7 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
return ProcessResult(
status_code=0,
message='{0}: Successfully processed but no change in status confirmed'.format(section),
)
)
# we will now check to see if CPS has finished renaming before returning to TorrentToMedia and unpausing.
timeout = time.time() + 60 * wait_for
@ -470,7 +474,7 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
'{0} does not appear to have changed status after {1} minutes, Please check your logs.'.format(input_name, wait_for),
section,
)
return ProcessResult(
status_code=1,
message='{0}: Failed to post-process - No change in status'.format(section),

View file

@ -26,17 +26,15 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
delete_failed = int(cfg['delete_failed'])
web_root = cfg.get('web_root', '')
remote_path = int(cfg.get('remote_path', 0))
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
status = int(status)
if status > 0 and core.NOEXTRACTFAILED:
extract = 0
else:
extract = int(cfg.get('extract', 0))
if section == 'Lidarr':
url = '{0}{1}:{2}{3}/api/v1'.format(protocol, host, port, web_root)
else:
url = '{0}{1}:{2}{3}/api'.format(protocol, host, port, web_root)
route = f'{web_root}/api/v1' if section == 'Lidarr' else f'{web_root}/api'
url = core.utils.common.create_url(scheme, host, port, route)
if not server_responding(url):
logger.error('Server did not respond. Exiting', section)
return ProcessResult(
@ -96,7 +94,8 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
)
elif status == 0 and section == 'Lidarr':
url = '{0}{1}:{2}{3}/api/v1/command'.format(protocol, host, port, web_root)
route = f'{web_root}/api/v1/command'
url = core.utils.common.create_url(scheme, host, port, route)
headers = {'X-Api-Key': apikey}
if remote_path:
logger.debug('remote_path: {0}'.format(remote_dir(dir_name)), section)

View file

@ -39,7 +39,7 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
port = cfg['port']
ssl = int(cfg.get('ssl', 0))
web_root = cfg.get('web_root', '')
protocol = 'https://' if ssl else 'http://'
scheme = 'https' if ssl else 'http'
username = cfg.get('username', '')
password = cfg.get('password', '')
apikey = cfg.get('apikey', '')
@ -51,7 +51,8 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
# For now let's do botch the OO and the serialized code, until everything has been migrated.
init_sickbeard = InitSickBeard(cfg, section, input_category)
if server_responding('{0}{1}:{2}{3}'.format(protocol, host, port, web_root)):
url = core.utils.common.create_url(scheme, host, port, web_root)
if server_responding(url):
# auto-detect correct fork
# During reactor we also return fork, fork_params. But these are also stored in the object.
# Should be changed after refactor.
@ -289,27 +290,25 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
status_code=1, # Return as failed to flag this in the downloader.
)
url = None
route = ''
if section == 'SickBeard':
if apikey:
url = '{0}{1}:{2}{3}/api/{4}/'.format(protocol, host, port, web_root, apikey)
if not 'cmd' in fork_params:
if 'SickGear' in fork:
fork_params['cmd'] = 'sg.postprocess'
else:
fork_params['cmd'] = 'postprocess'
route = f'{web_root}/api/{apikey}/'
if 'cmd' not in fork_params:
prefix = '' if 'SickGear' not in fork else 'sg.'
fork_params['cmd'] = f'{prefix}postprocess'
elif fork == 'Stheno':
url = '{0}{1}:{2}{3}/home/postprocess/process_episode'.format(protocol, host, port, web_root)
route = f'{web_root}/home/postprocess/process_episode'
else:
url = '{0}{1}:{2}{3}/home/postprocess/processEpisode'.format(protocol, host, port, web_root)
route = f'{web_root}/home/postprocess/processEpisode'
elif section == 'SiCKRAGE':
if api_version >= 2:
url = '{0}{1}:{2}{3}/api/v{4}/postprocess'.format(protocol, host, port, web_root, api_version)
route = f'{web_root}/api/v{api_version}/postprocess'
else:
url = '{0}{1}:{2}{3}/api/v{4}/{5}/'.format(protocol, host, port, web_root, api_version, apikey)
route = f'{web_root}/api/v{api_version}/{apikey}/'
elif section == 'NzbDrone':
url = '{0}{1}:{2}{3}/api/command'.format(protocol, host, port, web_root)
url2 = '{0}{1}:{2}{3}/api/config/downloadClient'.format(protocol, host, port, web_root)
route = f'{web_root}/api/command'
route2 = f'{web_root}/api/config/downloadClient'
headers = {'X-Api-Key': apikey}
# params = {'sortKey': 'series.title', 'page': 1, 'pageSize': 1, 'sortDir': 'asc'}
if remote_path:
@ -321,7 +320,7 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
if not download_id:
data.pop('downloadClientId')
data = json.dumps(data)
url = core.utils.common.create_url(scheme, host, port, route)
try:
if section == 'SickBeard':
if init_sickbeard.fork_obj:
@ -331,7 +330,7 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
logger.debug('Opening URL: {0} with params: {1}'.format(url, fork_params), section)
if not apikey and username and password:
login = '{0}{1}:{2}{3}/login'.format(protocol, host, port, web_root)
login = f'{web_root}/login'
login_params = {'username': username, 'password': password}
r = s.get(login, verify=False, timeout=(30, 60))
if r.status_code in [401, 403] and r.cookies.get('_xsrf'):
@ -457,6 +456,8 @@ def process(section, dir_name, input_name=None, failed=False, client_agent='manu
# message='{0}: Failed to post-process {1}'.format(section, input_name),
# status_code=1,
# )
url2 = core.utils.common.create_url(scheme, host, port, route)
if completed_download_handling(url2, headers, section=section):
logger.debug('The Scan command did not return status completed, but complete Download Handling is enabled. Passing back to {0}.'.format(section),
section)

View file

@ -1,4 +1,6 @@
import os.path
import typing
import urllib.parse
import core
from core import logger
@ -109,3 +111,16 @@ def get_dirs(section, subsection, link='hard'):
logger.debug('No directories identified in {0}:{1} for post-processing'.format(section, subsection))
return list(set(to_return))
def create_url(
scheme: str,
host: str,
port: typing.Optional[int] = None,
path: str = '',
query: str = '',
) -> str:
"""Create a url from its component parts."""
netloc = host if port is None else f'{host}:{port}'
fragments = ''
return urllib.parse.urlunsplit([scheme, netloc, path, query, fragments])