""" Copyright (C) 2018 MuadDib ---------------------------------------------------------------------------- "THE BEER-WARE LICENSE" (Revision 42): @tantrumdev wrote this file. As long as you retain this notice you can do whatever you want with this stuff. Just Ask first when not released through the tools and parser GIT. If we meet some day, and you think this stuff is worth it, you can buy him a beer in return. - Muad'Dib ---------------------------------------------------------------------------- Overview: Drop this PY in the plugins folder. See examples below on use. Version: 2019.7.23: - Updated Clear Cache function to make use of "quiet_cache" 2018.7.2: - Added Clear Cache function - Minor update on fetch cache returns 2018.6.20: - Added caching to primary menus (Cache time is 3 hours) 2018.5.17 - Initial Release XML Explanations: Tags: - Displays the entry as category's contents Usage Examples: 911 dhcategory/911 Activist dhcategory/activist Archaeology dhcategory/archaeology Art and Artists dhcategory/art-and-artists Atheism dhcategory/atheism Biographies dhcategory/biographies Business dhcategory/business Celebrity dhcategory/celebrity Crime dhcategory/crime Conference dhcategory/conference Conspiracy dhcategory/conspiracy Countries dhcategory/countries Drugs dhcategory/drugs Economics dhcategory/economics Educational dhcategory/educational Environment dhcategory/environment Evolution dhcategory/evolution Gangs dhcategory/gangs Health dhcategory/health History dhcategory/history Human Rights dhcategory/human-rights Lifestyle dhcategory/lifestyle Movies dhcategory/movies Music dhcategory/music Mystery dhcategory/mystery Nature dhcategory/nature News and Politics dhcategory/news-politics Performing Arts dhcategory/performing-arts Philosophy dhcategory/philosophy Preview Only dhcategory/preview-only Psychology dhcategory/psychology Religion dhcategory/religion Science dhcategory/science Society dhcategory/society Space dhcategory/space Spiritual dhcategory/spiritual Sport and Adventure dhcategory/sportadventure Technology dhcategory/technology War dhcategory/war """ import __builtin__ import base64,time import json,re,requests,os,traceback,urlparse import koding import xbmc,xbmcaddon,xbmcgui from koding import route from resources.lib.plugin import Plugin from resources.lib.util import dom_parser from resources.lib.util.context import get_context_items from resources.lib.util.xml import JenItem, JenList, display_list from unidecode import unidecode CACHE_TIME = 10800 # change to wanted cache time in seconds addon_id = xbmcaddon.Addon().getAddonInfo('id') addon_fanart = xbmcaddon.Addon().getAddonInfo('fanart') addon_icon = xbmcaddon.Addon().getAddonInfo('icon') docu_link = 'http://documentaryheaven.com' docu_cat_list = 'http://documentaryheaven.com/category/' """ Add strings to the reg_items for domains that are supported naturally by resolveurl """ reg_items = {'vimeo','dailymotion','rutube','vid.ag','thevideobee','vidzi.tv'} unreg_items = {'myspace','nfb.ca','snagfilms','dotsub','en.musicplayon.com','vkontakte.ru','veehd.com','liveleak.com','imdb.com','disclose.tv','videoweed.es','putlocker','vid.ag','vice.com'} """ Examples for unreg_items, to look into future support or if requested to fix by adding to/fixing in resolveurl thevideobee: Music - Amy snagfiles: Music - Jimi Hendrix the Uncut Story dotsub: Music - The Man in the Mirror en.musicplayon.com: Music - Prince: The Glory Years vkontakte.ru: Music - Paul Kalkbrenner: A live documentary veehd.com: The Abandoned Marsh liveleak.com: Lost Nuke imdb.com: Eceti Ranch disclose.tv: The Revelation of the Pyramids videoweed.es: EP2/4 Wonders of the Universe putlocker: EP 1/6 The Private Life of Plants vid.ag: Jim: The James Foley Story vice.com: Our Rising Oceans """ class DocuHeaven(Plugin): name = "docuh" priority = 200 def process_item(self, item_xml): if "" in item_xml: item = JenItem(item_xml) if "dhcategory/" in item.get("docuh", ""): result_item = { 'label': item["title"], 'icon': item.get("thumbnail", addon_icon), 'fanart': item.get("fanart", addon_fanart), 'mode': "DHCats", 'url': item.get("docuh", ""), 'folder': True, 'imdb': "0", 'content': "files", 'season': "0", 'episode': "0", 'info': {}, 'year': "0", 'context': get_context_items(item), "summary": item.get("summary", None) } result_item['fanart_small'] = result_item["fanart"] return result_item def clear_cache(self): skip_prompt = xbmcaddon.Addon().getSetting("quiet_cache") dialog = xbmcgui.Dialog() if skip_prompt == 'false': if dialog.yesno(xbmcaddon.Addon().getAddonInfo('name'), "Clear Documentary Heaven Plugin Cache?"): koding.Remove_Table("docuheaven_com_plugin") else: koding.Remove_Table("docuheaven_com_plugin") @route(mode='DHCats', args=["url"]) def get_DHcats(url): pins = "" url = url.replace('dhcategory/', '') # Strip our category tag off. orig_cat = url.split("/")[0] url = urlparse.urljoin(docu_cat_list, url) xml = fetch_from_db(url) if not xml: xml = "" try: html = requests.get(url).content doc_list = dom_parser.parseDOM(html, 'article') for content in doc_list: try: docu_info = re.compile('

