Skip to content

Commit

Permalink
Add Soon offline menu (#253)
Browse files Browse the repository at this point in the history
This PR adds a new 'Soon offline' meny item in the main menu, and a 'My
soon offline' menu in the favorites menu.
  • Loading branch information
dagwieers committed May 18, 2019
1 parent b89e8fe commit f86f3eb
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 27 deletions.
2 changes: 2 additions & 0 deletions addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ def router(params_string):
_vrtplayer.show_episodes(path=params.get('video_url'))
elif action == actions.LISTING_ALL_EPISODES:
_vrtplayer.show_all_episodes(path=params.get('video_url'))
elif action == actions.LISTING_OFFLINE:
_vrtplayer.show_offline(page=params.get('page'), filtered=params.get('filtered'))
elif action == actions.LISTING_RECENT:
_vrtplayer.show_recent(page=params.get('page'), filtered=params.get('filtered'))
elif action == actions.SEARCH:
Expand Down
24 changes: 20 additions & 4 deletions resources/language/resource.language.en_gb/strings.po
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,30 @@ msgid "Most recent"
msgstr ""

msgctxt "#30021"
msgid "Recently published episodes of TV programs"
msgid "Recently published video content"
msgstr ""

msgctxt "#30022"
msgid "TV guide"
msgid "Soon offline"
msgstr ""

msgctxt "#30023"
msgid "Browse channel TV guides"
msgid "Video content that will soon be offline"
msgstr ""

msgctxt "#30024"
msgid "Search VRT NU"
msgid "TV guide"
msgstr ""

msgctxt "#30025"
msgid "Browse channel TV guides"
msgstr ""

msgctxt "#30026"
msgid "Search VRT NU"
msgstr ""

msgctxt "#30027"
msgid "Search the complete VRT NU library"
msgstr ""

Expand All @@ -98,6 +106,14 @@ msgctxt "#30043"
msgid "Recently published episodes of My TV programs"
msgstr ""

msgctxt "#30044"
msgid "My soon offline"
msgstr ""

msgctxt "#30045"
msgid "My video content that will soon be offline"
msgstr ""


### APPLICATION
msgctxt "#30094"
Expand Down
24 changes: 20 additions & 4 deletions resources/language/resource.language.nl_nl/strings.po
Original file line number Diff line number Diff line change
Expand Up @@ -62,22 +62,30 @@ msgid "Most recent"
msgstr "Meest recent"

msgctxt "#30021"
msgid "Recently published episodes of TV programs"
msgid "Recently published video content"
msgstr "Recent gepubliceerde afleveringen van tv-programma's"

msgctxt "#30022"
msgid "Soon offline"
msgstr "Binnenkort verwijderd"

msgctxt "#30023"
msgid "Video content that will soon be offline"
msgstr "Tv-afleveringen die binnenkort verdwijnen"

msgctxt "#30024"
msgid "TV guide"
msgstr "Tv-gids"

msgctxt "#30023"
msgctxt "#30025"
msgid "Browse channel TV guides"
msgstr "Doorzoek de tv-gids per kanaal"

msgctxt "#30024"
msgctxt "#30026"
msgid "Doorzoek VRT NU"
msgstr "Doorzoek VRT NU"

msgctxt "#30025"
msgctxt "#30027"
msgid "Search the complete VRT NU library"
msgstr "Doorzoek de hele VRT NU bibliotheek"

Expand All @@ -99,6 +107,14 @@ msgctxt "#30043"
msgid "Recently published episodes of My TV programs"
msgstr "Recent gepubliceerde afleveringen van tv-programma's die je volgt"

msgctxt "#30044"
msgid "My soon offline"
msgstr "Mijn binnenkort verwijderd"

msgctxt "#30045"
msgid "My video content that will soon be offline"
msgstr "Mijn tv-afleveringen die binnenkort verdwijnen"


### APPLICATION
msgctxt "#30094"
Expand Down
1 change: 1 addition & 0 deletions resources/lib/vrtplayer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ class actions:
LISTING_EPISODES = 'listingepisodes'
LISTING_FAVORITES = 'favorites'
LISTING_LIVE = 'listinglive'
LISTING_OFFLINE = 'listingoffline'
LISTING_RECENT = 'listingrecent'
LISTING_TVGUIDE = 'listingtvguide'
PLAY = 'play'
Expand Down
12 changes: 6 additions & 6 deletions resources/lib/vrtplayer/tvguide.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def show_episodes(self, date, channel):
return episode_items

def episode_description(self, episode):
return '[B]{title}[/B]\n{start} - {end}'.format(**episode)
return '{start} - {end}\n» [B]{title}[/B]'.format(**episode)

def live_description(self, channel):
now = datetime.now(dateutil.tz.tzlocal())
Expand All @@ -208,21 +208,21 @@ def live_description(self, channel):
start_date = dateutil.parser.parse(episode.get('startTime'))
end_date = dateutil.parser.parse(episode.get('endTime'))
if start_date <= now <= end_date: # Now playing
description = '[COLOR yellow]%s %s[/COLOR]\n' % (self._kodi.localize(30421), self.episode_description(episode))
description = '[COLOR yellow][B]%s[/B] %s[/COLOR]\n' % (self._kodi.localize(30421), self.episode_description(episode))
try:
description += '%s %s' % (self._kodi.localize(30422), self.episode_description(next(episodes)))
description += '[B]%s[/B] %s' % (self._kodi.localize(30422), self.episode_description(next(episodes)))
except StopIteration:
break
break
elif now < start_date: # Nothing playing now, but this may be next
description = '%s %s\n' % (self._kodi.localize(30422), self.episode_description(episode))
description = '[B]%s[/B] %s\n' % (self._kodi.localize(30422), self.episode_description(episode))
try:
description += '%s %s' % (self._kodi.localize(30422), self.episode_description(next(episodes)))
description += '[B]%s[/B] %s' % (self._kodi.localize(30422), self.episode_description(next(episodes)))
except StopIteration:
break
break
if not description:
description = '[COLOR yellow]%s %s[/COLOR]\n' % (self._kodi.localize(30421), self._kodi.localize(30423))
description = '[COLOR yellow][B]%s[/B] %s[/COLOR]\n' % (self._kodi.localize(30421), self._kodi.localize(30423))
return description

def parse(self, date, now):
Expand Down
10 changes: 8 additions & 2 deletions resources/lib/vrtplayer/vrtapihelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,21 +104,26 @@ def _get_season_items(self, api_url, api_json):
pass
return season_items, sort, ascending, content

def get_episode_items(self, path=None, page=None, all_seasons=False, filtered=False):
def get_episode_items(self, path=None, page=None, all_seasons=False, filtered=False, variety=None):
import json
episode_items = []
sort = 'episode'
ascending = True

# Recent items
if page is not None:
if variety in ('offline', 'recent'):
page = statichelper.realpage(page)
params = {
'from': ((page - 1) * 50) + 1,
'i': 'video',
'size': 50,
}

if variety == 'offline':
from datetime import datetime
import dateutil.tz
params['facets[assetOffTime]'] = datetime.now(dateutil.tz.tzlocal()).strftime('%Y-%m-%d')

if statichelper.is_filtered(filtered):
params['facets[programName]'] = '[%s]' % (','.join(self._favorites.names()))
else:
Expand All @@ -139,6 +144,7 @@ def get_episode_items(self, path=None, page=None, all_seasons=False, filtered=Fa
api_url = self._VRTNU_SEARCH_URL + '?' + urlencode(params)
else:
api_url = path

self._kodi.log_notice('URL get: ' + unquote(api_url), 'Verbose')
api_json = json.loads(urlopen(api_url).read())

Expand Down
43 changes: 35 additions & 8 deletions resources/lib/vrtplayer/vrtplayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,23 +53,29 @@ def show_main_menu_items(self):
TitleItem(title=self._kodi.localize(30018), # Live TV
url_dict=dict(action=actions.LISTING_LIVE),
is_playable=False,
art_dict=dict(thumb='DefaultAddonPVRClient.png', icon='DefaultAddonPVRClient.png', fanart='DefaultAddonPVRClient.png'),
# art_dict=dict(thumb='DefaultAddonPVRClient.png', icon='DefaultAddonPVRClient.png', fanart='DefaultAddonPVRClient.png'),
art_dict=dict(thumb='DefaultTVShows.png', icon='DefaultTVShows.png', fanart='DefaultTVShows.png'),
video_dict=dict(plot=self._kodi.localize(30019))),
TitleItem(title=self._kodi.localize(30020), # Recent items
url_dict=dict(action=actions.LISTING_RECENT),
is_playable=False,
art_dict=dict(thumb='DefaultYear.png', icon='DefaultYear.png', fanart='DefaultYear.png'),
art_dict=dict(thumb='DefaultRecentlyAddedEpisodes.png', icon='DefaultRecentlyAddedEpisodes.png', fanart='DefaultRecentlyAddedEpisodes.png'),
video_dict=dict(plot=self._kodi.localize(30021))),
TitleItem(title=self._kodi.localize(30022), # TV guide
TitleItem(title=self._kodi.localize(30022), # Soon offline
url_dict=dict(action=actions.LISTING_OFFLINE),
is_playable=False,
art_dict=dict(thumb='DefaultYear.png', icon='DefaultYear.png', fanart='DefaultYear.png'),
video_dict=dict(plot=self._kodi.localize(30023))),
TitleItem(title=self._kodi.localize(30024), # TV guide
url_dict=dict(action=actions.LISTING_TVGUIDE),
is_playable=False,
art_dict=dict(thumb='DefaultAddonTvInfo.png', icon='DefaultAddonTvInfo.png', fanart='DefaultAddonTvInfo.png'),
video_dict=dict(plot=self._kodi.localize(30023))),
TitleItem(title=self._kodi.localize(30024), # Search
video_dict=dict(plot=self._kodi.localize(30025))),
TitleItem(title=self._kodi.localize(30026), # Search
url_dict=dict(action=actions.SEARCH),
is_playable=False,
art_dict=dict(thumb='DefaultAddonsSearch.png', icon='DefaultAddonsSearch.png', fanart='DefaultAddonsSearch.png'),
video_dict=dict(plot=self._kodi.localize(30025))),
video_dict=dict(plot=self._kodi.localize(30027))),
])
self._kodi.show_listing(main_items)

