# -*- coding: utf-8 -*-
#
-# Copyright (c) 2010, 2011, 2013, 2014, 2015, 2020 kaliko <kaliko@azylum.org>
+# Copyright (c) 2010, 2011, 2013, 2014, 2015, 2020, 2021, 2024 kaliko <kaliko@azylum.org>
#
# This file is part of sima
#
from os.path import dirname, isabs, join, normpath, exists, isdir, isfile
from time import sleep
+from musicpd import VERSION as mversion
+from sima.info import __version__ as sversion
+
def getws(dic):
"""
aka = getencoder('rot-13')(str((aka), 'utf-8'))[0]
dic.update({'apikey': aka})
+
def parse_mpd_host(value):
passwd = host = None
# If password is set: MPD_HOST=pass@host
log = logging.getLogger(__name__)
log.error('Unhandled Exception!!!')
log.error(''.join(traceback.format_exc()))
+ log.info('musicpd python module version: %s', mversion)
+ log.info('MPD_sima version: %s', sversion)
log.info('Please report the previous message'
' along with some log entries right before the crash.')
log.info('thanks for your help :)')
sys.exit(1)
-class SigHup(Exception):
- """SIGHUP raises this Exception"""
-
-
# ArgParse Callbacks
class Obsolete(Action):
# pylint: disable=R0903
class FileAction(Action):
"""Generic class to inherit from for ArgParse action on file/dir
"""
- # pylint: disable=R0903
+ # pylint: disable=R0903,W0201
def __call__(self, parser, namespace, values, option_string=None):
self._file = normalize_path(values)
self._dir = dirname(self._file)
"""
def checks(self):
if isdir(self._file):
- self.parser.error('need a file not a directory: {}'.format(self._file))
+ self.parser.error(f'need a file not a directory: {self._file}')
if not exists(self._dir):
- #raise ArgumentError(self, '"{0}" does not exist'.format(self._dir))
- self.parser.error('directory does not exist: {0}'.format(self._dir))
+ self.parser.error(f'directory does not exist: {self._dir}')
if not exists(self._file):
# Is parent directory writable then
if not access(self._dir, W_OK):
- self.parser.error('no write access to "{0}"'.format(self._dir))
+ self.parser.error(f'no write access to "{self._dir}"')
else:
if not access(self._file, W_OK):
- self.parser.error('no write access to "{0}"'.format(self._file))
+ self.parser.error(f'no write access to "{self._file}"')
class Rfile(FileAction):
"""
def checks(self):
if not exists(self._file):
- self.parser.error('file does not exist: {0}'.format(self._file))
+ self.parser.error(f'file does not exist: {self._file}')
if not isfile(self._file):
- self.parser.error('not a file: {0}'.format(self._file))
+ self.parser.error(f'not a file: {self._file}')
if not access(self._file, R_OK):
- self.parser.error('no read access to "{0}"'.format(self._file))
+ self.parser.error(f'no read access to "{self._file}"')
class Wdir(FileAction):
"""
def checks(self):
if not exists(self._file):
- self.parser.error('directory does not exist: {0}'.format(self._file))
+ self.parser.error(f'directory does not exist: {self._file}')
if not isdir(self._file):
- self.parser.error('not a directory: {0}'.format(self._file))
+ self.parser.error(f'not a directory: {self._file}')
if not access(self._file, W_OK):
- self.parser.error('no write access to "{0}"'.format(self._file))
+ self.parser.error(f'no write access to "{self._file}"')
class Throttle:
"""throttle decorator"""
+ # pylint: disable=R0903
def __init__(self, wait):
self.wait = wait
self.last_called = datetime.now()
"""Generic MPD_sima Exception"""
+class SigHup(MPDSimaException):
+ """SIGHUP raises this Exception"""
+
+
# http client exceptions (for webservices)
class WSError(MPDSimaException):
pass
class PluginException(MPDSimaException):
pass
+
+# Wrap Exception decorator
+def get_decorator(errors=(OSError, TimeoutError), wrap_into=Exception):
+ def decorator(func):
+ def w_func(*args, **kwargs):
+ try:
+ return func(*args, **kwargs)
+ except errors as err:
+ strerr = str(err)
+ if hasattr(err, 'strerror'):
+ if err.strerror:
+ strerr = err.strerror
+ raise wrap_into(strerr) from err
+ return w_func
+ return decorator
+
# VIM MODLINE
# vim: ai ts=4 sw=4 sts=4 expandtab