Example #1
0
def Scrape_Sites(list_type):
    """
This is just a very rough example showing how simple it is to make use of the NaN Scrapers module.
We send through details of what we want to find and NaN Scrapers will search multiple websites for this content.
    """
    content = ''
    if list_type == 'movie_dialog':
        content = nanscrapers.scrape_movie_with_dialog(title='Trainspotting', year='1996', imdb='tt0117951', host=None, include_disabled=False, timeout=30)
    elif list_type == 'episode_dialog':
        content = nanscrapers.scrape_episode_with_dialog(title='Fraggle Rock', show_year='1983', year='1985', season='3', episode='4', imdb='tt0085017', tvdb=None, host=None, include_disabled=False, timeout=30)
    elif list_type == 'song_dialog':
        content = nanscrapers.scrape_song_with_dialog(title='Fools Gold', artist='Stone Roses', host=None, include_disabled=False, timeout=30)

# If the item returned is a dictionary that's great we know we have a list to work with
    if koding.Data_Type(content) == 'dict':
        xbmc.log(repr(content),2)
        playback = koding.Play_Video(video=content["url"], showbusy=True)
 
# It may be a plugin or direct url has been sent through, if so lets use the list_type variable
    elif not list_type.endswith('_dialog'):
        playback = koding.Play_Video(video=list_type, showbusy=True)

# Nothing useful has been found, lets exit back to the list
    else:
        return

# If the playback returned as True then it was successful but if it was False we know we need to try again for another source
    if not playback:
        if dialog.yesno('PLAYBACK FAILED','The video may have been removed, the web host may have altered their code or this video may not be available in your region. [COLOR=dodgerblue]Would you like to try another source?[/COLOR]'):
            Scrape_Sites(list_type)
Example #2
0
def Scrape_Sites(list_type):
    """
This is a dummy function, you would add whatever code you require in here for grabbing the content.
Please do not use this function for scraping copyright infringing content. If you need a site to test with
archive.org has a good library of public domain music and video files.
    """
    content = ''
    if list_type == 'movie_dialog':
        dolog('Add your code to scrape for a movie')
    elif list_type == 'episode_dialog':
        dolog('Add your code to scrape for a tv show')
    elif list_type == 'song_dialog':
        dolog('Add your code to scrape for a song')

# If the item returned is a dictionary that's great we know we have a list to work with
    if koding.Data_Type(content) == 'dict':
        xbmc.log(repr(content),2)
        playback = koding.Play_Video(video=content["url"], showbusy=True)
 
# It may be a plugin or direct url has been sent through, if so lets use the list_type variable
    elif not list_type.endswith('_dialog'):
        playback = koding.Play_Video(video=list_type, showbusy=True)

# Nothing useful has been found, lets exit back to the list
    else:
        return

# If the playback returned as True then it was successful but if it was False we know we need to try again for another source
    if not playback:
        if dialog.yesno('PLAYBACK FAILED','The video may have been removed, the web host may have altered their code or this video may not be available in your region. [COLOR=dodgerblue]Would you like to try another source?[/COLOR]'):
            Scrape_Sites(list_type)
