Skip to content

Commit

Permalink
Fix movies with the same name matching wrong
Browse files Browse the repository at this point in the history
  • Loading branch information
razzeee committed Dec 28, 2017
1 parent 97fae62 commit a0d31e0
Show file tree
Hide file tree
Showing 10 changed files with 326 additions and 61 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -3,6 +3,7 @@
.DS*
.pylint_rc
/.idea
/.coverage
/.project
/.pydevproject
/.settings
Expand Down
25 changes: 15 additions & 10 deletions resources/lib/syncEpisodes.py
Expand Up @@ -233,7 +233,8 @@ def __addEpisodesToTraktCollection(self, kodiShows, traktShows, fromPercent, toP
addTraktShows = copy.deepcopy(traktShows)
addKodiShows = copy.deepcopy(kodiShows)

tmpTraktShowsAdd = utilities.compareEpisodes(addKodiShows, addTraktShows)
tmpTraktShowsAdd = utilities.compareEpisodes(
addKodiShows, addTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"))
traktShowsAdd = copy.deepcopy(tmpTraktShowsAdd)
utilities.sanitizeShows(traktShowsAdd)
# logger.debug("traktShowsAdd %s" % traktShowsAdd)
Expand Down Expand Up @@ -278,7 +279,8 @@ def __deleteEpisodesFromTraktCollection(self, traktShows, kodiShows, fromPercent
removeTraktShows = copy.deepcopy(traktShows)
removeKodiShows = copy.deepcopy(kodiShows)

traktShowsRemove = utilities.compareEpisodes(removeTraktShows, removeKodiShows)
traktShowsRemove = utilities.compareEpisodes(
removeTraktShows, removeKodiShows, kodiUtilities.getSettingAsBool("scrobble_fallback"))
utilities.sanitizeShows(traktShowsRemove)

if len(traktShowsRemove['shows']) == 0:
Expand Down Expand Up @@ -306,7 +308,8 @@ def __addEpisodesToTraktWatched(self, kodiShows, traktShows, fromPercent, toPerc
updateTraktTraktShows = copy.deepcopy(traktShows)
updateTraktKodiShows = copy.deepcopy(kodiShows)

traktShowsUpdate = utilities.compareEpisodes(updateTraktKodiShows, updateTraktTraktShows, watched=True)
traktShowsUpdate = utilities.compareEpisodes(
updateTraktKodiShows, updateTraktTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True)
utilities.sanitizeShows(traktShowsUpdate)
# logger.debug("traktShowsUpdate %s" % traktShowsUpdate)

Expand Down Expand Up @@ -349,7 +352,7 @@ def __addEpisodesToKodiWatched(self, traktShows, kodiShows, kodiShowsCollected,
updateKodiTraktShows = copy.deepcopy(traktShows)
updateKodiKodiShows = copy.deepcopy(kodiShows)

kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, watched=True, restrict=True, collected=kodiShowsCollected)
kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True, restrict=True, collected=kodiShowsCollected)

if len(kodiShowsUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(32074), line2=kodiUtilities.getString(32107))
Expand Down Expand Up @@ -389,7 +392,8 @@ def __addEpisodeProgressToKodi(self, traktShows, kodiShows, fromPercent, toPerce
if kodiUtilities.getSettingAsBool('trakt_episode_playback') and traktShows and not self.sync.IsCanceled():
updateKodiTraktShows = copy.deepcopy(traktShows)
updateKodiKodiShows = copy.deepcopy(kodiShows)
kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, restrict=True, playback=True)
kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool(
"scrobble_fallback"), restrict=True, playback=True)

if len(kodiShowsUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1=kodiUtilities.getString(1441), line2=kodiUtilities.getString(32129))
Expand Down Expand Up @@ -428,7 +432,7 @@ def __syncShowsRatings(self, traktShows, kodiShows, fromPercent, toPercent):
updateKodiTraktShows = copy.deepcopy(traktShows)
updateKodiKodiShows = copy.deepcopy(kodiShows)

traktShowsToUpdate = utilities.compareShows(updateKodiKodiShows, updateKodiTraktShows, rating=True)
traktShowsToUpdate = utilities.compareShows(updateKodiKodiShows, updateKodiTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True)
if len(traktShowsToUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32181))
logger.debug("[Episodes Sync] Trakt show ratings are up to date.")
Expand All @@ -440,7 +444,7 @@ def __syncShowsRatings(self, traktShows, kodiShows, fromPercent, toPercent):
self.sync.traktapi.addRating(traktShowsToUpdate)

# needs to be restricted, because we can't add a rating to an episode which is not in our Kodi collection
kodiShowsUpdate = utilities.compareShows(updateKodiTraktShows, updateKodiKodiShows, rating=True, restrict = True)
kodiShowsUpdate = utilities.compareShows(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True, restrict=True)

if len(kodiShowsUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32176))
Expand Down Expand Up @@ -477,7 +481,8 @@ def __syncEpisodeRatings(self, traktShows, kodiShows, fromPercent, toPercent):
updateKodiTraktShows = copy.deepcopy(traktShows)
updateKodiKodiShows = copy.deepcopy(kodiShows)

