TV Shows sync up and running
This commit is contained in:
parent
08a0c38704
commit
9f3db90a7c
2 changed files with 42 additions and 115 deletions
|
@ -25,6 +25,10 @@ import PlexAPI
|
||||||
|
|
||||||
|
|
||||||
class Items(object):
|
class Items(object):
|
||||||
|
"""
|
||||||
|
Items to be called with "with Items as xxx:" to ensure that __enter__
|
||||||
|
method is called!
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.clientInfo = clientinfo.ClientInfo()
|
self.clientInfo = clientinfo.ClientInfo()
|
||||||
|
@ -40,6 +44,9 @@ class Items(object):
|
||||||
self.emby = embyserver.Read_EmbyServer()
|
self.emby = embyserver.Read_EmbyServer()
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
"""
|
||||||
|
Open DB connections and cursors
|
||||||
|
"""
|
||||||
self.embyconn = utils.kodiSQL('emby')
|
self.embyconn = utils.kodiSQL('emby')
|
||||||
self.embycursor = self.embyconn.cursor()
|
self.embycursor = self.embyconn.cursor()
|
||||||
self.kodiconn = utils.kodiSQL('video')
|
self.kodiconn = utils.kodiSQL('video')
|
||||||
|
@ -471,73 +478,6 @@ class Movies(Items):
|
||||||
# resume = API.adjustResume(userdata['Resume'])
|
# resume = API.adjustResume(userdata['Resume'])
|
||||||
kodi_db.addPlaystate(fileid, resume, runtime, playcount, dateplayed)
|
kodi_db.addPlaystate(fileid, resume, runtime, playcount, dateplayed)
|
||||||
|
|
||||||
def add_updateBoxset(self, boxset):
|
|
||||||
|
|
||||||
emby = self.emby
|
|
||||||
emby_db = self.emby_db
|
|
||||||
kodi_db = self.kodi_db
|
|
||||||
artwork = self.artwork
|
|
||||||
|
|
||||||
boxsetid = boxset['Id']
|
|
||||||
title = boxset['Name']
|
|
||||||
checksum = boxset['Etag']
|
|
||||||
emby_dbitem = emby_db.getItem_byId(boxsetid)
|
|
||||||
try:
|
|
||||||
setid = emby_dbitem[0]
|
|
||||||
|
|
||||||
except TypeError:
|
|
||||||
setid = kodi_db.createBoxset(title)
|
|
||||||
|
|
||||||
# Process artwork
|
|
||||||
artwork.addArtwork(artwork.getAllArtwork(boxset), setid, "set", self.kodicursor)
|
|
||||||
|
|
||||||
# Process movies inside boxset
|
|
||||||
current_movies = emby_db.getItemId_byParentId(setid, "movie")
|
|
||||||
process = []
|
|
||||||
try:
|
|
||||||
# Try to convert tuple to dictionary
|
|
||||||
current = dict(current_movies)
|
|
||||||
except ValueError:
|
|
||||||
current = {}
|
|
||||||
|
|
||||||
# Sort current titles
|
|
||||||
for current_movie in current:
|
|
||||||
process.append(current_movie)
|
|
||||||
|
|
||||||
# New list to compare
|
|
||||||
boxsetMovies = emby.getMovies_byBoxset(boxsetid)
|
|
||||||
for movie in boxsetMovies['Items']:
|
|
||||||
|
|
||||||
itemid = movie['Id']
|
|
||||||
|
|
||||||
if not current.get(itemid):
|
|
||||||
# Assign boxset to movie
|
|
||||||
emby_dbitem = emby_db.getItem_byId(itemid)
|
|
||||||
try:
|
|
||||||
movieid = emby_dbitem[0]
|
|
||||||
except TypeError:
|
|
||||||
self.logMsg("Failed to add: %s to boxset." % movie['Name'], 1)
|
|
||||||
continue
|
|
||||||
|
|
||||||
self.logMsg("New addition to boxset %s: %s" % (title, movie['Name']), 1)
|
|
||||||
kodi_db.assignBoxset(setid, movieid)
|
|
||||||
# Update emby reference
|
|
||||||
emby_db.updateParentId(itemid, setid)
|
|
||||||
else:
|
|
||||||
# Remove from process, because the item still belongs
|
|
||||||
process.remove(itemid)
|
|
||||||
|
|
||||||
# Process removals from boxset
|
|
||||||
for movie in process:
|
|
||||||
movieid = current[movie]
|
|
||||||
self.logMsg("Remove from boxset %s: %s" % (title, movieid))
|
|
||||||
kodi_db.removefromBoxset(movieid)
|
|
||||||
# Update emby reference
|
|
||||||
emby_db.updateParentId(movie, None)
|
|
||||||
|
|
||||||
# Update the reference in the emby table
|
|
||||||
emby_db.addReference(boxsetid, setid, "BoxSet", mediatype="set", checksum=checksum)
|
|
||||||
|
|
||||||
def updateUserdata(self, item):
|
def updateUserdata(self, item):
|
||||||
# This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
|
# This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
|
||||||
# Poster with progress bar
|
# Poster with progress bar
|
||||||
|
@ -616,8 +556,8 @@ class Movies(Items):
|
||||||
|
|
||||||
self.logMsg("Deleted %s %s from kodi database" % (mediatype, itemid), 1)
|
self.logMsg("Deleted %s %s from kodi database" % (mediatype, itemid), 1)
|
||||||
|
|
||||||
class HomeVideos(Items):
|
|
||||||
|
|
||||||
|
class HomeVideos(Items):
|
||||||
|
|
||||||
def __init__(self, embycursor, kodicursor):
|
def __init__(self, embycursor, kodicursor):
|
||||||
Items.__init__(self, embycursor, kodicursor)
|
Items.__init__(self, embycursor, kodicursor)
|
||||||
|
@ -1221,11 +1161,9 @@ class TVShows(Items):
|
||||||
if not pdialog and self.contentmsg:
|
if not pdialog and self.contentmsg:
|
||||||
self.contentPop(title)
|
self.contentPop(title)
|
||||||
|
|
||||||
|
|
||||||
def add_update(self, item, viewtag=None, viewid=None):
|
def add_update(self, item, viewtag=None, viewid=None):
|
||||||
# Process single tvshow
|
# Process single tvshow
|
||||||
kodicursor = self.kodicursor
|
kodicursor = self.kodicursor
|
||||||
emby = self.emby
|
|
||||||
emby_db = self.emby_db
|
emby_db = self.emby_db
|
||||||
kodi_db = self.kodi_db
|
kodi_db = self.kodi_db
|
||||||
artwork = self.artwork
|
artwork = self.artwork
|
||||||
|
@ -1246,7 +1184,6 @@ class TVShows(Items):
|
||||||
showid = emby_dbitem[0]
|
showid = emby_dbitem[0]
|
||||||
pathid = emby_dbitem[2]
|
pathid = emby_dbitem[2]
|
||||||
self.logMsg("showid: %s pathid: %s" % (showid, pathid), 1)
|
self.logMsg("showid: %s pathid: %s" % (showid, pathid), 1)
|
||||||
|
|
||||||
except TypeError:
|
except TypeError:
|
||||||
update_item = False
|
update_item = False
|
||||||
self.logMsg("showid: %s not found." % itemid, 2)
|
self.logMsg("showid: %s not found." % itemid, 2)
|
||||||
|
@ -1404,32 +1341,22 @@ class TVShows(Items):
|
||||||
artwork.addArtwork(allartworks, seasonid, "season", kodicursor)
|
artwork.addArtwork(allartworks, seasonid, "season", kodicursor)
|
||||||
|
|
||||||
def add_updateSeason(self, item, viewid=None, viewtag=None):
|
def add_updateSeason(self, item, viewid=None, viewtag=None):
|
||||||
self.logMsg("add_updateSeason called with", 1)
|
API = PlexAPI.API(item)
|
||||||
self.logMsg("item: %s" % item, 1)
|
|
||||||
self.logMsg("viewid: %s" % viewid, 1)
|
|
||||||
self.logMsg("viewName: %s" % viewtag, 1)
|
|
||||||
showid = viewid
|
showid = viewid
|
||||||
itemid = viewid
|
itemid = API.getKey()
|
||||||
kodicursor = self.kodicursor
|
kodicursor = self.kodicursor
|
||||||
emby_db = self.emby_db
|
emby_db = self.emby_db
|
||||||
kodi_db = self.kodi_db
|
kodi_db = self.kodi_db
|
||||||
artwork = self.artwork
|
artwork = self.artwork
|
||||||
API = PlexAPI.API(item)
|
|
||||||
self.logMsg("add_updateSeason initialization done", 1)
|
|
||||||
|
|
||||||
seasonnum = API.getIndex()
|
seasonnum = API.getIndex()
|
||||||
self.logMsg("seasonnum: %s" % seasonnum, 1)
|
|
||||||
seasonid = kodi_db.addSeason(showid, seasonnum)
|
seasonid = kodi_db.addSeason(showid, seasonnum)
|
||||||
self.logMsg("seasonid: %s" % seasonid, 1)
|
|
||||||
# Create the reference in emby table
|
# Create the reference in emby table
|
||||||
emby_db.addReference(itemid, seasonid, "Season", "season", parentid=showid)
|
emby_db.addReference(itemid, seasonid, "Season", "season", parentid=showid)
|
||||||
self.logMsg("Added db reference", 1)
|
|
||||||
|
|
||||||
# Process artwork
|
# Process artwork
|
||||||
allartworks = API.getAllArtwork()
|
allartworks = API.getAllArtwork()
|
||||||
self.logMsg("Gotten allartworks: %s" % allartworks, 1)
|
|
||||||
artwork.addArtwork(allartworks, seasonid, "season", kodicursor)
|
artwork.addArtwork(allartworks, seasonid, "season", kodicursor)
|
||||||
self.logMsg("Added Artwork reference", 1)
|
self.logMsg("Updated season %s, Plex Id: %s of Plex show Id: %s" % (
|
||||||
|
seasonnum, itemid, showid), 2)
|
||||||
|
|
||||||
def add_updateEpisode(self, item, viewtag=None, viewid=None):
|
def add_updateEpisode(self, item, viewtag=None, viewid=None):
|
||||||
"""
|
"""
|
||||||
|
@ -1447,13 +1374,12 @@ class TVShows(Items):
|
||||||
# If the item doesn't exist, we'll add it to the database
|
# If the item doesn't exist, we'll add it to the database
|
||||||
update_item = True
|
update_item = True
|
||||||
itemid = API.getKey()
|
itemid = API.getKey()
|
||||||
self.logMsg("itemid: %s" % itemid, 2)
|
|
||||||
emby_dbitem = emby_db.getItem_byId(itemid)
|
emby_dbitem = emby_db.getItem_byId(itemid)
|
||||||
|
self.logMsg("Processing episode with Plex Id: %s" % itemid, 2)
|
||||||
try:
|
try:
|
||||||
episodeid = emby_dbitem[0]
|
episodeid = emby_dbitem[0]
|
||||||
fileid = emby_dbitem[1]
|
fileid = emby_dbitem[1]
|
||||||
pathid = emby_dbitem[2]
|
pathid = emby_dbitem[2]
|
||||||
self.logMsg("episodeid: %s fileid: %s pathid: %s" % (episodeid, fileid, pathid), 1)
|
|
||||||
|
|
||||||
except TypeError:
|
except TypeError:
|
||||||
update_item = False
|
update_item = False
|
||||||
|
@ -1470,15 +1396,15 @@ class TVShows(Items):
|
||||||
dateplayed = userdata['LastPlayedDate']
|
dateplayed = userdata['LastPlayedDate']
|
||||||
|
|
||||||
# item details
|
# item details
|
||||||
director, writer, cast, producer = API.getPeople()
|
peoples = API.getPeople()
|
||||||
director = API.joinList(director)
|
director = API.joinList(peoples['Director'])
|
||||||
writer = API.joinList(writer)
|
writer = API.joinList(peoples['Writer'])
|
||||||
cast = API.joinList(cast)
|
cast = API.joinList(peoples['Cast'])
|
||||||
producer = API.joinList(producer)
|
producer = API.joinList(peoples['Producer'])
|
||||||
title, sorttitle = API.getTitle()
|
title, sorttitle = API.getTitle()
|
||||||
plot = API.getPlot()
|
plot = API.getPlot()
|
||||||
rating = API.getAudienceRating()
|
rating = API.getAudienceRating()
|
||||||
runtime = API.getRuntime()
|
resume, runtime = API.getRuntime()
|
||||||
premieredate = API.getPremiereDate()
|
premieredate = API.getPremiereDate()
|
||||||
|
|
||||||
# episode details
|
# episode details
|
||||||
|
@ -1563,7 +1489,6 @@ class TVShows(Items):
|
||||||
}
|
}
|
||||||
filename = "%s?%s" % (path, urllib.urlencode(params))
|
filename = "%s?%s" % (path, urllib.urlencode(params))
|
||||||
|
|
||||||
|
|
||||||
##### UPDATE THE EPISODE #####
|
##### UPDATE THE EPISODE #####
|
||||||
if update_item:
|
if update_item:
|
||||||
self.logMsg("UPDATE episode itemid: %s - Title: %s" % (itemid, title), 1)
|
self.logMsg("UPDATE episode itemid: %s - Title: %s" % (itemid, title), 1)
|
||||||
|
@ -1606,7 +1531,6 @@ class TVShows(Items):
|
||||||
pathid = kodi_db.addPath(path)
|
pathid = kodi_db.addPath(path)
|
||||||
# Add the file
|
# Add the file
|
||||||
fileid = kodi_db.addFile(filename, pathid)
|
fileid = kodi_db.addFile(filename, pathid)
|
||||||
|
|
||||||
# Create the episode entry
|
# Create the episode entry
|
||||||
if kodiversion == 16:
|
if kodiversion == 16:
|
||||||
# Kodi Jarvis
|
# Kodi Jarvis
|
||||||
|
@ -1658,7 +1582,6 @@ class TVShows(Items):
|
||||||
))
|
))
|
||||||
kodicursor.execute(query, (pathid, filename, dateadded, fileid))
|
kodicursor.execute(query, (pathid, filename, dateadded, fileid))
|
||||||
|
|
||||||
self.logMsg("Start processing getPeopleList", 1)
|
|
||||||
# Process cast
|
# Process cast
|
||||||
people = API.getPeopleList()
|
people = API.getPeopleList()
|
||||||
kodi_db.addPeople(episodeid, people, "episode")
|
kodi_db.addPeople(episodeid, people, "episode")
|
||||||
|
|
|
@ -590,7 +590,7 @@ class LibrarySync(threading.Thread):
|
||||||
if self.compare:
|
if self.compare:
|
||||||
# Manual sync
|
# Manual sync
|
||||||
for item in elementList:
|
for item in elementList:
|
||||||
# Only look at valid items = Plex library items
|
# Skipping XML item 'title=All episodes' without ratingKey
|
||||||
if item.get('ratingKey', False):
|
if item.get('ratingKey', False):
|
||||||
if self.shouldStop():
|
if self.shouldStop():
|
||||||
return False
|
return False
|
||||||
|
@ -713,16 +713,6 @@ class LibrarySync(threading.Thread):
|
||||||
self.logMsg("=====================", 1)
|
self.logMsg("=====================", 1)
|
||||||
self.logMsg("Sync threads finished", 1)
|
self.logMsg("Sync threads finished", 1)
|
||||||
self.logMsg("=====================", 1)
|
self.logMsg("=====================", 1)
|
||||||
##### PROCESS DELETES #####
|
|
||||||
if self.compare:
|
|
||||||
# Manual sync, process deletes
|
|
||||||
itemFkt = getattr(itemtypes, itemType)
|
|
||||||
with itemFkt() as item:
|
|
||||||
for kodimovie in self.allKodiElementsId:
|
|
||||||
if kodimovie not in self.allPlexElementsId:
|
|
||||||
item.remove(kodimovie)
|
|
||||||
else:
|
|
||||||
self.logMsg("%s compare finished." % itemType, 1)
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def PlexMovies(self):
|
def PlexMovies(self):
|
||||||
|
@ -761,13 +751,22 @@ class LibrarySync(threading.Thread):
|
||||||
# Populate self.updatelist and self.allPlexElementsId
|
# Populate self.updatelist and self.allPlexElementsId
|
||||||
self.GetUpdatelist(all_plexmovies)
|
self.GetUpdatelist(all_plexmovies)
|
||||||
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
|
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
|
||||||
result = self.GetAndProcessXMLs(
|
self.GetAndProcessXMLs(
|
||||||
'Movies',
|
'Movies',
|
||||||
viewName,
|
viewName,
|
||||||
viewId,
|
viewId,
|
||||||
'add_update'
|
'add_update'
|
||||||
)
|
)
|
||||||
return result
|
##### PROCESS DELETES #####
|
||||||
|
if self.compare:
|
||||||
|
# Manual sync, process deletes
|
||||||
|
with itemtypes.Movies() as Movie:
|
||||||
|
for kodimovie in self.allKodiElementsId:
|
||||||
|
if kodimovie not in self.allPlexElementsId:
|
||||||
|
Movie.remove(kodimovie)
|
||||||
|
else:
|
||||||
|
self.logMsg("%s compare finished." % 'Movies', 1)
|
||||||
|
return True
|
||||||
|
|
||||||
def musicvideos(self, embycursor, kodicursor, pdialog, compare=False):
|
def musicvideos(self, embycursor, kodicursor, pdialog, compare=False):
|
||||||
# Get musicvideos from emby
|
# Get musicvideos from emby
|
||||||
|
@ -989,7 +988,6 @@ class LibrarySync(threading.Thread):
|
||||||
##### PROCESS TV Shows #####
|
##### PROCESS TV Shows #####
|
||||||
for view in views:
|
for view in views:
|
||||||
self.updatelist = []
|
self.updatelist = []
|
||||||
self.allPlexElementsId = {}
|
|
||||||
if self.shouldStop():
|
if self.shouldStop():
|
||||||
return False
|
return False
|
||||||
# Get items per view
|
# Get items per view
|
||||||
|
@ -1005,14 +1003,13 @@ class LibrarySync(threading.Thread):
|
||||||
'add_update')
|
'add_update')
|
||||||
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
|
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
|
||||||
|
|
||||||
# Save for later use
|
# COPY for later use
|
||||||
allPlexTvShowsId = self.allPlexElementsId
|
allPlexTvShowsId = self.allPlexElementsId.copy()
|
||||||
|
|
||||||
##### PROCESS TV Seasons #####
|
##### PROCESS TV Seasons #####
|
||||||
# Cycle through tv shows
|
# Cycle through tv shows
|
||||||
for tvShowId in allPlexTvShowsId:
|
for tvShowId in allPlexTvShowsId:
|
||||||
self.updatelist = []
|
self.updatelist = []
|
||||||
self.allPlexElementsId = {}
|
|
||||||
# Grab all seasons to tvshow from PMS
|
# Grab all seasons to tvshow from PMS
|
||||||
seasons = plx.GetAllPlexChildren(tvShowId)
|
seasons = plx.GetAllPlexChildren(tvShowId)
|
||||||
# Populate self.updatelist and self.allPlexElementsId
|
# Populate self.updatelist and self.allPlexElementsId
|
||||||
|
@ -1031,7 +1028,6 @@ class LibrarySync(threading.Thread):
|
||||||
# Cycle through tv shows
|
# Cycle through tv shows
|
||||||
for tvShowId in allPlexTvShowsId:
|
for tvShowId in allPlexTvShowsId:
|
||||||
self.updatelist = []
|
self.updatelist = []
|
||||||
self.allPlexElementsId = {}
|
|
||||||
# Grab all episodes to tvshow from PMS
|
# Grab all episodes to tvshow from PMS
|
||||||
episodes = plx.GetAllPlexLeaves(tvShowId)
|
episodes = plx.GetAllPlexLeaves(tvShowId)
|
||||||
# Populate self.updatelist and self.allPlexElementsId
|
# Populate self.updatelist and self.allPlexElementsId
|
||||||
|
@ -1042,7 +1038,15 @@ class LibrarySync(threading.Thread):
|
||||||
None,
|
None,
|
||||||
'add_updateEpisode')
|
'add_updateEpisode')
|
||||||
self.logMsg("Processed all episodes of TV show with Plex Id %s" % tvShowId, 1)
|
self.logMsg("Processed all episodes of TV show with Plex Id %s" % tvShowId, 1)
|
||||||
|
##### PROCESS DELETES #####
|
||||||
|
if self.compare:
|
||||||
|
# Manual sync, process deletes
|
||||||
|
with itemtypes.TVShows() as TVShow:
|
||||||
|
for kodiTvElement in self.allKodiElementsId:
|
||||||
|
if kodiTvElement not in self.allPlexElementsId:
|
||||||
|
TVShow.remove(kodiTvElement)
|
||||||
|
else:
|
||||||
|
self.logMsg("TV Shows compare finished.", 1)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def tvshows(self, embycursor, kodicursor, pdialog, compare=False):
|
def tvshows(self, embycursor, kodicursor, pdialog, compare=False):
|
||||||
|
|
Loading…
Reference in a new issue