From 8c6c8a6839719b9f603138d6e225d753f1cc49ff Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Mon, 13 Nov 2017 00:43:59 +0200 Subject: Rename addon.py -> default.py --- addon.py | 161 ------------------------------------------------------------- addon.xml | 9 +--- default.py | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 168 deletions(-) delete mode 100644 addon.py create mode 100644 default.py diff --git a/addon.py b/addon.py deleted file mode 100644 index b595dd1..0000000 --- a/addon.py +++ /dev/null @@ -1,161 +0,0 @@ -# -*- coding: UTF-8 -*- -""" Kan Video plugin """ - -# Copyright (c) 2017 Tzafrir Cohen -# SPDX-License-Identifier: GPL-2.0+ -# -# License-Filename: LICENSE - -from bs4 import BeautifulSoup -import re -import sys -import urllib -#import urllib2 -import requests -import urlparse -import xbmc -import xbmcgui -import xbmcplugin - - -KAN_URL = 'http://www.kan.org.il' -USER_AGENT = 'Kodi' # I'm optimistic - - -def trace(msg): - xbmc.log(msg="Tzafrir: " + msg, level=xbmc.LOGNOTICE) - - -class Page: - def __init__(self, argv): - self.base_url = argv[0] - self.addon_handle = int(argv[1]) - self.args = urlparse.parse_qs(argv[2][1:]) - self.mode = self.args.get('mode', None) - - def build_url(self, query): - #query['addon_handle'] = self.addon_handle - return self.base_url + '?' + urllib.urlencode(query) - - def add_directory_item(self, **kwargs): - xbmcplugin.addDirectoryItem(handle=self.addon_handle, **kwargs) - - def end_directory(self): - xbmcplugin.endOfDirectory(self.addon_handle) - - def placeholder_folder(self, foldername): - """ A folder with a single dummy item """ - url = 'http://localhost/some_video.mkv' - li = xbmcgui.ListItem(foldername + 'Not Implemented', - iconImage='DefaultVideo.png') - self.add_directory_item(url=url, listitem=li) - self.end_directory() - - def placeholder_item(self, name, label): - """ An item that calls a placeholder folder """ - url = self.build_url({'mode': 'placeholder', 'name': name}) - li = xbmcgui.ListItem(label) - self.add_directory_item(url=url, listitem=li, isFolder=True) - - def __str__(self): - return "[base_url: {}, addon_handle: {}, mode: {}]".format( - self.base_url, self.addon_handle, self.mode) - - -def read_url(url): - headers = {'user-agent': 'Kodi/plugin.video.kan/1.0'} - response = requests.get(url, headers=headers) - if response.status_code != 200: - raise IOError("Invalid URL {}".format(url)) - return response.content - - -def get_show_title(base_url, path): - url = base_url + '/' + path - page = read_url(url) - parsed = BeautifulSoup(page, "html.parser") - title = parsed.title.string - title = re.sub('[|-].*', '', title) - return title - - -def tvshows_menu(page): - """ Display a menu of all the TV shows """ - tvshows_url = KAN_URL + '/video/programs.aspx' - main_page = read_url(tvshows_url) - parsed = BeautifulSoup(main_page, "html.parser") - anchors = parsed.find_all('a', - class_="program_category_link w-inline-block") - trace("got anchors: " + str(len(anchors))) - for a in anchors: - path = a.get('href') - show_id = re.sub('.*=', '', path) - #trace("Checking link to " + path) - title = get_show_title(KAN_URL, path) - url = page.build_url({'mode': 'show', 'id': show_id}) - trace("Item: URL: {}, title: {}.".format(url, title.encode('utf8'))) - li = xbmcgui.ListItem(title) - page.add_directory_item(url=url, listitem=li, isFolder=True, - totalItems=len(anchors)) - page.end_directory() - - -def show_menu(page): - """ Display a menu of items in a specific show """ - show_id = page.args['id'][0] - show_url = KAN_URL + '/Program/?catId=' + show_id - trace("URL for show {}: {}".format(show_id, show_url)) - - show_page = read_url(show_url) - parsed = BeautifulSoup(show_page, "html.parser") - items = parsed.find_all('li', - class_="program_list_item w-clearfix") - trace("got items: " + str(len(items))) - for item in items: - titles = item.find_all('h2') - title = titles[0].string - iframe = item.find_all('iframe')[0] - youtube_url = iframe['src'] - #trace("Youtube URL: {}.".format(youtube_url)) - youtube_id = re.sub('.*/embed/([0-9A-Za-z]+)(\?.*)?', r'\1', youtube_url) - trace("Add link for ID {} ({}).".format(youtube_id, title.encode('utf-8'))) - url = 'plugin://plugin.video.youtube/play/?video_id={}'.format(youtube_id) - li = xbmcgui.ListItem(title) - li.setProperty('IsPlayable','true') - page.add_directory_item(url=url, listitem=li, totalItems=len(items)) - page.end_directory() - - -def main_page(page): - url = page.build_url({'mode': 'shows', 'name': 'tv-shows'}) - li = xbmcgui.ListItem(u'תוכניות טלוויזיה') - page.add_directory_item(url=url, listitem=li, isFolder=True) - - page.placeholder_item('net-shows', u'תוכניות רשת') - page.placeholder_item('new-items', u'קטעים חדשים') - - page.end_directory() - - -def main(): - page = Page(sys.argv) - - trace("{}".format(page)) - if page.mode is not None: - mode = page.mode[0] - - if page.mode is None: - main_page(page) - elif mode == 'shows': - tvshows_menu(page) - elif mode == 'show': - show_menu(page) - elif mode == 'placeholder': - name = page.args['name'][0] - page.placeholder_folder(name) - else: - trace("No handler for mode '{}'".format(mode)) - - -if __name__ == '__main__': - main() diff --git a/addon.xml b/addon.xml index cecffb1..fee028f 100644 --- a/addon.xml +++ b/addon.xml @@ -3,7 +3,7 @@ - + video @@ -12,7 +12,7 @@ כאן תאגיד השידור הישראלי Video content available from Kan, the Israeli public broadcasting corperation. תכני וידאו מאתר כאן - תאגיד השידור הציבורי - GNU General Public License, v2 + GNU General Public License, v2 or later he https://git.tzafrir.org.il/cgit/kodi-kan @@ -21,11 +21,6 @@ resources/icon.png resources/fanart.jpg - v1.0.0 (2017-10-28) - Initial version diff --git a/default.py b/default.py new file mode 100644 index 0000000..b595dd1 --- /dev/null +++ b/default.py @@ -0,0 +1,161 @@ +# -*- coding: UTF-8 -*- +""" Kan Video plugin """ + +# Copyright (c) 2017 Tzafrir Cohen +# SPDX-License-Identifier: GPL-2.0+ +# +# License-Filename: LICENSE + +from bs4 import BeautifulSoup +import re +import sys +import urllib +#import urllib2 +import requests +import urlparse +import xbmc +import xbmcgui +import xbmcplugin + + +KAN_URL = 'http://www.kan.org.il' +USER_AGENT = 'Kodi' # I'm optimistic + + +def trace(msg): + xbmc.log(msg="Tzafrir: " + msg, level=xbmc.LOGNOTICE) + + +class Page: + def __init__(self, argv): + self.base_url = argv[0] + self.addon_handle = int(argv[1]) + self.args = urlparse.parse_qs(argv[2][1:]) + self.mode = self.args.get('mode', None) + + def build_url(self, query): + #query['addon_handle'] = self.addon_handle + return self.base_url + '?' + urllib.urlencode(query) + + def add_directory_item(self, **kwargs): + xbmcplugin.addDirectoryItem(handle=self.addon_handle, **kwargs) + + def end_directory(self): + xbmcplugin.endOfDirectory(self.addon_handle) + + def placeholder_folder(self, foldername): + """ A folder with a single dummy item """ + url = 'http://localhost/some_video.mkv' + li = xbmcgui.ListItem(foldername + 'Not Implemented', + iconImage='DefaultVideo.png') + self.add_directory_item(url=url, listitem=li) + self.end_directory() + + def placeholder_item(self, name, label): + """ An item that calls a placeholder folder """ + url = self.build_url({'mode': 'placeholder', 'name': name}) + li = xbmcgui.ListItem(label) + self.add_directory_item(url=url, listitem=li, isFolder=True) + + def __str__(self): + return "[base_url: {}, addon_handle: {}, mode: {}]".format( + self.base_url, self.addon_handle, self.mode) + + +def read_url(url): + headers = {'user-agent': 'Kodi/plugin.video.kan/1.0'} + response = requests.get(url, headers=headers) + if response.status_code != 200: + raise IOError("Invalid URL {}".format(url)) + return response.content + + +def get_show_title(base_url, path): + url = base_url + '/' + path + page = read_url(url) + parsed = BeautifulSoup(page, "html.parser") + title = parsed.title.string + title = re.sub('[|-].*', '', title) + return title + + +def tvshows_menu(page): + """ Display a menu of all the TV shows """ + tvshows_url = KAN_URL + '/video/programs.aspx' + main_page = read_url(tvshows_url) + parsed = BeautifulSoup(main_page, "html.parser") + anchors = parsed.find_all('a', + class_="program_category_link w-inline-block") + trace("got anchors: " + str(len(anchors))) + for a in anchors: + path = a.get('href') + show_id = re.sub('.*=', '', path) + #trace("Checking link to " + path) + title = get_show_title(KAN_URL, path) + url = page.build_url({'mode': 'show', 'id': show_id}) + trace("Item: URL: {}, title: {}.".format(url, title.encode('utf8'))) + li = xbmcgui.ListItem(title) + page.add_directory_item(url=url, listitem=li, isFolder=True, + totalItems=len(anchors)) + page.end_directory() + + +def show_menu(page): + """ Display a menu of items in a specific show """ + show_id = page.args['id'][0] + show_url = KAN_URL + '/Program/?catId=' + show_id + trace("URL for show {}: {}".format(show_id, show_url)) + + show_page = read_url(show_url) + parsed = BeautifulSoup(show_page, "html.parser") + items = parsed.find_all('li', + class_="program_list_item w-clearfix") + trace("got items: " + str(len(items))) + for item in items: + titles = item.find_all('h2') + title = titles[0].string + iframe = item.find_all('iframe')[0] + youtube_url = iframe['src'] + #trace("Youtube URL: {}.".format(youtube_url)) + youtube_id = re.sub('.*/embed/([0-9A-Za-z]+)(\?.*)?', r'\1', youtube_url) + trace("Add link for ID {} ({}).".format(youtube_id, title.encode('utf-8'))) + url = 'plugin://plugin.video.youtube/play/?video_id={}'.format(youtube_id) + li = xbmcgui.ListItem(title) + li.setProperty('IsPlayable','true') + page.add_directory_item(url=url, listitem=li, totalItems=len(items)) + page.end_directory() + + +def main_page(page): + url = page.build_url({'mode': 'shows', 'name': 'tv-shows'}) + li = xbmcgui.ListItem(u'תוכניות טלוויזיה') + page.add_directory_item(url=url, listitem=li, isFolder=True) + + page.placeholder_item('net-shows', u'תוכניות רשת') + page.placeholder_item('new-items', u'קטעים חדשים') + + page.end_directory() + + +def main(): + page = Page(sys.argv) + + trace("{}".format(page)) + if page.mode is not None: + mode = page.mode[0] + + if page.mode is None: + main_page(page) + elif mode == 'shows': + tvshows_menu(page) + elif mode == 'show': + show_menu(page) + elif mode == 'placeholder': + name = page.args['name'][0] + page.placeholder_folder(name) + else: + trace("No handler for mode '{}'".format(mode)) + + +if __name__ == '__main__': + main() -- cgit v1.2.3