traktShowsToUpdate = utilities.compareEpisodes(updateKodiKodiShows, updateKodiTraktShows, rating=True)
traktShowsToUpdate = utilities.compareEpisodes(
updateKodiKodiShows, updateKodiTraktShows, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True)
if len(traktShowsToUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32181))
logger.debug("[Episodes Sync] Trakt episode ratings are up to date.")
Expand All @@ -487,8 +492,8 @@ def __syncEpisodeRatings(self, traktShows, kodiShows, fromPercent, toPercent):
self.sync.UpdateProgress(fromPercent, line1='', line2=kodiUtilities.getString(32182) % len(traktShowsToUpdate['shows']))
self.sync.traktapi.addRating(traktShowsToUpdate)


kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, restrict=True, rating=True)
kodiShowsUpdate = utilities.compareEpisodes(updateKodiTraktShows, updateKodiKodiShows, kodiUtilities.getSettingAsBool(
"scrobble_fallback"), restrict=True, rating=True)
if len(kodiShowsUpdate['shows']) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32173))
logger.debug("[Episodes Sync] Kodi episode ratings are up to date.")
Expand Down
19 changes: 11 additions & 8 deletions resources/lib/syncMovies.py
Expand Up @@ -124,7 +124,8 @@ def __addMoviesToTraktCollection(self, kodiMovies, traktMovies, fromPercent, toP
addTraktMovies = copy.deepcopy(traktMovies)
addKodiMovies = copy.deepcopy(kodiMovies)

traktMoviesToAdd = utilities.compareMovies(addKodiMovies, addTraktMovies)
traktMoviesToAdd = utilities.compareMovies(
addKodiMovies, addTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"))
utilities.sanitizeMovies(traktMoviesToAdd)
logger.debug("[Movies Sync] Compared movies, found %s to add." % len(traktMoviesToAdd))

Expand Down Expand Up @@ -156,7 +157,8 @@ def __deleteMoviesFromTraktCollection(self, traktMovies, kodiMovies, fromPercent
removeKodiMovies = copy.deepcopy(kodiMovies)

logger.debug("[Movies Sync] Starting to remove.")
traktMoviesToRemove = utilities.compareMovies(removeTraktMovies, removeKodiMovies)
traktMoviesToRemove = utilities.compareMovies(
removeTraktMovies, removeKodiMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"))
utilities.sanitizeMovies(traktMoviesToRemove)
logger.debug("[Movies Sync] Compared movies, found %s to remove." % len(traktMoviesToRemove))

Expand Down Expand Up @@ -185,7 +187,7 @@ def __addMoviesToTraktWatched(self, kodiMovies, traktMovies, fromPercent, toPerc
updateTraktTraktMovies = copy.deepcopy(traktMovies)
updateTraktKodiMovies = copy.deepcopy(kodiMovies)

traktMoviesToUpdate = utilities.compareMovies(updateTraktKodiMovies, updateTraktTraktMovies, watched=True)
traktMoviesToUpdate = utilities.compareMovies(updateTraktKodiMovies, updateTraktTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), watched=True)
utilities.sanitizeMovies(traktMoviesToUpdate)

if len(traktMoviesToUpdate) == 0:
Expand Down Expand Up @@ -229,7 +231,8 @@ def __addMoviesToKodiWatched(self, traktMovies, kodiMovies, fromPercent, toPerce
updateKodiTraktMovies = copy.deepcopy(traktMovies)
updateKodiKodiMovies = copy.deepcopy(kodiMovies)

kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, watched=True, restrict=True)
kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool(
"scrobble_fallback"), watched=True, restrict=True)

if len(kodiMoviesToUpdate) == 0:
self.sync.UpdateProgress(toPercent, line2=kodiUtilities.getString(32088))
Expand Down Expand Up @@ -264,7 +267,7 @@ def __addMovieProgressToKodi(self, traktMovies, kodiMovies, fromPercent, toPerce
updateKodiTraktMovies = copy.deepcopy(traktMovies)
updateKodiKodiMovies = copy.deepcopy(kodiMovies)

kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies['movies'], updateKodiKodiMovies, restrict=True, playback=True)
kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies['movies'], updateKodiKodiMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), restrict=True, playback=True)
if len(kodiMoviesToUpdate) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32125))
logger.debug("[Movies Sync] Kodi movie playbacks are up to date.")
Expand Down Expand Up @@ -295,7 +298,7 @@ def __syncMovieRatings(self, traktMovies, kodiMovies, fromPercent, toPercent):
updateKodiTraktMovies = copy.deepcopy(traktMovies)
updateKodiKodiMovies = copy.deepcopy(kodiMovies)

