diff options
Diffstat (limited to 'plugin.video.science.friday/addon.py')
-rw-r--r-- | plugin.video.science.friday/addon.py | 154 |
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() |