Skip to content

Commit

Permalink
Blackify python files
Browse files Browse the repository at this point in the history
  • Loading branch information
cas-- committed Feb 16, 2019
1 parent 24949c7 commit 774702e
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 103 deletions.
81 changes: 60 additions & 21 deletions plugin.video.redbulltv/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,19 @@
from resources.lib import utils
from resources.lib import redbulltv_client as redbulltv


class RedbullTV2(object):
def __init__(self):
self.id = 'plugin.video.redbull.tv'
self.id = "plugin.video.redbull.tv"
self.addon = xbmcaddon.Addon(self.id)
self.icon = self.addon.getAddonInfo('icon')
self.icon = self.addon.getAddonInfo("icon")
self.base_url = sys.argv[0]
self.addon_handle = int(sys.argv[1])
self.args = urlparse.parse_qs(sys.argv[2][1:])
xbmcplugin.setContent(self.addon_handle, 'videos')
self.redbulltv_client = redbulltv.RedbullTVClient(self.addon.getSetting('video.resolution'))
xbmcplugin.setContent(self.addon_handle, "videos")
self.redbulltv_client = redbulltv.RedbullTVClient(
self.addon.getSetting("video.resolution")
)

@staticmethod
def get_keyboard(default="", heading="", hidden=False):
Expand All @@ -24,8 +27,12 @@ def get_keyboard(default="", heading="", hidden=False):
return default

def navigation(self):
url = self.args.get("api_url")[0].decode('base64') if self.args.get("api_url") else None
category = self.args.get('category', [None])[0]
url = (
self.args.get("api_url")[0].decode("base64")
if self.args.get("api_url")
else None
)
category = self.args.get("category", [None])[0]

if url and "search?q=" in url:
url += self.get_keyboard()
Expand All @@ -34,12 +41,20 @@ def navigation(self):
items = self.redbulltv_client.get_items(url, category)
except IOError:
# Error getting data from Redbull server
xbmcgui.Dialog().ok(self.addon.getLocalizedString(30020), self.addon.getLocalizedString(30021), self.addon.getLocalizedString(30022))
xbmcgui.Dialog().ok(
self.addon.getLocalizedString(30020),
self.addon.getLocalizedString(30021),
self.addon.getLocalizedString(30022),
)
return

if not items:
# No results found
xbmcgui.Dialog().ok(self.addon.getLocalizedString(30023), self.addon.getLocalizedString(30024), self.addon.getLocalizedString(30025))
xbmcgui.Dialog().ok(
self.addon.getLocalizedString(30023),
self.addon.getLocalizedString(30024),
self.addon.getLocalizedString(30025),
)
return
elif items[0].get("is_stream"):
self.play_stream(items[0])
Expand All @@ -48,8 +63,12 @@ def navigation(self):
xbmcgui.Dialog().ok(
self.addon.getLocalizedString(30026),
self.addon.getLocalizedString(30027),
datetime.datetime.fromtimestamp(int(items[0].get("event_date"))).strftime('%a %-d %b %Y %H:%M') +
" (GMT+" + str(time.timezone / 3600 * -1) + ")"
datetime.datetime.fromtimestamp(
int(items[0].get("event_date"))
).strftime("%a %-d %b %Y %H:%M")
+ " (GMT+"
+ str(time.timezone / 3600 * -1)
+ ")",
)
return
else:
Expand All @@ -59,27 +78,47 @@ def navigation(self):

def add_items(self, items):
for item in items:
params = {'api_url' : item["url"].encode('base64')}
params = {"api_url": item["url"].encode("base64")}
if "category" in item:
params['category'] = item["category"].encode('utf-8')
params["category"] = item["category"].encode("utf-8")

url = utils.build_url(self.base_url, params)
list_item = xbmcgui.ListItem(
item.get("title"),
iconImage='DefaultFolder.png',
thumbnailImage=item.get("image", self.icon)
iconImage="DefaultFolder.png",
thumbnailImage=item.get("image", self.icon),
)
list_item.setInfo(
type="Video",
infoLabels={"Title": item["title"], "Plot": item.get("summary", None)},
)
list_item.setInfo(type="Video", infoLabels={"Title": item["title"], "Plot": item.get("summary", None)})
if item.get("is_content"):
list_item.setProperty('IsPlayable', 'true')
xbmcplugin.addDirectoryItem(handle=self.addon_handle, url=url, listitem=list_item, isFolder=(not item["is_content"]))
list_item.setProperty("IsPlayable", "true")
xbmcplugin.addDirectoryItem(
handle=self.addon_handle,
url=url,
listitem=list_item,
isFolder=(not item["is_content"]),
)