traktMoviesToUpdate = utilities.compareMovies(updateKodiKodiMovies, updateKodiTraktMovies, rating=True)
traktMoviesToUpdate = utilities.compareMovies(updateKodiKodiMovies, updateKodiTraktMovies, kodiUtilities.getSettingAsBool("scrobble_fallback"), rating=True)
if len(traktMoviesToUpdate) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32179))
logger.debug("[Movies Sync] Trakt movie ratings are up to date.")
Expand All @@ -308,8 +311,8 @@ def __syncMovieRatings(self, traktMovies, kodiMovies, fromPercent, toPercent):

self.sync.traktapi.addRating(moviesRatings)


kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, restrict=True, rating=True)
kodiMoviesToUpdate = utilities.compareMovies(updateKodiTraktMovies, updateKodiKodiMovies, kodiUtilities.getSettingAsBool(
"scrobble_fallback"), restrict=True, rating=True)
if len(kodiMoviesToUpdate) == 0:
self.sync.UpdateProgress(toPercent, line1='', line2=kodiUtilities.getString(32169))
logger.debug("[Movies Sync] Kodi movie ratings are up to date.")
Expand Down
45 changes: 26 additions & 19 deletions resources/lib/utilities.py
Expand Up @@ -87,7 +87,7 @@ def __findInList(list, case_sensitive=True, **kwargs):
return None