Expand All @@ -83,8 +89,13 @@ def show_favorites_menu_items(self):
TitleItem(title=self._kodi.localize(30042), # My recent items
url_dict=dict(action=actions.LISTING_RECENT, filtered=True),
is_playable=False,
art_dict=dict(thumb='DefaultYear.png', icon='DefaultYear.png', fanart='DefaultYear.png'),
art_dict=dict(thumb='DefaultRecentlyAddedEpisodes.png', icon='DefaultRecentlyAddedEpisodes.png', fanart='DefaultRecentlyAddedEpisodes.png'),
video_dict=dict(plot=self._kodi.localize(30043))),
TitleItem(title=self._kodi.localize(30044), # My soon offline
url_dict=dict(action=actions.LISTING_OFFLINE, filtered=True),
is_playable=False,
art_dict=dict(thumb='DefaultYear.png', icon='DefaultYear.png', fanart='DefaultYear.png'),
video_dict=dict(plot=self._kodi.localize(30045))),
]
self._kodi.show_listing(favorites_items)

Expand Down Expand Up @@ -173,7 +184,7 @@ def show_all_episodes(self, path):

def show_recent(self, page=0, filtered=False):
page = statichelper.realpage(page)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=page, filtered=filtered)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=page, filtered=filtered, variety='recent')

