# -*- 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): 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): base_url = 'http://www.kan.org.il' tvshows_url = base_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(base_url, path) url = page.build_url({'mode': 'show', 'id': show_id}) li = xbmcgui.ListItem(title) page.add_directory_item(url=url, listitem=li) 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': pass elif mode == 'placeholder': name = page.args['name'][0] page.placeholder_folder(name) else: trace("No handler for mode '{}'".format(mode)) if __name__ == '__main__': main()