Beispiel #1
0
def play():
    if request.method == 'POST':
        url = request.form['url']
        try:
            islist = request.form['list']
            islist = islist == "True"
        except:
            islist = False
        m,u = url_to_module(url)
        if not islist:
            parser = m.parser
        else:
            parser = m.parser_list
        try:
           info = parser(u)
        except AssertionError as e:
           return str(e)
        if type(info) is types.GeneratorType or type(info) is list:
            for i in info:
                player_args = i.extra
                player_args['title'] = i.title
                urls = i.streams[i.stream_types[0]]['src']
                video = json.dumps({"urls": urls, "args": player_args})
                player.play(video)
        else:
            player_args = info.extra
            player_args['title'] = info.title
            urls = info.streams[info.stream_types[0]]['src']
            video = json.dumps({"urls": urls, "args": player_args})
            player.play(video)
        return "OK"
    else:
        return "curl --data-urlencode \"url=<URL>\" http://IP:5000/play"
Beispiel #2
0
def play():
    if request.method == 'POST':
        url = request.form['url']
        try:
            islist = request.form['list']
            islist = islist == 'True'
        except:
            islist = False
        m,u = url_to_module(url)
        if not islist:
            parser = m.parser
        else:
            parser = m.parser_list
        try:
           info = parser(u)
        except AssertionError as e:
           return str(e)
        if type(info) is types.GeneratorType or type(info) is list:
            for i in info:
                handle_videoinfo(i)
        else:
            handle_videoinfo(info)
        return 'OK'
    else:
        return 'curl --data-urlencode "url=<URL>" http://IP:5000/play'
Beispiel #3
0
 def check_stream(self):
     logger.debug(self.fname)
     if platform.system() == 'Linux':
         if not chakra_available and not quickjs_available and external_interpreter is None:
             logger.error('''
     Please install at least one of the following Javascript interpreter.'
     python packages: PyChakra, quickjs
     applications: Gjs, CJS, QuickJS, JavaScriptCore, Node.js, etc.''')
     site, url = url_to_module(self.url)
     try:
         info = site.parser(url)
     except AssertionError:
         return
     stream_id = info.stream_types[0]
     urls = info.streams[stream_id]['src']
     self.raw_stream_url = urls[0]
     # print(info.title)
     douyuurl = self.url
     roomnum = douyuurl.split("douyu.com/")[1]
     roomloop = json.loads(
         get_content(
             'https://www.douyu.com/wgapi/live/liveweb/getRoomLoopInfo?rid='
             + roomnum))
     roomvid = roomloop['data']['vid']
     if roomvid != "":
         return False
     else:
         return True