Example #3
0
def get_swiftstreamz_play(url):
    url = url.replace('swiftplay/', '')  # Strip our category tag off.
    tmp = url.split('/', 1)
    title = tmp[0]
    url = tmp[1]
    try:
        repair = False
        response = requests.get(
            base_dta_url,
            headers={'Authorization': 'Basic U3dpZnRTdHJlYW16OkBTd2lmdFN0cmVhbXpA', 'User-Agent': User_Agent})
        data = response.json(strict=False)

        if data['DATA'][0]['HelloUrl'] in url \
                or data['DATA'][0]['HelloUrl1'] in url:
            auth_url = data['DATA'][0]['HelloLogin']
            auth_auth = tuple(data['DATA'][0]['PasswordHello'].split(':'))
        elif data['DATA'][0]['LiveTvUrl'] in url:
            auth_url = data['DATA'][0]['LiveTvLogin']
            auth_auth = tuple(data['DATA'][0]['PasswordLiveTv'].split(':'))
            repair = True
        elif data['DATA'][0]['nexgtvUrl'] in url:
            auth_url = data['DATA'][0]['nexgtvToken']
            auth_auth = tuple(data['DATA'][0]['nexgtvPass'].split(':'))
        else:
            auth_url = data['DATA'][0]['loginUrl']
            auth_auth = tuple(data['DATA'][0]['Password'].split(':'))
            repair = True

        r = requests.get(auth_url, headers={'User-Agent': User_Agent}, auth=auth_auth, timeout=10)
        auth_token = r.text.partition('=')[2]

        if repair:
            auth_token = ''.join(
                [auth_token[: -59],
                 auth_token[-58: -47],
                 auth_token[-46: -35],
                 auth_token[-34: -23],
                 auth_token[-22: -11],
                 auth_token[-10:]])

        if 'playlist.m3u8' in url or '.2ts' in url:
            url = url + '?wmsAuthSign=' + auth_token + '|User-Agent=123456'
            item = xbmcgui.ListItem(label=title, path=url, iconImage=addon_icon, thumbnailImage=addon_icon)
            item.setInfo(type="Video", infoLabels={"Title": title})
            import resolveurl
            koding.Play_Video(url, showbusy=False, ignore_dp=True, item=item, resolver=resolveurl)
            # xbmc.executebuiltin("PlayMedia(%s)" % url)
        else:
            url = url + '|User-Agent=123456'
            item = xbmcgui.ListItem(label=title, path=url, iconImage=addon_icon, thumbnailImage=addon_icon)
            item.setInfo(type="Video", infoLabels={"Title": title})
            import resolveurl
            koding.Play_Video(url, showbusy=False, ignore_dp=True, item=item, resolver=resolveurl)
            # xbmc.executebuiltin("PlayMedia(%s)" % url)
    except Exception:
        xbmcgui.Dialog().ok('Stream', 'Unable to play stream')
Example #4
0
def get_pbepisode(url):
    xml = ""
    url = url.replace('pbepisode/', '')  # Strip our episode tag off.

    try:
        html = requests.get(url).content
        ep_icon = re.compile('property="og:image" content="(.*?)"',
                             re.DOTALL).findall(html)[0]
        ep_title = re.compile('property="og:title" content="(.*?)"',
                              re.DOTALL).findall(html)[0]
        ep_title = refreshtitle(ep_title)
        url = dom_parser.parseDOM(html,
                                  'a',
                                  attrs={'class': 'btn btn-mini btn-primary'},
                                  ret='href')[0]
        if not 'mp3' in url:
            url = re.compile('file: "(.*?)"', re.DOTALL).findall(html)[0]
        item = xbmcgui.ListItem(label=ep_title,
                                path=url,
                                iconImage=ep_icon,
                                thumbnailImage=ep_icon)
        item.setInfo(type="Video", infoLabels={"Title": ep_title})
        import resolveurl
        koding.Play_Video(url,
                          showbusy=False,
                          ignore_dp=True,
                          item=item,
                          resolver=resolveurl)
    except:
        pass
Example #5
0
def get_pbepisode(url):
    xml = ""
    url = url.replace('pbepisode/', '')  # Strip our episode tag off.

    try:
        html = requests.get(url).content
        ep_icon = dom_parser.parseDOM(html,
                                      'meta',
                                      attrs={'property': 'og:image'},
                                      ret='content')[0]
        ep_title = dom_parser.parseDOM(html,
                                       'meta',
                                       attrs={'property': 'og:title'},
                                       ret='content')[0].encode(
                                           'utf-8', 'ignore').decode('utf-8')
        url = dom_parser.parseDOM(html,
                                  'a',
                                  attrs={'class': 'btn btn-mini btn-primary'},
                                  ret='href')[0]
        item = xbmcgui.ListItem(label=ep_title,
                                path=url,
                                iconImage=ep_icon,
                                thumbnailImage=ep_icon)
        item.setInfo(type="Video", infoLabels={"Title": ep_title})
        import resolveurl
        koding.Play_Video(url,
                          showbusy=False,
                          ignore_dp=True,
                          item=item,
                          resolver=resolveurl)
    except:
        pass
Example #6
0
def metalliq_play(args):
    run        = 0
    windowopen = 0
    dixie.log('### metalliq play args: %s' % args)
    channel, repository, plugin, playertype, channel_orig, itemname = args.split('|')
    dixie.log('### %s' % channel)
    dixie.log('### %s' % repository)
    dixie.log('### %s' % plugin)
    dixie.log('### %s' % playertype)

# Check if add-on is installed
    try:
        addonid         = xbmcaddon.Addon(id=plugin)
        addonname       = addonid.getAddonInfo('name')
# If not then install the relevant addon
    except:
        koding.Addon_Install(addon_id=addonid,confirm=True,silent=0,repo_install=0)
