TV Shows sync up and running

This commit is contained in:
tomkat83 2016-01-10 15:16:59 +01:00
parent 08a0c38704
commit 9f3db90a7c
2 changed files with 42 additions and 115 deletions

View file

@ -25,6 +25,10 @@ import PlexAPI
class Items(object):
"""
Items to be called with "with Items as xxx:" to ensure that __enter__
method is called!
"""
def __init__(self):
self.clientInfo = clientinfo.ClientInfo()
@ -40,6 +44,9 @@ class Items(object):
self.emby = embyserver.Read_EmbyServer()
def __enter__(self):
"""
Open DB connections and cursors
"""
self.embyconn = utils.kodiSQL('emby')
self.embycursor = self.embyconn.cursor()
self.kodiconn = utils.kodiSQL('video')
@ -471,73 +478,6 @@ class Movies(Items):
# resume = API.adjustResume(userdata['Resume'])
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):
# This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
# Poster with progress bar
@ -616,9 +556,9 @@ class Movies(Items):
self.logMsg("Deleted %s %s from kodi database" % (mediatype, itemid), 1)
class HomeVideos(Items):
def __init__(self, embycursor, kodicursor):
Items.__init__(self, embycursor, kodicursor)
@ -1221,11 +1161,9 @@ class TVShows(Items):
if not pdialog and self.contentmsg:
self.contentPop(title)
def add_update(self, item, viewtag=None, viewid=None):
# Process single tvshow
kodicursor = self.kodicursor
emby = self.emby
emby_db = self.emby_db
kodi_db = self.kodi_db
artwork = self.artwork
@ -1246,7 +1184,6 @@ class TVShows(Items):
showid = emby_dbitem[0]
pathid = emby_dbitem[2]
self.logMsg("showid: %s pathid: %s" % (showid, pathid), 1)
except TypeError:
update_item = False
self.logMsg("showid: %s not found." % itemid, 2)
@ -1404,32 +1341,22 @@ class TVShows(Items):
artwork.addArtwork(allartworks, seasonid, "season", kodicursor)
def add_updateSeason(self, item, viewid=None, viewtag=None):
self.logMsg("add_updateSeason called with", 1)
self.logMsg("item: %s" % item, 1)
self.logMsg("viewid: %s" % viewid, 1)
self.logMsg("viewName: %s" % viewtag, 1)
API = PlexAPI.API(item)
showid = viewid
itemid = viewid
itemid = API.getKey()
kodicursor = self.kodicursor
emby_db = self.emby_db
kodi_db = self.kodi_db
artwork = self.artwork
API = PlexAPI.API(item)
self.logMsg("add_updateSeason initialization done", 1)
seasonnum = API.getIndex()
self.logMsg("seasonnum: %s" % seasonnum, 1)
seasonid = kodi_db.addSeason(showid, seasonnum)
self.logMsg("seasonid: %s" % seasonid, 1)
# Create the reference in emby table
emby_db.addReference(itemid, seasonid, "Season", "season", parentid=showid)
self.logMsg("Added db reference", 1)
# Process artwork
allartworks = API.getAllArtwork()
self.logMsg("Gotten allartworks: %s" % allartworks, 1)
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):
"""
@ -1447,13 +1374,12 @@ class TVShows(Items):
# If the item doesn't exist, we'll add it to the database
update_item = True
itemid = API.getKey()
self.logMsg("itemid: %s" % itemid, 2)
emby_dbitem = emby_db.getItem_byId(itemid)
self.logMsg("Processing episode with Plex Id: %s" % itemid, 2)
try:
episodeid = emby_dbitem[0]
fileid = emby_dbitem[1]
pathid = emby_dbitem[2]
self.logMsg("episodeid: %s fileid: %s pathid: %s" % (episodeid, fileid, pathid), 1)
except TypeError:
update_item = False
@ -1470,15 +1396,15 @@ class TVShows(Items):
dateplayed = userdata['LastPlayedDate']
# item details
director, writer, cast, producer = API.getPeople()
director = API.joinList(director)
writer = API.joinList(writer)
cast = API.joinList(cast)
producer = API.joinList(producer)
peoples = API.getPeople()
director = API.joinList(peoples['Director'])
writer = API.joinList(peoples['Writer'])
cast = API.joinList(peoples['Cast'])
producer = API.joinList(peoples['Producer'])
title, sorttitle = API.getTitle()
plot = API.getPlot()
rating = API.getAudienceRating()
runtime = API.getRuntime()
resume, runtime = API.getRuntime()
premieredate = API.getPremiereDate()
# episode details
@ -1563,7 +1489,6 @@ class TVShows(Items):
}
filename = "%s?%s" % (path, urllib.urlencode(params))
##### UPDATE THE EPISODE #####
if update_item:
self.logMsg("UPDATE episode itemid: %s - Title: %s" % (itemid, title), 1)
@ -1606,7 +1531,6 @@ class TVShows(Items):
pathid = kodi_db.addPath(path)
# Add the file
fileid = kodi_db.addFile(filename, pathid)
# Create the episode entry
if kodiversion == 16:
# Kodi Jarvis
@ -1658,7 +1582,6 @@ class TVShows(Items):
))
kodicursor.execute(query, (pathid, filename, dateadded, fileid))
self.logMsg("Start processing getPeopleList", 1)
# Process cast
people = API.getPeopleList()
kodi_db.addPeople(episodeid, people, "episode")

View file

@ -590,7 +590,7 @@ class LibrarySync(threading.Thread):
if self.compare:
# Manual sync
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 self.shouldStop():
return False
@ -713,16 +713,6 @@ class LibrarySync(threading.Thread):
self.logMsg("=====================", 1)
self.logMsg("Sync threads finished", 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
def PlexMovies(self):
@ -761,13 +751,22 @@ class LibrarySync(threading.Thread):
# Populate self.updatelist and self.allPlexElementsId
self.GetUpdatelist(all_plexmovies)
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
result = self.GetAndProcessXMLs(
self.GetAndProcessXMLs(
'Movies',
viewName,
viewId,
'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):
# Get musicvideos from emby
@ -989,7 +988,6 @@ class LibrarySync(threading.Thread):
##### PROCESS TV Shows #####
for view in views:
self.updatelist = []
self.allPlexElementsId = {}
if self.shouldStop():
return False
# Get items per view
@ -1005,14 +1003,13 @@ class LibrarySync(threading.Thread):
'add_update')
self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
# Save for later use
allPlexTvShowsId = self.allPlexElementsId
# COPY for later use
allPlexTvShowsId = self.allPlexElementsId.copy()
##### PROCESS TV Seasons #####
# Cycle through tv shows
for tvShowId in allPlexTvShowsId:
self.updatelist = []
self.allPlexElementsId = {}
# Grab all seasons to tvshow from PMS
seasons = plx.GetAllPlexChildren(tvShowId)
# Populate self.updatelist and self.allPlexElementsId
@ -1031,7 +1028,6 @@ class LibrarySync(threading.Thread):
# Cycle through tv shows
for tvShowId in allPlexTvShowsId:
self.updatelist = []
self.allPlexElementsId = {}
# Grab all episodes to tvshow from PMS
episodes = plx.GetAllPlexLeaves(tvShowId)
# Populate self.updatelist and self.allPlexElementsId
@ -1042,7 +1038,15 @@ class LibrarySync(threading.Thread):
None,
'add_updateEpisode')
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
def tvshows(self, embycursor, kodicursor, pdialog, compare=False):