def download(urls, name, ext, live = False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal if not urls[0].startswith('http') or not ext == 'm3u8': m3u8_internal = True # for live video, always use ffmpeg to rebuild timeline. if live: m3u8_internal = False # change m3u8 ext to mp4 # rebuild urls when use internal downloader if ext == 'm3u8': ext = 'mp4' if m3u8_internal: urls = load_m3u8(urls[0]) # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext, live) else: save_urls(urls, name, ext) lenth = len(urls) if lenth > 1: launch_ffmpeg(name, ext,lenth) clean_slices(name, ext,lenth)
def download(urls, name, ext, live=False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal if not urls[0].startswith('http') or not ext == 'm3u8': m3u8_internal = True # for live video, always use ffmpeg to rebuild timeline. if live: m3u8_internal = False # change m3u8 ext to mp4 # rebuild urls when use internal downloader if ext == 'm3u8': ext = 'mp4' if m3u8_internal: urls = load_m3u8(urls[0]) # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext, live) else: save_urls(urls, name, ext) lenth = len(urls) if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext, lenth) clean_slices(name, ext, lenth)
def download(urls, name, ext, live = False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal # for live video, always use ffmpeg to rebuild timeline. if live: m3u8_internal = False # rebuild m3u8 urls when use internal downloader, # change the ext to segment's ext, default is "ts", # otherwise change the ext to "mp4". if ext == 'm3u8': if m3u8_internal: urls = load_m3u8(urls[0]) ext = urlparse(urls[0])[2].split('.')[-1] if ext not in ['ts', 'm4s', 'mp4']: ext = 'ts' else: ext = 'mp4' # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext, live) else: if save_urls(urls, name, ext, jobs = args.jobs): lenth = len(urls) if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext,lenth) clean_slices(name, ext,lenth) else: logger.critical("{}> donwload failed".format(name))
def download_subtitles(subtitles, name): for sub in subtitles: _name = name + '_' + sub['lang'] if not save_urls([sub['src']], _name, sub['format'], fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): logger.critical('{}> donwload failed'.format(_name))
def download(urls, name, ext, live=False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal # for live video, always use ffmpeg to rebuild timeline. if live: m3u8_internal = False # change m3u8 ext to mp4 # rebuild urls when use internal downloader if ext == 'm3u8': ext = 'mp4' if m3u8_internal: urls = load_m3u8(urls[0]) # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext, live) else: if save_urls(urls, name, ext, jobs=args.jobs): lenth = len(urls) if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext, lenth) clean_slices(name, ext, lenth) else: logger.critical("{}> donwload failed".format(name))
def download(urls, name, ext, live = False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal # for live video, always use ffmpeg to rebuild timeline. if live: m3u8_internal = False # change m3u8 ext to mp4 # rebuild urls when use internal downloader if ext == 'm3u8': ext = 'mp4' if m3u8_internal: urls = load_m3u8(urls[0]) # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext, live) else: if save_urls(urls, name, ext, jobs = args.jobs): lenth = len(urls) if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext,lenth) clean_slices(name, ext,lenth) else: logger.critical("{}> donwload failed".format(name))
def download(urls, name, ext, live=False): url = urls[0] m3u8 = ext == 'm3u8' m3u8_crypto = False audio = subtitle = None # for live video, always use ffmpeg to rebuild timeline. if not live and m3u8: live = live_m3u8(url) internal = not live and m3u8_internal if m3u8: m3u8_crypto = crypto_m3u8(url) # rebuild m3u8 urls when use internal downloader, # change the ext to segment's ext, default is "ts", # otherwise change the ext to "flv" or "mp4". if internal: urls, audio, subtitle = load_m3u8(url) ext = urlparse(urls[0])[2].split('.')[-1] if ext not in ['ts', 'm4s', 'mp4', 'm4a']: ext = 'ts' elif live: ext = 'flv' else: ext = 'mp4' elif ext == 'mpd': # very slow # and now, it has many problems # TODO: implement internal download/merge process internal = False ext = 'mp4' # OK check internal if not internal: launch_ffmpeg_download(url, name + '.' + ext, allow_all_ext=m3u8_crypto) else: if save_urls(urls, name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): lenth = len(urls) if (m3u8 or lenth > 1) and not args.no_merge: fix_sa_name(name, ext, lenth) if m3u8_crypto: # use ffmpeg to merge internal downloaded m3u8 # build the local m3u8, and then the headers cannot be set lm3u8 = NamedTemporaryFile(mode='w+t', suffix='.m3u8', dir='.', encoding='utf-8') lkeys = [] # temp keys' references m = _load_m3u8(url) for k in m.keys + m.session_keys: if k and k.uri: key = NamedTemporaryFile(mode='w+b', suffix='.key', dir='.') key.write(http.get_response(k.absolute_uri).content) key.flush() k.uri = os.path.basename(key.name) lkeys.append(key) for i, seg in enumerate(m.segments): seg.uri = '%s_%d.%s' % (name, i, ext) lm3u8.write(m.dumps()) lm3u8.flush() launch_ffmpeg_download(lm3u8.name, name + '.mp4', False, True) else: launch_ffmpeg_merge(name, ext, lenth) clean_slices(name, ext, lenth) else: logger.critical('{}> donwload failed'.format(name)) if audio: ext = 'm4a' lenth = len(audio) if save_urls(audio, name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): if (m3u8 or lenth > 1) and not args.no_merge: fix_sa_name(name, ext, lenth) launch_ffmpeg_merge(name, ext, lenth) clean_slices(name, ext, lenth) else: logger.critical('{}> HLS audio donwload failed'.format(name)) if subtitle: ext = 'srt' if not save_urls(subtitle[:1], name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): logger.critical('{}> HLS subtitle donwload failed'.format(name))
def download(urls, name, ext, live=False): # ffmpeg can't handle local m3u8. # only use ffmpeg to hanle m3u8. global m3u8_internal # for live video, always use ffmpeg to rebuild timeline. if ext == 'm3u8' and not live: live = live_m3u8(urls[0]) if live: m3u8_internal = False # rebuild m3u8 urls when use internal downloader, # change the ext to segment's ext, default is "ts", # otherwise change the ext to "flv" or "mp4". audio = subtitle = None if ext == 'm3u8': if m3u8_internal: urls, audio, subtitle = load_m3u8(urls[0]) ext = urlparse(urls[0])[2].split('.')[-1] if ext not in ['ts', 'm4s', 'mp4', 'm4a']: ext = 'ts' elif live: ext = 'flv' else: ext = 'mp4' # OK check m3u8_internal if not m3u8_internal: launch_ffmpeg_download(urls[0], name + '.' + ext) else: if save_urls(urls, name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): lenth = len(urls) if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext, lenth) clean_slices(name, ext, lenth) else: logger.critical('{}> donwload failed'.format(name)) if audio: ext = 'm4a' lenth = len(audio) if save_urls(audio, name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): if lenth > 1 and not args.no_merge: launch_ffmpeg(name, ext, lenth) clean_slices(name, ext, lenth) else: logger.critical('{}> HLS audio donwload failed'.format(name)) if subtitle: ext = 'srt' if not save_urls(subtitle[:1], name, ext, jobs=args.jobs, fail_confirm=not args.no_fail_confirm, fail_retry_eta=args.fail_retry_eta): logger.critical( '{}> HLS subtitle donwload failed'.format(name))