# Update enabled metalliq players
        xbmc.executebuiltin('RunPlugin(plugin://plugin.video.metalliq/settings/channelers)')

    updateicon      = Addon_Info('icon')
    xbmc.executebuiltin("XBMC.Notification(Please Wait...,Searching for  [COLOR=dodgerblue]"+channel+"[/COLOR] ,5000,"+updateicon+")")
    my_playback     = koding.Play_Video('plugin://plugin.video.metalliq/live_guide/%s/None/en/%s' % (channel, playertype))
    if not my_playback:
        if dialog.yesno('Edit Search Term?','Would you like to edit the channel name? It may be this add-on has a slightly different spelling of [COLOR=dodgerblue]%s[/COLOR]' % channel):
            Edit_Search(channel, repository, plugin, playertype, channel_orig, itemname)
        else:
            Edit_SF_Name('bad', playertype, channel_orig, itemname)
    else:
        Edit_SF_Name('good', playertype, channel_orig, itemname)
Example #7
0
def fxxx_play(url):
    try:
        progress_dialog = xbmcgui.DialogProgress()
        progress_dialog.create(
            "Finding Streams",
            "Get your tissues ready while we find the movie....")
        progress = 0
        headers = {'User_Agent': User_Agent}
        vid_html = requests.get(url, headers=headers).content
        the_item = dom_parser.parseDOM(vid_html,
                                       'div',
                                       attrs={'class': 'entry-content'})[0]
        progress += 10
        progress_dialog.update(progress)
        streams = re.compile('href="(.+?)"', re.DOTALL).findall(str(the_item))
        try:
            title = re.compile('<em>(.+?)</em>',
                               re.DOTALL).findall(str(the_item))[0]
        except:
            title = re.compile('property="og:title" content="(.+?)"',
                               re.DOTALL).findall(str(vid_html))[0]
        progress += 10
        progress_dialog.update(progress)
        names = []
        sources = []
        for stream in streams:
            progress += 5
            progress_dialog.update(progress)
            if 'securely.link' in stream:
                response = requests.get(stream)
                stream = response.url
            elif any(x in stream for x in ignore_items):
                continue
            if 'openload' in stream:
                names.append('Openload')
                sources.append(stream)
            elif 'streamango' in stream:
                names.append('Streamango')
                sources.append(stream)

        progress_dialog.close()
        selected = xbmcgui.Dialog().select(
            '[COLORlime]4QED XXX[/COLOR] - Get the tissues ready!', names)
        if selected == -1:
            return

        item = xbmcgui.ListItem(label=title,
                                path=sources[selected],
                                iconImage=addon_icon,
                                thumbnailImage=addon_icon)
        item.setInfo(type="Video", infoLabels={"Title": title})
        import resolveurl
        koding.Play_Video(sources[selected],
                          showbusy=False,
                          ignore_dp=True,
                          item=item,
                          resolver=resolveurl)
    except:
        return
Example #8
0
def play_PlayMTorture(url):
    try:
        url = url.replace('play/','').split('|')
        link = url[0]
        title = url[1]

        item = xbmcgui.ListItem(label=title, path=link, iconImage=addon_icon, thumbnailImage=addon_icon)
        item.setInfo( type="Video", infoLabels={ "Title": title } )
        import resolveurl
        koding.Play_Video(link,showbusy=False,ignore_dp=True,item=item,resolver=resolveurl)
    except:
        xbmcgui.Dialog().ok('Stream', 'Unable to play stream')
Example #9
0
def play_MOPEpisode(url):
    try:
        html = requests.get(url,headers).content
        link = re.compile('a href="(.+?).mp3"').findall(html)[0] + '.mp3'
        title = re.compile('property="og:title" content="(.+?)"').findall(html)[0]

        item = xbmcgui.ListItem(label=title, path=link, iconImage=addon_icon, thumbnailImage=addon_icon)
        item.setInfo( type="Audio", infoLabels={ "Title": title } )
        import resolveurl
        koding.Play_Video(link,showbusy=False,ignore_dp=True,item=item,resolver=resolveurl)
    except:
        failure = traceback.format_exc()
        xbmcgui.Dialog().textviewer('Item Exception',str(failure))
        xbmcgui.Dialog().ok('Stream', 'Unable to play stream')
