예제 #1
0
def download_video(video_id, background=True):
    url = YOUTUBE_VIDEO_URL % video_id
    info = get_video_info(url)
    if info:
        log_utils.log('Downloading: |video| video_id: |%s| Background: |%s|' %
                      (video_id, str(background)))
        _download(info, background)
예제 #2
0
def get_video_id(url):
    result = re.search('video_id=(?P<video_id>.+?)(?:&|$)', url)
    if result:
        log_utils.log('Found video_id: |%s|' % result.group('video_id'))
        return result.group('video_id')
    else:
        log_utils.log('video_id not found', log_utils.LOGERROR)
        return None
예제 #3
0
def get_video_info(url):
    info = YDStreamExtractor.getVideoInfo(url)
    if hasattr(info, '_streams'):
        return info
    else:
        log_utils.log('Stream not available: |%s|' % url, log_utils.LOGERROR)
        kodi.notify(msg=kodi.i18n('stream_not_available'), sound=False)
        return None
예제 #4
0
def get_video_info(url):
    info = YDStreamExtractor.getVideoInfo(url)
    if hasattr(info, '_streams'):
        return info
    else:
        log_utils.log('Stream not available: |%s|' % url, log_utils.LOGERROR)
        kodi.notify(msg=kodi.i18n('stream_not_available'), sound=False)
        return None
예제 #5
0
 def _get(self):
     log_utils.log(
         'M3UUtils._get from_list: |{0!s}|'.format(self.from_list),
         log_utils.LOGDEBUG)
     if self.from_list == 'history':
         return PlayHistory().get()
     else:
         return []
예제 #6
0
def get_video_id(url):
    result = re.search('video_id=(?P<video_id>.+?)(?:&|$)', url)
    if result:
        log_utils.log('Found video_id: |%s|' % result.group('video_id'))
        return result.group('video_id')
    else:
        log_utils.log('video_id not found', log_utils.LOGERROR)
        return None
예제 #7
0
    def export(self, row_id):
        rows = self._get(row_id)
        if rows:
            url, content_type, title, thumb = rows[0]
            play_path = {
                'mode': MODES.PLAY,
                'player': 'false',
                'history': 'false',
                'path': quote(url),
                'thumb': quote(thumb)
            }
            strm = kodi.get_plugin_url(play_path)

            if strm:
                log_utils.log(
                    'STRMUtils.export writing .m3u: |{0!s}|'.format(
                        self.filename), log_utils.LOGDEBUG)
                try:
                    with open(self.filename, 'w+') as f:
                        f.write(strm)
                    log_utils.log('STRMUtils.export writing .m3u completed.',
                                  log_utils.LOGDEBUG)
                    kodi.notify(msg=kodi.i18n('export_success'), sound=False)
                    return
                except:
                    log_utils.log('STRMUtils.export failed to write .strm',
                                  log_utils.LOGDEBUG)
                    kodi.notify(msg=kodi.i18n('export_fail'), sound=False)
                    return
        log_utils.log('STRMUtils.export no item for export to .strm',
                      log_utils.LOGDEBUG)
        kodi.notify(msg=kodi.i18n('no_items_export'), sound=False)
def main(argv=None):
    if sys.argv:
        argv = sys.argv
    queries = kodi.parse_query(sys.argv[2])
    log_utils.log('Version: |%s| Queries: |%s|' % (kodi.get_version(), queries), log_utils.LOGDEBUG)
    log_utils.log('Args: |%s|' % argv, log_utils.LOGDEBUG)

    # don't process params that don't match our url exactly
    plugin_url = 'plugin://%s/' % (kodi.get_id())
    if argv[0] != plugin_url:
        return

    mode = queries.get('mode', None)
    DISPATCHER.dispatch(mode, queries)
예제 #9
0
def _download(info, background=True):
    if background:
        YDStreamExtractor.handleDownload(info, bg=True)
    else:
        result = YDStreamExtractor.handleDownload(info, bg=False)
        if result:
            log_utils.log('Download complete: |%s|' % result.filepath)
        elif result.status != 'canceled':
            log_utils.log('Download failed: |%s|' % result.message, log_utils.LOGERROR)
            kodi.notify(msg=result.message, sound=True)
        else:
            log_utils.log('Download cancelled')
