mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-12-25 10:16:11 +00:00
Add database discovery
This commit is contained in:
parent
d43b261f0b
commit
23686f975f
5 changed files with 91 additions and 9 deletions
|
@ -922,6 +922,14 @@ msgctxt "#33188"
|
||||||
msgid "Would you like to sync Rotten Tomatoes ratings?"
|
msgid "Would you like to sync Rotten Tomatoes ratings?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#33189"
|
||||||
|
msgid "The database version detected is unsupported. Syncing may not work, proceed anyway?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgctxt "#33190"
|
||||||
|
msgid "Enable Kodi database discovery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgctxt "#33191"
|
msgctxt "#33191"
|
||||||
msgid "Restart Emby for Kodi to apply this change?"
|
msgid "Restart Emby for Kodi to apply this change?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -31,6 +31,7 @@ class Database(object):
|
||||||
db.conn.commit()
|
db.conn.commit()
|
||||||
'''
|
'''
|
||||||
timeout = 120
|
timeout = 120
|
||||||
|
discovered = False
|
||||||
|
|
||||||
def __init__(self, file=None, commit_close=True):
|
def __init__(self, file=None, commit_close=True):
|
||||||
|
|
||||||
|
@ -42,17 +43,16 @@ class Database(object):
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
|
||||||
''' Open the connection and return the Database class.
|
''' Open the connection and return the Database class.
|
||||||
This is to allow for both the cursor and conn to be accessible.
|
This is to allow for the cursor, conn and others to be accessible.
|
||||||
at any time.
|
|
||||||
'''
|
'''
|
||||||
self.path = self._sql(self.db_file)
|
self.path = self._sql(self.db_file)
|
||||||
self.conn = sqlite3.connect(self.path, timeout=self.timeout)
|
self.conn = sqlite3.connect(self.path, timeout=self.timeout)
|
||||||
self.cursor = self.conn.cursor()
|
self.cursor = self.conn.cursor()
|
||||||
|
|
||||||
if self.db_file in ('video', 'music', 'texture', 'emby'):
|
if self.db_file in ('video', 'music', 'texture', 'emby'):
|
||||||
self.conn.execute("PRAGMA journal_mode=WAL")
|
self.conn.execute("PRAGMA journal_mode=WAL") # to avoid writing conflict with kodi
|
||||||
|
|
||||||
LOG.info("--->[ database: %s ] %s", self.db_file, id(self.conn))
|
LOG.debug("--->[ database: %s ] %s", self.db_file, id(self.conn))
|
||||||
|
|
||||||
if not window('emby_db_check.bool') and self.db_file == 'emby':
|
if not window('emby_db_check.bool') and self.db_file == 'emby':
|
||||||
|
|
||||||
|
@ -71,10 +71,32 @@ class Database(object):
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
def _discover_database(self, database):
|
||||||
|
|
||||||
|
''' Grab the first database encountered, by most recent.
|
||||||
|
Will likely not work, but heck.
|
||||||
|
'''
|
||||||
|
types = {
|
||||||
|
'video': "MyVideos",
|
||||||
|
'music': "MyMusic",
|
||||||
|
'texture': "Textures"
|
||||||
|
}
|
||||||
|
database = types[database]
|
||||||
|
dirs, files = xbmcvfs.listdir(xbmc.translatePath("special://database/").decode('utf-8'))
|
||||||
|
|
||||||
|
for file in reversed(files):
|
||||||
|
if file.startswith(database) and not file.endswith('-wal') and not file.endswith('-shm'):
|
||||||
|
|
||||||
|
LOG.info("Found database: %s", file)
|
||||||
|
self.discovered = True
|
||||||
|
|
||||||
|
return xbmc.translatePath("special://database/%s" % file.decode('utf-8')).decode('utf-8')
|
||||||
|
|
||||||
def _sql(self, file):
|
def _sql(self, file):
|
||||||
|
|
||||||
''' Get the database path based on the file objects/obj_map.json
|
''' Get the database path based on the file objects/obj_map.json
|
||||||
Compatible check, in the event multiple db version are supported with the same Kodi version.
|
Compatible check, in the event multiple db version are supported with the same Kodi version.
|
||||||
|
Discover by file as a last resort.
|
||||||
'''
|
'''
|
||||||
databases = obj.Objects().objects
|
databases = obj.Objects().objects
|
||||||
|
|
||||||
|
@ -91,13 +113,13 @@ class Database(object):
|
||||||
databases[file] = self._get_database(databases[alt_file])
|
databases[file] = self._get_database(databases[alt_file])
|
||||||
|
|
||||||
return databases[file]
|
return databases[file]
|
||||||
except IndexError: # No other db options
|
except KeyError: # No other db options
|
||||||
break
|
databases[file] = self._discover_database(file)
|
||||||
|
|
||||||
|
return databases[file]
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return xbmc.translatePath(databases[file]).decode('utf-8')
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
|
||||||
''' Close the connection and cursor.
|
''' Close the connection and cursor.
|
||||||
|
|
|
@ -53,6 +53,7 @@ class Service(xbmc.Monitor):
|
||||||
self.settings['enable_context'] = settings('enableContext.bool')
|
self.settings['enable_context'] = settings('enableContext.bool')
|
||||||
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
|
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
|
||||||
self.settings['kodi_companion'] = settings('kodiCompanion.bool')
|
self.settings['kodi_companion'] = settings('kodiCompanion.bool')
|
||||||
|
self.settings['enable_db_discovery'] = settings('AskDiscoverDatabase.bool')
|
||||||
window('emby_logLevel', value=str(self.settings['log_level']))
|
window('emby_logLevel', value=str(self.settings['log_level']))
|
||||||
window('emby_kodiProfile', value=self.settings['profile'])
|
window('emby_kodiProfile', value=self.settings['profile'])
|
||||||
settings('platformDetected', client.get_platform())
|
settings('platformDetected', client.get_platform())
|
||||||
|
@ -122,6 +123,7 @@ class Service(xbmc.Monitor):
|
||||||
|
|
||||||
window('emby.restart', clear=True)
|
window('emby.restart', clear=True)
|
||||||
dialog("notification", heading="{emby}", message=_(33193), icon="{emby}", time=1000, sound=False)
|
dialog("notification", heading="{emby}", message=_(33193), icon="{emby}", time=1000, sound=False)
|
||||||
|
reload(objects)
|
||||||
|
|
||||||
raise Exception('RestartService')
|
raise Exception('RestartService')
|
||||||
|
|
||||||
|
@ -452,6 +454,14 @@ class Service(xbmc.Monitor):
|
||||||
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
|
self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
|
||||||
LOG.warn("New context transcode setting: %s", self.settings['enable_context_transcode'])
|
LOG.warn("New context transcode setting: %s", self.settings['enable_context_transcode'])
|
||||||
|
|
||||||
|
if settings('AskDiscoverDatabase.bool') != self.settings['enable_db_discovery']:
|
||||||
|
LOG.warn(self.settings['enable_db_discovery'])
|
||||||
|
self.settings['enable_db_discovery'] = settings('AskDiscoverDatabase.bool')
|
||||||
|
LOG.warn("Enable database discovery: %s", self.settings['enable_db_discovery'])
|
||||||
|
|
||||||
|
if dialog("yesno", heading="{emby}", line1=_(33191)):
|
||||||
|
window('emby.restart.bool', True)
|
||||||
|
|
||||||
if settings('useDirectPaths') != self.settings['mode'] and self.library_thread.started:
|
if settings('useDirectPaths') != self.settings['mode'] and self.library_thread.started:
|
||||||
|
|
||||||
self.settings['mode'] = settings('useDirectPaths')
|
self.settings['mode'] = settings('useDirectPaths')
|
||||||
|
|
|
@ -116,6 +116,27 @@ class Library(threading.Thread):
|
||||||
|
|
||||||
LOG.warn("---<[ library ]")
|
LOG.warn("---<[ library ]")
|
||||||
|
|
||||||
|
def test_databases(self):
|
||||||
|
|
||||||
|
''' Open the databases to test if the file exists.
|
||||||
|
'''
|
||||||
|
with Database('video') as kodidb:
|
||||||
|
with Database('music') as musicdb:
|
||||||
|
|
||||||
|
if kodidb.discovered or musicdb.discovered:
|
||||||
|
if kodidb.path != settings('DiscoveredDatabase'):
|
||||||
|
|
||||||
|
LOG.info("Newly discovered database: %s", kodidb.path)
|
||||||
|
settings('DiscoveredDatabase', kodidb.path)
|
||||||
|
self.monitor.settings['enable_db_discovery'] = False
|
||||||
|
settings('AskDiscoverDatabase.bool', False)
|
||||||
|
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
settings('DiscoveredDatabase', "")
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
@stop()
|
@stop()
|
||||||
def service(self):
|
def service(self):
|
||||||
|
|
||||||
|
@ -294,8 +315,28 @@ class Library(threading.Thread):
|
||||||
|
|
||||||
def startup(self):
|
def startup(self):
|
||||||
|
|
||||||
''' Run at startup. Will check for the server plugin.
|
''' Run at startup.
|
||||||
|
Check databases.
|
||||||
|
Check for the server plugin.
|
||||||
'''
|
'''
|
||||||
|
if not self.test_databases():
|
||||||
|
if settings('AskDiscoverDatabase.bool'):
|
||||||
|
|
||||||
|
self.monitor.settings['enable_db_discovery'] = False
|
||||||
|
settings('AskDiscoverDatabase.bool', False)
|
||||||
|
result = dialog("yesno", heading="{emby}", line1=_(33189))
|
||||||
|
settings('DiscoverDatabase.bool', result == 1)
|
||||||
|
|
||||||
|
if not result:
|
||||||
|
LOG.info("Do not discover database again.")
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
elif not settings('DiscoverDatabase.bool'):
|
||||||
|
LOG.info("Do not re-discover database again.")
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
Views().get_views()
|
Views().get_views()
|
||||||
Views().get_nodes()
|
Views().get_nodes()
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
<setting label="30507" id="syncIndicator" type="number" default="99" visible="eq(-1,true)" subsetting="true"/>
|
<setting label="30507" id="syncIndicator" type="number" default="99" visible="eq(-1,true)" subsetting="true"/>
|
||||||
<setting label="33185" id="syncDuringPlay" type="bool" default="true" />
|
<setting label="33185" id="syncDuringPlay" type="bool" default="true" />
|
||||||
<setting label="30536" id="dbSyncScreensaver" type="bool" default="true" />
|
<setting label="30536" id="dbSyncScreensaver" type="bool" default="true" />
|
||||||
|
<setting label="33190" id="AskDiscoverDatabase" type="bool" default="true" />
|
||||||
<setting label="33111" type="lsep" />
|
<setting label="33111" type="lsep" />
|
||||||
<setting label="30511" id="useDirectPaths" type="enum" lvalues="33036|33037" default="1" />
|
<setting label="30511" id="useDirectPaths" type="enum" lvalues="33036|33037" default="1" />
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue