summaryrefslogtreecommitdiff
path: root/plugin.video.science.friday/addon.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.video.science.friday/addon.py')
-rw-r--r--plugin.video.science.friday/addon.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/plugin.video.science.friday/addon.py b/plugin.video.science.friday/addon.py
new file mode 100644
index 0000000..50cb08c
--- /dev/null
+++ b/plugin.video.science.friday/addon.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2016 William Forde (willforde+kodi@gmail.com)
+#
+# License: GPLv2, see LICENSE for more details
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+from __future__ import unicode_literals
+from codequick import Route, Resolver, Listitem, run
+
+# Localized string Constants
+RECENT_VIDEOS = 30001
+RECENT_AUDIO = 30002
+LIST_AUDIO = 30003
+LIST_VIDEO = 30004
+
+
+@Route.register
+def root(plugin):
+ """:type plugin: Route"""
+ # Set context parameters based on default view setting
+ if plugin.setting.get_int("defaultview") == 0:
+ context_label = plugin.localize(LIST_AUDIO)
+ context_type = "segment"
+ item_type = "video"
+ else:
+ context_label = plugin.localize(LIST_VIDEO)
+ context_type = "video"
+ item_type = "segment"
+
+ # Fetch HTML Source
+ url = "https://www.sciencefriday.com/explore/"
+ html = plugin.request.get(url)
+
+ # Parse for the content
+ root_elem = html.parse("form", attrs={"class": "searchandfilter"})
+ sfid = root_elem.get("data-sf-form-id")
+
+ # Add Youtube & Recent Content
+ yield Listitem.youtube("UUDjGU4DP3b-eGxrsipCvoVQ")
+
+ # Add Recent Videos link
+ yield Listitem.from_dict(label=plugin.localize(RECENT_VIDEOS), callback=content_lister,
+ params={"sfid": sfid, "ctype": "video"})
+ # Add Recent Audio link
+ yield Listitem.from_dict(label=plugin.localize(RECENT_AUDIO), callback=content_lister,
+ params={"sfid": sfid, "ctype": "segment"})
+
+ # List all topics
+ for elem in root_elem.iterfind(".//option[@data-sf-cr]"):
+ item = Listitem()
+ item.label = elem.text
+
+ # Add context item to link to the opposite content type. e.g. audio if video is default
+ item.context.container(context_label, content_lister, topic=elem.attrib["value"], sfid=sfid, ctype=context_type)
+ item.set_callback(content_lister, topic=elem.attrib["value"], ctype=item_type, sfid=sfid)
+ yield item
+
+
+@Route.register
+def content_lister(plugin, sfid, ctype, topic=None, page_count=1):
+ """
+ :type plugin: Route
+ :type sfid: unicode
+ :type ctype: unicode
+ :type topic: unicode
+ :type page_count: int
+ """
+ # Add link to Alternitve Listing
+ if page_count == 1 and topic:
+ params = {"sfid": sfid, "ctype": u"segment" if ctype == u"video" else u"video", "topic": topic}
+ label = plugin.localize(LIST_AUDIO) if ctype == u"video" else plugin.localize(LIST_VIDEO)
+ item_dict = {"label": label, "callback": content_lister, "params": params}
+ yield Listitem.from_dict(**item_dict)
+
+ # Create content url
+ if topic:
+ url = "https://www.sciencefriday.com/wp-admin/admin-ajax.php?action=get_results&paged=%(next)s&" \
+ "sfid=%(sfid)s&post_types=%(ctype)s&_sft_topic=%(topic)s" % \
+ {"sfid": sfid, "ctype": ctype, "topic": topic, "next": page_count}
+ else:
+ url = "https://www.sciencefriday.com/wp-admin/admin-ajax.php?action=get_results&paged=%(next)s&" \
+ "sfid=%(sfid)s&post_types=%(ctype)s" % \
+ {"sfid": sfid, "ctype": ctype, "next": page_count}
+
+ # Fetch & parse HTML Source
+ ishd = bool(plugin.setting.get_int("video_quality", addon_id="script.module.youtube.dl"))
+ root_elem = plugin.request.get(url).parse()
+
+ # Fetch next page
+ next_url = root_elem.find(".//a[@rel='next']")
+ if next_url is not None:
+ yield Listitem.next_page(sfid=sfid, ctype=ctype, page_count=page_count+1)
+
+ # Parse the elements
+ for element in root_elem.iterfind(".//article"):
+ tag_a = element.find(".//a[@rel='bookmark']")
+ item = Listitem()
+ item.label = tag_a.text
+ item.stream.hd(ishd)
+
+ # Fetch plot & duration
+ tag_p = element.findall(".//p")
+ if tag_p and tag_p[0].get("class") == "run-time":
+ item.info["duration"] = tag_p[0].text
+ item.info["plot"] = tag_p[1].text
+ elif tag_p:
+ item.info["plot"] = tag_p[0].text
+
+ # Fetch image if exists
+ img = element.find(".//img[@data-src]")
+ if img is not None:
+ item.art["thumb"] = img.get("data-src")
+
+ # Fetch audio/video url
+ tag_audio = element.find(".//a[@data-audio]")
+ if tag_audio is not None:
+ audio_url = tag_audio.get("data-audio")
+ item.set_callback(audio_url)
+ else:
+ item.set_callback(play_video, url=tag_a.get("href"))
+
+ yield item
+
+
+@Resolver.register
+def play_video(plugin, url):
+ """
+ :type plugin: Resolver
+ :type url: unicode
+ """
+ # Run SpeedForce to atempt to strip Out any unneeded html tags
+ root_elem = plugin.request.get(url).parse("section", attrs={"class": "video-section bg-lightgrey"})
+
+ # Search for youtube iframe
+ iframe = root_elem.find("./div/iframe")
+ return plugin.extract_source(iframe.get("src"))
+
+
+# Initiate add-on
+if __name__ == "__main__":
+ run()