예제 #10
0
def _download(info, background=True):
    if background:
        YDStreamExtractor.handleDownload(info, bg=True)
    else:
        result = YDStreamExtractor.handleDownload(info, bg=False)
        if result:
            log_utils.log('Download complete: |%s|' % result.filepath)
        elif result.status != 'canceled':
            log_utils.log('Download failed: |%s|' % result.message,
                          log_utils.LOGERROR)
            kodi.notify(msg=result.message, sound=True)
        else:
            log_utils.log('Download cancelled')
예제 #11
0
def download(download_type='video', background=True):
    download_type = download_type.lower()
    plugin_url = sys.listitem.getfilename()
    log_utils.log('ListItem.FileNameAndPath: |%s|' % plugin_url)
    if plugin_url:
        video_id = get_video_id(plugin_url)
        if video_id:
            if download_type == 'video':
                download_video(video_id, background=background)
            elif download_type == 'audio':
                download_audio(video_id, background=background)
            else:
                log_utils.log('Requested unknown download_type: |%s|' % download_type, log_utils.LOGERROR)
        else:
            kodi.notify(msg=kodi.i18n('not_found_video_id'), sound=False)
    else:
        log_utils.log('Plugin URL not found', log_utils.LOGERROR)
        kodi.notify(msg=kodi.i18n('not_found_plugin_url'), sound=False)
예제 #12
0
def download(download_type='video', background=True):
    download_type = download_type.lower()
    plugin_url = sys.listitem.getfilename()
    log_utils.log('ListItem.FileNameAndPath: |%s|' % plugin_url)
    if plugin_url:
        video_id = get_video_id(plugin_url)
        if video_id:
            if download_type == 'video':
                download_video(video_id, background=background)
            elif download_type == 'audio':
                download_audio(video_id, background=background)
            else:
                log_utils.log(
                    'Requested unknown download_type: |%s|' % download_type,
                    log_utils.LOGERROR)
        else:
            kodi.notify(msg=kodi.i18n('not_found_video_id'), sound=False)
    else:
        log_utils.log('Plugin URL not found', log_utils.LOGERROR)
        kodi.notify(msg=kodi.i18n('not_found_plugin_url'), sound=False)
예제 #13
0
    def export(self, results='playthis', ctype='video'):
        if results == 'resolved':
            from addon_lib.playback import resolve
        else:

            def resolve(url):
                return url

        rows = self._get()
        if rows:
            _m3u = '#EXTM3U\n'
            m3u = _m3u
            for item, content_type, title, thumb in rows:
                if content_type != ctype:
                    continue
                if results == 'resolved':
                    resolved = resolve(item)
                else:
                    resolved = None
                if resolved:
                    log_utils.log(
                        'M3UUtils.export adding resolved item: |{0!s}| as |{1!s}|'
                        .format(resolved, title), log_utils.LOGDEBUG)
                    m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format(
                        '0', title, resolved, thumb)
                else:
                    if results == 'playthis':
                        pt_url = 'plugin://plugin.video.playthis/?mode=play&player=false&history=false&path={0!s}' \
                            .format(quote(item))
                        log_utils.log(
                            'M3UUtils.export adding PlayThis item: |{0!s}| as |{1!s}|'
                            .format(pt_url, title), log_utils.LOGDEBUG)
                        m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format(
                            '0', title, pt_url, thumb)
                    else:
                        log_utils.log(
                            'M3UUtils.export adding unresolved item: |{0!s}| as |{1!s}|'
                            .format(item, title), log_utils.LOGDEBUG)
                        m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format(
                            '0', title, item, thumb)

            if m3u != _m3u:
                log_utils.log(
                    'M3UUtils.export writing .m3u: |{0!s}|'.format(
                        self.filename), log_utils.LOGDEBUG)
                try:
                    with open(self.filename, 'w+') as f:
                        f.write(m3u)
                    log_utils.log('M3UUtils.export writing .m3u completed.',
                                  log_utils.LOGDEBUG)
                    kodi.notify(msg=kodi.i18n('export_success'), sound=False)
                    return
                except:
                    log_utils.log('M3UUtils.export failed to write .m3u',
                                  log_utils.LOGDEBUG)
                    kodi.notify(msg=kodi.i18n('export_fail'), sound=False)
                    return
        log_utils.log('M3UUtils.export no items for export to .m3u',
                      log_utils.LOGDEBUG)
        kodi.notify(msg=kodi.i18n('no_items_export'), sound=False)