Example #10
0
def get_pcoepisode(url):
    xml = ""
    url = url.replace('pcoepisode/', '') # Strip our episode tag off.

    try:
        html = requests.get(url).content
        episode_item = dom_parser.parseDOM(html, 'div', attrs={'class': 'media-player'})[0]
        episode_item2 = dom_parser.parseDOM(html, 'div', attrs={'class': 'letestepi'})[0]
        ep_icon = dom_parser.parseDOM(episode_item2, 'img', attrs={'class': 'img-responsive'}, ret='src')[0]
        ep_title = dom_parser.parseDOM(html, 'title')[0].replace('PodcastOne: ','')
        play_url = re.compile('href="(.+?)"',re.DOTALL).findall(episode_item)[0].replace("\n","").replace('/downloadsecurity?url=', '')
        url = pcoplay_link % play_url
        item = xbmcgui.ListItem(label=ep_title, path=url, iconImage=ep_icon, thumbnailImage=ep_icon)
        item.setInfo( type="Video", infoLabels={ "Title": ep_title } )
        import resolveurl
        koding.Play_Video(url,showbusy=False,ignore_dp=True,item=item,resolver=resolveurl)
    except:
        pass
Example #11
0
def play_MOPEpisode(url):
    try:
        html = requests.get(url, headers).content
        link = re.compile('a href="(.+?).mp3"').findall(html)[0] + '.mp3'
        title = re.compile('h1 class="entry-title">(.+?)</h1>').findall(
            html)[0]

        title = remove_non_ascii(replaceHTMLCodes(title)).replace(
            'Massively OP Podcast', '')

        item = xbmcgui.ListItem(label=title,
                                path=link,
                                iconImage=addon_icon,
                                thumbnailImage=addon_icon)
        item.setInfo(type="Audio", infoLabels={"Title": title})
        import resolveurl
        koding.Play_Video(link,
                          showbusy=False,
                          ignore_dp=True,
                          item=item,
                          resolver=resolveurl)
    except Exception:
        xbmcgui.Dialog().ok('Stream', 'Unable to play stream')
