Exemple #1
0
    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  ) ]
Exemple #4
0
    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  ) ]
Exemple #5
0
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)
Exemple #7
0
    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 )
Exemple #11
0
# -*- 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:
Exemple #12
0
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)
Exemple #14
0
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
Exemple #15
0
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',
Exemple #16
0
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
Exemple #25
0
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)
Exemple #27
0
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)
Exemple #29
0
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('&amp;','&')
                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('&amp;','&')
                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('&amp;', '&')
                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