예제 #14
0
    def history_directory(self, ctype):
        icon_path = kodi.get_icon()
        fanart_path = kodi.get_fanart()
        total_items = None
        if self.size_limit() != 0:
            _queries = self.get(include_ids=True)
            queries = []
            for index, (row_id, item, content_type, label,
                        thumbnail) in enumerate(_queries):
                if content_type == ctype:
                    queries += [_queries[index]]
            if len(queries) > 0:
                total_items = len(queries)

                can_remote_send = HttpJSONRPC().has_connection_details
                resolve_locally = kodi.get_setting('resolve-locally') == 'true'

                for row_id, item, content_type, label, thumbnail in queries:
                    play_path = {
                        'mode': MODES.PLAY,
                        'player': 'false',
                        'history': 'false',
                        'path': quote(item),
                        'thumb': quote(thumbnail)
                    }
                    if ctype == 'image':
                        play_path = item
                    menu_items = [(kodi.i18n('new_'), 'RunPlugin(%s)' %
                                   (kodi.get_plugin_url({
                                       'mode': MODES.NEW,
                                       'player': 'true'
                                   }))),
                                  (kodi.i18n('manage'),
                                   'Container.Update(%s)' %
                                   (kodi.get_plugin_url({
                                       'mode': MODES.MANAGE_MENU,
                                       'row_id': row_id,
                                       'title': quote(label)
                                   }))),
                                  (kodi.i18n('export'),
                                   'Container.Update(%s)' %
                                   (kodi.get_plugin_url({
                                       'mode': MODES.EXPORT_MENU,
                                       'row_id': row_id,
                                       'ctype': content_type
                                   }))),
                                  (kodi.i18n('clear_history'),
                                   'RunPlugin(%s)' % (kodi.get_plugin_url(
                                       {
                                           'mode': MODES.CLEARHISTORY,
                                           'ctype': content_type
                                       }))),
                                  (kodi.i18n('refresh'), 'Container.Refresh')]

                    if can_remote_send:
                        if resolve_locally:
                            send_path = {
                                'mode': MODES.PLAY,
                                'path': quote(item),
                                'thumb': quote(thumbnail),
                                'title': quote(label),
                                'player': 'remote'
                            }
                        else:
                            send_path = {
                                'mode': MODES.SENDREMOTE,
                                'path': quote(item),
                                'thumb': quote(thumbnail),
                                'title': quote(label)
                            }
                        menu_items.append((kodi.i18n('send_remote_playthis'),
                                           'RunPlugin(%s)' %
                                           (kodi.get_plugin_url(send_path))))

                    is_folder = False
                    thumb = icon_path
                    if content_type == 'image':
                        thumb = item
                    if thumbnail:
                        thumb = thumbnail
                    info = {'title': label}
                    if content_type == 'audio':
                        info.update({'mediatype': 'song'})
                    elif content_type == 'video':
                        info.update({'mediatype': 'video'})
                    elif content_type == 'executable':
                        is_folder = True
                        play_path['player'] = 'true'

                    log_utils.log(
                        'Creating item |{2}|: path |{0}| content type |{1}|'.
                        format(play_path, content_type,
                               label), log_utils.LOGDEBUG)
                    kodi.create_item(play_path,
                                     label,
                                     thumb=thumb,
                                     fanart=fanart_path,
                                     is_folder=is_folder,
                                     is_playable=True,
                                     total_items=total_items,
                                     menu_items=menu_items,
                                     content_type=content_type,
                                     info=info)
        if not total_items:
            menu_items = [(kodi.i18n('refresh'), 'Container.Refresh')]
            kodi.create_item({
                'mode': MODES.NEW,
                'player': 'true'
            },
                             kodi.i18n('new_'),
                             thumb=icon_path,
                             fanart=fanart_path,
                             is_folder=False,
                             is_playable=False,
                             menu_items=menu_items)
        kodi.end_of_directory(cache_to_disc=False)