Example #12
0
def get_sources(item):
    """
    get video_link and try to play it
    Keyword Arguments:
    item -- JenItem to try playing
    """
    result = run_hook("get_sources", item)
    if result:
        return
    if item.startswith("<plugin>"):
        # link to plugin
        link = JenItem(item)["link"]
        sublinks = JenItem(link).getAll("sublink")
        if sublinks:
            if len(sublinks) > 1:
                link = choose_quality(link)
            else:
                link = sublinks[0]
        link = link.replace("&amp;", "&")
        xbmc.executebuiltin("Container.update(" + link + ")")
        return
    item = JenItem(item)

    link = item["link"]
    if not link or link.replace("\t", "") == "":
        return
    meta = JenItem(item["meta"])
    title = meta["title"]
    year = meta.get("year", "").split("-")[0].strip()
    imdb = meta.get("imdb", "")
    tvdb = meta.get("tvdb", "")
    season = meta.get("season", "")
    episode = meta.get("episode", "")
    tvshowtitle = meta.get("tvshowtitle", None)
    premiered = meta.get("premiered", "")
    try:
        premiered = premiered.split("-")[0].strip()
    except:
        if len(premiered) == 4:
            pass
        elif not premiered:
            pass
        else:
            koding.dolog("wrong premiered format")
    busy_dialog = xbmcgui.DialogProgress()
    dialog = xbmcgui.Dialog()
    icon = ADDON.getAddonInfo("icon")

    jenplayer = JenPlayer(resume=False)
    try:
        spec = {"identifier": imdb, "season": season or "0", "episode": episode or "0"}
        match = koding.Get_From_Table("watched", spec)
        if match:
            match = match[0]
            if match["currentTime"] and not match["currentTime"] == "0":
                if dialog.yesno(
                    ADDON.getAddonInfo("name"),
                    _("Previous playback detected"),
                    yeslabel=_("Resume"),
                    nolabel=_("Restart"),
                ):
                    jenplayer = JenPlayer(resume=True)
    except:
        pass

    jenplayer.setItem(item)

    busy_dialog.create(xbmcaddon.Addon().getAddonInfo("name"), _("Processing Link"))
    preset = choose_quality(link)
    message = get_searching_message(preset)
    played = False
    infolabels = {}
    if preset:
        preset = preset.replace("&amp;", "&")
        busy_dialog.update(0, message)
        listitem = None
        fetch_meta = ADDON.getSetting("metadata") == "true"
        listitem = xbmcgui.ListItem(
            path=link,
            iconImage=item.get("thumbnail", icon),
            thumbnailImage=item.get("thumbnail", icon),
        )
        infolabels = {}
        if fetch_meta and imdb != "0":  # only try valid items with imdb
            try:
                info, created = get_info([item.item_string])
                if info and type(info) == dict:
                    infolabels = info
            except:
                pass
        else:
            infolabels["title"] = title
            infolabels["name"] = title
        if "plotoutline" not in infolabels:
            infolabels["plotoutline"] = infolabels.get("plot", "")
        if item.get("content", "") == "song":
            listitem.setInfo(
                type="Music",
                infoLabels={
                    "title": meta.get("title", ""),
                    "artist": meta.get("artist", ""),
                },
            )
        else:
            listitem.setInfo(type="video", infoLabels=infolabels)
            listitem.setLabel(item.get("title", item.get("name", "")))

        if "search" in preset:
            exclude_scrapers_content = item.get("exclude_scrapers", "")
            if exclude_scrapers_content:
                exclude_scrapers = exclude_scrapers_content.split(";")
            else:
                exclude_scrapers = None
            # nanscraper link
            if item.get("content", "") == "song":
                artist = item.get("artist", "")
                played = Sources.get_music_sources(
                    title,
                    artist,
                    preset=preset,
                    dialog=busy_dialog,
                    exclude=exclude_scrapers,
                    listitem=listitem,
                    player=jenplayer,
                )
            else:
                played = Sources.get_sources(
                    title,
                    year,
                    imdb,
                    tvdb,
                    season,
                    episode,
                    tvshowtitle,
                    premiered,
                    preset=preset,
                    dialog=busy_dialog,
                    listitem=listitem,
                    exclude=exclude_scrapers,
                    player=jenplayer,
                )
        elif preset.startswith("http") or preset.startswith("plugin") or preset.endswith('.torrent') or preset.startswith('magnet'):
            # direct link
            if "/playlist" in preset and "youtube" in preset:
                busy_dialog.close()
                xbmc.executebuiltin("Container.update(" + preset + ")")
                return
            elif "plugin://plugin.video.youtube/play/?video_id=" in preset:
                xbmc.executebuiltin("PlayMedia(%s)" % preset)
                played = True
            elif item["content"] == "image":
                busy_dialog.close()
                xbmc.executebuiltin("ShowPicture(%s)" % preset)
                played = True
            else:
                played = koding.Play_Video(
                    preset,
                    showbusy=False,
                    ignore_dp=True,
                    item=listitem,
                    player=jenplayer,
                    resolver=resolveurl,
                )      
                
        else:
            # who knows
            busy_dialog.close()
            koding.dolog("unknown link type: " + repr(preset))
            raise Exception()
    busy_dialog.close()
    if played:
        jenplayer.keep_alive()
Example #13
0
def play(url, windowed, name=None):
    handled = False

    getIdle = int(ADDON.getSetting('idle').replace('Never', '0'))
    maxIdle = getIdle * 60 * 60

    dixie.SetSetting('streamURL', url)

    if 'tv/play_by_name_only_guide/' in url or 'movies/play_by_name_guide' in url or 'tv/play_by_name_guide/' in url:
        dixie.removeKepmap()
        xbmc.executebuiltin('XBMC.ActivateWindow(10025,%s)' % url)
        CheckIdle(maxIdle)

    else:
        dixie.loadKepmap()

        if url.startswith('HDTV'):
            import hdtv
            delay = 5
            stream = hdtv.getURL(url)

            if not playAndWait(stream, windowed, maxIdle, delay=delay):
                dixie.SetSetting('LOGIN_HDTV', '2001-01-01 00:00:00')
                stream = hdtv.getURL(url)
                playAndWait(stream, windowed, maxIdle, delay=delay)
            return

        if url.startswith('IPLAY'):
            import iplayer
            stream = iplayer.getURL(url)
            playAndWait(stream, windowed, maxIdle)
            return

        if url.startswith('IPTV:'):
            import iptv
            url = iptv.getURL(url)
            dixie.log(url)
            xbmc.executebuiltin('XBMC.RunPlugin(%s)' % url)
            return

        if url.startswith('UKTV'):
            import uktv
            stream = uktv.getURL(url)
            dixie.log(stream)
            playAndWait(stream, windowed, maxIdle)
            return

        if url.isdigit():
            command = (
                '{"jsonrpc": "2.0", "id":"1", "method": "Player.Open","params":{"item":{"channelid":%s}}}'
                % url)
            xbmc.executeJSONRPC(command)
            return

        if (url.startswith('__SF__')) or (
                'plugin://plugin.program.super.favourites' in url.lower()):
            handled, url = playSF(url)
            if handled:
                return

        if not checkForAlternateStreaming(url):
            my_playback = koding.Play_Video(url)
            if not my_playback:
                if CLEAN_STREAMS == 'true':
                    clean_ini(url)
            koding.Notify(title='PLAYBACK FAILED',
                          message='Please try another link',
                          duration=5000)
