def load_settings(self): self.SPEED = float(addon.getSetting('slideshow_speed')) self.SHOW_TITLE = addon.getSetting('show_title') == 'true' self.CONCURRENCY = 1.0 #float(addon.getSetting('appletvlike_concurrency')) self.MAX_TIME = int(36000 / self.SPEED) #int(15000 / self.SPEED) self.NEXT_IMAGE_TIME = int(12000.0 / self.SPEED)
def load_settings(self): self.SPEED = float(addon.getSetting('slideshow_speed')) self.SHOW_TITLE = addon.getSetting('show_title') == 'true' self.CONCURRENCY = 1.0 #float(addon.getSetting('appletvlike_concurrency')) self.MAX_TIME = int(36000 / self.SPEED) #int(15000 / self.SPEED) self.NEXT_IMAGE_TIME = int(12000.0 / self.SPEED)
def load_settings(self): self.SPEED = float(addon.getSetting('slideshow_speed')) self.SHOW_TITLE = addon.getSetting('show_title') == 'true' self.CONCURRENCY = 1.0 #float(addon.getSetting('appletvlike_concurrency')) self.MAX_TIME = int(8000 / self.SPEED) #int(15000 / self.SPEED) self.NEXT_IMAGE_TIME = int(12000.0 / self.SPEED) self.TEXT_ANIMATIONS= [ ('conditional', 'condition=true effect=fade delay=0 time=500 start=0 end=100 ' ), ('conditional', 'condition=true effect=fade delay=%s time=500 start=100 end=0 tween=circle easing=in' % self.NEXT_IMAGE_TIME ) ]
def load_settings(self): self.SPEED = float(addon.getSetting('slideshow_speed')) self.SHOW_TITLE = addon.getSetting('show_title') == 'true' self.CONCURRENCY = 1.0 #float(addon.getSetting('appletvlike_concurrency')) self.MAX_TIME = int(8000 / self.SPEED) #int(15000 / self.SPEED) self.NEXT_IMAGE_TIME = int(12000.0 / self.SPEED) self.TEXT_ANIMATIONS= [ ('conditional', 'condition=true effect=fade delay=0 time=500 start=0 end=100 ' ), ('conditional', 'condition=true effect=fade delay=%s time=500 start=100 end=0 tween=circle easing=in' % self.NEXT_IMAGE_TIME ) ]
def setting_gif_repeat_count(): srepeat_gif_video = addon.getSetting("repeat_gif_video") try: repeat_gif_video = int(srepeat_gif_video) except ValueError: repeat_gif_video = 0 #repeat_gif_video = [0, 1, 3, 10, 100][repeat_gif_video] return [0, 1, 3, 10, 100][repeat_gif_video]
def __new__(cls, ev, q): mode = MODES[int(addon.getSetting('slideshow_mode'))] if mode == 'Random': subcls = random.choice(ScreensaverBase.__subclasses__( )) return subcls( ev, q) for subcls in ScreensaverBase.__subclasses__(): #log(' mode:%s subclass:%s' %( mode, subcls.__name__ )) if subcls.MODE == mode: return subcls( ev, q) raise ValueError('Not a valid ScreensaverBase subclass: %s' % mode)
def __new__(cls, ev, q): mode = MODES[int(addon.getSetting('slideshow_mode'))] if mode == 'Random': subcls = random.choice(ScreensaverBase.__subclasses__()) return subcls(ev, q) for subcls in ScreensaverBase.__subclasses__(): #log(' mode:%s subclass:%s' %( mode, subcls.__name__ )) if subcls.MODE == mode: return subcls(ev, q) raise ValueError('Not a valid ScreensaverBase subclass: %s' % mode)
def reddit_get_refresh_token(url, name, type_): code = addon.getSetting("reddit_code") if reddit_refresh_token and code: dialog = xbmcgui.Dialog() if dialog.yesno(translation(30411), translation(30412), translation(30413), translation(30414) ): pass else: return try: log( "Requesting a reddit permanent token with code=" + code ) req = urllib2.Request('https://www.reddit.com/api/v1/access_token') data = urllib.urlencode({'grant_type' : 'authorization_code' ,'code' : code #'woX9CDSuw7XBg1MiDUnTXXQd0e4' ,'redirect_uri': reddit_redirect_uri}) #http://localhost:8090/ import base64 base64string = base64.encodestring('%s:%s' % (reddit_clientID, '')).replace('\n', '') req.add_header('Authorization',"Basic %s" % base64string) req.add_header('User-Agent', reddit_userAgent) page = urllib2.urlopen(req, data=data) response=page.read();page.close() log( response ) status=reddit_set_addon_setting_from_response(response) if status=='ok': r1="Click 'OK' when done" r2="Settings will not be saved" xbmc.executebuiltin("XBMC.Notification(%s, %s)" %( r1, r2) ) else: r2="Requesting a reddit permanent token" xbmc.executebuiltin("XBMC.Notification(%s, %s)" %( status, r2) ) except urllib2.HTTPError, err: xbmc_notify(err.code, err.msg)
def listAlbum(album_url, name, type_): from slideshow import slideshowAlbum from domains import sitesManager log(" listAlbum:"+album_url) hoster = sitesManager( album_url ) if hoster: dictlist=hoster.ret_album_list(album_url) if type_=='return_dictlist': #used in autoSlideshow return dictlist if not dictlist: xbmc_notify(translation(32200),translation(32055)) #slideshow, no playable items return if addon.getSetting('use_slideshow_for_album') == 'true': slideshowAlbum( dictlist, name ) else: display_album_from( dictlist, name )
def listAlbum(album_url, name, type_): from slideshow import slideshowAlbum from domains import sitesManager log(" listAlbum:"+album_url) hoster = sitesManager( album_url ) #log( ' %s %s ' %(hoster.__class__.__name__, album_url ) ) if hoster: dictlist=hoster.ret_album_list(album_url) if type_=='return_dictlist': #used in autoSlideshow return dictlist if not dictlist: xbmc_notify(translation(32200), translation(32055)) #slideshow, no playable items return #log(pprint.pformat(dictlist)) if addon.getSetting('use_slideshow_for_album') == 'true': slideshowAlbum( dictlist, name ) else: display_album_from( dictlist, name )
# -*- coding: utf-8 -*- import xbmc import xbmcgui import sys import urllib2, urllib import re import os from default import addon, subredditsFile, urlMain, itemsPerPage,subredditsPickle,REQUEST_TIMEOUT from utils import log, translation,xbmc_notify from default import reddit_clientID, reddit_userAgent, reddit_redirect_uri reddit_refresh_token =addon.getSetting("reddit_refresh_token") reddit_access_token =addon.getSetting("reddit_access_token") #1hour token def reddit_request( url, data=None ): if reddit_refresh_token: url=url.replace('www.reddit.com','oauth.reddit.com' ) url=url.replace( 'np.reddit.com','oauth.reddit.com' ) url=url.replace( 'http://', 'https://' ) req = urllib2.Request(url) req.add_header('User-Agent', reddit_userAgent) #userAgent = "XBMC:"+addonID+":v"+addon.getAddonInfo('version')+" (by /u/gsonide)" if reddit_refresh_token: req.add_header('Authorization','bearer '+ reddit_access_token ) try:
import xbmc import xbmcgui import xbmcplugin #import xbmcvfs import sys import shutil, os import re, urllib.request, urllib.parse, urllib.error import pprint import json import urllib.parse from default import subredditsFile, addon, addon_path, profile_path, ytdl_core_path, pluginhandle, subredditsPickle from .utils import xbmc_busy, log, translation, xbmc_notify from .reddit import get_subreddit_entry_info ytdl_quality = addon.getSetting("ytdl_quality") try: ytdl_quality = [0, 1, 2, 3][int(ytdl_quality)] except ValueError: ytdl_quality = 1 ytdl_DASH = addon.getSetting("ytdl_DASH") == 'true' def addSubreddit(subreddit, name, type_): from .utils import colored_subreddit from .reddit import this_is_a_multireddit, format_multihub alreadyIn = False with open(subredditsFile, 'r') as fh: content = fh.readlines() if subreddit: for line in content:
def display_album_from(dictlist, album_name): from domains import parse_reddit_link, build_DirectoryItem_url_based_on_media_type, sitesBase from utils import build_script directory_items=[] album_viewMode=addon.getSetting("album_viewMode") if album_viewMode=='450': #using custom gui using_custom_gui=True else: using_custom_gui=False for _, d in enumerate(dictlist): ti=d['li_thumbnailImage'] media_url=d.get('DirectoryItem_url') combined = d['infoLabels'].get('plot') if d['infoLabels'].get('plot') else "" d['infoLabels']['plot'] = combined liz=xbmcgui.ListItem(label=d.get('li_label'), label2=d.get('li_label2') ) ld=parse_reddit_link(media_url) DirectoryItem_url, setProperty_IsPlayable, isFolder, _ = build_DirectoryItem_url_based_on_media_type(ld, media_url, '', '', script_to_call="") if using_custom_gui: url_for_DirectoryItem=media_url liz.setProperty('onClick_action', DirectoryItem_url ) liz.setProperty('is_video','true') if ld.link_action == sitesBase.DI_ACTION_PLAYABLE: liz.setProperty('item_type','playable') else: liz.setProperty('item_type','script') else: liz.setProperty('IsPlayable',setProperty_IsPlayable) url_for_DirectoryItem=DirectoryItem_url liz.setInfo( type='video', infoLabels=d['infoLabels'] ) #this tricks the skin to show the plot. where we stored the picture descriptions liz.setArt({"thumb": ti,'icon': ti, "poster":media_url, "banner":media_url, "fanart":media_url, "landscape":media_url }) directory_items.append( (url_for_DirectoryItem, liz, isFolder) ) if using_custom_gui: from guis import cGUI li=[] for di in directory_items: li.append( di[1] ) ui = cGUI('view_450_slideshow.xml' , addon_path, defaultSkin='Default', defaultRes='1080i', listing=li, id=53) ui.include_parent_directory_entry=False ui.doModal() del ui else: if album_viewMode!='0': xbmc.executebuiltin('Container.SetViewMode('+album_viewMode+')') xbmcplugin.addDirectoryItems(handle=pluginhandle, items=directory_items ) xbmcplugin.endOfDirectory(pluginhandle)
def autoSlideshow(url, name, type_): log('starting slideshow ' + url) ev = threading.Event() entries = [] #watchdog_counter=0 preview_w = 0 preview_h = 0 image = '' #content = opener.open(url).read() content = reddit_request(url) if not content: return #log( str(content) ) #content = json.loads(content.replace('\\"', '\'')) content = json.loads(content) log("slideshow %s:Parsing %d items: %s" % (type_, len(content['data']['children']), 'random' if random_post_order else 'normal order')) data_children = content['data']['children'] if random_post_order: random.shuffle(data_children) for j_entry in data_children: try: title = unescape(j_entry['data']['title'].encode('utf-8')) log(" TITLE:%s [r/%s]" % (title, j_entry.get('data').get('subreddit'))) try: description = unescape(j_entry['data']['media']['oembed'] ['description'].encode('utf-8')) except: description = '' #log(' description [%s]' %description) try: post_selftext = unescape( j_entry['data']['selftext'].encode('utf-8')) except: post_selftext = '' #log(' post_selftext[%s]' %post_selftext) description = post_selftext + '[CR]' + description if post_selftext else description try: media_url = j_entry['data']['url'] except: media_url = j_entry['data']['media']['oembed']['url'] try: preview = j_entry['data']['preview']['images'][0]['source'][ 'url'].encode('utf-8').replace('&', '&') try: preview_h = float(j_entry['data']['preview']['images'][0] ['source']['height']) preview_w = float(j_entry['data']['preview']['images'][0] ['source']['width']) except: preview_w = 0 preview_h = 0 except Exception as e: #log(" getting preview image EXCEPTION:="+ str( sys.exc_info()[0]) + " " + str(e) ) preview = "" ld = parse_reddit_link(link_url=media_url, assume_is_video=False, needs_preview=True, get_playable_url=True) if ld: if not preview: preview = ld.poster if (addon.getSetting('include_albums') == 'true') and (ld.media_type == sitesBase.TYPE_ALBUM): dictlist = listAlbum(media_url, title, 'return_dictlist') for d in dictlist: #log(' (S) adding items from album ' + title +' ' + d.get('DirectoryItem_url') ) t2 = d.get('li_label') if d.get('li_label') else title #entries.append([ t2, d.get('DirectoryItem_url'), d.get('width'), d.get('height'), len(entries)]) d['li_label'] = t2 entries.append(d) #title='' #only put the title in once. else: if addon.getSetting('use_reddit_preview') == 'true': if preview: image = preview elif ld.poster: image = ld.poster #if preview: entries.append([title,preview,preview_w, preview_h,len(entries)]) #log(' (N)added preview:%s %s' %( title,preview) ) #elif ld.poster: entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) #log(' (N)added poster:%s %s' % ( title,ld.poster) ) else: if ld.poster: image = ld.poster #entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) elif preview: image = preview #entries.append([title,preview,preview_w, preview_h,len(entries)]) #if ld.poster: entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) #elif preview: entries.append([title,preview,preview_w, preview_h,len(entries)]) append_entry(entries, title, image, preview_w, preview_h, description) else: append_entry(entries, title, preview, preview_w, preview_h, description) #log(' (N)added preview:%s' % title ) except Exception as e: log(' autoPlay exception:' + str(e)) #log( repr(entries)) entries = remove_dict_duplicates(entries, 'DirectoryItem_url') # #for i,e in enumerate(entries): log(' e1-%d %s' %(i, e[1]) ) # def k2(x): return x[1] # entries=remove_duplicates(entries, k2) # #for i,e in enumerate(entries): log(' e2-%d %s' %(i, e[1]) ) for i, e in enumerate(entries): log(' possible playable items({0}) {1}...{2}x{3} {4}'.format( i, e['li_label'].ljust(15)[:15], repr(e.get('width')), repr(e.get('height')), e.get('DirectoryItem_url'))) if len(entries) == 0: log(' Play All: no playable items') xbmc.executebuiltin( 'XBMC.Notification("%s","%s")' % (translation(32054), translation(32055))) #Play All No playable items return #if type.endswith("_RANDOM"): # random.shuffle(entries) #for title, url in entries: # log(" added to playlist:"+ title + " " + url ) log("**********playing slideshow*************") for e in entries: q.put(e) #s= HorizontalSlideScreensaver(ev,q) s = ScreensaverManager(ev, q) try: s.start_loop() except Exception as e: log(" EXCEPTION slideshowAlbum:=" + str(sys.exc_info()[0]) + " " + str(e)) return
import xbmc import xbmcgui import xbmcaddon import urllib.request, urllib.parse, urllib.error, urllib.parse import json import threading import re from queue import Queue from collections import defaultdict import os, sys import pprint from default import addon, addon_path, itemsPerPage, urlMain, subredditsFile, subredditsPickle, int_CommentTreshold, addonUserDataFolder, CACHE_FILE from .utils import xbmc_busy, log, translation, post_excluded_from use_requests_cache = addon.getSetting("use_requests_cache") == "true" default_frontpage = addon.getSetting("default_frontpage") no_index_page = addon.getSetting("no_index_page") == "true" main_gui_skin = addon.getSetting("main_gui_skin") anti_dos_delay = addon.getSetting("anti_dos_delay") try: anti_dos_delay = int(anti_dos_delay) except ValueError: anti_dos_delay = 100 use_first_link_in_textpost_for_the_following_subreddits = addon.getSetting( "use_first_link_in_textpost_for_the_following_subreddits") if use_requests_cache: import requests_cache requests_cache.install_cache( CACHE_FILE, backend='sqlite',
import re import urllib.request, urllib.parse, urllib.error import urllib.parse from .main_listing import GCXM_hasmultipleauthor, GCXM_hasmultiplesubreddit, GCXM_hasmultipledomain, GCXM_actual_url_used_to_generate_these_posts, GCXM_reddit_query_of_this_gui from default import addon from .reddit import assemble_reddit_filter_string, subreddit_in_favorites #, this_is_a_user_saved_list from .utils import log, translation, colored_subreddit, build_script, truncate cxm_show_html_to_text = addon.getSetting("cxm_show_html_to_text") == "true" cxm_show_open_browser = addon.getSetting("cxm_show_open_browser") == "true" cxm_show_comments = addon.getSetting("cxm_show_comments") == "true" cxm_show_by_author = addon.getSetting("cxm_show_by_author") == "true" cxm_show_by_subreddit = addon.getSetting("cxm_show_by_subreddit") == "true" cxm_show_by_domain = addon.getSetting("cxm_show_by_domain") == "true" cxm_show_autoplay = addon.getSetting("cxm_show_autoplay") == "true" cxm_show_slideshow = addon.getSetting("cxm_show_slideshow") == "true" cxm_show_add_shortcuts = addon.getSetting("cxm_show_add_shortcuts") == "true" #cxm_show_new_from = addon.getSetting("cxm_show_new_from") == "true" cxm_show_filter = addon.getSetting("cxm_show_filter") == "true" cxm_show_search = addon.getSetting("cxm_show_search") == "true" #cxm_show_reddit_save = addon.getSetting("cxm_show_reddit_save") == "true" cxm_show_youtube_items = addon.getSetting("cxm_show_youtube_items") == "true" cxm_show_add_to_favorites = addon.getSetting( "cxm_show_add_to_favorites") == "true" def build_context_menu_entries(num_comments, commentsUrl, subreddit, domain,
def setting_gif_repeat_count(): srepeat_gif_video= addon.getSetting("repeat_gif_video") try: repeat_gif_video = int(srepeat_gif_video) except ValueError: repeat_gif_video = 0 #repeat_gif_video = [0, 1, 3, 10, 100][repeat_gif_video] return [0, 1, 3, 10, 100][repeat_gif_video]
# -*- coding: utf-8 -*- import xbmc import xbmcgui import sys import urllib2, urllib import re import os from default import addon, subredditsFile, urlMain, itemsPerPage, subredditsPickle, REQUEST_TIMEOUT from utils import log, translation, xbmc_notify, clean_str from default import reddit_clientID, reddit_userAgent, reddit_redirect_uri reddit_refresh_token = addon.getSetting("reddit_refresh_token") reddit_access_token = addon.getSetting("reddit_access_token") #1hour token def reddit_request(url, data=None): #if there is a refresh_token, we use oauth.reddit.com instead of www.reddit.com if reddit_refresh_token: url = url.replace('www.reddit.com', 'oauth.reddit.com') url = url.replace('np.reddit.com', 'oauth.reddit.com') url = url.replace('http://', 'https://') #log( " replaced reqst." + url + " + access token=" + reddit_access_token) req = urllib2.Request(url) #req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14') req.add_header( 'User-Agent', reddit_userAgent ) #userAgent = "XBMC:"+addonID+":v"+addon.getAddonInfo('version')+" (by /u/gsonide)" #if there is a refresh_token, add the access token to the header
import xbmcgui import xbmcplugin import urllib, urlparse import json import threading import re from Queue import Queue import os,sys from default import addon, addon_path, itemsPerPage, urlMain, subredditsFile, int_CommentTreshold from default import pluginhandle, WINDOW, forceViewMode, viewMode, comments_viewMode, album_viewMode, autoplayAll, autoplayUnwatched, TitleAddtlInfo, DoNotResolveLinks from utils import xbmc_busy, log, translation, addDir, addDirR from reddit import reddit_request default_frontpage = addon.getSetting("default_frontpage") no_index_page = addon.getSetting("no_index_page") == "true" main_gui_skin = addon.getSetting("main_gui_skin") cxm_show_comment_link = addon.getSetting("cxm_show_comment_link") == "true" cxm_show_comments = addon.getSetting("cxm_show_comments") == "true" cxm_show_go_to = addon.getSetting("cxm_show_go_to") == "true" cxm_show_new_from = addon.getSetting("cxm_show_new_from") == "true" cxm_show_add_shortcuts = addon.getSetting("cxm_show_add_shortcuts") == "true" cxm_show_filter_subreddit = addon.getSetting("cxm_show_filter_subreddit") == "true" cxm_show_filter_domain = addon.getSetting("cxm_show_filter_domain") == "true" cxm_show_open_browser = addon.getSetting("cxm_show_open_browser") == "true" cxm_show_reddit_save = addon.getSetting("cxm_show_reddit_save") == "true" cxm_show_youtube_items = addon.getSetting("cxm_show_youtube_items") == "true" def index(url,name,type_):
def reddit_get_refresh_token(url, name, type_): #this function gets a refresh_token from reddit and keep it in our addon. this refresh_token is used to get 1-hour access tokens. # getting a refresh_token is a one-time step #1st: use any webbrowser to # https://www.reddit.com/api/v1/authorize?client_id=hXEx62LGqxLj8w&response_type=code&state=RS&redirect_uri=http://localhost:8090/&duration=permanent&scope=read,mysubreddits #2nd: click allow and copy the code provided after reddit redirects the user # save this code in add-on settings. A one-time use code that may be exchanged for a bearer token. code = addon.getSetting("reddit_code") #log(" user refresh token:"+reddit_refresh_token) #log(" user code:"+code) if reddit_refresh_token and code: #log(" user already have refresh token:"+reddit_refresh_token) dialog = xbmcgui.Dialog() if dialog.yesno(translation(30411), translation(30412), translation(30413), translation(30414) ): pass else: return try: log( "Requesting a reddit permanent token with code=" + code ) req = urllib2.Request('https://www.reddit.com/api/v1/access_token') #http://stackoverflow.com/questions/6348499/making-a-post-call-instead-of-get-using-urllib2 data = urllib.urlencode({'grant_type' : 'authorization_code' ,'code' : code #'woX9CDSuw7XBg1MiDUnTXXQd0e4' ,'redirect_uri': reddit_redirect_uri}) #http://localhost:8090/ #http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem import base64 base64string = base64.encodestring('%s:%s' % (reddit_clientID, '')).replace('\n', '') req.add_header('Authorization',"Basic %s" % base64string) req.add_header('User-Agent', reddit_userAgent) page = urllib2.urlopen(req, data=data) response=page.read();page.close() log( response ) status=reddit_set_addon_setting_from_response(response) if status=='ok': r1="Click 'OK' when done" r2="Settings will not be saved" xbmc.executebuiltin("XBMC.Notification(%s, %s)" %( r1, r2) ) else: r2="Requesting a reddit permanent token" xbmc.executebuiltin("XBMC.Notification(%s, %s)" %( status, r2) ) # This is a 2nd option reddit oauth. user needs to request access token every hour # #user enters this on their webbrowser. note that there is no duration=permanent response_type=token instead of code # request_url='https://www.reddit.com/api/v1/authorize?client_id=hXEx62LGqxLj8w&response_type=token&state=RS&redirect_uri=http://localhost:8090/&scope=read,identity' # #click on "Allow" # #copy the redirect url code #enters it on settings. e.g.: LVQu8vitbEXfMPcK1sGlVVQZEpM # # #u='https://oauth.reddit.com/new.json' # u='https://oauth.reddit.com//api/v1/me.json' # # req = urllib2.Request(u) # #req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14') # req.add_header('User-Agent', reddit_userAgent) # req.add_header('Authorization','bearer LVQu8vitbEXfMPcK1sGlVVQZEpM') # page = read,identity.urlopen(req) # response=page.read();page.close() except urllib2.HTTPError, err: xbmc_notify(err.code, err.msg)
def display_album_from(dictlist, album_name): from domains import parse_reddit_link, build_DirectoryItem_url_based_on_media_type, sitesBase from utils import build_script directory_items=[] album_viewMode=addon.getSetting("album_viewMode") if album_viewMode=='450': #using custom gui using_custom_gui=True else: using_custom_gui=False #log( repr(dictlist)) for _, d in enumerate(dictlist): ti=d['li_thumbnailImage'] media_url=d.get('DirectoryItem_url') #log(' display_album_from list:'+ media_url + " " ) #There is only 1 textbox for Title and description in our custom gui. # I don't know how to achieve this in the xml file so it is done here: # combine title and description without [CR] if label is empty. [B]$INFO[Container(53).ListItem.Label][/B][CR]$INFO[Container(53).ListItem.Plot] # new note: this is how it is done: # $INFO[Container(53).ListItem.Label,[B],[/B][CR]] $INFO[Container(53).ListItem.Plot] #if the infolabel is empty, nothing is printed for that block #combined = '[B]'+ d['li_label2'] + "[/B][CR]" if d['li_label2'] else "" combined = d['infoLabels'].get('plot') if d['infoLabels'].get('plot') else "" d['infoLabels']['plot'] = combined liz=xbmcgui.ListItem(label=d.get('li_label'), label2=d.get('li_label2') ) #parse the link so that we can determine whether it is image or video. ld=parse_reddit_link(media_url) DirectoryItem_url, setProperty_IsPlayable, isFolder, _ = build_DirectoryItem_url_based_on_media_type(ld, media_url, '', '', script_to_call="") #log('isFolder:' + repr(isFolder)+ ' IsPlayable:'+repr(setProperty_IsPlayable) + ' DirectoryItem_url:' + repr(DirectoryItem_url)) if using_custom_gui: url_for_DirectoryItem=media_url liz.setProperty('onClick_action', DirectoryItem_url ) liz.setProperty('is_video','true') #if setProperty_IsPlayable=='true': if ld: if ld.link_action == sitesBase.DI_ACTION_PLAYABLE: liz.setProperty('item_type','playable') else: #this part is for playing video that needs to be resolved first. (youtube_dl) #I could not get this to work --> #Attempt to use invalid handle -1 #I think you can't setresolvedUrl a listitem from a custom gui #url_for_DirectoryItem=DirectoryItem_url liz.setProperty('item_type','script') else: #sys.argv[0]+"?url="+ urllib.quote_plus(d['DirectoryItem_url']) +"&mode=viewImage" #with xbmc's standard gui, we need to specify to call the plugin to open the gui that shows image #log('***'+'isFolder:' + repr(isFolder)+ ' IsPlayable:'+repr(setProperty_IsPlayable) +'**[diu]:'+ DirectoryItem_url) liz.setProperty('IsPlayable',setProperty_IsPlayable) url_for_DirectoryItem=DirectoryItem_url liz.setInfo( type='video', infoLabels=d['infoLabels'] ) #this tricks the skin to show the plot. where we stored the picture descriptions liz.setArt({"thumb": ti,'icon': ti, "poster":media_url, "banner":media_url, "fanart":media_url, "landscape":media_url }) directory_items.append( (url_for_DirectoryItem, liz, isFolder) ) if using_custom_gui: from guis import cGUI li=[] for di in directory_items: li.append( di[1] ) ui = cGUI('view_450_slideshow.xml' , addon_path, defaultSkin='Default', defaultRes='1080i', listing=li, id=53) ui.include_parent_directory_entry=False ui.doModal() del ui else: if album_viewMode!='0': xbmc.executebuiltin('Container.SetViewMode('+album_viewMode+')') xbmcplugin.addDirectoryItems(handle=pluginhandle, items=directory_items ) xbmcplugin.endOfDirectory(pluginhandle)
from default import addon, addon_path, addonID from utils import log, translation from reddit import reddit_request from domains import sitesBase, parse_reddit_link from actions import listAlbum from utils import unescape, post_excluded_from, remove_duplicates, remove_dict_duplicates import threading from Queue import Queue ADDON_NAME = addonID #addon.getAddonInfo('name') <--changed to id ADDON_PATH = addon_path #addon.getAddonInfo('path') random_post_order = addon.getSetting("random_post_order") == "true" random_image_order= addon.getSetting("random_image_order") == "true" q=Queue() def slideshowAlbum(dictlist, name): log("slideshowAlbum") #introduce a duplicate # dictlist.append( {'li_label': 'aaa1', # 'li_label2': 'descrip', # 'DirectoryItem_url': 'http://i.imgur.com/K5uhHZF.jpg', # 'li_thumbnailImage': 'media_thumb_url', # 'width': 12, # 'height': 123, # } )
import re import urllib import urlparse from main_listing import GCXM_hasmultipleauthor, GCXM_hasmultiplesubreddit, GCXM_hasmultipledomain, GCXM_actual_url_used_to_generate_these_posts, GCXM_reddit_query_of_this_gui from default import addon from reddit import assemble_reddit_filter_string, subreddit_in_favorites #, this_is_a_user_saved_list from utils import log,translation, colored_subreddit, build_script, truncate cxm_show_html_to_text = addon.getSetting("cxm_show_html_to_text") == "true" cxm_show_open_browser = addon.getSetting("cxm_show_open_browser") == "true" cxm_show_comments = addon.getSetting("cxm_show_comments") == "true" cxm_show_by_author = addon.getSetting("cxm_show_by_author") == "true" cxm_show_by_subreddit = addon.getSetting("cxm_show_by_subreddit") == "true" cxm_show_by_domain = addon.getSetting("cxm_show_by_domain") == "true" cxm_show_autoplay = addon.getSetting("cxm_show_autoplay") == "true" cxm_show_slideshow = addon.getSetting("cxm_show_slideshow") == "true" cxm_show_add_shortcuts = addon.getSetting("cxm_show_add_shortcuts") == "true" #cxm_show_new_from = addon.getSetting("cxm_show_new_from") == "true" cxm_show_filter = addon.getSetting("cxm_show_filter") == "true" cxm_show_search = addon.getSetting("cxm_show_search") == "true" #cxm_show_reddit_save = addon.getSetting("cxm_show_reddit_save") == "true" cxm_show_youtube_items = addon.getSetting("cxm_show_youtube_items") == "true" cxm_show_add_to_favorites = addon.getSetting("cxm_show_add_to_favorites") == "true" def build_context_menu_entries(num_comments,commentsUrl, subreddit, domain, link_url, post_id, post_title, posted_by, onClick_action, thumbnail): s=truncate(subreddit,15) #crop long subreddit names in context menu colored_subreddit_short=colored_subreddit( s )
import xbmc import xbmcgui #import xbmcvfs import sys import shutil, os import re, urllib import pprint import json import urlparse #import inputstream.adaptive from default import subredditsFile, addon, addon_path, profile_path, ytdl_core_path, subredditsPickle,CACHE_FILE from utils import xbmc_busy, log, translation, xbmc_notify from reddit import get_subreddit_entry_info ytdl_quality=addon.getSetting("ytdl_quality") try: ytdl_quality=[0, 1, 2, 3][ int(ytdl_quality) ] except ValueError: ytdl_quality=1 ytdl_DASH=addon.getSetting("ytdl_DASH")=='true' def manage_subreddits(subreddit_entry, name, type_): from main_listing import index log('manage_subreddits(%s, %s, %s)' %(subreddit_entry, name, type_) ) #http://forum.kodi.tv/showthread.php?tid=148568 dialog = xbmcgui.Dialog() #funcs = ( addSubreddit, editSubreddit, removeSubreddit, ) #elected_index = dialog.select(subreddit, ['add new subreddi', 'edit subreddit', 'remove subreddit']) selected_index = dialog.select(subreddit_entry, [translation(32001), translation(32003), translation(32002), translation(32004)]) #the if statements below is not as elegant as autoselecting the func from funcs but more flexible in the case with add subreddit where we should not send a subreddit parameter
def display_album_from(dictlist, album_name): from .domains import parse_reddit_link, build_DirectoryItem_url_based_on_media_type, sitesBase from .utils import build_script directory_items = [] album_viewMode = addon.getSetting("album_viewMode") if album_viewMode == '450': #using custom gui using_custom_gui = True else: using_custom_gui = False #log( repr(dictlist)) for _, d in enumerate(dictlist): ti = d['li_thumbnailImage'] media_url = d.get('DirectoryItem_url') #log(' display_album_from list:'+ media_url + " " ) #There is only 1 textbox for Title and description in our custom gui. # I don't know how to achieve this in the xml file so it is done here: # combine title and description without [CR] if label is empty. [B]$INFO[Container(53).ListItem.Label][/B][CR]$INFO[Container(53).ListItem.Plot] # new note: this is how it is done: # $INFO[Container(53).ListItem.Label,[B],[/B][CR]] $INFO[Container(53).ListItem.Plot] #if the infolabel is empty, nothing is printed for that block #combined = '[B]'+ d['li_label2'] + "[/B][CR]" if d['li_label2'] else "" combined = d['infoLabels'].get('plot') if d['infoLabels'].get( 'plot') else "" d['infoLabels']['plot'] = combined liz = xbmcgui.ListItem(label=d.get('li_label'), label2=d.get('li_label2')) #parse the link so that we can determine whether it is image or video. ld = parse_reddit_link(media_url) DirectoryItem_url, setProperty_IsPlayable, isFolder, _ = build_DirectoryItem_url_based_on_media_type( ld, media_url, '', '', script_to_call="") #log('isFolder:' + repr(isFolder)+ ' IsPlayable:'+repr(setProperty_IsPlayable) + ' DirectoryItem_url:' + repr(DirectoryItem_url)) if using_custom_gui: url_for_DirectoryItem = media_url liz.setProperty('onClick_action', DirectoryItem_url) liz.setProperty('is_video', 'true') #if setProperty_IsPlayable=='true': if ld: if ld.link_action == sitesBase.DI_ACTION_PLAYABLE: liz.setProperty('item_type', 'playable') else: #this part is for playing video that needs to be resolved first. (youtube_dl) #I could not get this to work --> #Attempt to use invalid handle -1 #I think you can't setresolvedUrl a listitem from a custom gui #url_for_DirectoryItem=DirectoryItem_url liz.setProperty('item_type', 'script') else: #sys.argv[0]+"?url="+ urllib.quote_plus(d['DirectoryItem_url']) +"&mode=viewImage" #with xbmc's standard gui, we need to specify to call the plugin to open the gui that shows image #log('***'+'isFolder:' + repr(isFolder)+ ' IsPlayable:'+repr(setProperty_IsPlayable) +'**[diu]:'+ DirectoryItem_url) liz.setProperty('IsPlayable', setProperty_IsPlayable) url_for_DirectoryItem = DirectoryItem_url liz.setInfo( type='video', infoLabels=d['infoLabels'] ) #this tricks the skin to show the plot. where we stored the picture descriptions liz.setArt({ "thumb": ti, 'icon': ti, "poster": media_url, "banner": media_url, "fanart": media_url, "landscape": media_url }) directory_items.append((url_for_DirectoryItem, liz, isFolder)) if using_custom_gui: from .guis import cGUI li = [] for di in directory_items: li.append(di[1]) ui = cGUI('view_450_slideshow.xml', addon_path, defaultSkin='Default', defaultRes='1080i', listing=li, id=53) ui.include_parent_directory_entry = False ui.doModal() del ui else: if album_viewMode != '0': xbmc.executebuiltin('Container.SetViewMode(' + album_viewMode + ')') xbmcplugin.addDirectoryItems(handle=pluginhandle, items=directory_items) xbmcplugin.endOfDirectory(pluginhandle)
# -*- coding: utf-8 -*- import xbmc import xbmcgui import xbmcaddon import urllib import json import threading import re from Queue import Queue import os, sys from default import addon, addon_path, itemsPerPage, urlMain, subredditsFile, int_CommentTreshold from utils import xbmc_busy, log, translation default_frontpage = addon.getSetting("default_frontpage") no_index_page = addon.getSetting("no_index_page") == "true" main_gui_skin = addon.getSetting("main_gui_skin") def index(url, name, type_): ## this is where the __main screen is created from guis import indexGui from reddit import assemble_reddit_filter_string, create_default_subreddits if not os.path.exists(subredditsFile): create_default_subreddits() if no_index_page: log(" default_frontpage " + default_frontpage)
from default import addon, addon_path, addonID from utils import log, translation from reddit import reddit_request from domains import sitesBase, parse_reddit_link from actions import listAlbum from utils import unescape, remove_dict_duplicates import threading from Queue import Queue ADDON_NAME = addonID #addon.getAddonInfo('name') <--changed to id ADDON_PATH = addon_path #addon.getAddonInfo('path') random_post_order = addon.getSetting("random_post_order") == "true" random_image_order = addon.getSetting("random_image_order") == "true" q = Queue() def slideshowAlbum(dictlist, name): log("slideshowAlbum") #introduce a duplicate # dictlist.append( {'li_label': 'aaa1', # 'li_label2': 'descrip', # 'DirectoryItem_url': 'http://i.imgur.com/K5uhHZF.jpg', # 'li_thumbnailImage': 'media_thumb_url', # 'width': 12, # 'height': 123,
def reddit_get_refresh_token(url, name, type_): #this function gets a refresh_token from reddit and keep it in our addon. this refresh_token is used to get 1-hour access tokens. # getting a refresh_token is a one-time step #1st: use any webbrowser to # https://www.reddit.com/api/v1/authorize?client_id=hXEx62LGqxLj8w&response_type=code&state=RS&redirect_uri=http://localhost:8090/&duration=permanent&scope=read,mysubreddits #2nd: click allow and copy the code provided after reddit redirects the user # save this code in add-on settings. A one-time use code that may be exchanged for a bearer token. code = addon.getSetting("reddit_code") #log(" user refresh token:"+reddit_refresh_token) #log(" user code:"+code) if reddit_refresh_token and code: #log(" user already have refresh token:"+reddit_refresh_token) dialog = xbmcgui.Dialog() if dialog.yesno(translation(30411), translation(30412), translation(30413), translation(30414)): pass else: return try: log("Requesting a reddit permanent token with code=" + code) req = urllib2.Request('https://www.reddit.com/api/v1/access_token') #http://stackoverflow.com/questions/6348499/making-a-post-call-instead-of-get-using-urllib2 data = urllib.urlencode({ 'grant_type': 'authorization_code', 'code': code #'woX9CDSuw7XBg1MiDUnTXXQd0e4' , 'redirect_uri': reddit_redirect_uri }) #http://localhost:8090/ #http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem import base64 base64string = base64.encodestring( '%s:%s' % (reddit_clientID, '')).replace('\n', '') req.add_header('Authorization', "Basic %s" % base64string) req.add_header('User-Agent', reddit_userAgent) page = urllib2.urlopen(req, data=data) response = page.read() page.close() log(response) status = reddit_set_addon_setting_from_response(response) if status == 'ok': r1 = "Click 'OK' when done" r2 = "Settings will not be saved" xbmc.executebuiltin("XBMC.Notification(%s, %s)" % (r1, r2)) else: r2 = "Requesting a reddit permanent token" xbmc.executebuiltin("XBMC.Notification(%s, %s)" % (status, r2)) # This is a 2nd option reddit oauth. user needs to request access token every hour # #user enters this on their webbrowser. note that there is no duration=permanent response_type=token instead of code # request_url='https://www.reddit.com/api/v1/authorize?client_id=hXEx62LGqxLj8w&response_type=token&state=RS&redirect_uri=http://localhost:8090/&scope=read,identity' # #click on "Allow" # #copy the redirect url code #enters it on settings. e.g.: LVQu8vitbEXfMPcK1sGlVVQZEpM # # #u='https://oauth.reddit.com/new.json' # u='https://oauth.reddit.com//api/v1/me.json' # # req = urllib2.Request(u) # #req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14') # req.add_header('User-Agent', reddit_userAgent) # req.add_header('Authorization','bearer LVQu8vitbEXfMPcK1sGlVVQZEpM') # page = read,identity.urlopen(req) # response=page.read();page.close() except urllib2.HTTPError, err: xbmc_notify(err.code, err.msg)
def autoSlideshow(url, name, type_): log('starting slideshow '+ url) ev=threading.Event() entries = [] preview_w=0 preview_h=0 image='' content = reddit_request(url) if not content: return content = json.loads(content) log("slideshow %s:Parsing %d items: %s" %( type_, len(content['data']['children']), 'random' if random_post_order else 'normal order' ) ) data_children = content['data']['children'] if random_post_order: random.shuffle(data_children) for j_entry in data_children: try: title = unescape(j_entry['data']['title'].encode('utf-8')) log(" TITLE:%s [r/%s]" %( title, j_entry.get('data').get('subreddit') ) ) try: description = unescape(j_entry['data']['media']['oembed']['description'].encode('utf-8')) except: description = '' try: post_selftext=unescape(j_entry['data']['selftext'].encode('utf-8')) except: post_selftext='' description=post_selftext+'[CR]'+description if post_selftext else description try: media_url = j_entry['data']['url'] except: media_url = j_entry['data']['media']['oembed']['url'] try: preview=j_entry['data']['preview']['images'][0]['source']['url'].encode('utf-8').replace('&','&') try: preview_h = float( j_entry['data']['preview']['images'][0]['source']['height'] ) preview_w = float( j_entry['data']['preview']['images'][0]['source']['width'] ) except: preview_w=0 preview_h=0 except Exception as e: preview="" ld=parse_reddit_link(link_url=media_url, assume_is_video=False, needs_preview=True, get_playable_url=True ) if ld: if not preview: preview = ld.poster if (addon.getSetting('include_albums')=='true') and (ld.media_type==sitesBase.TYPE_ALBUM) : dictlist = listAlbum( media_url, title, 'return_dictlist') for d in dictlist: t2=d.get('li_label') if d.get('li_label') else title d['li_label']=t2 entries.append( d ) else: if addon.getSetting('use_reddit_preview')=='true': if preview: image=preview elif ld.poster: image=ld.poster else: if ld.poster: image=ld.poster #entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) elif preview: image=preview #entries.append([title,preview,preview_w, preview_h,len(entries)]) append_entry( entries, title,image,preview_w, preview_h, description ) else: append_entry( entries, title,preview,preview_w, preview_h, description ) except Exception as e: log( ' autoPlay exception:' + str(e) ) entries = remove_dict_duplicates( entries, 'DirectoryItem_url') for i, e in enumerate(entries): log(' possible playable items({0}) {1}...{2}x{3} {4}'.format( i, e['li_label'].ljust(15)[:15], repr(e.get('width')),repr(e.get('height')), e.get('DirectoryItem_url')) ) if len(entries)==0: log(' Play All: no playable items' ) xbmc.executebuiltin('XBMC.Notification("%s","%s")' %(translation(32054), translation(32055) ) ) #Play All No playable items return log("**********playing slideshow*************") for e in entries: q.put(e) s= ScreensaverManager(ev,q) try: s.start_loop() except Exception as e: log(" EXCEPTION slideshowAlbum:="+ str( sys.exc_info()[0]) + " " + str(e) ) return
def autoSlideshow(url, name, type_): log('starting slideshow '+ url) ev=threading.Event() entries = [] #watchdog_counter=0 preview_w=0 preview_h=0 image='' #content = opener.open(url).read() content = reddit_request(url) if not content: return #log( str(content) ) #content = json.loads(content.replace('\\"', '\'')) content = json.loads(content) log("slideshow %s:Parsing %d items: %s" %( type_, len(content['data']['children']), 'random' if random_post_order else 'normal order' ) ) data_children = content['data']['children'] if random_post_order: random.shuffle(data_children) for j_entry in data_children: try: title = unescape(j_entry['data']['title'].encode('utf-8')) log(" TITLE:%s [r/%s]" %( title, j_entry.get('data').get('subreddit') ) ) try: description = unescape(j_entry['data']['media']['oembed']['description'].encode('utf-8')) except: description = '' #log(' description [%s]' %description) try: post_selftext=unescape(j_entry['data']['selftext'].encode('utf-8')) except: post_selftext='' #log(' post_selftext[%s]' %post_selftext) description=post_selftext+'[CR]'+description if post_selftext else description try: media_url = j_entry['data']['url'] except: media_url = j_entry['data']['media']['oembed']['url'] try: preview=j_entry['data']['preview']['images'][0]['source']['url'].encode('utf-8').replace('&','&') try: preview_h = float( j_entry['data']['preview']['images'][0]['source']['height'] ) preview_w = float( j_entry['data']['preview']['images'][0]['source']['width'] ) except: preview_w=0 preview_h=0 except Exception as e: #log(" getting preview image EXCEPTION:="+ str( sys.exc_info()[0]) + " " + str(e) ) preview="" ld=parse_reddit_link(link_url=media_url, assume_is_video=False, needs_preview=True, get_playable_url=True ) if ld: if not preview: preview = ld.poster if (addon.getSetting('include_albums')=='true') and (ld.media_type==sitesBase.TYPE_ALBUM) : dictlist = listAlbum( media_url, title, 'return_dictlist') for d in dictlist: #log(' (S) adding items from album ' + title +' ' + d.get('DirectoryItem_url') ) t2=d.get('li_label') if d.get('li_label') else title #entries.append([ t2, d.get('DirectoryItem_url'), d.get('width'), d.get('height'), len(entries)]) d['li_label']=t2 entries.append( d ) #title='' #only put the title in once. else: if addon.getSetting('use_reddit_preview')=='true': if preview: image=preview elif ld.poster: image=ld.poster #if preview: entries.append([title,preview,preview_w, preview_h,len(entries)]) #log(' (N)added preview:%s %s' %( title,preview) ) #elif ld.poster: entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) #log(' (N)added poster:%s %s' % ( title,ld.poster) ) else: if ld.poster: image=ld.poster #entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) elif preview: image=preview #entries.append([title,preview,preview_w, preview_h,len(entries)]) #if ld.poster: entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) #elif preview: entries.append([title,preview,preview_w, preview_h,len(entries)]) append_entry( entries, title,image,preview_w, preview_h, description ) else: append_entry( entries, title,preview,preview_w, preview_h, description ) #log(' (N)added preview:%s' % title ) except Exception as e: log( ' autoPlay exception:' + str(e) ) #log( repr(entries)) entries = remove_dict_duplicates( entries, 'DirectoryItem_url') # #for i,e in enumerate(entries): log(' e1-%d %s' %(i, e[1]) ) # def k2(x): return x[1] # entries=remove_duplicates(entries, k2) # #for i,e in enumerate(entries): log(' e2-%d %s' %(i, e[1]) ) for i, e in enumerate(entries): log(' possible playable items({0}) {1}...{2}x{3} {4}'.format( i, e['li_label'].ljust(15)[:15], repr(e.get('width')),repr(e.get('height')), e.get('DirectoryItem_url')) ) if len(entries)==0: log(' Play All: no playable items' ) xbmc.executebuiltin('XBMC.Notification("%s","%s")' %(translation(32054), translation(32055) ) ) #Play All No playable items return #if type.endswith("_RANDOM"): # random.shuffle(entries) #for title, url in entries: # log(" added to playlist:"+ title + " " + url ) log("**********playing slideshow*************") for e in entries: q.put(e) #s= HorizontalSlideScreensaver(ev,q) s= ScreensaverManager(ev,q) try: s.start_loop() except Exception as e: log(" EXCEPTION slideshowAlbum:="+ str( sys.exc_info()[0]) + " " + str(e) ) return
# -*- coding: utf-8 -*- import xbmc import xbmcgui import xbmcaddon import urllib, urlparse import json import threading import re from Queue import Queue from collections import defaultdict import os,sys from default import addon, addon_path, itemsPerPage, urlMain, subredditsFile, subredditsPickle, int_CommentTreshold,addonUserDataFolder,CACHE_FILE from utils import xbmc_busy, log, translation, post_excluded_from use_requests_cache = addon.getSetting("use_requests_cache") == "true" default_frontpage = addon.getSetting("default_frontpage") no_index_page = addon.getSetting("no_index_page") == "true" main_gui_skin = addon.getSetting("main_gui_skin") anti_dos_delay = addon.getSetting("anti_dos_delay") try:anti_dos_delay=int(anti_dos_delay) except ValueError:anti_dos_delay=100 use_first_link_in_textpost_for_the_following_subreddits=addon.getSetting("use_first_link_in_textpost_for_the_following_subreddits") if use_requests_cache: import requests_cache requests_cache.install_cache(CACHE_FILE, backend='sqlite', expire_after=86400 ) #cache expires after: 86400=1day 604800=7 days sites_that_will_ban_if_excessive_connections=['pornhub','youporn'] domains_d=defaultdict(int) #anti_dos_delay used in count_links_from_same_domain() to keep track of the domains in a subreddit listing domains_exempt_from_anti_dos_delay=['youtube','youtu.be','imgur.com','redd.it','gfycat.com'] #checked in compute_anti_dos_delay()
import xbmcgui import xbmcplugin import urllib, urlparse import json import threading import re from Queue import Queue import os, sys from default import addon, addon_path, itemsPerPage, urlMain, subredditsFile, int_CommentTreshold from default import pluginhandle, WINDOW, forceViewMode, viewMode, comments_viewMode, album_viewMode, autoplayAll, autoplayUnwatched, TitleAddtlInfo, DoNotResolveLinks from utils import xbmc_busy, log, translation, addDir, addDirR from reddit import reddit_request default_frontpage = addon.getSetting("default_frontpage") no_index_page = addon.getSetting("no_index_page") == "true" main_gui_skin = addon.getSetting("main_gui_skin") cxm_show_comment_link = addon.getSetting("cxm_show_comment_link") == "true" cxm_show_comments = addon.getSetting("cxm_show_comments") == "true" cxm_show_go_to = addon.getSetting("cxm_show_go_to") == "true" cxm_show_new_from = addon.getSetting("cxm_show_new_from") == "true" cxm_show_add_shortcuts = addon.getSetting("cxm_show_add_shortcuts") == "true" cxm_show_filter_subreddit = addon.getSetting( "cxm_show_filter_subreddit") == "true" cxm_show_filter_domain = addon.getSetting("cxm_show_filter_domain") == "true" cxm_show_open_browser = addon.getSetting("cxm_show_open_browser") == "true" cxm_show_reddit_save = addon.getSetting("cxm_show_reddit_save") == "true" cxm_show_youtube_items = addon.getSetting("cxm_show_youtube_items") == "true"
def autoSlideshow(url, name, type_): log('starting slideshow ' + url) ev = threading.Event() entries = [] preview_w = 0 preview_h = 0 image = '' content = reddit_request(url) if not content: return content = json.loads(content) log("slideshow %s:Parsing %d items: %s" % (type_, len(content['data']['children']), 'random' if random_post_order else 'normal order')) data_children = content['data']['children'] if random_post_order: random.shuffle(data_children) for j_entry in data_children: try: title = unescape(j_entry['data']['title'].encode('utf-8')) log(" TITLE:%s [r/%s]" % (title, j_entry.get('data').get('subreddit'))) try: description = unescape(j_entry['data']['media']['oembed'] ['description'].encode('utf-8')) except: description = '' try: post_selftext = unescape( j_entry['data']['selftext'].encode('utf-8')) except: post_selftext = '' description = post_selftext + '[CR]' + description if post_selftext else description try: media_url = j_entry['data']['url'] except: media_url = j_entry['data']['media']['oembed']['url'] try: preview = j_entry['data']['preview']['images'][0]['source'][ 'url'].encode('utf-8').replace('&', '&') try: preview_h = float(j_entry['data']['preview']['images'][0] ['source']['height']) preview_w = float(j_entry['data']['preview']['images'][0] ['source']['width']) except: preview_w = 0 preview_h = 0 except Exception as e: preview = "" ld = parse_reddit_link(link_url=media_url, assume_is_video=False, needs_preview=True, get_playable_url=True) if ld: if not preview: preview = ld.poster if (addon.getSetting('include_albums') == 'true') and (ld.media_type == sitesBase.TYPE_ALBUM): dictlist = listAlbum(media_url, title, 'return_dictlist') for d in dictlist: t2 = d.get('li_label') if d.get('li_label') else title d['li_label'] = t2 entries.append(d) else: if addon.getSetting('use_reddit_preview') == 'true': if preview: image = preview elif ld.poster: image = ld.poster else: if ld.poster: image = ld.poster #entries.append([title,ld.poster,preview_w, preview_h,len(entries)]) elif preview: image = preview #entries.append([title,preview,preview_w, preview_h,len(entries)]) append_entry(entries, title, image, preview_w, preview_h, description) else: append_entry(entries, title, preview, preview_w, preview_h, description) except Exception as e: log(' autoPlay exception:' + str(e)) entries = remove_dict_duplicates(entries, 'DirectoryItem_url') for i, e in enumerate(entries): log(' possible playable items({0}) {1}...{2}x{3} {4}'.format( i, e['li_label'].ljust(15)[:15], repr(e.get('width')), repr(e.get('height')), e.get('DirectoryItem_url'))) if len(entries) == 0: log(' Play All: no playable items') xbmc.executebuiltin( 'XBMC.Notification("%s","%s")' % (translation(32054), translation(32055))) #Play All No playable items return log("**********playing slideshow*************") for e in entries: q.put(e) s = ScreensaverManager(ev, q) try: s.start_loop() except Exception as e: log(" EXCEPTION slideshowAlbum:=" + str(sys.exc_info()[0]) + " " + str(e)) return