# -*- coding: utf-8 -*- import sys import re import os import xbmc import xbmcplugin import xbmcgui import xbmcaddon import xbmcvfs import six from six.moves import urllib from lib.general import * from lib.rumble_user import RumbleUser from lib.comments import CommentWindow try: import json except ImportError: import simplejson as json BASE_URL = 'https://rumble.com' PLUGIN_URL = sys.argv[0] PLUGIN_ID = int(sys.argv[1]) PLUGIN_NAME = PLUGIN_URL.replace('plugin://','') ADDON = xbmcaddon.Addon() ADDON_ICON = ADDON.getAddonInfo('icon') ADDON_NAME = ADDON.getAddonInfo('name') HOME_DIR = 'special://home/addons/' + PLUGIN_NAME RESOURCE_DIR = HOME_DIR + 'resources/' MEDIA_DIR = RESOURCE_DIR + 'media/' DATE_FORMAT = ADDON.getSetting('date_format') RUMBLE_USER = RumbleUser() if six.PY2: favorites = xbmc.translatePath(os.path.join(ADDON.getAddonInfo('profile'), 'favorites.dat')) else: favorites = xbmcvfs.translatePath(os.path.join(ADDON.getAddonInfo('profile'), 'favorites.dat')) def favorites_create(): """ creates favorite directory if doesn't exist """ if six.PY2: addon_data_path = xbmc.translatePath(ADDON.getAddonInfo('profile')) else: addon_data_path = xbmcvfs.translatePath(ADDON.getAddonInfo('profile')) if os.path.exists(addon_data_path) is False: os.mkdir(addon_data_path) xbmc.sleep(1) def favorites_load( return_string = False ): """ load favourites from file into variable """ if os.path.exists( favorites ): fav_str = open( favorites ).read() if return_string: return fav_str if fav_str: return json.loads( fav_str ) else: favorites_create() # nothing to load, return type necessary if return_string: return '' return [] def to_unicode( text, encoding='utf-8', errors='strict' ): """ Forces text to unicode """ if isinstance(text, bytes): return text.decode(encoding, errors=errors) return text def get_search_string( heading='', message='' ): """ Ask the user for a search string """ search_string = None keyboard = xbmc.Keyboard(message, heading) keyboard.doModal() if keyboard.isConfirmed(): search_string = to_unicode(keyboard.getText()) return search_string def home_menu(): """ Creates home menu """ # Search add_dir( get_string(137), '', 1, { 'thumb': 'search.png' } ) # Favorites add_dir( get_string(1036), '', 7, { 'thumb': 'favorite.png' } ) if RUMBLE_USER.has_login_details(): # Subscriptions add_dir( 'Subscriptions', BASE_URL + '/subscriptions', 3, { 'thumb': 'favorite.png' }, {}, 'subscriptions' ) # Following add_dir( 'Following', BASE_URL + '/followed-channels', 3, { 'thumb': 'favorite.png' }, {}, 'following' ) # Watch Later add_dir( 'Watch Later', BASE_URL + '/playlists/watch-later', 3, { 'thumb': 'favorite.png' }, {}, 'playlist' ) # Battle Leaderboard add_dir( get_string(30050), BASE_URL + '/battle-leaderboard/recorded', 3, { 'thumb': 'leader.png' }, {}, 'top' ) # Categories add_dir( get_string(30051), BASE_URL + '/browse', 3, { 'thumb': 'viral.png' }, {}, 'cat_list' ) # Live Streams add_dir( get_string(30052), BASE_URL + '/browse/live', 3, { 'thumb': 'viral.png' }, {}, 'live_stream' ) # Settings add_dir( get_string(5), '', 8, { 'thumb': 'settings.png' } ) xbmcplugin.endOfDirectory( PLUGIN_ID, cacheToDisc=False ) def search_menu(): """ Creates search menu """ # Search Video add_dir( get_string(30100), BASE_URL + '/search/video?q=', 2, { 'thumb': 'search.png' }, {}, 'video' ) # Search Channel add_dir( get_string(30101), BASE_URL + '/search/channel?q=', 2, { 'thumb': 'search.png' }, {}, 'channel' ) # Search User add_dir( get_string(30102), BASE_URL + '/search/channel?q=', 2, { 'thumb': 'search.png' }, {}, 'user' ) xbmcplugin.endOfDirectory(PLUGIN_ID) def pagination( url, page, cat, search=False ): """ list directory items then show pagination """ if url > '': page = int(page) page_url = url paginated = True if page == 1: if search: page_url = url + search elif search and cat == 'video': page_url = url + search + "&page=" + str( page ) elif cat in {'channel', 'cat_video', 'user', 'other', 'subscriptions', 'live_stream' }: page_url = url + "?page=" + str( page ) if cat in { 'following', 'top', 'cat_list' }: paginated = False amount = list_rumble( page_url, cat ) if paginated and amount > 15 and page < 10: # for next page page = page + 1 name = get_string(30150) + " " + str( page ) list_item = xbmcgui.ListItem(name) link_params = { 'url': url, 'mode': '3', 'name': name, 'page': str( page ), 'cat': cat, } link = build_url( link_params ) if search and cat == 'video': link = link + "&search=" + urllib.parse.quote_plus(search) xbmcplugin.addDirectoryItem(PLUGIN_ID, link, list_item, True) xbmcplugin.endOfDirectory(PLUGIN_ID) def get_image( data, image_id ): """ method to get an image from scraped page's CSS from the image ID """ image_re = re.compile( "i.user-image--img--id-" + str( image_id ) + ".+?{\s*background-image: url(.+?);", re.MULTILINE|re.DOTALL|re.IGNORECASE ).findall(data) if image_re != []: image = str(image_re[0]).replace('(', '').replace(')', '') else: image = '' return image def list_rumble( url, cat ): """ Method to get and display items from Rumble """ amount = 0 headers = None if 'subscriptions' in url or cat == 'following': # make sure there is a session # result is stored in a cookie RUMBLE_USER.has_session() data = request_get(url, None, headers) # Fix for favorites & search if cat in { 'other', 'channel' } and '/c/' in url: cat = 'channel_video' if 'search' in url: if cat == 'video': amount = dir_list_create( data, cat, 'video', True, 1 ) else: amount = dir_list_create( data, cat, 'channel', True ) elif cat in { 'subscriptions', 'cat_video', 'live_stream', 'playlist' }: amount = dir_list_create( data, cat, cat, False, 2 ) elif cat in { 'channel', 'top', 'other' }: amount = dir_list_create( data, cat, 'video', False, 2 ) elif cat in { 'channel_video', 'user' }: amount = dir_list_create( data, cat, 'channel_video', False, 2 ) elif cat == 'following': amount = dir_list_create( data, cat, 'following', False, 2 ) elif cat == 'cat_list': amount = dir_list_create( data, cat, cat, False ) return amount def dir_list_create( data, cat, video_type='video', search = False, play=0 ): """ create and display dir list based upon type """ amount = 0 if video_type == 'video': videos = re.compile(r'href=\"([^\"]+)\">
(?:[^\<]+)?(?:
(?:[0-9]+)
)?
<(?:[^\>]+)>

(.+?)

]+)>