def get_sources(item):
    """
    get video_link and try to play it
    Keyword Arguments:
    item -- JenItem to try playing
    """
    if item.startswith("<plugin>"):
        # link to plugin
        link = JenItem(item)["link"]
        sublinks = JenItem(link).getAll("sublink")
        if sublinks:
            if len(sublinks) > 1:
                link = choose_quality(link)
            else:
                link = sublinks[0]
        link = link.replace("&amp;", "&")
        xbmc.executebuiltin('Container.update(' + link + ')')
        return
    item = JenItem(item)

    link = item["link"]
    if not link or link.replace("\t", "") == "":
        return
    meta = JenItem(item["meta"])
    title = meta["title"]
    year = meta["year"].split("-")[0].strip()
    imdb = meta["imdb"]
    tvdb = meta.get("tvdb", "")
    season = meta.get("season", "")
    episode = meta.get("episode", "")
    tvshowtitle = meta.get("tvshowtitle", None)
    premiered = meta.get("premiered", "")
    try:
        premiered = premiered.split("-")[0].strip()
    except:
        if len(premiered) == 4:
            pass
        else:
            xbmc.log("wrong premiered format")
    busy_dialog = xbmcgui.DialogProgress()
    dialog = xbmcgui.Dialog()
    icon = ADDON.getAddonInfo('icon')

    busy_dialog.create(addon_name, "Processing Link")
    preset = choose_quality(link)
    played = False
    infolabels = {}
    if preset:
        preset = preset.replace("&amp;", "&")
        busy_dialog.update(0, "")
        listitem = None
        fetch_meta = ADDON.getSetting("metadata") == "true"
        listitem = xbmcgui.ListItem(path=link,
                                    iconImage=item.get("thumbnail", icon),
                                    thumbnailImage=item.get("thumbnail", icon))

        if fetch_meta and imdb != "0":  # only try valid items with imdb
            infolabels = {}
            try:
                info, created = get_info([item.item_string])
                if info and type(info) == dict:
                    infolabels = info
            except:
                pass
        if "plotoutline" not in infolabels:
            infolabels["plotoutline"] = infolabels.get("plot", "")
        listitem.setInfo(type="video", infoLabels=infolabels)
        listitem.setLabel(item.get("title", item.get("name", "")))
        if "search" in preset:
            exclude_scrapers_content = item.get("exclude_scrapers", "")
            if exclude_scrapers_content:
                exclude_scrapers = exclude_scrapers_content.split(";")
            else:
                exclude_scrapers = None
            # nanscraper link
            played = Sources.get_sources(title,
                                         year,
                                         imdb,
                                         tvdb,
                                         season,
                                         episode,
                                         tvshowtitle,
                                         premiered,
                                         preset=preset,
                                         dialog=busy_dialog,
                                         listitem=listitem,
                                         exclude=exclude_scrapers)
            if not played:
                dialog.notification(addon_name, "no link found", icon, 5)
        elif preset.startswith("http") or preset.startswith("plugin"):
            # direct link
            if "/playlist" in preset:
                busy_dialog.close()
                xbmc.executebuiltin('Container.update(' + preset + ')')
                return
            elif "plugin://plugin.video.youtube/play/?video_id=" in preset:
                xbmc.executebuiltin("PlayMedia(%s)" % preset)
                played = True
            elif item["content"] == "image":
                busy_dialog.close()
                xbmc.executebuiltin("ShowPicture(%s)" % preset)
                played = True
            else:
                played = koding.Play_Video(preset,
                                           showbusy=False,
                                           ignore_dp=True,
                                           item=listitem)
            if not played:
                dialog.notification(addon_name, "no link found", icon, 5)
        else:
            # who knows
            busy_dialog.close()
            xbmc.log("unknown link type: " + repr(preset), xbmc.LOGDEBUG)
            raise Exception()
    busy_dialog.close()
    if played:
        is_playing = True
        while is_playing:
            is_playing = xbmc.Player().isPlaying()
            xbmc.sleep(1000)