(.+?)

',re.DOTALL).findall(content)[0] docu_title = re.compile('(.+?)',re.DOTALL).findall(docu_info)[0] docu_title = docu_title.replace("&","&").replace(''',"'").replace('"','"').replace(''',"'").replace('–',' - ').replace('’',"'").replace('‘',"'").replace('&','&').replace('â','') docu_summary = re.compile('

(.+?)

',re.DOTALL).findall(content)[0].replace('"','"').replace(''',"'").replace('–',' - ').replace('’',"'").replace('‘',"'").replace('&','&').replace('â','') try: docu_icon = re.compile('data-src="(.+?)"',re.DOTALL).findall(content)[0] except: docu_icon = re.compile('src="(.+?)"',re.DOTALL).findall(content)[0] docu_url = re.compile('href="(.+?)"',re.DOTALL).findall(docu_info)[0] docu_html = requests.get(docu_url).content try: docu_item = dom_parser.parseDOM(docu_html, 'meta', attrs={'itemprop':'embedUrl'}, ret='content')[0] except: docu_item = dom_parser.parseDOM(docu_html, 'iframe', ret='src')[0] if 'http:' not in docu_item and 'https:' not in docu_item: docu_item = 'https:' + docu_item docu_url = docu_item replaceHTMLCodes(docu_title) if 'youtube' in docu_url: if 'videoseries' not in docu_url: xml += ""\ " %s"\ " %s"\ " %s"\ " %s"\ "" % (docu_title,docu_url,docu_icon,docu_summary) else: # videoseries stuff? video_id = docu_url.split("=")[-1] docu_url = 'plugin://plugin.video.youtube/playlist/%s/' % video_id xml += ""\ " %s"\ " %s"\ " %s"\ " %s"\ "" % (docu_title,docu_url,docu_icon,docu_summary) elif 'archive.org/embed' in docu_url: docu_html = requests.get(docu_url).content video_element = dom_parser.parseDOM(docu_html, 'source', ret='src')[0] docu_url = urlparse.urljoin('https://archive.org/', video_element) xml += ""\ " %s"\ " %s"\ " %s"\ " %s"\ "" % (docu_title,docu_url,docu_icon,docu_summary) elif any(x in docu_url for x in reg_items): xml += ""\ " %s"\ " %s"\ " %s"\ " %s"\ "" % (docu_title,docu_url,docu_icon,docu_summary) elif any(x in docu_url for x in unreg_items): # most of these gone now so screw it lol, and no valid player know yet to work with nfb continue else: xbmcgui.Dialog().ok('Unknown Host - ' + docu_title,str(docu_url)) except: continue try: navi_content = dom_parser.parseDOM(html, 'div', attrs={'class':'numeric-nav'})[0] if '>NEXT' in navi_content: links = dom_parser.parseDOM(navi_content, 'a', ret='href') link = links[(len(links)-1)] page = link.split("/")[-2] xml += ""\ " Next Page >>"\ " dhcategory/%s/page/%s"\ "" % (orig_cat,page) except: pass except: pass save_to_db(xml, url) jenlist = JenList(xml) display_list(jenlist.get_list(), jenlist.get_content_type(), pins) def save_to_db(item, url): if not item or not url: return False try: koding.reset_db() koding.Remove_From_Table( "docuheaven_com_plugin", { "url": url }) koding.Add_To_Table("docuheaven_com_plugin", { "url": url, "item": base64.b64encode(item), "created": time.time() }) except: return False def fetch_from_db(url): koding.reset_db() docuh_plugin_spec = { "columns": { "url": "TEXT", "item": "TEXT", "created": "TEXT" }, "constraints": { "unique": "url" } } koding.Create_Table("docuheaven_com_plugin", docuh_plugin_spec) match = koding.Get_From_Table( "docuheaven_com_plugin", {"url": url}) if match: match = match[0] if not match["item"]: return None created_time = match["created"] if created_time and float(created_time) + CACHE_TIME >= time.time(): match_item = match["item"] try: result = base64.b64decode(match_item) except: return None return result else: return None else: return None def replaceHTMLCodes(txt): txt = re.sub("(&#[0-9]+)([^;^0-9]+)", "\\1;\\2", txt) txt = txt.replace(""", "\"").replace("&", "&") txt = txt.replace('‘','\'').replace('’','\'').replace('&','&').replace('…','....') txt = txt.strip() return txt def remove_non_ascii(text): try: text = text.decode('utf-8').replace(u'\xc2', u'A').replace(u'\xc3', u'A').replace(u'\xc4', u'A') except: pass return unidecode(text)