Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion plugin.video.drnu/addon.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="plugin.video.drnu" version="6.6.0" name="DR TV" provider-name="TermeHansen">
<addon id="plugin.video.drnu" version="6.6.1" name="DR TV" provider-name="TermeHansen">
<requires>
<import addon="xbmc.python" version="3.0.1"/>
<import addon="script.module.dateutil" version="2.8.2" />
Expand Down Expand Up @@ -31,6 +31,9 @@
<screenshot>resources/media/Screenshot3.jpg</screenshot>
<screenshot>resources/media/Screenshot4.jpg</screenshot>
</assets>
<news>[B]Version 6.6.1 - 2025-06-15[/B]
- Fix crash in refresh of anonymous tokens
</news>
<news>[B]Version 6.6.0 - 2025-05-09[/B]
- Fix change in drtv login flow
- Use oidc auth flow
Expand Down
3 changes: 3 additions & 0 deletions plugin.video.drnu/changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[B]Version 6.6.1 - 2025-06-15[/B]
- Fix crash in refresh of anonymous tokens

[B]Version 6.6.0 - 2025-05-09[/B]
- Fix change in drtv login flow
- Use oidc auth flow
Expand Down
9 changes: 5 additions & 4 deletions plugin.video.drnu/resources/lib/addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,15 +196,15 @@ def showMainMenu(self):
item.addContextMenuItems(self.menuItems, False)
items.append((self._plugin_url + '?show=liveTV', item, True))

if self.api._user_name != 'anonymous':
if self.api.user_name != 'anonymous':
# Mylist
item = xbmcgui.ListItem(f'{tr(30004)} ({self.api._user_name})', offscreen=True)
item = xbmcgui.ListItem(f'{tr(30004)} ({self.api.user_name})', offscreen=True)
item.setArt({'fanart': self.fanart_image, 'icon': str(resources_path/'icons/star.png')})
item.addContextMenuItems(self.menuItems, False)
items.append((self._plugin_url + '?show=mylist', item, True))

# Continue watching
item = xbmcgui.ListItem(f'{tr(30003)} ({self.api._user_name})', offscreen=True)
item = xbmcgui.ListItem(f'{tr(30003)} ({self.api.user_name})', offscreen=True)
item.setArt({'fanart': self.fanart_image, 'icon': str(resources_path/'icons/star.png')})
item.addContextMenuItems(self.menuItems, False)
items.append((self._plugin_url + '?show=continue', item, True))
Expand Down Expand Up @@ -509,12 +509,13 @@ def resfresh_ui(self, params=''):
xbmc.executebuiltin(f'Container.Update({self._plugin_url + params})')

def login(self):
self.api._refresh_settings()
err = self.api.request_tokens()
if self.api.user:
if err:
xbmcgui.Dialog().ok(tr(30306), tr(30307))
else:
xbmcgui.Dialog().ok(tr(30303), tr(30304) + f'"{self.api._user_name}"')
xbmcgui.Dialog().ok(tr(30303), tr(30304) + f'"{self.api.user_name}"')
self.resfresh_ui()
else:
if err:
Expand Down
37 changes: 25 additions & 12 deletions plugin.video.drnu/resources/lib/tvapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,15 @@ def __init__(self, cachePath, getLocalizedString, get_setting):
self.token_file = Path(f'{self.cachePath}/token.p')
self.access_tokens = {}
self._user_token = None
self.user = get_setting('drtv_username')
self.password = get_setting('drtv_password')
self._user_name = ''
self.get_setting = get_setting
self._refresh_settings()
self.refresh_tokens()

def _refresh_settings(self):
self.user = self.get_setting('drtv_username')
self.password = self.get_setting('drtv_password')
self._user_name = ''

def init_sqlite_db(self):
if not (self.cachePath/'requests_cleaned').exists():
if (self.cachePath/'requests.cache.sqlite').exists():
Expand All @@ -235,6 +239,12 @@ def init_sqlite_db(self):
self.session.mount('https://', self.adapter)
(self.cachePath/'requests_cleaned').write_text(str(datetime.now()))

@property
def user_name(self):
if self._user_name == '':
self._user_name = self.get_profile()['name']
return self._user_name

def read_tokens(self, tokens):
if 'value' in tokens[0]:
#old flow, anonymous
Expand All @@ -252,8 +262,6 @@ def read_tokens(self, tokens):
except Exception:
time_struct = time.strptime(time_str, '%Y-%m-%dT%H:%M:%S')
self._token_expire = datetime(*time_struct[0:6], tzinfo=timezone.utc)
if self.access_tokens:
self._user_name = self.get_profile()['name']

def request_tokens(self):
self._user_token = None
Expand All @@ -267,6 +275,7 @@ def request_tokens(self):
self.access_tokens = access_tokens
tokens = exchange_token(access_tokens)
else:
self.access_tokens = {}
tokens = anonymous_tokens()
self.read_tokens(tokens)
with self.token_file.open('wb') as fh:
Expand All @@ -290,16 +299,20 @@ def refresh_tokens(self):
if (self._token_expire - datetime.now(timezone.utc)) < timedelta(hours=10):
failed_refresh = False
tokens = []
# oidc flow
access_tokens = refresh_token(self.access_tokens['refresh_token'])
if 'error' in access_tokens:
failed_refresh = True
if self.user and 'refresh_token' in self.access_tokens:
# oidc flow
access_tokens = refresh_token(self.access_tokens['refresh_token'])
if 'error' in access_tokens:
failed_refresh = True
self.access_tokens = {}
else:
tokens = exchange_token(access_tokens)
self.access_tokens = access_tokens
else:
tokens = exchange_token(access_tokens)
self.access_tokens = access_tokens
#old flow, anonymous
failed_refresh = True

if failed_refresh:
self.request_tokens()
err = self.request_tokens()
if err:
raise ApiException(f'Login failed with: "{err}"')
Expand Down