2015-12-25 06:51:47 +11:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2016-02-12 00:03:04 +11:00
|
|
|
###############################################################################
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2018-02-11 22:59:04 +11:00
|
|
|
from utils import kodi_sql
|
2017-02-02 05:56:06 +11:00
|
|
|
import variables as v
|
2016-08-30 02:44:27 +10:00
|
|
|
|
2016-08-30 04:00:16 +10:00
|
|
|
###############################################################################
|
2016-08-30 02:44:27 +10:00
|
|
|
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-05 06:57:16 +11:00
|
|
|
class Get_Plex_DB():
|
2016-02-10 21:00:32 +11:00
|
|
|
"""
|
2017-01-08 06:11:48 +11:00
|
|
|
Usage: with Get_Plex_DB() as plex_db:
|
|
|
|
plex_db.do_something()
|
2016-02-10 21:00:32 +11:00
|
|
|
|
|
|
|
On exiting "with" (no matter what), commits get automatically committed
|
|
|
|
and the db gets closed
|
|
|
|
"""
|
|
|
|
def __enter__(self):
|
2018-02-11 22:59:04 +11:00
|
|
|
self.plexconn = kodi_sql('plex')
|
2017-01-08 06:11:48 +11:00
|
|
|
return Plex_DB_Functions(self.plexconn.cursor())
|
2016-02-10 21:00:32 +11:00
|
|
|
|
|
|
|
def __exit__(self, type, value, traceback):
|
2017-01-05 06:57:16 +11:00
|
|
|
self.plexconn.commit()
|
|
|
|
self.plexconn.close()
|
2016-02-10 21:00:32 +11:00
|
|
|
|
|
|
|
|
2017-01-05 06:57:16 +11:00
|
|
|
class Plex_DB_Functions():
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-05 06:57:16 +11:00
|
|
|
def __init__(self, plexcursor):
|
|
|
|
self.plexcursor = plexcursor
|
2015-12-25 06:51:47 +11:00
|
|
|
|
|
|
|
def getViews(self):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
Returns a list of view_id
|
|
|
|
"""
|
2015-12-25 06:51:47 +11:00
|
|
|
views = []
|
2017-01-08 06:11:48 +11:00
|
|
|
query = '''
|
|
|
|
SELECT view_id
|
|
|
|
FROM view
|
|
|
|
'''
|
2017-01-05 06:57:16 +11:00
|
|
|
self.plexcursor.execute(query)
|
|
|
|
rows = self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
for row in rows:
|
|
|
|
views.append(row[0])
|
|
|
|
return views
|
|
|
|
|
2016-01-28 06:41:28 +11:00
|
|
|
def getAllViewInfo(self):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
2017-02-01 20:41:44 +11:00
|
|
|
Returns a list of dicts for all Plex libraries:
|
|
|
|
{
|
|
|
|
'id': view_id,
|
|
|
|
'name': view_name,
|
|
|
|
'itemtype': kodi_type
|
|
|
|
'kodi_tagid'
|
|
|
|
'sync_to_kodi'
|
|
|
|
}
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
2017-01-05 06:57:16 +11:00
|
|
|
plexcursor = self.plexcursor
|
2016-01-28 06:41:28 +11:00
|
|
|
views = []
|
2017-02-01 20:41:44 +11:00
|
|
|
query = '''SELECT * FROM view'''
|
2017-01-05 06:57:16 +11:00
|
|
|
plexcursor.execute(query)
|
|
|
|
rows = plexcursor.fetchall()
|
2016-01-28 06:41:28 +11:00
|
|
|
for row in rows:
|
|
|
|
views.append({'id': row[0],
|
|
|
|
'name': row[1],
|
2017-02-01 20:41:44 +11:00
|
|
|
'itemtype': row[2],
|
|
|
|
'kodi_tagid': row[3],
|
|
|
|
'sync_to_kodi': row[4]})
|
2016-01-28 06:41:28 +11:00
|
|
|
return views
|
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getView_byId(self, view_id):
|
|
|
|
"""
|
|
|
|
Returns tuple (view_name, kodi_type, kodi_tagid) for view_id
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT view_name, kodi_type, kodi_tagid
|
|
|
|
FROM view
|
|
|
|
WHERE view_id = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (view_id,))
|
2017-01-05 06:57:16 +11:00
|
|
|
view = self.plexcursor.fetchone()
|
2015-12-25 06:51:47 +11:00
|
|
|
return view
|
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getView_byType(self, kodi_type):
|
|
|
|
"""
|
|
|
|
Returns a list of dicts for kodi_type:
|
|
|
|
{'id': view_id, 'name': view_name, 'itemtype': kodi_type}
|
|
|
|
"""
|
2015-12-25 06:51:47 +11:00
|
|
|
views = []
|
2017-01-08 06:11:48 +11:00
|
|
|
query = '''
|
|
|
|
SELECT view_id, view_name, kodi_type
|
|
|
|
FROM view
|
|
|
|
WHERE kodi_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (kodi_type,))
|
2017-01-05 06:57:16 +11:00
|
|
|
rows = self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
for row in rows:
|
|
|
|
views.append({
|
|
|
|
'id': row[0],
|
2016-01-28 06:41:28 +11:00
|
|
|
'name': row[1],
|
|
|
|
'itemtype': row[2]
|
2015-12-25 06:51:47 +11:00
|
|
|
})
|
|
|
|
return views
|
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getView_byName(self, view_name):
|
|
|
|
"""
|
|
|
|
Returns the view_id for view_name (or None)
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT view_id
|
|
|
|
FROM view
|
|
|
|
WHERE view_name = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (view_name,))
|
2015-12-25 06:51:47 +11:00
|
|
|
try:
|
2017-01-05 06:57:16 +11:00
|
|
|
view = self.plexcursor.fetchone()[0]
|
2015-12-25 06:51:47 +11:00
|
|
|
except TypeError:
|
|
|
|
view = None
|
|
|
|
return view
|
|
|
|
|
2017-02-01 20:41:44 +11:00
|
|
|
def addView(self, view_id, view_name, kodi_type, kodi_tagid, sync=True):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
Appends an entry to the view table
|
2017-02-01 20:41:44 +11:00
|
|
|
|
|
|
|
sync=False: Plex library won't be synced to Kodi
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
query = '''
|
2015-12-25 06:51:47 +11:00
|
|
|
INSERT INTO view(
|
2017-02-01 20:41:44 +11:00
|
|
|
view_id, view_name, kodi_type, kodi_tagid, sync_to_kodi)
|
|
|
|
VALUES (?, ?, ?, ?, ?)
|
2015-12-25 06:51:47 +11:00
|
|
|
'''
|
2017-01-08 06:11:48 +11:00
|
|
|
self.plexcursor.execute(query,
|
2017-02-01 20:41:44 +11:00
|
|
|
(view_id,
|
|
|
|
view_name,
|
|
|
|
kodi_type,
|
|
|
|
kodi_tagid,
|
|
|
|
1 if sync is True else 0))
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def updateView(self, view_name, kodi_tagid, view_id):
|
|
|
|
"""
|
|
|
|
Updates the view_id with view_name and kodi_tagid
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
UPDATE view
|
|
|
|
SET view_name = ?, kodi_tagid = ?
|
|
|
|
WHERE view_id = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (view_name, kodi_tagid, view_id))
|
|
|
|
|
|
|
|
def removeView(self, view_id):
|
|
|
|
query = '''
|
|
|
|
DELETE FROM view
|
|
|
|
WHERE view_id = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (view_id,))
|
|
|
|
|
2017-02-01 22:16:35 +11:00
|
|
|
def get_items_by_viewid(self, view_id):
|
|
|
|
"""
|
|
|
|
Returns a list for view_id with one item like this:
|
|
|
|
{
|
|
|
|
'plex_id': xxx
|
|
|
|
'kodi_type': xxx
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
query = '''SELECT plex_id, kodi_type FROM plex WHERE view_id = ?'''
|
|
|
|
self.plexcursor.execute(query, (view_id, ))
|
|
|
|
rows = self.plexcursor.fetchall()
|
|
|
|
res = []
|
|
|
|
for row in rows:
|
|
|
|
res.append({'plex_id': row[0], 'kodi_type': row[1]})
|
|
|
|
return res
|
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byFileId(self, kodi_fileid, kodi_type):
|
2016-03-12 00:42:14 +11:00
|
|
|
"""
|
2017-01-08 06:11:48 +11:00
|
|
|
Returns plex_id for kodi_fileid and kodi_type
|
2016-03-18 02:03:02 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
None if not found
|
2016-03-18 02:03:02 +11:00
|
|
|
"""
|
2017-01-08 06:11:48 +11:00
|
|
|
query = '''
|
2018-04-09 15:15:12 +10:00
|
|
|
SELECT plex_id FROM plex WHERE kodi_fileid = ? AND kodi_type = ?
|
|
|
|
LIMIT 1
|
2017-01-08 06:11:48 +11:00
|
|
|
'''
|
2018-04-09 15:15:12 +10:00
|
|
|
self.plexcursor.execute(query, (kodi_fileid, kodi_type))
|
2016-03-12 00:42:14 +11:00
|
|
|
try:
|
2017-01-05 06:57:16 +11:00
|
|
|
item = self.plexcursor.fetchone()[0]
|
2018-04-09 15:15:12 +10:00
|
|
|
except TypeError:
|
|
|
|
item = None
|
|
|
|
return item
|
2016-03-12 00:42:14 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byId(self, plex_id):
|
|
|
|
"""
|
|
|
|
For plex_id, returns the tuple
|
2018-05-21 02:15:09 +10:00
|
|
|
(kodi_id, kodi_fileid, kodi_pathid, parent_id, kodi_type, plex_type,
|
|
|
|
kodi_fileid_2)
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
None if not found
|
|
|
|
"""
|
|
|
|
query = '''
|
2018-03-12 01:23:32 +11:00
|
|
|
SELECT kodi_id, kodi_fileid, kodi_pathid, parent_id, kodi_type,
|
2018-05-21 02:15:09 +10:00
|
|
|
plex_type, kodi_fileid_2
|
2018-03-12 01:23:32 +11:00
|
|
|
FROM plex WHERE plex_id = ?
|
|
|
|
LIMIT 1
|
2017-01-08 06:11:48 +11:00
|
|
|
'''
|
2018-03-12 01:23:32 +11:00
|
|
|
self.plexcursor.execute(query, (plex_id,))
|
|
|
|
return self.plexcursor.fetchone()
|
2016-03-16 22:13:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byWildId(self, plex_id):
|
|
|
|
"""
|
|
|
|
Returns a list of tuples (kodi_id, kodi_type) for plex_id (% appended)
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT kodi_id, kodi_type
|
|
|
|
FROM plex
|
|
|
|
WHERE plex_id LIKE ?
|
|
|
|
'''
|
2018-04-09 15:15:12 +10:00
|
|
|
self.plexcursor.execute(query, (plex_id + "%",))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchall()
|
2016-03-16 22:13:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byView(self, view_id):
|
|
|
|
"""
|
|
|
|
Returns kodi_id for view_id
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT kodi_id
|
|
|
|
FROM plex
|
|
|
|
WHERE view_id = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (view_id,))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byKodiId(self, kodi_id, kodi_type):
|
2016-03-12 00:42:14 +11:00
|
|
|
"""
|
2017-05-07 23:02:45 +10:00
|
|
|
Returns the tuple (plex_id, parent_id, plex_type) for kodi_id and
|
|
|
|
kodi_type
|
2016-03-12 00:42:14 +11:00
|
|
|
"""
|
2017-01-08 06:11:48 +11:00
|
|
|
query = '''
|
2017-05-07 23:02:45 +10:00
|
|
|
SELECT plex_id, parent_id, plex_type
|
2017-01-08 06:11:48 +11:00
|
|
|
FROM plex
|
2018-04-09 15:15:12 +10:00
|
|
|
WHERE kodi_id = ? AND kodi_type = ?
|
2018-04-11 16:50:51 +10:00
|
|
|
LIMIT 1
|
2017-01-08 06:11:48 +11:00
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (kodi_id, kodi_type,))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchone()
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItem_byParentId(self, parent_id, kodi_type):
|
|
|
|
"""
|
2018-03-12 01:23:32 +11:00
|
|
|
Returns a list of tuples (plex_id, kodi_id, kodi_fileid) for parent_id,
|
2017-01-08 06:11:48 +11:00
|
|
|
kodi_type
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT plex_id, kodi_id, kodi_fileid
|
|
|
|
FROM plex
|
2018-03-12 01:23:32 +11:00
|
|
|
WHERE parent_id = ? AND kodi_type = ?
|
2017-01-08 06:11:48 +11:00
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (parent_id, kodi_type,))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def getItemId_byParentId(self, parent_id, kodi_type):
|
|
|
|
"""
|
|
|
|
Returns the tuple (plex_id, kodi_id) for parent_id, kodi_type
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT plex_id, kodi_id
|
|
|
|
FROM plex
|
|
|
|
WHERE parent_id = ?
|
|
|
|
AND kodi_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (parent_id, kodi_type,))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2018-02-12 00:42:49 +11:00
|
|
|
def checksum(self, plex_type):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
Returns a list of tuples (plex_id, checksum) for plex_type
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
SELECT plex_id, checksum
|
|
|
|
FROM plex
|
|
|
|
WHERE plex_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (plex_type,))
|
2017-01-05 06:57:16 +11:00
|
|
|
return self.plexcursor.fetchall()
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def addReference(self, plex_id, plex_type, kodi_id, kodi_type,
|
2018-05-21 02:15:09 +10:00
|
|
|
kodi_fileid=None, kodi_fileid_2=None, kodi_pathid=None,
|
|
|
|
parent_id=None, checksum=None, view_id=None):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
Appends or replaces an entry into the plex table
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
INSERT OR REPLACE INTO plex(
|
2018-05-21 02:15:09 +10:00
|
|
|
plex_id, kodi_id, kodi_fileid, kodi_fileid_2, kodi_pathid,
|
|
|
|
plex_type, kodi_type, parent_id, checksum, view_id,
|
|
|
|
fanart_synced)
|
|
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
2015-12-25 06:51:47 +11:00
|
|
|
'''
|
2017-01-08 06:11:48 +11:00
|
|
|
self.plexcursor.execute(query, (plex_id, kodi_id, kodi_fileid,
|
2018-05-21 02:15:09 +10:00
|
|
|
kodi_fileid_2, kodi_pathid, plex_type,
|
|
|
|
kodi_type, parent_id, checksum, view_id,
|
|
|
|
0))
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def updateReference(self, plex_id, checksum):
|
|
|
|
"""
|
|
|
|
Updates checksum for plex_id
|
|
|
|
"""
|
|
|
|
query = "UPDATE plex SET checksum = ? WHERE plex_id = ?"
|
|
|
|
self.plexcursor.execute(query, (checksum, plex_id))
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2016-05-31 16:06:42 +10:00
|
|
|
def updateParentId(self, plexid, parent_kodiid):
|
2017-01-08 06:11:48 +11:00
|
|
|
"""
|
|
|
|
Updates parent_id for plex_id
|
|
|
|
"""
|
|
|
|
query = "UPDATE plex SET parent_id = ? WHERE plex_id = ?"
|
2017-01-05 06:57:16 +11:00
|
|
|
self.plexcursor.execute(query, (parent_kodiid, plexid))
|
2015-12-25 06:51:47 +11:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def removeItems_byParentId(self, parent_id, kodi_type):
|
|
|
|
"""
|
|
|
|
Removes all entries with parent_id and kodi_type
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
DELETE FROM plex
|
|
|
|
WHERE parent_id = ?
|
|
|
|
AND kodi_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (parent_id, kodi_type,))
|
|
|
|
|
|
|
|
def removeItem_byKodiId(self, kodi_id, kodi_type):
|
|
|
|
"""
|
|
|
|
Removes the one entry with kodi_id and kodi_type
|
|
|
|
"""
|
|
|
|
query = '''
|
|
|
|
DELETE FROM plex
|
|
|
|
WHERE kodi_id = ?
|
|
|
|
AND kodi_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (kodi_id, kodi_type,))
|
|
|
|
|
|
|
|
def removeItem(self, plex_id):
|
|
|
|
"""
|
|
|
|
Removes the one entry with plex_id
|
|
|
|
"""
|
2018-03-12 01:23:32 +11:00
|
|
|
self.plexcursor.execute('DELETE FROM plex WHERE plex_id = ?',
|
|
|
|
(plex_id,))
|
2016-09-11 03:49:03 +10:00
|
|
|
|
2017-01-08 06:11:48 +11:00
|
|
|
def itemsByType(self, plex_type):
|
|
|
|
"""
|
|
|
|
Returns a list of dicts for plex_type:
|
2016-09-11 03:49:03 +10:00
|
|
|
{
|
2017-02-02 22:27:21 +11:00
|
|
|
'plex_id': plex_id
|
2017-01-08 06:11:48 +11:00
|
|
|
'kodiId': kodi_id
|
|
|
|
'kodi_type': kodi_type
|
|
|
|
'plex_type': plex_type
|
2016-09-11 03:49:03 +10:00
|
|
|
}
|
|
|
|
"""
|
2017-01-08 06:11:48 +11:00
|
|
|
query = '''
|
|
|
|
SELECT plex_id, kodi_id, kodi_type
|
|
|
|
FROM plex
|
|
|
|
WHERE plex_type = ?
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query, (plex_type, ))
|
2016-09-11 03:49:03 +10:00
|
|
|
result = []
|
2017-01-05 06:57:16 +11:00
|
|
|
for row in self.plexcursor.fetchall():
|
2016-09-11 03:49:03 +10:00
|
|
|
result.append({
|
2017-02-02 22:27:21 +11:00
|
|
|
'plex_id': row[0],
|
2016-09-11 03:49:03 +10:00
|
|
|
'kodiId': row[1],
|
|
|
|
'kodi_type': row[2],
|
2017-01-08 06:11:48 +11:00
|
|
|
'plex_type': plex_type
|
2016-09-11 03:49:03 +10:00
|
|
|
})
|
|
|
|
return result
|
2017-02-02 05:56:06 +11:00
|
|
|
|
|
|
|
def set_fanart_synched(self, plex_id):
|
|
|
|
"""
|
|
|
|
Sets the fanart_synced flag to 1 for plex_id
|
|
|
|
"""
|
2018-04-09 15:15:12 +10:00
|
|
|
query = 'UPDATE plex SET fanart_synced = 1 WHERE plex_id = ?'
|
2017-02-02 05:56:06 +11:00
|
|
|
self.plexcursor.execute(query, (plex_id,))
|
|
|
|
|
|
|
|
def get_missing_fanart(self):
|
|
|
|
"""
|
2017-02-02 22:27:21 +11:00
|
|
|
Returns a list of {'plex_id': x, 'plex_type': y} where fanart_synced
|
2017-02-02 05:56:06 +11:00
|
|
|
flag is set to 0
|
|
|
|
|
|
|
|
This only for plex_type is either movie or TV show
|
|
|
|
"""
|
|
|
|
query = '''
|
2017-02-02 22:27:21 +11:00
|
|
|
SELECT plex_id, plex_type FROM plex
|
2017-02-02 05:56:06 +11:00
|
|
|
WHERE fanart_synced = ?
|
|
|
|
AND (plex_type = ? OR plex_type = ?)
|
|
|
|
'''
|
|
|
|
self.plexcursor.execute(query,
|
|
|
|
(0, v.PLEX_TYPE_MOVIE, v.PLEX_TYPE_SHOW))
|
|
|
|
rows = self.plexcursor.fetchall()
|
|
|
|
result = []
|
|
|
|
for row in rows:
|
|
|
|
result.append({'plex_id': row[0],
|
2017-02-02 22:27:21 +11:00
|
|
|
'plex_type': row[1]})
|
2017-02-02 05:56:06 +11:00
|
|
|
return result
|