Fix OperationalError when resetting PKC
This commit is contained in:
parent
764f132f66
commit
56324b1e88
6 changed files with 73 additions and 38 deletions
|
@ -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')
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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():
|
||||||
|
|
Loading…
Reference in a new issue