From d8e52d3317c5440d65786c3e40089037cb29e534 Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 25 Apr 2018 22:34:23 +0200 Subject: [PATCH 01/22] Fixing getEpisodeTVDB --- default.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/default.py b/default.py index e05523a..1f70940 100644 --- a/default.py +++ b/default.py @@ -264,17 +264,25 @@ def getEpisodeTVDB(self, xbmc_id): rpccmd = {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetEpisodeDetails', 'params': {"episodeid": int(xbmc_id), 'properties': ['season', 'episode', 'tvshowid', 'showtitle', 'uniqueid']}, 'id': 1} rpccmd = json.dumps(rpccmd) result = xbmc.executeJSONRPC(rpccmd) - result = json.loads(result) - log('result=%s' % result) - log('episode_id=%s' % result['result']['episodedetails']['uniqueid']['unknown']) - + result = json.loads(result) + log('result=%s' % result) + if 'unknown' in result['result']['episodedetails']['uniqueid']: + episode_id = result['result']['episodedetails']['uniqueid']['unknown'] + if 'imdb' in result['result']['episodedetails']['uniqueid']: + episode_id = result['result']['episodedetails']['uniqueid']['imdb'] + if 'tvdb' in result['result']['episodedetails']['uniqueid']: + episode_id = result['result']['episodedetails']['uniqueid']['tvdb'] + else: + return False + log('episode_id=%s' % episode_id) + try: item = {} item['season'] = result['result']['episodedetails']['season'] item['tvshowid'] = result['result']['episodedetails']['tvshowid'] item['episode'] = result['result']['episodedetails']['episode'] item['showtitle'] = result['result']['episodedetails']['showtitle'] - item['episode_id'] = result['result']['episodedetails']['uniqueid']['unknown'] + item['episode_id'] = episode_id return item except: return False @@ -367,4 +375,3 @@ def normalizeString(str): player._monitor = None log("sys.exit(0)") sys.exit(0) - From 6a079a0834263ce5223c6b02892cf609f4204f4d Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 25 Apr 2018 22:36:59 +0200 Subject: [PATCH 02/22] Update french strings --- resources/language/French/strings.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/language/French/strings.po b/resources/language/French/strings.po index 812d687..6b9aa0b 100644 --- a/resources/language/French/strings.po +++ b/resources/language/French/strings.po @@ -91,7 +91,7 @@ msgstr "Bien" msgctxt "#35312" msgid "Funk" -msgstr "Fun" +msgstr "Drole" msgctxt "#35313" msgid "Wow" @@ -99,15 +99,15 @@ msgstr "Wow" msgctxt "#35314" msgid "Sad" -msgstr "triste" +msgstr "Triste" msgctxt "#35316" msgid "Soso" -msgstr "Mitigé" +msgstr "Bof" msgctxt "#35317" msgid "Bad" -msgstr "Mauvais" +msgstr "Nul" msgctxt "#32901" msgid "Please login" From 6e381b6adc7c7bcbe49685139cc96ceac6720246 Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 25 Apr 2018 22:58:39 +0200 Subject: [PATCH 03/22] Update addon.xml Update to be able to identify it from the source --- addon.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addon.xml b/addon.xml index 9088bfb..dc616f5 100644 --- a/addon.xml +++ b/addon.xml @@ -1,8 +1,8 @@ + version="1.2.1" + provider-name="alxlaxv"> @@ -19,9 +19,9 @@ en fr it GNU GENERAL PUBLIC LICENSE. Version 2, June 1991 http://forum.kodi.tv/showthread.php?tid=199604 - https://github.com/cxii-dev/script.tvtime - https://github.com/cxii-dev/script.tvtime.git - cxii-dev[AT]users[DOT]noreply[DOT]github[DOT]com + https://github.com/alxlaxv/script.tvtime + https://github.com/alxlaxv/script.tvtime.git + alxlaxv[AT]users[DOT]noreply[DOT]github[DOT]com From 9f97a65db74aa038db4f2a56242a4c067eefaad8 Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 23 May 2018 12:39:13 +0200 Subject: [PATCH 04/22] Update README.md --- README.md | 54 +++++++++++++----------------------------------------- 1 file changed, 13 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 82916dc..3a357f3 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,25 @@ -script.tvtime -================= +# script.tvtime Kodi plugin for [TV Time](http://www.tvtime.com) This plugin will set TV shows episodes you've seen as watched on TV Time. It will also add the new TV show to your account if it was not already there. -install -======= +This fork has been created to be able to apply some fixes on the initial repository (hibernating/dead) but it will never be submitted to the official Kodi repository. +Please follow Build or Download steps below to install this version. -This plugin has been submitted to the [official Kodi repository](http://addons.xbmc.org/show/script.tvtime/). -To install it, just follow this [HOW-TO](http://kodi.wiki/view/HOW-TO:Install_add-ons). -After that, launch the add-on to login. +## Build -build -===== +If you want to build it manually, please follow the steps below: -If you want to build it manually, here is a simple script to do so: -```sh -#!/bin/bash +1. Clone this repository `sudo git clone https://github.com/alxlaxv/script.tvtime.git` +2. Enter in script.tvtime `cd script.tvtime` +3. Make the compile script executable `sudo chmod +x compile.sh` +4. Launch the compile script `./compile.sh` -dest=script.tvtime -version=$(grep -E "^\s+version" addon.xml | cut -f2 -d'"') +It will create a zip file which can be installed directly within Kodi by following this [HOW-TO](https://kodi.wiki/view/Add-on_manager#How_to_install_from_a_ZIP_file). -if [ -d $dest ]; then - rm -r $dest -fi +## Download -mkdir $dest -cp addon.xml $dest/ -cp *.txt $dest/ -cp icon.png $dest/ -cp *.py $dest/ -cp -r resources $dest/ - -if [ -f $dest-$version.zip ]; then - rm $dest-$version.zip -fi - -zip -r $dest-$version.zip $dest -rm -r $dest -```` -It will create a zip file that you can install directly within Kodi. -Using the GUI of Kodi, choose to install your plugin as a zip file, find your zip file and it's done ! - -download -======== - -If you want to download the release package because you can't or don't want to build it, you can do it on this link: -http://addons.xbmc.org/show/script.tvtime/ -or -[download](here) the latests version. +You can down the [last release](https://github.com/alxlaxv/script.tvtime/releases/latest) directly. +It will download a zip file which can be installed directly within Kodi by following this [HOW-TO](https://kodi.wiki/view/Add-on_manager#How_to_install_from_a_ZIP_file). From 88521d026d85fe51b8d3658c4c09f4e4f8f37f7c Mon Sep 17 00:00:00 2001 From: kvanzuijlen Date: Mon, 16 Jul 2018 23:49:10 +0200 Subject: [PATCH 05/22] Fixed getEpisodeTVDB for tv episodes without an tvdb ID Because the code had 3 different if statements, the getEpisodeTVDB method always returned false for episodes without a tvdb unique ID. --- default.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/default.py b/default.py index 1f70940..6ad36e3 100644 --- a/default.py +++ b/default.py @@ -268,9 +268,9 @@ def getEpisodeTVDB(self, xbmc_id): log('result=%s' % result) if 'unknown' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['unknown'] - if 'imdb' in result['result']['episodedetails']['uniqueid']: + elif 'imdb' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['imdb'] - if 'tvdb' in result['result']['episodedetails']['uniqueid']: + elif 'tvdb' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['tvdb'] else: return False From 67ae0e78bc508a35f3ad926f82e8dce358db41fe Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Tue, 30 Oct 2018 08:10:40 +0100 Subject: [PATCH 06/22] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index dc616f5..b0014ca 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ From 0c71ecda8b2d359c44bd4d73f790ec2348c413bc Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 24 Apr 2019 18:59:55 +0200 Subject: [PATCH 07/22] Reverting IMDb feature --- default.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/default.py b/default.py index 6ad36e3..f0bd4b2 100644 --- a/default.py +++ b/default.py @@ -268,8 +268,6 @@ def getEpisodeTVDB(self, xbmc_id): log('result=%s' % result) if 'unknown' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['unknown'] - elif 'imdb' in result['result']['episodedetails']['uniqueid']: - episode_id = result['result']['episodedetails']['uniqueid']['imdb'] elif 'tvdb' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['tvdb'] else: From f8479974571c5716403185755a466785e547fb63 Mon Sep 17 00:00:00 2001 From: alxlaxv <35723598+alxlaxv@users.noreply.github.com> Date: Wed, 24 Apr 2019 19:00:16 +0200 Subject: [PATCH 08/22] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index b0014ca..a954aed 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ From faa1f85d495deaf0615b5604ddff829a6e35843c Mon Sep 17 00:00:00 2001 From: JosemyAB Date: Mon, 5 Aug 2019 17:29:45 +0200 Subject: [PATCH 09/22] Fix issues finding episode using Kodi 18.3 Using scrapper The movie database (TMDB) --- default.py | 66 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/default.py b/default.py index f0bd4b2..4ac283b 100644 --- a/default.py +++ b/default.py @@ -67,7 +67,7 @@ def _tearDown(self): def onSettingsChanged( self ): log('onSettingsChanged') self.action() - + def onNotification(self, sender, method, data): log('onNotification') log('method=%s' % method) @@ -90,7 +90,7 @@ def onNotification(self, sender, method, data): player.episode = FindEpisode(player.token, 0, player.filename) log('episode.is_found=%s' % player.episode.is_found) if player.episode.is_found: - if player.notifications == 'true': + if player.notifications == 'true': if player.notif_during_playback == 'false' and player.isPlaying() == 1: return if player.notif_scrobbling == 'false': @@ -103,22 +103,22 @@ def onNotification(self, sender, method, data): notif(__language__(32905), time=2500) else: player.http_playing = False - response = json.loads(data) + response = json.loads(data) log('%s' % response) if response.get('item').get('type') == 'episode': xbmc_id = response.get('item').get('id') - item = self.getEpisodeTVDB(xbmc_id) + item = self.getEpisodeTVDB(xbmc_id) log('showtitle=%s' % item['showtitle']) log('season=%s' % item['season']) log('episode=%s' % item['episode']) log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % player.filename) - player.episode = FindEpisode(player.token, item['episode_id']) + player.episode = FindEpisode(player.token, item['episode_id'], player.filename) log('episode.is_found=%s' % player.episode.is_found) if player.episode.is_found: - if player.notifications == 'true': + if player.notifications == 'true': if player.notif_during_playback == 'false' and player.isPlaying() == 1: return if player.notif_scrobbling == 'false': @@ -133,20 +133,20 @@ def onNotification(self, sender, method, data): if player.notifications == 'true': if player.notif_during_playback == 'false' and player.isPlaying() == 1: return - notif(__language__(32905), time=2500) - if (method == 'Player.OnStop'): + notif(__language__(32905), time=2500) + if (method == 'Player.OnStop'): self._tearDown() actual_percent = (self._last_pos/self._total_time)*100 - log('last_pos / total_time : %s / %s = %s %%' % (self._last_pos, self._total_time, actual_percent)) - log('Player.OnStop') + log('last_pos / total_time : %s / %s = %s %%' % (self._last_pos, self._total_time, actual_percent)) + log('Player.OnStop') if player.http == 'true' and player.http_playing == True : if player.progress == 'true': player.episode = FindEpisode(player.token, 0, player.filename) log('episode.is_found=%s' % player.episode.is_found) if player.episode.is_found: log('progress=%s' % self._last_pos) - self.progress = SaveProgress(player.token, player.episode.id, self._last_pos) - log('progress.is_set:=%s' % self.progress.is_set) + self.progress = SaveProgress(player.token, player.episode.id, self._last_pos) + log('progress.is_set:=%s' % self.progress.is_set) if actual_percent > 90: log('MarkAsWatched(*, %s, %s, %s)' % (player.filename, player.facebook, player.twitter)) checkin = MarkAsWatched(player.token, player.episode.id, player.facebook, player.twitter) @@ -173,33 +173,33 @@ def onNotification(self, sender, method, data): return if player.notif_scrobbling == 'false': return - notif('%s %s %sx%s' % (__language__(32906), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) - else: - response = json.loads(data) + notif('%s %s %sx%s' % (__language__(32906), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) + else: + response = json.loads(data) log('%s' % response) if player.progress == 'true': if response.get('item').get('type') == 'episode': xbmc_id = response.get('item').get('id') - item = self.getEpisodeTVDB(xbmc_id) + item = self.getEpisodeTVDB(xbmc_id) log('showtitle=%s' % item['showtitle']) log('season=%s' % item['season']) log('episode=%s' % item['episode']) log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % player.filename) log('progress=%s' % self._last_pos) - self.progress = SaveProgress(player.token, item['episode_id'], self._last_pos) - log('progress.is_set:=%s' % self.progress.is_set) + self.progress = SaveProgress(player.token, item['episode_id'], self._last_pos) + log('progress.is_set:=%s' % self.progress.is_set) if (method == 'VideoLibrary.OnUpdate'): log('VideoLibrary.OnUpdate') - response = json.loads(data) + response = json.loads(data) log('%s' % response) if response.get('item').get('type') == 'episode': xbmc_id = response.get('item').get('id') - playcount = response.get('playcount') + playcount = response.get('playcount') log('playcount=%s' % playcount) - item = self.getEpisodeTVDB(xbmc_id) + item = self.getEpisodeTVDB(xbmc_id) log('showtitle=%s' % item['showtitle']) log('season=%s' % item['season']) log('episode=%s' % item['episode']) @@ -208,12 +208,12 @@ def onNotification(self, sender, method, data): if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: self.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % self.filename) - self.episode = FindEpisode(player.token, item['episode_id']) + self.episode = FindEpisode(player.token, item['episode_id'], self.filename) log('episode.is_found=%s' % self.episode.is_found) if self.episode.is_found: if playcount is 1: log('MarkAsWatched(*, %s, %s, %s)' % (self.filename, player.facebook, player.twitter)) - checkin = MarkAsWatched(player.token, item['episode_id'], player.facebook, player.twitter) + checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter) log('checkin.is_marked:=%s' % checkin.is_marked) if checkin.is_marked: if player.emotion == 'true': @@ -231,7 +231,7 @@ def onNotification(self, sender, method, data): self.emotion = 6 elif self.emotion == 5: self.emotion = 7 - SetEmotion(player.token, item['episode_id'], self.emotion) + SetEmotion(player.token, self.episode.id, self.emotion) if player.notifications == 'true': if player.notif_during_playback == 'false' and player.isPlaying() == 1: return @@ -245,7 +245,7 @@ def onNotification(self, sender, method, data): notif(__language__(32907), time=2500) if playcount is 0: log('MarkAsUnWatched(*, %s)' % (self.filename)) - checkin = MarkAsUnWatched(player.token, item['episode_id']) + checkin = MarkAsUnWatched(player.token, self.episode.id) log('checkin.is_unmarked:=%s' % checkin.is_unmarked) if checkin.is_unmarked: if player.notifications == 'true': @@ -270,6 +270,8 @@ def getEpisodeTVDB(self, xbmc_id): episode_id = result['result']['episodedetails']['uniqueid']['unknown'] elif 'tvdb' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['tvdb'] + elif 'tmdb' in result['result']['episodedetails']['uniqueid']: + episode_id = result['result']['episodedetails']['uniqueid']['tmdb'] else: return False log('episode_id=%s' % episode_id) @@ -284,7 +286,7 @@ def getEpisodeTVDB(self, xbmc_id): return item except: return False - + def getAllEpisodes(self, xbmc_id): rpccmd = {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetEpisodes', 'params': {"tvshowid": int(xbmc_id), 'properties': ['season', 'episode', 'showtitle', 'playcount']}, 'id': 1} rpccmd = json.dumps(rpccmd) @@ -319,10 +321,10 @@ def __init__ (self): return self._monitor = Monitor(action = self._reset) log('Player - monitor') - + def _reset(self): self.__init__() - + def _GetUser(self): log('_GetUser') user = GetUserInformations(self.token) @@ -341,12 +343,12 @@ def formatNumber(number): if len(number) < 2: number = '0%s' % number return number - + def formatName(filename): filename = filename.strip() filename = filename.replace(' ', '.') return normalizeString(filename) - + def notif(msg, time=5000): xbmcgui.Dialog().notification(encode(__scriptname__), encode(msg), time=time, icon=__icon__) From 478f13eb51333460c50290d5eb7df92b098e5414 Mon Sep 17 00:00:00 2001 From: rubenfjs Date: Fri, 4 Dec 2020 01:20:55 +0000 Subject: [PATCH 10/22] Add support for Kodi 19 (kodi libs and python3) --- addon.xml | 2 +- default.py | 19 ++-- program.py | 7 +- resources/lib/tvtime.py | 232 ++++++++++++++++++++-------------------- 4 files changed, 132 insertions(+), 128 deletions(-) diff --git a/addon.xml b/addon.xml index a954aed..98d90b7 100644 --- a/addon.xml +++ b/addon.xml @@ -4,7 +4,7 @@ version="1.2.3" provider-name="alxlaxv"> - + executable diff --git a/default.py b/default.py index 4ac283b..542b223 100644 --- a/default.py +++ b/default.py @@ -19,7 +19,7 @@ __version__ = __addon__.getAddonInfo('version') __language__ = __addon__.getLocalizedString __resource_path__ = os.path.join(__cwd__, 'resources', 'lib') -__resource__ = xbmc.translatePath(__resource_path__).decode('utf-8') +__resource__ = xbmcvfs.translatePath(__resource_path__) __notifications__ = __addon__.getSetting('notifications') from resources.lib.tvtime import FindEpisode @@ -39,7 +39,8 @@ def __init__( self, *args, **kwargs ): self._playback_lock = threading.Event() def _trackPosition(self): - while self._playback_lock.isSet() and not xbmc.abortRequested: + monit = xbmc.Monitor() + while self._playback_lock.isSet() and not monit.abortRequested: try: self._last_pos = player.getTime() except: @@ -67,7 +68,7 @@ def _tearDown(self): def onSettingsChanged( self ): log('onSettingsChanged') self.action() - + def onNotification(self, sender, method, data): log('onNotification') log('method=%s' % method) @@ -211,7 +212,7 @@ def onNotification(self, sender, method, data): self.episode = FindEpisode(player.token, item['episode_id'], self.filename) log('episode.is_found=%s' % self.episode.is_found) if self.episode.is_found: - if playcount is 1: + if playcount == 1: log('MarkAsWatched(*, %s, %s, %s)' % (self.filename, player.facebook, player.twitter)) checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter) log('checkin.is_marked:=%s' % checkin.is_marked) @@ -243,7 +244,7 @@ def onNotification(self, sender, method, data): if player.notif_during_playback == 'false' and player.isPlaying() == 1: return notif(__language__(32907), time=2500) - if playcount is 0: + if playcount == 0: log('MarkAsUnWatched(*, %s)' % (self.filename)) checkin = MarkAsUnWatched(player.token, self.episode.id) log('checkin.is_unmarked:=%s' % checkin.is_unmarked) @@ -311,7 +312,7 @@ def __init__ (self): self.http_playing = False self.emotion = __addon__.getSetting('emotion') self.defaultemotion = __addon__.getSetting('defaultemotion') - if self.token is '': + if self.token == '': log(__language__(32901)) if self.notifications == 'true': notif(__language__(32901), time=2500) @@ -370,8 +371,10 @@ def normalizeString(str): if ( __name__ == "__main__" ): player = Player() log("[%s] - Version: %s Started" % (__scriptname__, __version__)) - while not xbmc.abortRequested: - xbmc.sleep(100) + monit = xbmc.Monitor() + while not monit.abortRequested(): + if monit.waitForAbort(100): + break player._monitor = None log("sys.exit(0)") sys.exit(0) diff --git a/program.py b/program.py index 3902afc..e01c0c4 100644 --- a/program.py +++ b/program.py @@ -6,6 +6,7 @@ import sys import threading import xbmc +import xbmcvfs import xbmcgui import xbmcaddon import unicodedata @@ -32,7 +33,7 @@ __version__ = __addon__.getAddonInfo('version') __language__ = __addon__.getLocalizedString __resource_path__ = os.path.join(__cwd__, 'resources', 'lib') -__resource__ = xbmc.translatePath(__resource_path__).decode('utf-8') +__resource__ = xbmcvfs.translatePath(__resource_path__) __token__ = __addon__.getSetting('token') __facebook__ = __addon__.getSetting('facebook') @@ -42,14 +43,14 @@ def start(): menuitems = [] - if __token__ is '': + if __token__ == '': menuitems.append(__language__(33801)) else: menuitems.append(__language__(33803)) menuitems.append(__language__(33802)) startmenu = xbmcgui.Dialog().select(__scriptname__, menuitems) if startmenu < 0: return - elif startmenu == 0 and __token__ is '': + elif startmenu == 0 and __token__ == '': _login = GetCode() if _login.is_code: Authorization(_login.verification_url, _login.user_code, _login.device_code) diff --git a/resources/lib/tvtime.py b/resources/lib/tvtime.py index cd902d9..4cf70c6 100644 --- a/resources/lib/tvtime.py +++ b/resources/lib/tvtime.py @@ -1,9 +1,9 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import cookielib +import http.cookiejar import re -import urllib, urllib2 +import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse import json request_uri = "https://api.tvtime.com/v1/" @@ -19,12 +19,12 @@ def __init__(self, token, episode_id, filename=''): self.action = 'episode?access_token=%s&episode_id=%s' % (self.token, self.episode_id) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -57,12 +57,12 @@ def __init__(self, token, show_id): self.show_id = show_id self.action = 'show?access_token=%s&show_id=%s' % (self.token, self.show_id) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -95,12 +95,12 @@ def __init__(self, token, page, limit): self.limit = limit self.action = 'library?access_token=%s&page=%s&limit=%s' % (self.token, self.page, self.limit) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -129,12 +129,12 @@ def __init__(self, token, episode_id): self.episode_id = episode_id self.action = 'checkin?access_token=%s&episode_id=%s' % (self.token, self.episode_id) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -167,19 +167,19 @@ def __init__(self, token, episode_id, facebook=0, twitter=0): if self.twitter == True: self.twitter = 1 else: self.twitter = 0 self.action = 'checkin' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id, 'publish_on_ticker' : self.facebook, 'publish_on_twitter' : self.twitter }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -204,17 +204,17 @@ def __init__(self, token, episode_id): self.token = token self.episode_id = episode_id self.action = 'checkout' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -240,18 +240,18 @@ def __init__(self, token, episode_id, progress): self.episode_id = episode_id self.progress = progress self.action = 'progress' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id, 'progress' : self.progress }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -276,17 +276,17 @@ def __init__(self, token, show_id): self.token = token self.show_id = show_id self.action = 'follow' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -311,17 +311,17 @@ def __init__(self, token, show_id): self.token = token self.show_id = show_id self.action = 'follow' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -348,19 +348,19 @@ def __init__(self, token, show_id, season, episode): self.season = season self.episode = episode self.action = 'show_progress' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id, 'season' : self.season, 'episode' : self.episode }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -385,17 +385,17 @@ def __init__(self, token, shows): self.token = token self.shows = shows self.action = 'show_progress' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'shows' : self.shows }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -420,17 +420,17 @@ def __init__(self, token, show_id): self.token = token self.show_id = show_id self.action = 'delete_show_progress' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -457,17 +457,17 @@ def __init__(self, token, shows): self.token = token self.shows = shows self.action = 'delete_show_progress' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'shows' : self.shows }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ @@ -495,18 +495,18 @@ def __init__(self, token, episode_id, emotion_id): self.episode_id = episode_id self.emotion_id = emotion_id self.action = 'emotion' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id, 'emotion_id' : self.emotion_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -531,12 +531,12 @@ def __init__(self, token): self.token = token self.action = 'user?access_token=%s' % self.token - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -561,16 +561,16 @@ class GetCode(object): def __init__(self): self.client_id = '845mHJx5-CxI8dSlStHB' self.action = 'oauth/device/code' - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'client_id' : self.client_id }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') @@ -601,18 +601,18 @@ def __init__(self, code): self.client_secret = 'lvN6LZOZkUAH8aa_WAbvAJ4AXGcSo7irZyAPdRQj' self.action = 'oauth/access_token' self.code = code - request_data = urllib.urlencode({ + request_data = urllib.parse.urlencode({ 'client_id' : self.client_id, 'client_secret' : self.client_secret, 'code' : self.code }) - self.cj = cookielib.CookieJar() - self.opener = urllib2.build_opener( - urllib2.HTTPRedirectHandler(), - urllib2.HTTPHandler(debuglevel=0), - urllib2.HTTPSHandler(debuglevel=0), - urllib2.HTTPCookieProcessor(self.cj) + self.cj = http.cookiejar.CookieJar() + self.opener = urllib.request.build_opener( + urllib.request.HTTPRedirectHandler(), + urllib.request.HTTPHandler(debuglevel=0), + urllib.request.HTTPSHandler(debuglevel=0), + urllib.request.HTTPCookieProcessor(self.cj) ) self.opener.addheaders = [ ('User-agent', 'Lynx/2.8.1pre.9 libwww-FM/2.14') From e35d0f894f12883e5874ee9e772ff482497575e7 Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Wed, 17 Mar 2021 14:48:07 +0100 Subject: [PATCH 11/22] fixed all api issues --- resources/lib/tvtime.py | 58 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/resources/lib/tvtime.py b/resources/lib/tvtime.py index 4cf70c6..d560c8e 100644 --- a/resources/lib/tvtime.py +++ b/resources/lib/tvtime.py @@ -36,7 +36,7 @@ def __init__(self, token, episode_id, filename=''): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, None) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -74,7 +74,7 @@ def __init__(self, token, show_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, None) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -112,7 +112,7 @@ def __init__(self, token, page, limit): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, None) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -146,7 +146,7 @@ def __init__(self, token, episode_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, None) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -172,7 +172,7 @@ def __init__(self, token, episode_id, facebook=0, twitter=0): 'episode_id' : self.episode_id, 'publish_on_ticker' : self.facebook, 'publish_on_twitter' : self.twitter - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -190,7 +190,7 @@ def __init__(self, token, episode_id, facebook=0, twitter=0): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -207,7 +207,7 @@ def __init__(self, token, episode_id): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -225,7 +225,7 @@ def __init__(self, token, episode_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -244,7 +244,7 @@ def __init__(self, token, episode_id, progress): 'access_token' : self.token, 'episode_id' : self.episode_id, 'progress' : self.progress - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -262,7 +262,7 @@ def __init__(self, token, episode_id, progress): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -279,7 +279,7 @@ def __init__(self, token, show_id): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -297,7 +297,7 @@ def __init__(self, token, show_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -314,7 +314,7 @@ def __init__(self, token, show_id): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -332,7 +332,7 @@ def __init__(self, token, show_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -353,7 +353,7 @@ def __init__(self, token, show_id, season, episode): 'show_id' : self.show_id, 'season' : self.season, 'episode' : self.episode - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -371,7 +371,7 @@ def __init__(self, token, show_id, season, episode): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -388,7 +388,7 @@ def __init__(self, token, shows): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'shows' : self.shows - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -406,7 +406,7 @@ def __init__(self, token, shows): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -423,7 +423,7 @@ def __init__(self, token, show_id): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'show_id' : self.show_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -442,7 +442,7 @@ def __init__(self, token, show_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -460,7 +460,7 @@ def __init__(self, token, shows): request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'shows' : self.shows - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -479,7 +479,7 @@ def __init__(self, token, shows): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -499,7 +499,7 @@ def __init__(self, token, episode_id, emotion_id): 'access_token' : self.token, 'episode_id' : self.episode_id, 'emotion_id' : self.emotion_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -517,7 +517,7 @@ def __init__(self, token, episode_id, emotion_id): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -547,7 +547,7 @@ def __init__(self, token): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, None) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -563,7 +563,7 @@ def __init__(self): self.action = 'oauth/device/code' request_data = urllib.parse.urlencode({ 'client_id' : self.client_id - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -581,7 +581,7 @@ def __init__(self): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None @@ -605,7 +605,7 @@ def __init__(self, code): 'client_id' : self.client_id, 'client_secret' : self.client_secret, 'code' : self.code - }) + }).encode("utf-8") self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener( @@ -623,7 +623,7 @@ def __init__(self, code): request_url = "%s%s" % (request_uri, self.action) try: response = self.opener.open(request_url, request_data) - data = json.loads(''.join(response.readlines())) + data = json.loads(response.read()) except: data = None From 91a6488c1a0ab947337a4a8b60dbfd12e0482455 Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Wed, 17 Mar 2021 15:55:03 +0100 Subject: [PATCH 12/22] upgraded respecting kodi 19 changes --- program.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/program.py b/program.py index e01c0c4..65c9f87 100644 --- a/program.py +++ b/program.py @@ -68,7 +68,7 @@ def start(): def Authorization(verification_url, user_code, device_code): pDialog = xbmcgui.DialogProgress() - pDialog.create(__scriptname__, "%s: %s" % (__language__(33806), verification_url), "%s: %s" % (__language__(33807), user_code)) + pDialog.create(__scriptname__, "%s: %s\n%s: %s" % (__language__(33806), verification_url, __language__(33807), user_code)) for i in range(0, 100): pDialog.update(i) xbmc.sleep(5000) @@ -79,7 +79,7 @@ def Authorization(verification_url, user_code, device_code): user = GetUserInformations(_authorize.access_token) if user.is_authenticated: if __welcome__ == 'true': - xbmcgui.Dialog().ok(__scriptname__, '%s %s' % (__language__(32902), user.username), __language__(33808)) + xbmcgui.Dialog().ok(__scriptname__, '%s %s\n%s' % (__language__(32902), user.username, __language__(33808))) __addon__.setSetting('user', user.username) return pDialog.close() @@ -142,7 +142,7 @@ def scan(way): total = len(tvshowsList) for tvshowList in tvshowsList: cpt = cpt + 1 - pc = (cpt*100)/total + pc = int((cpt*100)/total) pDialog.update(pc, message=tvshowList['title']) xbmc.sleep(100) if tvshowList['seen'] == 1: @@ -165,7 +165,7 @@ def scan(way): pDialog.update(0, message=__language__(33908)) for showSeen in showsSeen: cpt = cpt + 1 - pc = (cpt*100)/total + pc = int((cpt*100)/total) tempShowsSeen.append({ 'show_id': int(showSeen['show_id']), 'season': showSeen['season'], @@ -189,7 +189,7 @@ def scan(way): pDialog.update(0, message=__language__(33908)) for showNotSeen in showsNotSeen: cpt = cpt + 1 - pc = (cpt*100)/total + pc = int((cpt*100)/total) tempShowsNotSeen.append({ 'show_id': int(showNotSeen['show_id']) }) @@ -222,7 +222,7 @@ def scan(way): for i in range(0, total): for tvshowTime in tvshowTimeList: if int(tvshowList[i]['show_id']) == int(tvshowTime['show_id']): - pDialog.update(((100/total)*(i+1)), message=tvshowTime['title']) + pDialog.update(int((100/total)*(i+1)), message=tvshowTime['title']) log('setTvshowProgress(%s, %s, %s)' % (tvshowTime['show_id'], tvshowTime['season'], tvshowTime['episode'])) tvshowProgress = setTvshowProgress(tvshowTime['show_id'], tvshowTime['season'], tvshowTime['episode']) pDialog.update(100, message=__language__(33907)) @@ -237,7 +237,7 @@ def getTvshowList(): tvshows = json.loads(result) log('tvshows=%s' % tvshows) tvshowList = [] - if tvshows.has_key('result') and tvshows['result'] != None and tvshows['result'].has_key('tvshows'): + if 'result' in tvshows and tvshows['result'] != None and 'tvshows' in tvshows['result']: tvshows = tvshows['result']['tvshows'] for tvshow in tvshows: rpccmd = {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetEpisodes', 'params': {'tvshowid': tvshow['tvshowid'], 'properties': ['season', 'episode', 'playcount']}, 'id': 1} @@ -246,7 +246,7 @@ def getTvshowList(): episodes = json.loads(result) log('tvshow=%s [%s]' % (tvshow['title'], tvshow['imdbnumber'])) log('episodes[%s]=%s' % (tvshow['imdbnumber'], episodes)) - if episodes.has_key('result') and episodes['result'] != None and episodes['result'].has_key('episodes'): + if 'result' in episodes and episodes['result'] != None and 'episodes' in episodes['result']: episodes = episodes['result']['episodes'] lastEpisode = None lastSeasonNr = 0 @@ -322,7 +322,7 @@ def setTvshowProgress(show_id, last_season_seen, last_episode_seen): rpccmd = json.dumps(rpccmd) result = xbmc.executeJSONRPC(rpccmd) episodes = json.loads(result) - log('episodes=%s' % episodes) + log('episodes=%s' % episodes) if episodes['result']['limits']['total'] > 0: episodes = episodes['result']['episodes'] for episode in episodes: From 8f8ac9dc80b180897c4dcdcb32b6d634a3e98bcf Mon Sep 17 00:00:00 2001 From: TheLazyFox <35723598+the-lazy-fox@users.noreply.github.com> Date: Thu, 18 Mar 2021 15:38:13 +0100 Subject: [PATCH 13/22] Update addon.xml --- addon.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.xml b/addon.xml index 98d90b7..e859c2b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,8 +1,8 @@ + version="2.0.0" + provider-name="the-lazy-fox"> From a3102d2cbb126a9f66058a61d164dd8172e6a6f0 Mon Sep 17 00:00:00 2001 From: TheLazyFox <35723598+the-lazy-fox@users.noreply.github.com> Date: Thu, 18 Mar 2021 15:39:15 +0100 Subject: [PATCH 14/22] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a357f3..79e4ccb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Please follow Build or Download steps below to install this version. If you want to build it manually, please follow the steps below: -1. Clone this repository `sudo git clone https://github.com/alxlaxv/script.tvtime.git` +1. Clone this repository `sudo git clone https://github.com/the-lazy-fox/script.tvtime.git` 2. Enter in script.tvtime `cd script.tvtime` 3. Make the compile script executable `sudo chmod +x compile.sh` 4. Launch the compile script `./compile.sh` From 05d31f09b5dffd895758bb60cf2b8c40e6f0b33f Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Fri, 19 Mar 2021 21:50:03 +0100 Subject: [PATCH 15/22] fixed python3 errors --- default.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/default.py b/default.py index 542b223..7e9d1ee 100644 --- a/default.py +++ b/default.py @@ -113,7 +113,7 @@ def onNotification(self, sender, method, data): log('season=%s' % item['season']) log('episode=%s' % item['episode']) log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % player.filename) player.episode = FindEpisode(player.token, item['episode_id'], player.filename) @@ -186,7 +186,7 @@ def onNotification(self, sender, method, data): log('season=%s' % item['season']) log('episode=%s' % item['episode']) log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % player.filename) log('progress=%s' % self._last_pos) @@ -206,7 +206,7 @@ def onNotification(self, sender, method, data): log('episode=%s' % item['episode']) log('episode_id=%s' % item['episode_id']) log('playcount=%s' % playcount) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and item['episode_id'] > 0: + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: self.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % self.filename) self.episode = FindEpisode(player.token, item['episode_id'], self.filename) @@ -366,7 +366,7 @@ def encode(string): return result def normalizeString(str): - return unicodedata.normalize('NFKD', str).encode('ascii','ignore').encode('UTF-8','replace') + return unicodedata.normalize('NFKD', str).encode('ascii','ignore').decode('UTF-8','replace') if ( __name__ == "__main__" ): player = Player() From b8bd8cbd61951d3604ac3578b4a249bd9e30ae13 Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Mon, 22 Mar 2021 16:01:46 +0100 Subject: [PATCH 16/22] Refactoring --- default.py | 409 +++++++++++++++++++++++++++++------------------------ 1 file changed, 226 insertions(+), 183 deletions(-) diff --git a/default.py b/default.py index 7e9d1ee..76b325a 100644 --- a/default.py +++ b/default.py @@ -73,193 +73,236 @@ def onNotification(self, sender, method, data): log('onNotification') log('method=%s' % method) if (method == 'Player.OnPlay'): - self._setUp() - self._total_time = player.getTotalTime() - self._tracker.start() - log('Player.OnPlay') - if player.http == 'true' and player.getPlayingFile()[:4] == 'http' and re.search(r'[sS][0-9]*[eE][0-9]*', os.path.basename(player.getPlayingFile()), flags=0) : - player.http_playing = True - player.filename = os.path.basename(player.getPlayingFile()) - self.startcut = player.filename.find("%5B") - self.endcut = player.filename.find("%5D") - self.tocut = player.filename[self.startcut:self.endcut] - player.filename = player.filename.replace(self.tocut, "") - player.filename = player.filename.replace("%5B", "") - player.filename = player.filename.replace("%5D", "") - player.filename = player.filename.replace("%20", ".") + self._player_onplay(data) + if (method == 'Player.OnStop'): + self._player_onstop(data) + if (method == 'VideoLibrary.OnUpdate'): + self._video_onupdate(data) + + def _player_onplay(self, data): + self._setUp() + self._total_time = player.getTotalTime() + self._tracker.start() + log('Player.OnPlay') + if player.http == 'true' and player.getPlayingFile()[:4] == 'http' and re.search(r'[sS][0-9]*[eE][0-9]*', os.path.basename(player.getPlayingFile()), flags=0) : + player.http_playing = True + player.filename = os.path.basename(player.getPlayingFile()) + startcut = player.filename.find("%5B") + endcut = player.filename.find("%5D") + tocut = player.filename[startcut:endcut] + player.filename = player.filename.replace(tocut, "") + player.filename = player.filename.replace("%5B", "") + player.filename = player.filename.replace("%5D", "") + player.filename = player.filename.replace("%20", ".") + log('tvshowtitle=%s' % player.filename) + + player.episode = FindEpisode(player.token, 0, player.filename) + log('episode.is_found=%s' % player.episode.is_found) + + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + + if player.episode.is_found: + if player.notif_scrobbling == 'false': + return + notif('%s %s %sx%s' % (__language__(32904), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) + else: + notif(__language__(32905), time=2500) + else: + player.http_playing = False + response = json.loads(data) + log('%s' % response) + if response.get('item').get('type') != 'episode': + return + + xbmc_id = response.get('item').get('id') + item = self.getEpisodeTVDB(xbmc_id) + log('showtitle=%s' % item['showtitle']) + log('season=%s' % item['season']) + log('episode=%s' % item['episode']) + log('episode_id=%s' % item['episode_id']) + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: + player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) log('tvshowtitle=%s' % player.filename) - player.episode = FindEpisode(player.token, 0, player.filename) + + player.episode = FindEpisode(player.token, item['episode_id'], player.filename) log('episode.is_found=%s' % player.episode.is_found) + + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + if player.episode.is_found: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - if player.notif_scrobbling == 'false': - return - notif('%s %s %sx%s' % (__language__(32904), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) + notif('%s %s %sx%s' % (__language__(32904), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) else: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - notif(__language__(32905), time=2500) - else: - player.http_playing = False - response = json.loads(data) - log('%s' % response) - if response.get('item').get('type') == 'episode': - xbmc_id = response.get('item').get('id') - item = self.getEpisodeTVDB(xbmc_id) - log('showtitle=%s' % item['showtitle']) - log('season=%s' % item['season']) - log('episode=%s' % item['episode']) - log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: - player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) - log('tvshowtitle=%s' % player.filename) - player.episode = FindEpisode(player.token, item['episode_id'], player.filename) - log('episode.is_found=%s' % player.episode.is_found) - if player.episode.is_found: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - if player.notif_scrobbling == 'false': - return - notif('%s %s %sx%s' % (__language__(32904), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) - else: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - notif(__language__(32905), time=2500) - else: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - notif(__language__(32905), time=2500) - if (method == 'Player.OnStop'): - self._tearDown() - actual_percent = (self._last_pos/self._total_time)*100 - log('last_pos / total_time : %s / %s = %s %%' % (self._last_pos, self._total_time, actual_percent)) - log('Player.OnStop') - if player.http == 'true' and player.http_playing == True : - if player.progress == 'true': - player.episode = FindEpisode(player.token, 0, player.filename) - log('episode.is_found=%s' % player.episode.is_found) - if player.episode.is_found: - log('progress=%s' % self._last_pos) - self.progress = SaveProgress(player.token, player.episode.id, self._last_pos) - log('progress.is_set:=%s' % self.progress.is_set) - if actual_percent > 90: - log('MarkAsWatched(*, %s, %s, %s)' % (player.filename, player.facebook, player.twitter)) - checkin = MarkAsWatched(player.token, player.episode.id, player.facebook, player.twitter) - log('checkin.is_marked:=%s' % checkin.is_marked) - if checkin.is_marked: - if player.emotion == 'true': - self.emotion = xbmcgui.Dialog().select('%s: %s %sx%s' % (__language__(33909), player.episode.showname, player.episode.season_number, player.episode.number), [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) - if self.emotion < 0: return - if self.emotion == 0: - self.emotion = 1 - elif self.emotion == 1: - self.emotion = 2 - elif self.emotion == 2: - self.emotion = 3 - elif self.emotion == 3: - self.emotion = 4 - elif self.emotion == 4: - self.emotion = 6 - elif self.emotion == 5: - self.emotion = 7 - SetEmotion(player.token, player.episode.id, self.emotion) - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - if player.notif_scrobbling == 'false': - return - notif('%s %s %sx%s' % (__language__(32906), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) + notif(__language__(32905), time=2500) else: - response = json.loads(data) - log('%s' % response) - if player.progress == 'true': - if response.get('item').get('type') == 'episode': - xbmc_id = response.get('item').get('id') - item = self.getEpisodeTVDB(xbmc_id) - log('showtitle=%s' % item['showtitle']) - log('season=%s' % item['season']) - log('episode=%s' % item['episode']) - log('episode_id=%s' % item['episode_id']) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: - player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) - log('tvshowtitle=%s' % player.filename) - log('progress=%s' % self._last_pos) - self.progress = SaveProgress(player.token, item['episode_id'], self._last_pos) - log('progress.is_set:=%s' % self.progress.is_set) - if (method == 'VideoLibrary.OnUpdate'): - log('VideoLibrary.OnUpdate') + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + + notif(__language__(32905), time=2500) + + + def _player_onstop(self, data): + self._tearDown() + actual_percent = (self._last_pos/self._total_time)*100 + log('last_pos / total_time : %s / %s = %s %%' % (self._last_pos, self._total_time, actual_percent)) + log('Player.OnStop') + if player.http == 'true' and player.http_playing == True: + if player.progress != 'true': + return + + player.episode = FindEpisode(player.token, 0, player.filename) + log('episode.is_found=%s' % player.episode.is_found) + + if not player.episode.is_found: + return + + log('progress=%s' % self._last_pos) + progress = SaveProgress(player.token, player.episode.id, self._last_pos) + log('progress.is_set:=%s' % progress.is_set) + + if actual_percent <= 90: + return + + log('MarkAsWatched(*, %s, %s, %s)' % (player.filename, player.facebook, player.twitter)) + checkin = MarkAsWatched(player.token, player.episode.id, player.facebook, player.twitter) + log('checkin.is_marked:=%s' % checkin.is_marked) + if not checkin.is_marked: + return + + if player.emotion == 'true': + msg = '%s: %s %sx%s' % (__language__(33909), player.episode.showname, player.episode.season_number, player.episode.number) + emotion = xbmcgui.Dialog().select(msg, [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) + if emotion < 0: return + if emotion == 0: + emotion = 1 + elif emotion == 1: + emotion = 2 + elif emotion == 2: + emotion = 3 + elif emotion == 3: + emotion = 4 + elif emotion == 4: + emotion = 6 + elif emotion == 5: + emotion = 7 + SetEmotion(player.token, player.episode.id, emotion) + + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + notif('%s %s %sx%s' % (__language__(32906), player.episode.showname, player.episode.season_number, player.episode.number), time=2500) + else: response = json.loads(data) log('%s' % response) - if response.get('item').get('type') == 'episode': - xbmc_id = response.get('item').get('id') - playcount = response.get('playcount') - log('playcount=%s' % playcount) - item = self.getEpisodeTVDB(xbmc_id) - log('showtitle=%s' % item['showtitle']) - log('season=%s' % item['season']) - log('episode=%s' % item['episode']) - log('episode_id=%s' % item['episode_id']) - log('playcount=%s' % playcount) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: - self.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) - log('tvshowtitle=%s' % self.filename) - self.episode = FindEpisode(player.token, item['episode_id'], self.filename) - log('episode.is_found=%s' % self.episode.is_found) - if self.episode.is_found: - if playcount == 1: - log('MarkAsWatched(*, %s, %s, %s)' % (self.filename, player.facebook, player.twitter)) - checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter) - log('checkin.is_marked:=%s' % checkin.is_marked) - if checkin.is_marked: - if player.emotion == 'true': - self.emotion = xbmcgui.Dialog().select('%s: %s' % (__language__(33909), self.filename), [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) - if self.emotion < 0: return - if self.emotion == 0: - self.emotion = 1 - elif self.emotion == 1: - self.emotion = 2 - elif self.emotion == 2: - self.emotion = 3 - elif self.emotion == 3: - self.emotion = 4 - elif self.emotion == 4: - self.emotion = 6 - elif self.emotion == 5: - self.emotion = 7 - SetEmotion(player.token, self.episode.id, self.emotion) - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - if player.notif_scrobbling == 'false': - return - notif('%s %s %sx%s' % (__language__(32906), self.episode.showname, self.episode.season_number, self.episode.number), time=2500) - else: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - notif(__language__(32907), time=2500) - if playcount == 0: - log('MarkAsUnWatched(*, %s)' % (self.filename)) - checkin = MarkAsUnWatched(player.token, self.episode.id) - log('checkin.is_unmarked:=%s' % checkin.is_unmarked) - if checkin.is_unmarked: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - if player.notif_scrobbling == 'false': - return - notif('%s %s %sx%s' % (__language__(32908), self.episode.showname, self.episode.season_number, self.episode.number), time=2500) - else: - if player.notifications == 'true': - if player.notif_during_playback == 'false' and player.isPlaying() == 1: - return - notif(__language__(32907), time=2500) + + if player.progress != 'true': + return + + if response.get('item').get('type') != 'episode': + return + + xbmc_id = response.get('item').get('id') + item = self.getEpisodeTVDB(xbmc_id) + log('showtitle=%s' % item['showtitle']) + log('season=%s' % item['season']) + log('episode=%s' % item['episode']) + log('episode_id=%s' % item['episode_id']) + + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: + player.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) + log('tvshowtitle=%s' % player.filename) + + log('progress=%s' % self._last_pos) + progress = SaveProgress(player.token, item['episode_id'], self._last_pos) + log('progress.is_set:=%s' % progress.is_set) + + def _video_onupdate(self, data): + log('VideoLibrary.OnUpdate') + response = json.loads(data) + log('%s' % response) + if response.get('item').get('type') != 'episode': + return + xbmc_id = response.get('item').get('id') + playcount = response.get('playcount') + log('playcount=%s' % playcount) + + item = self.getEpisodeTVDB(xbmc_id) + log('showtitle=%s' % item['showtitle']) + log('season=%s' % item['season']) + log('episode=%s' % item['episode']) + log('episode_id=%s' % item['episode_id']) + log('playcount=%s' % playcount) + + if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: + return + + self.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) + log('tvshowtitle=%s' % self.filename) + self.episode = FindEpisode(player.token, item['episode_id'], self.filename) + log('episode.is_found=%s' % self.episode.is_found) + + if not self.episode.is_found: + return + + if playcount == 1: + log('MarkAsWatched(*, %s, %s, %s)' % (self.filename, player.facebook, player.twitter)) + checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter) + log('checkin.is_marked:=%s' % checkin.is_marked) + if checkin.is_marked: + if player.emotion == 'true': + emotion = xbmcgui.Dialog().select('%s: %s' % (__language__(33909), self.filename), [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) + if emotion < 0: return + if emotion == 0: + emotion = 1 + elif emotion == 1: + emotion = 2 + elif emotion == 2: + emotion = 3 + elif emotion == 3: + emotion = 4 + elif emotion == 4: + emotion = 6 + elif emotion == 5: + emotion = 7 + SetEmotion(player.token, self.episode.id, emotion) + + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + if player.notif_scrobbling == 'false': + return + notif('%s %s %sx%s' % (__language__(32906), self.episode.showname, self.episode.season_number, self.episode.number), time=2500) + else: + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + notif(__language__(32907), time=2500) + elif playcount == 0: + log('MarkAsUnWatched(*, %s)' % (self.filename)) + checkin = MarkAsUnWatched(player.token, self.episode.id) + log('checkin.is_unmarked:=%s' % checkin.is_unmarked) + + if player.notifications != 'true': + return + if player.notif_during_playback == 'false' and player.isPlaying() == 1: + return + + if checkin.is_unmarked: + if player.notif_scrobbling == 'false': + return + notif('%s %s %sx%s' % (__language__(32908), self.episode.showname, self.episode.season_number, self.episode.number), time=2500) + else: + notif(__language__(32907), time=2500) def getEpisodeTVDB(self, xbmc_id): rpccmd = {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetEpisodeDetails', 'params': {"episodeid": int(xbmc_id), 'properties': ['season', 'episode', 'tvshowid', 'showtitle', 'uniqueid']}, 'id': 1} @@ -267,6 +310,7 @@ def getEpisodeTVDB(self, xbmc_id): result = xbmc.executeJSONRPC(rpccmd) result = json.loads(result) log('result=%s' % result) + if 'unknown' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['unknown'] elif 'tvdb' in result['result']['episodedetails']['uniqueid']: @@ -274,7 +318,7 @@ def getEpisodeTVDB(self, xbmc_id): elif 'tmdb' in result['result']['episodedetails']['uniqueid']: episode_id = result['result']['episodedetails']['uniqueid']['tmdb'] else: - return False + return {} log('episode_id=%s' % episode_id) try: @@ -286,7 +330,7 @@ def getEpisodeTVDB(self, xbmc_id): item['episode_id'] = episode_id return item except: - return False + return {} def getAllEpisodes(self, xbmc_id): rpccmd = {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetEpisodes', 'params': {"tvshowid": int(xbmc_id), 'properties': ['season', 'episode', 'showtitle', 'playcount']}, 'id': 1} @@ -296,7 +340,6 @@ def getAllEpisodes(self, xbmc_id): return result class Player(xbmc.Player): - def __init__ (self): xbmc.Player.__init__(self) log('Player - init') From dbd7ceeb04c164ef091fdd54ec47b3c11d1f6d4d Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Mon, 22 Mar 2021 16:25:55 +0100 Subject: [PATCH 17/22] refactoring fixes --- default.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/default.py b/default.py index 76b325a..f6f4029 100644 --- a/default.py +++ b/default.py @@ -72,6 +72,8 @@ def onSettingsChanged( self ): def onNotification(self, sender, method, data): log('onNotification') log('method=%s' % method) + log('sender=%s' % sender) + log('data=%s' % data) if (method == 'Player.OnPlay'): self._player_onplay(data) if (method == 'Player.OnStop'): @@ -87,6 +89,7 @@ def _player_onplay(self, data): if player.http == 'true' and player.getPlayingFile()[:4] == 'http' and re.search(r'[sS][0-9]*[eE][0-9]*', os.path.basename(player.getPlayingFile()), flags=0) : player.http_playing = True player.filename = os.path.basename(player.getPlayingFile()) + log('rawname=%s' % player.filename) startcut = player.filename.find("%5B") endcut = player.filename.find("%5D") tocut = player.filename[startcut:endcut] @@ -114,7 +117,7 @@ def _player_onplay(self, data): player.http_playing = False response = json.loads(data) log('%s' % response) - if response.get('item').get('type') != 'episode': + if response.get('item') is not None and reponse.get.get('type') != 'episode': return xbmc_id = response.get('item').get('id') @@ -241,7 +244,7 @@ def _video_onupdate(self, data): log('episode_id=%s' % item['episode_id']) log('playcount=%s' % playcount) - if len(item['showtitle']) > 0 and item['season'] > 0 and item['episode'] > 0 and len(str(item['episode_id'])) > 0: + if item.get('showtitle') is None or item.get('season') is None or item.get('episode') is None or item.get('episode_id') is None: return self.filename = '%s.S%.2dE%.2d' % (formatName(item['showtitle']), float(item['season']), float(item['episode'])) @@ -398,7 +401,7 @@ def notif(msg, time=5000): def log(msg): xbmc.log("### [%s] - %s" % (__scriptname__, encode(msg), ), - level=xbmc.LOGDEBUG) #100 #xbmc.LOGDEBUG + level=xbmc.LOGINFO) #100 #xbmc.LOGDEBUG def encode(string): result = '' From 64d66b03af59bba8a604e60c3c095129aca39027 Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Mon, 22 Mar 2021 16:31:17 +0100 Subject: [PATCH 18/22] refactoring fixes --- default.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/default.py b/default.py index f6f4029..3d8f246 100644 --- a/default.py +++ b/default.py @@ -117,7 +117,7 @@ def _player_onplay(self, data): player.http_playing = False response = json.loads(data) log('%s' % response) - if response.get('item') is not None and reponse.get.get('type') != 'episode': + if response.get('item') is None or response.get('item').get('type') != 'episode': return xbmc_id = response.get('item').get('id') @@ -231,8 +231,9 @@ def _video_onupdate(self, data): log('VideoLibrary.OnUpdate') response = json.loads(data) log('%s' % response) - if response.get('item').get('type') != 'episode': + if response.get('item') is None or response.get('item').get('type') != 'episode': return + xbmc_id = response.get('item').get('id') playcount = response.get('playcount') log('playcount=%s' % playcount) From 9eb1bf23ee926fb1e36d0da5d81dc8b162051de9 Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Mon, 22 Mar 2021 17:48:25 +0100 Subject: [PATCH 19/22] Added autofollow --- resources/lib/tvtime.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/resources/lib/tvtime.py b/resources/lib/tvtime.py index d560c8e..c799715 100644 --- a/resources/lib/tvtime.py +++ b/resources/lib/tvtime.py @@ -157,21 +157,29 @@ def __init__(self, token, episode_id): self.is_watched = data['code'] class MarkAsWatched(object): - def __init__(self, token, episode_id, facebook=0, twitter=0): + def __init__(self, token, episode_id, facebook=0, twitter=0, autofollow=1): self.token = token self.episode_id = episode_id + self.facebook = facebook if self.facebook == True: self.facebook = 1 else: self.facebook = 0 + self.twitter = twitter if self.twitter == True: self.twitter = 1 else: self.twitter = 0 + + self.autofollow = autofollow + if self.autofollow == True: self.autofollow = 1 + else: self.autofollow = 0 + self.action = 'checkin' request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id, 'publish_on_ticker' : self.facebook, - 'publish_on_twitter' : self.twitter + 'publish_on_twitter' : self.twitter, + 'auto_follow': self.autofollow }).encode("utf-8") self.cj = http.cookiejar.CookieJar() From 49eaaea43b4babeea4dc7e3a2081fde11facd93f Mon Sep 17 00:00:00 2001 From: Andrea Panizza Date: Mon, 22 Mar 2021 17:48:28 +0100 Subject: [PATCH 20/22] Added autofollow --- default.py | 29 +++++++++++++++++++++++---- resources/language/English/strings.po | 4 ++++ resources/language/French/strings.po | 4 ++++ resources/language/Italian/strings.po | 4 ++++ resources/lib/tvtime.py | 7 +++---- resources/settings.xml | 1 + 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/default.py b/default.py index 3d8f246..c02cbfd 100644 --- a/default.py +++ b/default.py @@ -24,6 +24,7 @@ from resources.lib.tvtime import FindEpisode from resources.lib.tvtime import MarkAsWatched +from resources.lib.tvtime import Follow from resources.lib.tvtime import MarkAsUnWatched from resources.lib.tvtime import GetUserInformations from resources.lib.tvtime import SaveProgress @@ -173,12 +174,21 @@ def _player_onstop(self, data): if actual_percent <= 90: return - log('MarkAsWatched(*, %s, %s, %s)' % (player.filename, player.facebook, player.twitter)) - checkin = MarkAsWatched(player.token, player.episode.id, player.facebook, player.twitter) + log('MarkAsWatched(*, %s, %s, %s, %s)' % (player.filename, player.facebook, player.twitter, player.autofollow)) + checkin = MarkAsWatched(player.token, player.episode.id, player.facebook, player.twitter, player.autofollow) log('checkin.is_marked:=%s' % checkin.is_marked) if not checkin.is_marked: return + # this is just temporary fix because TVTime's Checkin API is not working correctly + # auto_follow parameter is not working, if tvtime fixes this issue we can remove this piece of code + try: + if player.autofollow: + log("following tvshow manually=%s" % player.episode.showid) + Follow(player.token, player.episode.showid) + except: + pass + if player.emotion == 'true': msg = '%s: %s %sx%s' % (__language__(33909), player.episode.showname, player.episode.season_number, player.episode.number) emotion = xbmcgui.Dialog().select(msg, [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) @@ -257,9 +267,19 @@ def _video_onupdate(self, data): return if playcount == 1: - log('MarkAsWatched(*, %s, %s, %s)' % (self.filename, player.facebook, player.twitter)) - checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter) + log('MarkAsWatched(*, %s, %s, %s, %s)' % (self.filename, player.facebook, player.twitter, player.autofollow)) + checkin = MarkAsWatched(player.token, self.episode.id, player.facebook, player.twitter, player.autofollow) log('checkin.is_marked:=%s' % checkin.is_marked) + + # this is just temporary fix because TVTime's Checkin API is not working correctly + # auto_follow parameter is not working, if tvtime fixes this issue we can remove this piece of code + try: + if player.autofollow: + log("following tvshow manually=%s" % self.episode.showid) + Follow(player.token, self.episode.showid) + except: + pass + if checkin.is_marked: if player.emotion == 'true': emotion = xbmcgui.Dialog().select('%s: %s' % (__language__(33909), self.filename), [__language__(35311), __language__(35312), __language__(35313), __language__(35314), __language__(35316), __language__(35317)]) @@ -353,6 +373,7 @@ def __init__ (self): self.welcome = __addon__.getSetting('welcome') self.notifications = __addon__.getSetting('notifications') self.notif_during_playback = __addon__.getSetting('notif_during_playback') + self.autofollow = __addon__.getSetting('autofollow') self.notif_scrobbling = __addon__.getSetting('notif_scrobbling') self.progress = __addon__.getSetting('progress') self.http = __addon__.getSetting('http') diff --git a/resources/language/English/strings.po b/resources/language/English/strings.po index d612b77..77fcba9 100644 --- a/resources/language/English/strings.po +++ b/resources/language/English/strings.po @@ -41,6 +41,10 @@ msgctxt "#32303" msgid "Mark the http streams" msgstr "" +msgctxt "#32304" +msgid "Auto-follow the show if not already followed" +msgstr "" + msgctxt "#33001" msgid "Notifications" msgstr "" diff --git a/resources/language/French/strings.po b/resources/language/French/strings.po index 6b9aa0b..c9ecc71 100644 --- a/resources/language/French/strings.po +++ b/resources/language/French/strings.po @@ -41,6 +41,10 @@ msgctxt "#32303" msgid "Mark the http streams" msgstr "Marquer les flux http" +msgctxt "#32304" +msgid "Auto-follow the show if not already followed" +msgstr "Suivre automatiquement le spectacle s'il n'est pas déjà suivi" + msgctxt "#33001" msgid "Notifications" msgstr "Notifications" diff --git a/resources/language/Italian/strings.po b/resources/language/Italian/strings.po index e464264..99d5dc4 100644 --- a/resources/language/Italian/strings.po +++ b/resources/language/Italian/strings.po @@ -41,6 +41,10 @@ msgctxt "#32303" msgid "Mark the http streams" msgstr "Segna i flussi http" +msgctxt "#32304" +msgid "Auto-follow the show if not already followed" +msgstr "Segui automaticamente lo show se non è già seguito" + msgctxt "#33001" msgid "Notifications" msgstr "Notifiche" diff --git a/resources/lib/tvtime.py b/resources/lib/tvtime.py index c799715..5d2f74f 100644 --- a/resources/lib/tvtime.py +++ b/resources/lib/tvtime.py @@ -45,6 +45,7 @@ def __init__(self, token, episode_id, filename=''): else: self.is_found = True self.resultdata = data['result'] + self.showid = data['episode']['show']['id'] self.showname = data['episode']['show']['name'] self.episodename = data['episode']['name'] self.season_number = data['episode']['season_number'] @@ -170,10 +171,8 @@ def __init__(self, token, episode_id, facebook=0, twitter=0, autofollow=1): else: self.twitter = 0 self.autofollow = autofollow - if self.autofollow == True: self.autofollow = 1 - else: self.autofollow = 0 - self.action = 'checkin' + request_data = urllib.parse.urlencode({ 'access_token' : self.token, 'episode_id' : self.episode_id, @@ -206,7 +205,7 @@ def __init__(self, token, episode_id, facebook=0, twitter=0, autofollow=1): self.is_marked = False else: self.is_marked = True - + class MarkAsUnWatched(object): def __init__(self, token, episode_id): self.token = token diff --git a/resources/settings.xml b/resources/settings.xml index 9452c15..1c65674 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -5,6 +5,7 @@ + From 87e3a0614cc0a7db1ced198828e565b48e046819 Mon Sep 17 00:00:00 2001 From: TheLazyFox <35723598+the-lazy-fox@users.noreply.github.com> Date: Mon, 12 Apr 2021 22:15:40 +0200 Subject: [PATCH 21/22] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index e859c2b..951d149 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ From 31af403ef6d0f908a12822d3d6b23d6a46bd89da Mon Sep 17 00:00:00 2001 From: TheLazyFox <35723598+the-lazy-fox@users.noreply.github.com> Date: Fri, 7 May 2021 14:18:53 +0200 Subject: [PATCH 22/22] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 79e4ccb..3994b4c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Notice ⚠️ +TV Time has officially stopped its API and this addon for Kodi is based on it. Therefore this addon is not work anymore until further notice. +Please see #5 for more details and alternatives + # script.tvtime Kodi plugin for [TV Time](http://www.tvtime.com)