def play_stream(self, item):
list_item = xbmcgui.ListItem(label=item.get("title"), path=item.get("url"))
list_item.setInfo(type="Video", infoLabels={"title": item.get("title"), "plot": item.get("summary")})
list_item.setArt({'poster': item.get("image"), 'iconImage': "DefaultVideo.png", 'thumbnailImage': item.get("image")})
list_item.setInfo(
type="Video",
infoLabels={"title": item.get("title"), "plot": item.get("summary")},
)
list_item.setArt(
{
"poster": item.get("image"),
"iconImage": "DefaultVideo.png",
"thumbnailImage": item.get("image"),
}
)
list_item.setProperty("IsPlayable", "true")
xbmcplugin.setResolvedUrl(handle=self.addon_handle, succeeded=True, listitem=list_item)
xbmcplugin.setResolvedUrl(
handle=self.addon_handle, succeeded=True, listitem=list_item
)


if __name__ == '__main__':
if __name__ == "__main__":
RedbullTV2().navigation()
116 changes: 76 additions & 40 deletions plugin.video.redbulltv/resources/lib/redbulltv_client.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
import re, urllib2, os
import resources.lib.utils as utils


class RedbullTVClient(object):
REDBULL_API = "https://appletv.redbull.tv/"
ROOT_MENU = [
{"title": "Discover", "url": REDBULL_API + "products/discover", "is_content":False},
{"title": "TV", "url": REDBULL_API + "products/tv", "is_content":False},
{"title": "Channels", "url": REDBULL_API + "products/channels", "is_content":False},
{"title": "Events", "url": REDBULL_API + "products/calendar", "is_content":False},
{"title": "Search", "url": REDBULL_API + "search?q=", "is_content":False},
{
"title": "Discover",
"url": REDBULL_API + "products/discover",
"is_content": False,
},
{"title": "TV", "url": REDBULL_API + "products/tv", "is_content": False},
{
"title": "Channels",
"url": REDBULL_API + "products/channels",
"is_content": False,
},
{
"title": "Events",
"url": REDBULL_API + "products/calendar",
"is_content": False,
},
{"title": "Search", "url": REDBULL_API + "search?q=", "is_content": False},
]

def __init__(self, resolution=None):
Expand All @@ -17,19 +30,19 @@ def __init__(self, resolution=None):
@staticmethod
def get_resolution_code(video_resolution_id):
return {
"0" : "320x180",
"1" : "426x240",
"2" : "640x360",
"3" : "960x540",
"4" : "1280x720",
"0": "320x180",
"1": "426x240",
"2": "640x360",
"3": "960x540",
"4": "1280x720",
}.get(video_resolution_id, "1920x1080")

def get_stream_details(self, element):
name = element.findtext("title")
description = element.findtext("description")
image = element.find("image").get("src1080")
url = element.findtext("mediaURL")
base_url = ''
base_url = ""

# Try find the specific stream based on the users preferences
try:
Expand All @@ -40,36 +53,53 @@ def get_stream_details(self, element):

resolution = self.get_resolution_code(self.resolution)
media_url = re.search(
"RESOLUTION=" + resolution + ".*\n(.*)",
playlists).group(1)
"RESOLUTION=" + resolution + ".*\n(.*)", playlists
).group(1)
except Exception:
pass
else:
url = media_url

# if url is relative, add the base path
if base_url != '' and not url.startswith('http'):
url = os.path.dirname(base_url) + '/' + url
if base_url != "" and not url.startswith("http"):
url = os.path.dirname(base_url) + "/" + url

return {"title":name, "url":url, "summary":description, "image": image, "is_stream":True}
return {
"title": name,
"url": url,
"summary": description,
"image": image,
"is_stream": True,
}

