diff --git a/resources/lib/db.py b/resources/lib/db.py index 4b0b9480..2769c719 100644 --- a/resources/lib/db.py +++ b/resources/lib/db.py @@ -4,19 +4,13 @@ import sqlite3 from functools import wraps from . import variables as v, app +from .exceptions import LockedDatabase DB_WRITE_ATTEMPTS = 100 DB_WRITE_ATTEMPTS_TIMEOUT = 1 # in seconds DB_CONNECTION_TIMEOUT = 10 -class LockedDatabase(Exception): - """ - Dedicated class to make sure we're not silently catching locked DBs. - """ - pass - - def catch_operationalerrors(method): """ sqlite.OperationalError is raised immediately if another DB connection diff --git a/resources/lib/exceptions.py b/resources/lib/exceptions.py new file mode 100644 index 00000000..85a395df --- /dev/null +++ b/resources/lib/exceptions.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + + +class PlaylistError(Exception): + """ + Exception for our playlist constructs + """ + pass + + +class LockedDatabase(Exception): + """ + Dedicated class to make sure we're not silently catching locked DBs. + """ + pass + + +class SubtitleError(Exception): + """ + Exceptions relating to subtitles + """ + pass + + +class ProcessingNotDone(Exception): + """ + Exception to detect whether we've completed our sync and did not have to + abort or suspend. + """ + pass diff --git a/resources/lib/kodimonitor.py b/resources/lib/kodimonitor.py index 728a6cd9..118c4525 100644 --- a/resources/lib/kodimonitor.py +++ b/resources/lib/kodimonitor.py @@ -19,6 +19,7 @@ from .downloadutils import DownloadUtils as DU from . import utils, timing, plex_functions as PF from . import json_rpc as js, playqueue as PQ, playlist_func as PL from . import backgroundthread, app, variables as v +from . import exceptions LOG = getLogger('PLEX.kodimonitor') @@ -180,7 +181,7 @@ class KodiMonitor(xbmc.Monitor): try: for i, item in enumerate(items): PL.add_item_to_plex_playqueue(playqueue, i + 1, kodi_item=item) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.info('Could not build Plex playlist for: %s', items) def _json_item(self, playerid): @@ -317,7 +318,7 @@ class KodiMonitor(xbmc.Monitor): return try: item = PL.init_plex_playqueue(playqueue, plex_id=plex_id) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.info('Could not initialize the Plex playlist') return item.file = path diff --git a/resources/lib/library_sync/additional_metadata.py b/resources/lib/library_sync/additional_metadata.py index 70f5b575..ac87d708 100644 --- a/resources/lib/library_sync/additional_metadata.py +++ b/resources/lib/library_sync/additional_metadata.py @@ -5,6 +5,7 @@ from . import additional_metadata_tmdb from ..plex_db import PlexDB from .. import backgroundthread, utils from .. import variables as v, app +from ..exceptions import ProcessingNotDone logger = getLogger('PLEX.sync.metadata') @@ -22,12 +23,6 @@ SUPPORTED_METADATA = { } -class ProcessingNotDone(Exception): - """Exception to detect whether we've completed our sync and did not have to - abort or suspend.""" - pass - - def processing_is_activated(item_getter): """Checks the PKC settings whether processing is even activated.""" if item_getter == 'missing_fanart': diff --git a/resources/lib/playback.py b/resources/lib/playback.py index 37926b94..fe889026 100644 --- a/resources/lib/playback.py +++ b/resources/lib/playback.py @@ -15,6 +15,7 @@ from .kodi_db import KodiVideoDB from . import plex_functions as PF, playlist_func as PL, playqueue as PQ from . import json_rpc as js, variables as v, utils, transfer from . import playback_decision, app +from . import exceptions ############################################################################### LOG = getLogger('PLEX.playback') @@ -191,7 +192,7 @@ def _playback_init(plex_id, plex_type, playqueue, pos, resume): # Special case - we already got a filled Kodi playqueue try: _init_existing_kodi_playlist(playqueue, pos) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Playback_init for existing Kodi playlist failed') _ensure_resolve(abort=True) return @@ -311,7 +312,7 @@ def _init_existing_kodi_playlist(playqueue, pos): kodi_items = js.playlist_get_items(playqueue.playlistid) if not kodi_items: LOG.error('No Kodi items returned') - raise PL.PlaylistError('No Kodi items returned') + raise exceptions.PlaylistError('No Kodi items returned') item = PL.init_plex_playqueue(playqueue, kodi_item=kodi_items[pos]) item.force_transcode = app.PLAYSTATE.force_transcode # playqueue.py will add the rest - this will likely put the PMS under diff --git a/resources/lib/playlist_func.py b/resources/lib/playlist_func.py index e1ce7a48..b4a0ad88 100644 --- a/resources/lib/playlist_func.py +++ b/resources/lib/playlist_func.py @@ -14,19 +14,13 @@ from . import utils from . import json_rpc as js from . import variables as v from . import app +from .exceptions import PlaylistError from .subtitles import accessible_plex_subtitles LOG = getLogger('PLEX.playlist_func') -class PlaylistError(Exception): - """ - Exception for our playlist constructs - """ - pass - - class Playqueue_Object(object): """ PKC object to represent PMS playQueues and Kodi playlist for queueing diff --git a/resources/lib/playlists/__init__.py b/resources/lib/playlists/__init__.py index 6c17fa98..1c7a0466 100644 --- a/resources/lib/playlists/__init__.py +++ b/resources/lib/playlists/__init__.py @@ -14,13 +14,13 @@ from logging import getLogger from sqlite3 import OperationalError -from .common import Playlist, PlaylistError, PlaylistObserver, \ - kodi_playlist_hash +from .common import Playlist, PlaylistObserver, kodi_playlist_hash from . import pms, db, kodi_pl, plex_pl from ..watchdog import events from ..plex_api import API from .. import utils, path_ops, variables as v, app +from ..exceptions import PlaylistError ############################################################################### LOG = getLogger('PLEX.playlists') diff --git a/resources/lib/playlists/common.py b/resources/lib/playlists/common.py index 75a8884f..04d14132 100644 --- a/resources/lib/playlists/common.py +++ b/resources/lib/playlists/common.py @@ -11,6 +11,8 @@ from ..watchdog.observers import Observer from ..watchdog.utils.bricks import OrderedSetQueue from .. import path_ops, variables as v, app +from ..exceptions import PlaylistError + ############################################################################### LOG = getLogger('PLEX.playlists.common') @@ -19,13 +21,6 @@ SIMILAR_EVENTS = (events.EVENT_TYPE_CREATED, events.EVENT_TYPE_MODIFIED) ############################################################################### -class PlaylistError(Exception): - """ - The one main exception thrown if anything goes awry - """ - pass - - class Playlist(object): """ Class representing a synced Playlist with info for both Kodi and Plex. diff --git a/resources/lib/playlists/db.py b/resources/lib/playlists/db.py index 1c641a7f..a309f01b 100644 --- a/resources/lib/playlists/db.py +++ b/resources/lib/playlists/db.py @@ -6,10 +6,12 @@ module """ from logging import getLogger -from .common import Playlist, PlaylistError +from .common import Playlist from ..plex_db import PlexDB from ..kodi_db import kodiid_from_filename from .. import utils, variables as v +from ..exceptions import PlaylistError + ############################################################################### LOG = getLogger('PLEX.playlists.db') @@ -120,7 +122,7 @@ def m3u_to_plex_ids(playlist): def playlist_file_to_plex_ids(playlist): """ Takes the playlist file located at path [unicode] and parses it. - Returns a list of plex_ids (str) or raises PL.PlaylistError if a single + Returns a list of plex_ids (str) or raises PlaylistError if a single item cannot be parsed from Kodi to Plex. """ if playlist.kodi_extension == 'm3u': diff --git a/resources/lib/playlists/kodi_pl.py b/resources/lib/playlists/kodi_pl.py index 75685f76..04d97a36 100644 --- a/resources/lib/playlists/kodi_pl.py +++ b/resources/lib/playlists/kodi_pl.py @@ -6,11 +6,13 @@ Create and delete playlists on the Kodi side of things from logging import getLogger import re -from .common import Playlist, PlaylistError, kodi_playlist_hash +from .common import Playlist, kodi_playlist_hash from . import db, pms from ..plex_api import API from .. import utils, path_ops, variables as v +from ..exceptions import PlaylistError + ############################################################################### LOG = getLogger('PLEX.playlists.kodi_pl') REGEX_FILE_NUMBERING = re.compile(r'''_(\d\d)\.\w+$''') diff --git a/resources/lib/playlists/plex_pl.py b/resources/lib/playlists/plex_pl.py index 626262ac..9d170c8f 100644 --- a/resources/lib/playlists/plex_pl.py +++ b/resources/lib/playlists/plex_pl.py @@ -5,8 +5,9 @@ Create and delete playlists on the Plex side of things """ from logging import getLogger -from .common import PlaylistError from . import pms, db +from ..exceptions import PlaylistError + ############################################################################### LOG = getLogger('PLEX.playlists.plex_pl') # Used for updating Plex playlists due to Kodi changes - Plex playlist diff --git a/resources/lib/playlists/pms.py b/resources/lib/playlists/pms.py index a22dee7d..581fb403 100644 --- a/resources/lib/playlists/pms.py +++ b/resources/lib/playlists/pms.py @@ -6,11 +6,11 @@ manipulate playlists """ from logging import getLogger -from .common import PlaylistError - from ..plex_api import API from ..downloadutils import DownloadUtils as DU from .. import utils, app, variables as v +from ..exceptions import PlaylistError + ############################################################################### LOG = getLogger('PLEX.playlists.pms') diff --git a/resources/lib/playqueue.py b/resources/lib/playqueue.py index b1924bf3..1f06cb32 100644 --- a/resources/lib/playqueue.py +++ b/resources/lib/playqueue.py @@ -11,6 +11,7 @@ import xbmc from .plex_api import API from . import playlist_func as PL, plex_functions as PF from . import backgroundthread, utils, json_rpc as js, app, variables as v +from . import exceptions ############################################################################### LOG = getLogger('PLEX.playqueue') @@ -87,7 +88,7 @@ def init_playqueue_from_plex_children(plex_id, transient_token=None): api = API(child) try: PL.add_item_to_playlist(playqueue, i, plex_id=api.plex_id) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Could not add Plex item to our playlist: %s, %s', child.tag, child.attrib) playqueue.plex_transient_token = transient_token @@ -150,7 +151,7 @@ class PlayqueueMonitor(backgroundthread.KillableThread): i + j, i) try: PL.move_playlist_item(playqueue, i + j, i) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Could not modify playqueue positions') LOG.error('This is likely caused by mixing audio and ' 'video tracks in the Kodi playqueue') @@ -166,7 +167,7 @@ class PlayqueueMonitor(backgroundthread.KillableThread): PL.add_item_to_plex_playqueue(playqueue, i, kodi_item=new_item) - except PL.PlaylistError: + except exceptions.PlaylistError: # Could not add the element pass except KeyError: @@ -195,7 +196,7 @@ class PlayqueueMonitor(backgroundthread.KillableThread): LOG.debug('Detected deletion of playqueue element at pos %s', i) try: PL.delete_playlist_item_from_PMS(playqueue, i) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Could not delete PMS element from position %s', i) LOG.error('This is likely caused by mixing audio and ' 'video tracks in the Kodi playqueue') diff --git a/resources/lib/plex_companion.py b/resources/lib/plex_companion.py index 184c0526..25cf12aa 100644 --- a/resources/lib/plex_companion.py +++ b/resources/lib/plex_companion.py @@ -20,6 +20,7 @@ from . import playqueue as PQ from . import variables as v from . import backgroundthread from . import app +from . import exceptions ############################################################################### @@ -50,7 +51,7 @@ def update_playqueue_from_PMS(playqueue, with app.APP.lock_playqueues: try: xml = PL.get_PMS_playlist(playqueue, playqueue_id) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Could now download playqueue %s', playqueue_id) return if playqueue.id == playqueue_id: @@ -63,7 +64,7 @@ def update_playqueue_from_PMS(playqueue, # Get new metadata for the playqueue first try: PL.get_playlist_details_from_xml(playqueue, xml) - except PL.PlaylistError: + except exceptions.PlaylistError: LOG.error('Could not get playqueue ID %s', playqueue_id) return playqueue.repeat = 0 if not repeat else int(repeat) diff --git a/resources/lib/subtitles.py b/resources/lib/subtitles.py index b77f98c4..78fc9c83 100644 --- a/resources/lib/subtitles.py +++ b/resources/lib/subtitles.py @@ -8,6 +8,7 @@ import xml.etree.ElementTree as etree from . import app from . import path_ops from . import variables as v +from .exceptions import SubtitleError LOG = getLogger('PLEX.subtitles') @@ -466,7 +467,3 @@ def external_subs_from_filesystem(dirname, filename): class DummySub(etree.Element): def __init__(self): super(DummySub, self).__init__('Stream-subtitle-dummy') - - -class SubtitleError(Exception): - pass