Beispiel #4
0
def main():
    arg_parser()
    if not args.debug:
        logging.root.setLevel(logging.WARNING)
    else:
        logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
        args.proxy = os.environ.get('HTTP_PROXY', 'none')
    else:
        proxy_handler = ProxyHandler({'http': args.proxy, 'https': args.proxy})
    if not args.proxy == 'none':
        opener = build_opener(proxy_handler)
        install_opener(opener)

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            logger.warning("No permission or Not found " + args.output_dir)
            logger.warning("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m, u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is types.GeneratorType or type(info) is list:
                    ind = 0
                    for i in info:
                        if ind < args.start:
                            ind += 1
                            continue
                        handle_videoinfo(i, index=ind)
                        ind += 1
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                logger.critical(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                logger.error(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
 def check_stream(self):
     site, url = url_to_module(self.url)
     try:
         info = site.parser(url)
     except AssertionError:
         return False
     stream_id = info.stream_types[0]
     urls = info.streams[stream_id]['src']
     self.raw_stream_url = urls[0]
     return True
Beispiel #6
0
def main():
    arg_parser()
    if args.timeout:
        socket.setdefaulttimeout(args.timeout)
    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
    else:
        proxy_handler = ProxyHandler({
            'http': args.proxy,
            'https': args.proxy
        })
    opener = build_opener(proxy_handler)
    install_opener(opener)

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            log.w("No permission or Not found " + args.output_dir)
            log.w("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m,u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is types.GeneratorType or type(info) is list:
                    ind = 0
                    for i in info:
                        if ind < args.start:
                            ind+=1
                            continue
                        handle_videoinfo(i, index=ind)
                        ind+=1
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                log.wtf(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                log.e(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        print('\nInterrupted by Ctrl-C')
Beispiel #7
0
def main():
    arg_parser()
    if args.timeout:
        socket.setdefaulttimeout(args.timeout)
    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
    else:
        proxy_handler = ProxyHandler({
            'http': args.proxy,
            'https': args.proxy
        })
    opener = build_opener(proxy_handler)
    install_opener(opener)

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            log.w("No permission or Not found " + args.output_dir)
            log.w("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m,u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is list:
                    if args.start >= len(info):
                        log.w('invalid argument -s/--start')
                        log.w('start from beginning')
                        args.start = 0
                    for i in info[args.start:]:
                        handle_videoinfo(i)
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                log.wtf(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                log.e(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        print('\nInterrupted by Ctrl-C')
Beispiel #8
0
 def check_stream(self):
     logger.debug(self.fname)
     site, url = url_to_module(self.url)
     try:
         info = site.parser(url)
     except AssertionError:
         return
     stream_id = info.stream_types[0]
     urls = info.streams[stream_id]['src']
     self.ydl_opts['absurl'] = urls[0]
     # print(info.title)
     return True
Beispiel #9
0
def play():
    if request.method == 'PUT':
        url = request.form['url']
        m,u = url_to_module(url)
        try:
            info = m.parser(u)
        except AssertionError as e: 
            return str(e)
        player_args = info.extra
        player_args['title'] = info.title
        urls = info.streams[info.stream_types[0]]['src']
        launch_player("mpv", urls, **player_args)
        return "OK"
    else:
        return "curl -X put --data-urlencode \"url=<URL>\" http://IP:5000/play"
Beispiel #10
0
 def check_stream(self):
     logger.debug(self.fname)
     try:
         site, url = url_to_module(self.url)
         info = site.parser(url)
         stream_id = info.stream_types[0]
         urls = info.streams[stream_id]['src']
         self.raw_stream_url = urls[0]
     # print(info.title)
     except:
         handlers = [YDownload(self.fname, self.url, 'mp4'), SDownload(self.fname, self.url, 'flv')]
         for handler in handlers:
             if handler.check_stream():
                 self.handler = handler
                 self.suffix = handler.suffix
                 return True
         return False
     return True
Beispiel #11
0
 def check_stream(self):
     logger.debug(self.fname)
     if platform.system() == 'Linux':
         if not chakra_available and not quickjs_available and external_interpreter is None:
             logger.error('''
     Please install at least one of the following Javascript interpreter.'
     python packages: PyChakra, quickjs
     applications: Gjs, CJS, QuickJS, JavaScriptCore, Node.js, etc.''')
     site, url = url_to_module(self.url)
     try:
         info = site.parser(url)
     except AssertionError:
         return
     stream_id = info.stream_types[0]
     urls = info.streams[stream_id]['src']
     self.raw_stream_url = urls[0]
     # print(info.title)
     return True
Beispiel #12
0
def main():
    args = arg_parser()

    logging.root.setLevel(logging.WARNING)
    # if not args.debug:
    #     logging.root.setLevel(logging.WARNING)
    # else:
    #     logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
        args.proxy = os.environ.get('HTTP_PROXY', 'none')
    else:
        proxy_handler = ProxyHandler({'http': args.proxy, 'https': args.proxy})
    if not args.proxy == 'none':
        opener = build_opener(proxy_handler)
        install_opener(opener)
        default_proxy_handler[:] = [proxy_handler]

    import ssl

    ssl._create_default_https_context = ssl._create_unverified_context

    try:
        url = args.video_url
        try:
            m, u = url_to_module(url)
            parser = m.parser
            info = parser(u)
            print(
                json.dumps(info.jsonlize(),
                           indent=4,
                           sort_keys=True,
                           ensure_ascii=False))
        except AssertionError as e:
            logger.critical(e)
        except (RuntimeError, NotImplementedError, SyntaxError) as e:
            logger.error(e)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
Beispiel #13
0
def main():
    args = arg_parser()

    logging.root.setLevel(logging.WARNING)
    # if not args.debug:
    #     logging.root.setLevel(logging.WARNING)
    # else:
    #     logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
        args.proxy = os.environ.get('HTTP_PROXY', 'none')
    else:
        proxy_handler = ProxyHandler({
            'http': args.proxy,
            'https': args.proxy
        })
    if not args.proxy == 'none':
        opener = build_opener(proxy_handler)
        install_opener(opener)
        default_proxy_handler[:] = [proxy_handler]

    import ssl

    ssl._create_default_https_context = ssl._create_unverified_context

    try:
        url = args.video_url
        try:
            m, u = url_to_module(url)
            parser = m.parser
            info = parser(u)
            print(json.dumps(info.jsonlize(), indent=4, sort_keys=True, ensure_ascii=False))
        except AssertionError as e:
            logger.critical(e)
        except (RuntimeError, NotImplementedError, SyntaxError) as e:
            logger.error(e)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
Beispiel #14
0
    def check_stream(self):
        logger.debug(self.fname)
        streamlink = StreamLink(self.fname, self.url, FallbackHandler())
        youtube_dl = YoutubeDl(self.fname, self.url, streamlink)
        try:
            site, url = url_to_module(self.url)
            info = site.parser(url)
            # except AssertionError:
            #     self.handler = youtube_dl.handle()
            #     return self.handler != FallbackHandler()

            stream_id = info.stream_types[0]
            urls = info.streams[stream_id]['src']
            self.raw_stream_url = urls[0]
        # print(info.title)
        except:
            self.handler = youtube_dl.handle()
            self.suffix = self.handler.suffix
            return self.handler != FallbackHandler()
        return True
Beispiel #15
0
def main():
    args = arg_parser()
    if args.timeout:
        socket.setdefaulttimeout(args.timeout)
    if args.proxy:
        proxy_handler = ProxyHandler({'http': args.proxy, 'https': args.proxy})
        opener = build_opener(proxy_handler)
        install_opener(opener)

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            log.w("No permission or Not found " + args.output_dir)
            log.w("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m, u = url_to_module(url)
                if not u == url:
                    args.video_urls[args.video_urls.index(url)] = u
                if args.playlist:
                    m.download_playlist(u, args)
                else:
                    m.download(u, args)
            except AssertionError as e:
                log.wtf(str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                log.e(str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        print('\nInterrupted by Ctrl-C')
Beispiel #16
0
def main():
    args = arg_parser()
    handlers = []

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.user_agent:
        fake_headers['User-Agent'] = args.user_agent

    if args.http_proxy:
        proxy_handler = ProxyHandler({
            'http': args.http_proxy,
            'https': args.http_proxy
        })
        handlers.append(proxy_handler)

    elif args.socks_proxy:
        try:
            import socks
            addr, port = args.socks_proxy.split(':')
            socks.set_default_proxy(socks.SOCKS5, addr, int(port))
            socket.socket = socks.socksocket
        except:
            print('Failed to set socks5 proxy. Please install PySocks.', file=sys.stderr)

    opener = build_opener(*handlers)
    install_opener(opener)
    default_proxy_handler[:] = handlers

    m, u = url_to_module(args.video_url)
    info = m.parser(u)

    # Is a playlist?
    if m.list_only():
        video_list = m.prepare_list()
        result = [ {'title': match1(get_content(url), r'<title>(.+?)</title>'), 'url': url} for url in video_list ]
    else:
        result = info.jsonlize()
    print(json.dumps(result, indent=4, sort_keys=True, ensure_ascii=False))
Beispiel #17
0
def handle_video(video):
    http.reset_headers()
    http.uninstall_cookie()
    try:
        m, u = url_to_module(video)
        if args.playlist:
            parser = m.parser_list
            m.start = args.start
        else:
            parser = m.parser
        info = parser(u)
        if isinstance(info, (GeneratorType, list)):
            for i in info:
                handle_videoinfo(i)
        else:
            handle_videoinfo(info)
    except AssertionError as e:
        logger.critical(str(e))
        return 1
    except (RuntimeError, NotImplementedError, SyntaxError) as e:
        logger.error(repr(e))
        return 1
    return 0
Beispiel #18
0
def main():
    arg_parser()
    if not args.debug:
        logging.root.setLevel(logging.WARNING)
    else:
        logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.insecure:
        ssl._create_default_https_context = ssl._create_unverified_context

    proxies = None
    if args.proxy == 'system':
        proxies = getproxies()
        args.proxy = proxies.get('http') or proxies.get('https', 'none')
    args.proxy = args.proxy.lower()
    if not args.proxy.startswith(('http', 'socks', 'none')):
        args.proxy = 'http://' + args.proxy

    if args.proxy == 'none':
        proxies = {}
    elif args.proxy.startswith(('http', 'socks')):
        if args.proxy.startswith(('https', 'socks')):
            try:
                import extproxy
            except ImportError:
                logger.error('Please install ExtProxy to use proxy: ' + args.proxy)
                raise
        proxies = {
            'http': args.proxy,
            'https': args.proxy
        }
    proxy_handler = ProxyHandler(proxies)

    add_default_handler(proxy_handler)
    install_default_handlers()

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            logger.warning("No permission or Not found " + args.output_dir)
            logger.warning("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m, u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is types.GeneratorType or type(info) is list:
                    ind = 0
                    for i in info:
                        if ind < args.start:
                            ind += 1
                            continue
                        handle_videoinfo(i, index=ind)
                        ind += 1
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                logger.critical(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                logger.error(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
Beispiel #19
0
def main():
    arg_parser()
    if not args.debug:
        logging.root.setLevel(logging.INFO)
    else:
        logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.insecure:
        ssl._create_default_https_context = ssl._create_unverified_context
        args.certs = ssl.CERT_NONE
    else:
        certs = args.append_certs or []
        try:
            import certifi
        except ImportError:
            pass
        else:
            certs.append(certifi.where())
        if certs:
            context = ssl._create_default_https_context()
            for cert in certs:
                if os.path.isfile(cert):
                    context.load_verify_locations(cert)
                elif os.path.isdir(cert):
                    context.load_verify_locations(capath=cert)
            https_handler = HTTPSHandler(context=context)
            http.add_default_handler(https_handler)
            args.certs = certs
        else:
            args.certs = None

    proxies = None
    if args.proxy == 'system':
        proxies = getproxies()
        args.proxy = proxies.get('http') or proxies.get('https', 'none')
    args.proxy = args.proxy.lower()
    if not args.proxy.startswith(('http', 'socks', 'none')):
        args.proxy = 'http://' + args.proxy

    if args.proxy == 'none':
        proxies = {}
    elif args.proxy.startswith(('http', 'socks')):
        if args.proxy.startswith(('https', 'socks')):
            try:
                import extproxy
            except ImportError:
                logger.error('Please install ExtProxy to use proxy: ' + args.proxy)
                raise
        proxies = {
            'http': args.proxy,
            'https': args.proxy
        }
    proxy_handler = ProxyHandler(proxies)

    http.add_default_handler(proxy_handler)

    if args.no_http_cache:
        http.CACHED.set(0)

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            logger.warning('No permission or Not found ' + args.output_dir)
            logger.warning('use current folder')
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    exit = 0
    try:
        for url in args.video_urls:
            http.reset_headers()
            http.uninstall_cookie()
            try:
                m, u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                    m.start = args.start
                else:
                    parser = m.parser
                info = parser(u)
                if isinstance(info, (GeneratorType, list)):
                    for i in info:
                        handle_videoinfo(i)
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                logger.critical(str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                logger.error(repr(e))
                exit = 1
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
    except Exception as e:
        errmsg = str(e)
        logger.debug(errmsg, exc_info=True)
        if 'local issuer' in errmsg:
            logger.warning('Please install or update Certifi, and try again:\n'
                           'pip3 install certifi --upgrade')
        exit = 255
    sys.exit(exit)
Beispiel #20
0
def main():
    arg_parser()
    if not args.debug:
        logging.root.setLevel(logging.WARNING)
    else:
        logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
        args.proxy = os.environ.get('HTTP_PROXY', 'none')
    elif args.proxy.upper().startswith('SOCKS'):
        try:
            import socks
            from sockshandler import SocksiPyHandler
        except ImportError:
            logger.error('To use SOCKS proxy, please install PySocks first!')
            raise
        parsed_socks_proxy = urlparse(args.proxy)
        sockstype = socks.PROXY_TYPES[parsed_socks_proxy.scheme.upper()]
        rdns = True
        proxy_handler = SocksiPyHandler(sockstype, parsed_socks_proxy.hostname,
                                        parsed_socks_proxy.port, rdns,
                                        parsed_socks_proxy.username,
                                        parsed_socks_proxy.password)
    else:
        proxy_handler = ProxyHandler({'http': args.proxy, 'https': args.proxy})
    if not args.proxy == 'none':
        opener = build_opener(proxy_handler)
        install_opener(opener)
        default_proxy_handler[:] = [proxy_handler]

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            logger.warning("No permission or Not found " + args.output_dir)
            logger.warning("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m, u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is types.GeneratorType or type(info) is list:
                    ind = 0
                    for i in info:
                        if ind < args.start:
                            ind += 1
                            continue
                        handle_videoinfo(i, index=ind)
                        ind += 1
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                logger.critical(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                logger.error(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')
Beispiel #21
0
def main():
    arg_parser()
    if not args.debug:
        logging.root.setLevel(logging.WARNING)
    else:
        logging.root.setLevel(logging.DEBUG)

    if args.timeout:
        socket.setdefaulttimeout(args.timeout)

    if args.proxy == 'system':
        proxy_handler = ProxyHandler()
        args.proxy = os.environ.get('HTTP_PROXY', 'none')
    else:
        proxy_handler = ProxyHandler({
            'http': args.proxy,
            'https': args.proxy
        })
    if not args.proxy == 'none':
        opener = build_opener(proxy_handler)
        install_opener(opener)
        default_proxy_handler[:] = [proxy_handler]

    #mkdir and cd to output dir
    if not args.output_dir == '.':
        try:
            if not os.path.exists(args.output_dir):
                os.makedirs(args.output_dir)
        except:
            logger.warning("No permission or Not found " + args.output_dir)
            logger.warning("use current folder")
            args.output_dir = '.'
    if os.path.exists(args.output_dir):
        os.chdir(args.output_dir)

    try:
        exit = 0
        for url in args.video_urls:
            try:
                m,u = url_to_module(url)
                if args.playlist:
                    parser = m.parser_list
                else:
                    parser = m.parser
                info = parser(u)
                if type(info) is types.GeneratorType or type(info) is list:
                    ind = 0
                    for i in info:
                        if ind < args.start:
                            ind+=1
                            continue
                        handle_videoinfo(i, index=ind)
                        ind+=1
                else:
                    handle_videoinfo(info)
            except AssertionError as e:
                logger.critical(compact_str(e))
                exit = 1
            except (RuntimeError, NotImplementedError, SyntaxError) as e:
                logger.error(compact_str(e))
                exit = 1
        sys.exit(exit)
    except KeyboardInterrupt:
        logger.info('Interrupted by Ctrl-C')