def download(url, descpath, threadnum=15): '''Download file by m3u8-url''' try: urllist = paresUrl(url) if len(urllist) <= 0: return False threads = ThreadTool(threadnum) # Creat tmpdir path = getDirName(descpath) tmpPath = getDiffTmpPathName(path) if mkdirs(tmpPath) is False: return False # Progress progress = ProgressTool(len(urllist), 20) # Download files files = [] for i, item in enumerate(urllist): filepath = tmpPath + '/' + str(i) + '.ts' files.append(filepath) threads.start(__threadfunc__, item, filepath, progress) threads.waitAll() # merger __merger__(files, descpath) shutil.rmtree(tmpPath) threads.close() return True except: shutil.rmtree(tmpPath) return False
def mergerByFiles(self, srcfilepaths, filepath, showshell=False): """ #Func : 合并文件 #Param : srcfilepaths [in] 文件名数组 #Param : filepath [in] 目标文件名 #Param : showshell [in] 是否显示cmd信息 #Return : True/False """ filepath = os.path.abspath(filepath) res = -1 tmpfile = filepath + "TMP.txt" paths = srcfilepaths group = None groupnum = 50 try: # 先分组合并,再一起合并 if len(srcfilepaths) > groupnum: dirName = pathHelper.getDirName(filepath) group = pathHelper.getDiffTmpPathName(dirName) if pathHelper.mkdirs(group) is False: return False newPaths = [] array = [ srcfilepaths[i:i + groupnum] for i in range(0, len(srcfilepaths), groupnum) ] for index, item in enumerate(array): file = group + '/' + str(index) + ".mp4" newPaths.append(file) if self.mergerByFiles(item, file, showshell) is False: return False paths = newPaths # 创建临时文件,将要合并的文件名列表写入 with open(tmpfile, 'w') as fd: for item in paths: item = os.path.abspath(item) fd.write('file \'' + item + '\'\n') # 调用ffmpeg进行合并 cmd = "ffmpeg -f concat -safe 0 -i \"" + tmpfile + "\" -c copy \"" + filepath + "\"" res = self.__process(cmd, 3, showshell, filepath) except: pass if os.access(tmpfile, 0): os.remove(tmpfile) if group is not None: shutil.rmtree(group) return res
def mergerByM3u8_Multithreading(self, url, filepath, showprogress=False, showshell=False): """ #Func : 多线程下载并合并文件(使用M3u8的url) #Param : url [in] 链接 #Param : filepath [in] 目标文件名 #Param : showprogress [in] 是否显示进度条 #Param : showshell [in] 是否显示cmd信息 #Return : True/False """ try: # Get urllist urllist = self.__parseM3u8(url) if len(urllist) <= 0: return False # Creat tmpdir path = pathHelper.getDirName(filepath) tmpPath = pathHelper.getDiffTmpPathName(path) if pathHelper.mkdirs(tmpPath) is False: return False # Progress self.progress = None if showprogress: self.progress = ProgressTool(len(urllist)) # Download files allpath = [] self.waitCount = len(urllist) self.completeCount = 0 for i, item in enumerate(urllist): index = i + 100001 path = tmpPath + '/' + str(index) + ".ts" path = os.path.abspath(path) allpath.append(path) if os.path.exists(path): os.remove(path) self.thread.start(self.__thradfunc_dl, item, path, 3) self.thread.waitAll() ret = self.mergerByTs(tmpPath, filepath, showshell) # ret = self.mergerByFiles(allpath, filepath, showshell) shutil.rmtree(tmpPath) return ret except: return False