Merge pull request #1069 from croneter/fix-operationalerror

Fix OperationalError when resetting PKC
This commit is contained in:
croneter 2019-11-30 16:26:36 +01:00 committed by GitHub
commit aad68340cf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 73 additions and 38 deletions

View file

@ -64,7 +64,8 @@ def check_migration():
if not utils.compare_version(last_migration, '2.9.3'): if not utils.compare_version(last_migration, '2.9.3'):
LOG.info('Migrating to version 2.9.2') LOG.info('Migrating to version 2.9.2')
# Re-sync all playlists to Kodi # Re-sync all playlists to Kodi
utils.wipe_synched_playlists() from .playlists import remove_synced_playlists
remove_synced_playlists()
if not utils.compare_version(last_migration, '2.9.7'): if not utils.compare_version(last_migration, '2.9.7'):
LOG.info('Migrating to version 2.9.6') LOG.info('Migrating to version 2.9.6')

View file

@ -68,6 +68,18 @@ def kodi_playlist_monitor():
return observer return observer
def remove_synced_playlists():
"""
Deletes all synched playlists on the Kodi side, not on the Plex side
"""
LOG.info('Removing all playlists that we synced to Kodi')
with app.APP.lock_playlists:
paths = db.get_all_kodi_playlist_paths()
kodi_pl.delete_kodi_playlists(paths)
db.wipe_table()
LOG.info('Done removing all synced playlists')
def websocket(plex_id, status): def websocket(plex_id, status):
""" """
Call this function to process websocket messages from the PMS Call this function to process websocket messages from the PMS
@ -370,19 +382,19 @@ class PlaylistEventhandler(events.FileSystemEventHandler):
""" """
path = event.dest_path if event.event_type == events.EVENT_TYPE_MOVED \ path = event.dest_path if event.event_type == events.EVENT_TYPE_MOVED \
else event.src_path else event.src_path
if not sync_kodi_playlist(path):
return
if path in kodi_pl.IGNORE_KODI_PLAYLIST_CHANGE:
LOG.debug('Ignoring event %s', event)
kodi_pl.IGNORE_KODI_PLAYLIST_CHANGE.remove(path)
return
_method_map = {
events.EVENT_TYPE_MODIFIED: self.on_modified,
events.EVENT_TYPE_MOVED: self.on_moved,
events.EVENT_TYPE_CREATED: self.on_created,
events.EVENT_TYPE_DELETED: self.on_deleted,
}
with app.APP.lock_playlists: with app.APP.lock_playlists:
if not sync_kodi_playlist(path):
return
if path in kodi_pl.IGNORE_KODI_PLAYLIST_CHANGE:
LOG.debug('Ignoring event %s', event)
kodi_pl.IGNORE_KODI_PLAYLIST_CHANGE.remove(path)
return
_method_map = {
events.EVENT_TYPE_MODIFIED: self.on_modified,
events.EVENT_TYPE_MOVED: self.on_moved,
events.EVENT_TYPE_CREATED: self.on_created,
events.EVENT_TYPE_DELETED: self.on_deleted,
}
_method_map[event.event_type](event) _method_map[event.event_type](event)
def on_created(self, event): def on_created(self, event):

View file

@ -57,6 +57,23 @@ def get_playlist(path=None, plex_id=None):
return playlist return playlist
def get_all_kodi_playlist_paths():
"""
Returns a list with all paths for the playlists on the Kodi side
"""
with PlexDB() as plexdb:
paths = list(plexdb.all_kodi_paths())
return paths
def wipe_table():
"""
Deletes all playlists entries in the Plex DB
"""
with PlexDB() as plexdb:
plexdb.wipe_playlists()
def _m3u_iterator(text): def _m3u_iterator(text):
""" """
Yields e.g. plugin://plugin.video.plexkodiconnect.movies/?plex_id=xxx Yields e.g. plugin://plugin.video.plexkodiconnect.movies/?plex_id=xxx

View file

@ -96,6 +96,21 @@ def delete(playlist):
db.update_playlist(playlist, delete=True) db.update_playlist(playlist, delete=True)
def delete_kodi_playlists(playlist_paths):
"""
Deletes all the the playlist files passed in; WILL IGNORE THIS CHANGE ON
THE PLEX SIDE!
"""
for path in playlist_paths:
try:
path_ops.remove(path)
# Ensure we're not deleting the playlists on the Plex side later
IGNORE_KODI_PLAYLIST_CHANGE.append(path)
LOG.info('Removed playlist %s', path)
except (OSError, IOError):
LOG.warn('Could not remove playlist %s', path)
def _write_playlist_to_file(playlist, xml): def _write_playlist_to_file(playlist, xml):
""" """
Feed with playlist Playlist. Will write the playlist to a m3u file Feed with playlist Playlist. Will write the playlist to a m3u file

View file

@ -81,3 +81,16 @@ class Playlists(object):
playlist.kodi_type = answ[4] playlist.kodi_type = answ[4]
playlist.kodi_hash = answ[5] playlist.kodi_hash = answ[5]
return playlist return playlist
def all_kodi_paths(self):
"""
Returns a generator for all kodi_paths of all synched playlists
"""
self.cursor.execute('SELECT kodi_path FROM playlists')
return (x[0] for x in self.cursor)
def wipe_playlists(self):
"""
Deletes all entries in the playlists table
"""
self.cursor.execute('DELETE FROM playlists')

View file

@ -525,29 +525,6 @@ def delete_temporary_subtitles():
root, file, err) root, file, err)
def wipe_synched_playlists():
"""
Deletes all synched playlist files on the Kodi side; resets the Plex table
listing all synched Plex playlists
"""
from . import plex_db
try:
with plex_db.PlexDB() as plexdb:
plexdb.cursor.execute('SELECT kodi_path FROM playlists')
playlist_paths = [x[0] for x in plexdb.cursor]
except OperationalError:
# Plex DB completely empty yet
playlist_paths = []
for path in playlist_paths:
try:
path_ops.remove(path)
LOG.info('Removed playlist %s', path)
except (OSError, IOError):
LOG.warn('Could not remove playlist %s', path)
# Now wipe our database
plex_db.wipe(table='playlists')
def wipe_database(reboot=True): def wipe_database(reboot=True):
""" """
Deletes all Plex playlists as well as video nodes, then clears Kodi as well Deletes all Plex playlists as well as video nodes, then clears Kodi as well
@ -557,10 +534,10 @@ def wipe_database(reboot=True):
LOG.warn('Start wiping') LOG.warn('Start wiping')
from .library_sync.sections import delete_files from .library_sync.sections import delete_files
from . import kodi_db, plex_db from . import kodi_db, plex_db
from .playlists import remove_synced_playlists
# Clean up the playlists and video nodes # Clean up the playlists and video nodes
delete_files() delete_files()
# Wipe all synched playlists remove_synced_playlists()
wipe_synched_playlists()
try: try:
with plex_db.PlexDB() as plexdb: with plex_db.PlexDB() as plexdb:
if plexdb.songs_have_been_synced(): if plexdb.songs_have_been_synced():