jellyfin-kodi/resources/lib/database.py

101 lines
3.0 KiB
Python
Raw Normal View History

2016-11-04 01:36:05 +00:00
# -*- coding: utf-8 -*-
#################################################################################################
2016-11-04 04:45:37 +00:00
import logging
2016-11-04 01:36:05 +00:00
import sqlite3
import xbmc
#################################################################################################
2016-11-04 04:45:37 +00:00
log = logging.getLogger("EMBY."+__name__)
2016-11-04 01:36:05 +00:00
KODI = xbmc.getInfoLabel('System.BuildVersion')[:2]
#################################################################################################
def video_database():
db_version = {
'13': 78, # Gotham
'14': 90, # Helix
'15': 93, # Isengard
'16': 99, # Jarvis
2016-11-04 01:38:01 +00:00
'17': 107 # Krypton
2016-11-04 01:36:05 +00:00
}
path = xbmc.translatePath("special://database/MyVideos%s.db"
% db_version.get(KODI, "")).decode('utf-8')
return path
def music_database():
db_version = {
'13': 46, # Gotham
'14': 48, # Helix
'15': 52, # Isengard
'16': 56, # Jarvis
'17': 60 # Krypton
}
path = xbmc.translatePath("special://database/MyMusic%s.db"
% db_version.get(KODI, "")).decode('utf-8')
return path
class DatabaseConn(object):
2016-11-04 11:39:49 +00:00
# To be called as context manager - i.e. with DatabaseConn() as conn: #dostuff
2016-11-04 01:36:05 +00:00
2016-11-04 06:28:02 +00:00
def __init__(self, database_file="video", commit_mode="", timeout=20):
2016-11-04 01:36:05 +00:00
"""
2016-11-04 06:28:02 +00:00
database_file can be custom: emby, texture, music, video, :memory: or path to the file
2016-11-04 01:36:05 +00:00
commit_mode set to None to autocommit (isolation_level). See python documentation.
"""
self.db_file = database_file
self.commit_mode = commit_mode
2016-11-04 06:28:02 +00:00
self.timeout = timeout
2016-11-04 01:36:05 +00:00
def __enter__(self):
# Open the connection
self.path = self._SQL(self.db_file)
2016-11-04 11:39:49 +00:00
log.info("opening database: %s", self.path)
2016-11-04 06:28:02 +00:00
self.conn = sqlite3.connect(self.path,
isolation_level=self.commit_mode,
timeout=self.timeout)
2016-11-04 01:36:05 +00:00
return self.conn
def _SQL(self, media_type):
if media_type == "emby":
return xbmc.translatePath("special://database/emby.db").decode('utf-8')
elif media_type == "texture":
return xbmc.translatePath("special://database/Textures13.db").decode('utf-8')
elif media_type == "music":
return music_database()
elif media_type == "video":
return video_database()
else: # custom path
return self.db_file
def __exit__(self, exc_type, exc_val, exc_tb):
# Close the connection
2016-11-04 11:39:49 +00:00
changes = self.conn.total_changes
2016-11-04 01:36:05 +00:00
if exc_type is not None:
# Errors were raised in the with statement
2016-11-04 04:45:37 +00:00
log.error("rollback: Type: %s Value: %s", exc_type, exc_val)
2016-11-04 01:36:05 +00:00
self.conn.rollback()
if not "database is locked" in exc_val:
raise
2016-11-04 01:36:05 +00:00
2016-11-04 11:39:49 +00:00
elif self.commit_mode is not None and changes:
log.info("number of rows updated: %s", changes)
2016-11-04 01:36:05 +00:00
self.conn.commit()
2016-11-04 11:39:49 +00:00
log.info("close: %s", self.path)
2016-11-04 01:36:05 +00:00
self.conn.close()