예제 #15
0
def download_audio(video_id, background=True):
    url = YOUTUBE_VIDEO_URL % video_id
    info = get_video_info(url)
    if info:
        stream = info._streams[0]
        ytdl_format = stream.get('ytdl_format', {})
        formats = ytdl_format.get('formats', [])
        best_quality = 0
        best_format = None
        if formats:
            for fmt in formats:
                fmt_desc = fmt.get('format', '')
                log_utils.log('format: |%s|' % fmt_desc)
                if 'audio only' in fmt_desc.lower():
                    format_id = fmt.get('format_id', '')
                    asr = fmt.get('asr', '')
                    tbr = fmt.get('tbr', '')
                    abr = fmt.get('abr', '')
                    ext = fmt.get('ext', '')
                    log_utils.log(
                        'id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' %
                        (format_id, ext, asr, tbr, abr))
                    if 'm4a' in ext:
                        tbr = int(fmt.get('tbr'))
                        if tbr > best_quality:
                            best_quality = tbr
                            best_format = fmt
                            log_utils.log(
                                'Updated best_format: |%s| id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|'
                                % (fmt_desc, format_id, ext, asr, tbr, abr))
            if best_format:
                stream['xbmc_url'] = best_format[
                    'url'] + '|' + urllib.urlencode({'User-Agent': USER_AGENT})
                stream['url'] = best_format['url']
                stream['ytdl_format'].update(best_format)
                stream['ytdl_format']['formats'] = [best_format]
                info._streams = [stream]
                log_utils.log(
                    'Downloading: |audio| video_id: |%s| Background: |%s|' %
                    (video_id, str(background)))
                _download(info, background)
            else:
                log_utils.log(
                    'No audio-only stream formats found: |%s|' % video_id,
                    log_utils.LOGERROR)
                kodi.notify(msg=kodi.i18n('no_audio_stream_formats'),
                            sound=False)
        else:
            log_utils.log('No stream formats found: |%s|' % video_id,
                          log_utils.LOGERROR)
            kodi.notify(msg=kodi.i18n('no_stream_formats'), sound=False)
예제 #16
0
def log_version():
    log_utils.log('Version: |%s|' % kodi.get_version())
예제 #17
0
def log_version():
    log_utils.log('Version: |%s|' % kodi.get_version())
예제 #18
0
def download_video(video_id, background=True):
    url = YOUTUBE_VIDEO_URL % video_id
    info = get_video_info(url)
    if info:
        log_utils.log('Downloading: |video| video_id: |%s| Background: |%s|' % (video_id, str(background)))
        _download(info, background)
예제 #19
0
def download_audio(video_id, background=True):
    url = YOUTUBE_VIDEO_URL % video_id
    info = get_video_info(url)
    if info:
        stream = info._streams[0]
        ytdl_format = stream.get('ytdl_format', {})
        formats = ytdl_format.get('formats', [])
        best_quality = 0
        best_format = None
        if formats:
            for fmt in formats:
                fmt_desc = fmt.get('format', '')
                log_utils.log('format: |%s|' % fmt_desc)
                if 'audio only' in fmt_desc.lower():
                    format_id = fmt.get('format_id', '')
                    asr = fmt.get('asr', '')
                    tbr = fmt.get('tbr', '')
                    abr = fmt.get('abr', '')
                    ext = fmt.get('ext', '')
                    log_utils.log('id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' % (format_id, ext, asr, tbr, abr))
                    if 'm4a' in ext:
                        tbr = int(fmt.get('tbr'))
                        if tbr > best_quality:
                            best_quality = tbr
                            best_format = fmt
                            log_utils.log('Updated best_format: |%s| id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' %
                                          (fmt_desc, format_id, ext, asr, tbr, abr))
            if best_format:
                stream['xbmc_url'] = best_format['url'] + '|' + urllib.urlencode({'User-Agent': USER_AGENT})
                stream['url'] = best_format['url']
                stream['ytdl_format'].update(best_format)
                stream['ytdl_format']['formats'] = [best_format]
                info._streams = [stream]
                log_utils.log('Downloading: |audio| video_id: |%s| Background: |%s|' % (video_id, str(background)))
                _download(info, background)
            else:
                log_utils.log('No audio-only stream formats found: |%s|' % video_id, log_utils.LOGERROR)
                kodi.notify(msg=kodi.i18n('no_audio_stream_formats'), sound=False)
        else:
            log_utils.log('No stream formats found: |%s|' % video_id, log_utils.LOGERROR)
            kodi.notify(msg=kodi.i18n('no_stream_formats'), sound=False)