def findMediaObject(mediaObjectToMatch, listToSearch):
def findMediaObject(mediaObjectToMatch, listToSearch, matchByTitleAndYear):
result = None
if result is None and 'ids' in mediaObjectToMatch and 'imdb' in mediaObjectToMatch['ids'] and unicode(mediaObjectToMatch['ids']['imdb']).startswith("tt"):
result = __findInList(
Expand All @@ -100,15 +100,18 @@ def findMediaObject(mediaObjectToMatch, listToSearch):
if result is None and 'ids' in mediaObjectToMatch and 'tvdb' in mediaObjectToMatch['ids'] and mediaObjectToMatch['ids']['tvdb']:
result = __findInList(
listToSearch, tvdb=mediaObjectToMatch['ids']['tvdb'])
# match by title and year it will result in movies with the same title and
# year to mismatch - but what should we do instead?
if result is None and 'title' in mediaObjectToMatch and 'year' in mediaObjectToMatch:
result = __findInList(
listToSearch, title=mediaObjectToMatch['title'], year=mediaObjectToMatch['year'])
# match only by title, as some items don't have a year on trakt
if result is None and 'title' in mediaObjectToMatch:
result = __findInList(
listToSearch, title=mediaObjectToMatch['title'])

if(matchByTitleAndYear):
# match by title and year it will result in movies with the same title and
# year to mismatch - but what should we do instead?
if result is None and 'title' in mediaObjectToMatch and 'year' in mediaObjectToMatch:
result = __findInList(
listToSearch, title=mediaObjectToMatch['title'], year=mediaObjectToMatch['year'])
# match only by title, as some items don't have a year on trakt
if result is None and 'title' in mediaObjectToMatch:
result = __findInList(
listToSearch, title=mediaObjectToMatch['title'])

return result


Expand Down Expand Up @@ -300,12 +303,11 @@ def sanitizeShows(shows):
del episode['ids']['episodeid']


def compareMovies(movies_col1, movies_col2, watched=False, restrict=False, playback=False, rating=False):
def compareMovies(movies_col1, movies_col2, matchByTitleAndYear, watched=False, restrict=False, playback=False, rating=False):
movies = []

for movie_col1 in movies_col1:
if movie_col1:
movie_col2 = findMediaObject(movie_col1, movies_col2)
movie_col2 = findMediaObject(movie_col1, movies_col2, matchByTitleAndYear)
# logger.debug("movie_col1 %s" % movie_col1)
# logger.debug("movie_col2 %s" % movie_col2)

Expand Down Expand Up @@ -336,18 +338,19 @@ def compareMovies(movies_col1, movies_col2, watched=False, restrict=False, playb
elif rating and movie_col1['rating'] != 0:
movies.append(movie_col1)
elif not watched and not rating:

movies.append(movie_col1)
return movies


def compareShows(shows_col1, shows_col2, rating=False, restrict=False):
def compareShows(shows_col1, shows_col2, matchByTitleAndYear, rating=False, restrict=False):
shows = []
# logger.debug("shows_col1 %s" % shows_col1)
# logger.debug("shows_col2 %s" % shows_col2)
for show_col1 in shows_col1['shows']:
if show_col1:
show_col2 = findMediaObject(show_col1, shows_col2['shows'])
show_col2 = findMediaObject(show_col1, shows_col2['shows'], matchByTitleAndYear)
# logger.debug("show_col1 %s" % show_col1)
# logger.debug("show_col2 %s" % show_col2)

if show_col2:
show = {'title': show_col1['title'], 'ids': {}, 'year': show_col1['year']}
Expand Down Expand Up @@ -380,13 +383,16 @@ def compareShows(shows_col1, shows_col2, rating=False, restrict=False):


# always return shows_col1 if you have enrich it, but don't return shows_col2
def compareEpisodes(shows_col1, shows_col2, watched=False, restrict=False, collected=False, playback=False, rating=False):
def compareEpisodes(shows_col1, shows_col2, matchByTitleAndYear, watched=False, restrict=False, collected=False, playback=False, rating=False):
shows = []
# logger.debug("epi shows_col1 %s" % shows_col1)
# logger.debug("epi shows_col2 %s" % shows_col2)
for show_col1 in shows_col1['shows']:
if show_col1:
show_col2 = findMediaObject(show_col1, shows_col2['shows'])
show_col2 = findMediaObject(
show_col1, shows_col2['shows'], matchByTitleAndYear)
# logger.debug("show_col1 %s" % show_col1)
# logger.debug("show_col2 %s" % show_col2)

if show_col2:
season_diff = {}
Expand Down Expand Up @@ -428,7 +434,8 @@ def compareEpisodes(shows_col1, shows_col2, watched=False, restrict=False, colle
elif len(diff) > 0:
if restrict:
# get all the episodes that we have in Kodi, watched or not - update kodi
collectedShow = findMediaObject(show_col1, collected['shows'])
collectedShow = findMediaObject(
show_col1, collected['shows'], matchByTitleAndYear)
# logger.debug("collected %s" % collectedShow)
collectedSeasons = __getEpisodes(collectedShow['seasons'])
t = list(set(collectedSeasons[season]).intersection(set(diff)))
Expand Down
16 changes: 16 additions & 0 deletions tests/fixtures/movies_local_blind.json
@@ -0,0 +1,16 @@
{
"collected": 1,
"collected_at": "2017-08-28T02:51:51.000Z",
"ids": {
"imdb": "tt1935089"
},
"movieid": 15580,
"plays": 0,
"rating": 0,
"runtime": 5880,
"title": "Blind",
"userrating": 0,
"watched": 0,
"watched_at": "",
"year": 2017
}
14 changes: 14 additions & 0 deletions tests/fixtures/movies_local_chaos.json
@@ -0,0 +1,14 @@
{
"collected": 1,
"collected_at": "2017-08-28T02:51:51.000Z",
"ids": {
"imdb": "tt0405977"
},
"plays": 0,
"rating": 0,
"title": "Chaos",
"userrating": 0,
"watched": 0,
"watched_at": "",
"year": 2005
}
18 changes: 18 additions & 0 deletions tests/fixtures/movies_remote_blind_match.json
@@ -0,0 +1,18 @@
[
{
"collected": 1,
"collected_at": "2017-08-28T02:51:51.000Z",
"ids": {
"imdb": "tt1935089"
},
"movieid": 15580,
"plays": 0,
"rating": 0,
"runtime": 5880,
"title": "Blind",
"userrating": 0,
"watched": 0,
"watched_at": "",
"year": 2017
}
]
20 changes: 20 additions & 0 deletions tests/fixtures/movies_remote_blind_no_match.json
@@ -0,0 +1,20 @@
[
{
"collected": 1,
"collected_at": "2014-09-06T23:34:07.000-00:00",
"ids": {
"imdb": "tt2616810",
"slug": "blind-2014",
"tmdb": "245844",
"trakt": "149618"
},
"in_watchlist": 0,
"last_watched_at": "2014-07-05T16:42:12.000-00:00",
"plays": 1,
"rated_at": "2014-07-20T14:39:17.000-00:00",
"rating": 7,
"title": "Blind",
"watched": 1,
"year": 2014
}
]
16 changes: 16 additions & 0 deletions tests/fixtures/movies_remote_chaos_match.json
@@ -0,0 +1,16 @@
[
{
"collected": 1,
"collected_at": "2017-08-28T02:51:51.000Z",
"ids": {
"imdb": "tt0402910"
},
"plays": 0,
"rating": 0,
"title": "Chaos",
"userrating": 0,
"watched": 0,
"watched_at": "",
"year": 2005
}
]

0 comments on commit a0d31e0

Please sign in to comment.