diff --git a/resources/lib/initialsetup.py b/resources/lib/initialsetup.py index 0c048a60..033df380 100644 --- a/resources/lib/initialsetup.py +++ b/resources/lib/initialsetup.py @@ -640,7 +640,7 @@ class InitialSetup(object): # New installation - make sure we start with a clean slate from . import kodidb_functions - kodidb_functions.wipe_kodi_dbs() + kodidb_functions.wipe_dbs() if goto_settings is False: # Open Settings page now? You will need to restart! diff --git a/resources/lib/kodidb_functions.py b/resources/lib/kodidb_functions.py index c9194f3a..3d48674a 100644 --- a/resources/lib/kodidb_functions.py +++ b/resources/lib/kodidb_functions.py @@ -100,22 +100,6 @@ class KodiDBMethods(object): 1, 0)) - def setup_music_db_dummy_entries(self): - """ - Kodi Krypton Krypton has some dummy first entries that we might've - deleted - idArtist: 1 strArtist: [Missing Tag] - strMusicBrainzArtistID: Artist Tag Missing - """ - query = ''' - INSERT OR REPLACE INTO artist( - idArtist, strArtist, strMusicBrainzArtistID) - VALUES (?, ?, ?) - ''' - self.cursor.execute(query, (1, - '[Missing Tag]', - 'Artist Tag Missing')) - def parent_path_id(self, path): """ Video DB: Adds all subdirectories to path table while setting a "trail" @@ -1264,7 +1248,34 @@ def kodiid_from_filename(path, kodi_type=None, db_type=None): return kodi_id, kodi_type -def wipe_kodi_dbs(): +def setup_kodi_default_entries(): + """ + Makes sure that we retain the Kodi standard databases. E.g. that there + is a dummy artist with ID 1 + """ + if utils.settings('enableMusic') == 'true': + with GetKodiDB('music') as kodi_db: + query = ''' + INSERT OR REPLACE INTO artist( + idArtist, strArtist, strMusicBrainzArtistID) + VALUES (?, ?, ?) + ''' + kodi_db.cursor.execute(query, (1, + '[Missing Tag]', + 'Artist Tag Missing')) + if v.KODIVERSION >= 18: + query = ''' + INSERT OR REPLACE INTO versiontagscan( + idVersion, iNeedsScan, lastscanned) + VALUES (?, ?, ?) + ''' + kodi_db.cursor.execute(query, (v.DB_MUSIC_VERSION[v.KODIVERSION], + 0, + utils.unix_date_to_kodi( + utils.unix_timestamp()))) + + +def wipe_dbs(): """ Completely resets the Kodi databases 'video', 'texture' and 'music' (if music sync is enabled) @@ -1272,7 +1283,7 @@ def wipe_kodi_dbs(): LOG.warn('Wiping Kodi databases!') query = "SELECT name FROM sqlite_master WHERE type = 'table'" kinds = ['video', 'texture'] - if state.ENABLE_MUSIC: + if utils.settings('enableMusic') == 'true': LOG.info('Also deleting music database') kinds.append('music') for db in kinds: @@ -1282,10 +1293,14 @@ def wipe_kodi_dbs(): tables = [i[0] for i in tables] if 'version' in tables: tables.remove('version') + if 'versiontagscan' in tables: + tables.remove('versiontagscan') for table in tables: delete_query = 'DELETE FROM %s' % table kodi_db.cursor.execute(delete_query) + setup_kodi_default_entries() + # Make sure Kodi knows we wiped the databases import xbmc xbmc.executebuiltin('UpdateLibrary(video)') - if state.ENABLE_MUSIC: + if utils.settings('enableMusic') == 'true': xbmc.executebuiltin('UpdateLibrary(music)') diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py index bfc678ac..66d58347 100644 --- a/resources/lib/librarysync.py +++ b/resources/lib/librarysync.py @@ -1546,10 +1546,6 @@ class LibrarySync(Thread): with kodidb.GetKodiDB('video') as kodi_db: # Setup the paths for addon-paths (even when using direct paths) kodi_db.setup_path_table() - with kodidb.GetKodiDB('music') as kodi_db: - # Hack for a dummy genre entry - even when we're not using - # Plex Music - kodi_db.setup_music_db_dummy_entries() utils.window('plex_dbScan', clear=True) state.DB_SCAN = False playlist_monitor = None diff --git a/resources/lib/plexdb_functions.py b/resources/lib/plexdb_functions.py index 411623b2..49408479 100644 --- a/resources/lib/plexdb_functions.py +++ b/resources/lib/plexdb_functions.py @@ -490,3 +490,17 @@ class Plex_DB_Functions(): else: raise RuntimeError('Cannot delete playlist: %s' % playlist) self.plexcursor.execute(query, (var, )) + + +def wipe_dbs(): + """ + Completely resets the Plex database + """ + query = "SELECT name FROM sqlite_master WHERE type = 'table'" + with Get_Plex_DB() as plex_db: + plex_db.plexcursor.execute(query) + tables = plex_db.plexcursor.fetchall() + tables = [i[0] for i in tables] + for table in tables: + delete_query = 'DELETE FROM %s' % table + plex_db.plexcursor.execute(delete_query) diff --git a/resources/lib/utils.py b/resources/lib/utils.py index 80bc1916..b9c7891d 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -469,81 +469,37 @@ def wipe_database(): as Plex databases completely. Will also delete all cached artwork. """ + LOG.warn('Start wiping') # Clean up the playlists delete_playlists() # Clean up the video nodes delete_nodes() - - # Wipe the kodi databases - LOG.info("Resetting the Kodi video database.") - connection = kodi_sql('video') - cursor = connection.cursor() - cursor.execute('SELECT tbl_name FROM sqlite_master WHERE type="table"') - rows = cursor.fetchall() - for row in rows: - tablename = row[0] - if tablename != "version": - cursor.execute("DELETE FROM %s" % tablename) - connection.commit() - cursor.close() - - if settings('enableMusic') == "true": - LOG.info("Resetting the Kodi music database.") - connection = kodi_sql('music') - cursor = connection.cursor() - cursor.execute('SELECT tbl_name FROM sqlite_master WHERE type="table"') - rows = cursor.fetchall() - for row in rows: - tablename = row[0] - if tablename != "version": - cursor.execute("DELETE FROM %s" % tablename) - connection.commit() - cursor.close() - - # Wipe the Plex database - LOG.info("Resetting the Plex database.") - connection = kodi_sql('plex') - cursor = connection.cursor() + from . import kodidb_functions + kodidb_functions.wipe_dbs() + from . import plexdb_functions # First get the paths to all synced playlists playlist_paths = [] - cursor.execute('SELECT kodi_path FROM playlists') - for entry in cursor.fetchall(): - playlist_paths.append(entry[0]) - cursor.execute('SELECT tbl_name FROM sqlite_master WHERE type="table"') - rows = cursor.fetchall() - for row in rows: - tablename = row[0] - if tablename != "version": - cursor.execute("DELETE FROM %s" % tablename) - connection.commit() - cursor.close() - + with plexdb_functions.Get_Plex_DB() as plex_db: + plex_db.plexcursor.execute('SELECT kodi_path FROM playlists') + for entry in plex_db.plexcursor.fetchall(): + playlist_paths.append(entry[0]) + plexdb_functions.wipe_dbs() # Delete all synced playlists for path in playlist_paths: try: path_ops.remove(path) + LOG.info('Removed playlist %s', path) except (OSError, IOError): - pass + LOG.warn('Could not remove playlist %s', path) LOG.info("Resetting all cached artwork.") - # Remove all existing textures first + # Remove all cached artwork path = path_ops.translate_path("special://thumbnails/") if path_ops.exists(path): path_ops.rmtree(path, ignore_errors=True) - # remove all existing data from texture DB - connection = kodi_sql('texture') - cursor = connection.cursor() - query = 'SELECT tbl_name FROM sqlite_master WHERE type=?' - cursor.execute(query, ("table", )) - rows = cursor.fetchall() - for row in rows: - table_name = row[0] - if table_name != "version": - cursor.execute("DELETE FROM %s" % table_name) - connection.commit() - cursor.close() # reset the install run flag settings('SyncInstallRunDone', value="false") + LOG.info('Wiping done') def reset(ask_user=True): diff --git a/resources/lib/variables.py b/resources/lib/variables.py index a692ca40..1d1fed76 100644 --- a/resources/lib/variables.py +++ b/resources/lib/variables.py @@ -87,26 +87,26 @@ PKC_MACHINE_IDENTIFIER = None MIN_DB_VERSION = '2.0.27' # Database paths -_DB_VIDEO_VERSION = { +DB_VIDEO_VERSION = { 17: 107, # Krypton 18: 112 # Leia } DB_VIDEO_PATH = try_decode(xbmc.translatePath( - "special://database/MyVideos%s.db" % _DB_VIDEO_VERSION[KODIVERSION])) + "special://database/MyVideos%s.db" % DB_VIDEO_VERSION[KODIVERSION])) -_DB_MUSIC_VERSION = { +DB_MUSIC_VERSION = { 17: 60, # Krypton 18: 72 # Leia } DB_MUSIC_PATH = try_decode(xbmc.translatePath( - "special://database/MyMusic%s.db" % _DB_MUSIC_VERSION[KODIVERSION])) + "special://database/MyMusic%s.db" % DB_MUSIC_VERSION[KODIVERSION])) -_DB_TEXTURE_VERSION = { +DB_TEXTURE_VERSION = { 17: 13, # Krypton 18: 13 # Leia } DB_TEXTURE_PATH = try_decode(xbmc.translatePath( - "special://database/Textures%s.db" % _DB_TEXTURE_VERSION[KODIVERSION])) + "special://database/Textures%s.db" % DB_TEXTURE_VERSION[KODIVERSION])) DB_PLEX_PATH = try_decode(xbmc.translatePath("special://database/plex.db"))