def get_element_details(self, element, url=None):
details = {"url":url, "is_content":False}
subtitle = element.findtext('.//subtitle') or element.findtext('.//label2') or ""
details["title"] = (element.get("accessibilityLabel") or element.findtext('.//label')) + ((" - " + subtitle) if subtitle else "")
details["summary"] = element.findtext('.//summary')
details["image"] = element.find('.//image').get('src1080') if element.find('.//image') is not None else None
details["event_date"] = element.findtext('.//rightLabel')
details = {"url": url, "is_content": False}
subtitle = (
element.findtext(".//subtitle") or element.findtext(".//label2") or ""
)
details["title"] = (
element.get("accessibilityLabel") or element.findtext(".//label")
) + ((" - " + subtitle) if subtitle else "")
details["summary"] = element.findtext(".//summary")
details["image"] = (
element.find(".//image").get("src1080")
if element.find(".//image") is not None
else None
)
details["event_date"] = element.findtext(".//rightLabel")

# Get url of item, or name of selected category
if "onSelect" in element.attrib:
details["url"] = utils.strip_url(element.get("onSelect"))
details["is_content"] = re.search(self.REDBULL_API + "(content|linear_stream)", details["url"]) is not None
details["is_content"] = (
re.search(self.REDBULL_API + "(content|linear_stream)", details["url"])
is not None
)
elif not details["event_date"]:
details["category"] = details["title"]

# Strip out any keys with empty values
return {k:v for k, v in details.iteritems() if v is not None}
return {k: v for k, v in details.iteritems() if v is not None}

def get_items(self, url=None, category=None):
# If no url is specified, return the root menu
Expand All @@ -80,42 +110,48 @@ def get_items(self, url=None, category=None):
items = []

# if the current url is a media stream
if xml.find('.//httpLiveStreamingVideoAsset') is not None:
items.append(self.get_stream_details(xml.find('.//httpLiveStreamingVideoAsset')))
if xml.find(".//httpLiveStreamingVideoAsset") is not None:
items.append(
self.get_stream_details(xml.find(".//httpLiveStreamingVideoAsset"))
)
# if no category is specified, find the categories or item collection
elif category is None:
# Prevent duplicates from collectionDividers with empty title tags.
collections = [elem for elem in xml.findall('.//collectionDivider')
if elem.find('title').text]
collections = [
elem
for elem in xml.findall(".//collectionDivider")
if elem.find("title").text
]

# Show Categories if relevant
if collections:
items += self.generate_items(
xml.findall('.//showcase') + collections, url)
xml.findall(".//showcase") + collections, url
)
else:
items += self.generate_items(
xml.findall('.//twoLineMenuItem') +
xml.findall('.//twoLineEnhancedMenuItem') +
xml.findall('.//sixteenByNinePoster') +
xml.findall('.//actionButton'),
url)
xml.findall(".//twoLineMenuItem")
+ xml.findall(".//twoLineEnhancedMenuItem")
+ xml.findall(".//sixteenByNinePoster")
+ xml.findall(".//actionButton"),
url,
)
# if a category is specified, find the items for the specified category
elif category is not None:
if category in ('Featured', 'Featured Events'):
items += self.generate_items(xml.findall('.//showcasePoster'))
if category in ("Featured", "Featured Events"):
items += self.generate_items(xml.findall(".//showcasePoster"))
else:
collections = xml.iterfind(".//collectionDivider/../*")
for collection in collections:
if (
collection.tag == 'collectionDivider'
collection.tag == "collectionDivider"
and collection.get("accessibilityLabel") == category
):
elem = next(collections, None)
# Skip end of page or closing collectionDividers
if elem is None or elem.tag == 'collectionDivider':
if elem is None or elem.tag == "collectionDivider":
continue
items += self.generate_items(
list(elem.find('.//items')))
items += self.generate_items(list(elem.find(".//items")))

return items

Expand Down
5 changes: 4 additions & 1 deletion plugin.video.redbulltv/resources/lib/utils.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import re, urllib, urllib2
import xml.etree.ElementTree as ET


def strip_url(url):
nurl = re.search(r"\(\'(.*)\'\)", url)
return nurl.group(1)


def build_url(base_url, query):
return base_url + '?' + urllib.urlencode(query)
return base_url + "?" + urllib.urlencode(query)


def get_xml(url):
try:
Expand Down
Loading

0 comments on commit 774702e

Please sign in to comment.