# Add 'More...' entry at the end
if len(episode_items) == 50:
Expand All @@ -187,6 +198,22 @@ def show_recent(self, page=0, filtered=False):

self._kodi.show_listing(episode_items, sort=sort, ascending=ascending, content=content, cache=False)

def show_offline(self, page=0, filtered=False):
page = statichelper.realpage(page)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=page, filtered=filtered, variety='offline')

# Add 'More...' entry at the end
if len(episode_items) == 50:
episode_items.append(TitleItem(
title=self._kodi.localize(30300),
url_dict=dict(action=actions.LISTING_OFFLINE, page=page + 1, filtered=filtered),
is_playable=False,
art_dict=dict(thumb='DefaultYear.png', icon='DefaultYear.png', fanart='DefaultYear.png'),
video_dict=dict(),
))

self._kodi.show_listing(episode_items, sort=sort, ascending=ascending, content=content, cache=False)

def play(self, params):
_tokenresolver = tokenresolver.TokenResolver(self._kodi)
_streamservice = streamservice.StreamService(self._kodi, _tokenresolver)
Expand Down
14 changes: 11 additions & 3 deletions test/apihelpertests.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,28 +56,36 @@ def test_get_api_data_specific_season_without_broadcastdate(self):

def test_get_recent_episodes(self):
''' Test items, sort and order '''
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=1)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=1, variety='recent')
self.assertEqual(len(episode_items), 50)
self.assertEqual(sort, 'dateadded')
self.assertFalse(ascending)
self.assertEqual(content, 'episodes')

def test_get_recent_episodes_page1(self):
''' Test items, sort and order '''
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=2)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=2, variety='recent')
self.assertEqual(len(episode_items), 50)
self.assertEqual(sort, 'dateadded')
self.assertFalse(ascending)
self.assertEqual(content, 'episodes')

def test_get_recent_episodes_page2(self):
''' Test items, sort and order '''
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=3)
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=3, variety='recent')
self.assertEqual(len(episode_items), 50)
self.assertEqual(sort, 'dateadded')
self.assertFalse(ascending)
self.assertEqual(content, 'episodes')

def test_get_offline_episodes(self):
''' Test items, sort and order '''
episode_items, sort, ascending, content = self._apihelper.get_episode_items(page=1, variety='offline')
self.assertTrue(episode_items)
self.assertEqual(sort, 'dateadded')
self.assertFalse(ascending)
self.assertEqual(content, 'episodes')

def test_get_tvshows(self):
''' Test items, sort and order '''
path = 'nieuws-en-actua'
Expand Down

0 comments on commit f86f3eb

Please sign in to comment.