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)