Files
jellyfinStats/jellyfinstats/db.py

153 lines
5.3 KiB
Python

import sqlite3
from .utils import convert_uid, format_time
class PlaybackReportingDb:
def __init__(self, fn: str):
self._db = sqlite3.connect(fn)
self._closed = False
def __enter__(self):
return self
def __exit__(self, tp, val, trace):
self.close()
def close(self):
if self._closed:
return
self._db.close()
self._closed = True
def get_activitys(self, offset: int = 0, limit: int = 100,
itemType: str = None, userId: str = None,
startTime: float = None, endTime: float = None,
clientName: str = None, deviceName: str = None):
where_sqls = []
where_sql = ''
args = []
if itemType is not None:
where_sqls.append('ItemType = ?')
args.append(itemType)
if userId is not None:
where_sqls.append('UserId = ?')
args.append(userId)
if startTime is not None:
where_sqls.append('DateCreated >= ?')
args.append(format_time(startTime))
if endTime is not None:
where_sqls.append('DateCreated <= ?')
args.append(format_time(endTime))
if clientName is not None:
where_sqls.append("ClientName = ?")
args.append(clientName)
if deviceName is not None:
where_sqls.append("DeviceName = ?")
args.append(deviceName)
if len(where_sqls):
where_sql = ' WHERE ' + " AND ".join(where_sqls)
args.append(limit)
args.append(offset)
cur = self._db.execute(f"SELECT ROWID, * FROM PlaybackActivity{where_sql} LIMIT ? OFFSET ?;", args) # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
def get_client_devices(self):
cur = self._db.execute("SELECT ClientName, DeviceName FROM PlaybackActivity GROUP BY ClientName, DeviceName;") # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
def get_users(self, itemType: str = None):
where_sql = ''
args = []
if itemType is not None:
where_sql = ' WHERE ItemType = ?'
args.append(itemType)
cur = self._db.execute(f"SELECT UserId, min(DateCreated) AS MinDate, max(DateCreated) AS MaxDate FROM PlaybackActivity{where_sql} GROUP BY UserId;", args) # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
def update_playduration(self, rowid: int, duration: int):
self._db.execute("UPDATE PlaybackActivity SET PlayDuration = ? WHERE rowid = ?;", [duration, rowid]) # noqa: E501
class LibraryDb:
def __init__(self, fn: str):
self._db = sqlite3.connect(fn)
self._closed = False
def __enter__(self):
return self
def __exit__(self, tp, val, trace):
self.close()
def close(self):
if self._closed:
return
self._db.close()
self._closed = True
def get_items(self, offset: int = 0, limit: int = 100):
cur = self._db.execute("SELECT * FROM TypedBaseItems LIMIT ? OFFSET ?;", [limit, offset]) # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
def get_item(self, itemId: str):
cur = self._db.execute("SELECT * FROM TypedBaseItems WHERE PresentationUniqueKey = ?;", [itemId]) # noqa: E501
cur.row_factory = sqlite3.Row
re = cur.fetchone()
return dict(re) if re is not None else None
def get_audios(self, track: str = None, album: str = None):
args = ['MediaBrowser.Controller.Entities.Audio.Audio']
where_sql = ''
if track is not None:
where_sql += ' AND Name = ?'
args.append(track)
if album is not None:
where_sql += ' AND Album = ?'
args.append(album)
cur = self._db.execute(f"SELECT * FROM TypedBaseItems WHERE type = ?{where_sql};", args) # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
def get_albums(self, album: str = None, albumArtists: str = None):
args = ['MediaBrowser.Controller.Entities.Audio.MusicAlbum']
where_sql = ''
if album is not None:
where_sql += ' AND Name = ?'
args.append(album)
if albumArtists is not None:
where_sql += ' AND AlbumArtists = ?'
args.append(albumArtists)
cur = self._db.execute(f"SELECT * FROM TypedBaseItems WHERE type = ?{where_sql};", args) # noqa: E501
cur.row_factory = sqlite3.Row
return [dict(i) for i in cur.fetchall()]
class JellyfinDb:
def __init__(self, fn: str):
self._db = sqlite3.connect(fn)
self._closed = False
def __enter__(self):
return self
def __exit__(self, tp, val, trace):
self.close()
def close(self):
if self._closed:
return
self._db.close()
self._closed = True
def get_user(self, userId: str):
if len(userId) == 32:
userId = convert_uid(userId)
cur = self._db.execute("SELECT * FROM Users WHERE Id = ?;", [userId])
cur.row_factory = sqlite3.Row
re = cur.fetchone()
return dict(re) if re is not None else None