Skip to content

Instantly share code, notes, and snippets.

@redstoneleo
Created April 23, 2017 08:32
Show Gist options
  • Save redstoneleo/0faa008394f7f6ece9eb52cc900e9c48 to your computer and use it in GitHub Desktop.
Save redstoneleo/0faa008394f7f6ece9eb52cc900e9c48 to your computer and use it in GitHub Desktop.
# print('(QProcess)---------------',self.findChildren(QProcess))
arguments = ['-f', 'concat', '-safe', '-1', '-i', fp.name, '-y', '-c', 'copy', absoluteFileName]
# print(os.path.join(os.getcwd(), 'ffmpeg'), ' '.join(arguments))
# self.process.finished.connect(self.mergeFinished(self.process))
# process.destroyed.connect(self.onProcessDestroyed)
if self.process.state()==QProcess.NotRunning:
self.process.start(os.path.join(os.getcwd(), 'ffmpeg'), arguments)
else:
self.process.tasks.add(sourceUrl)
else: # 301未知协议处理不?
print('------------downloadFinished----', reply.error(), reply.errorString(), fileName)
# logging.error('-----------downloadFinished-----{}\n{}\n{}'.format(reply.error(), reply.errorString(), fileName))
def mergeFinished(self, process):
# print('mergeFinished---------', exitCode, exitStatus)
if process.exitStatus() == QProcess.NormalExit:
process.close()
# print(process)
arguments = process.arguments()
# del process#py方面进一步帮助清理,以便后面不占用合并好的文件和碎片文件
absoluteFileName = arguments[-1]
fileName = os.path.basename(absoluteFileName)
sourceUrl = self.fileName2sourceUrl.get(fileName) # 不pop,以免造成 KeyError: '蜡笔小新剧场版 2003年 风起云涌光荣烧肉之路.f4v' in on_pauseTasks_triggered,不用管这个字典了,占不了多少内存的,留着反而可以避免错误
self.finishedTasks[fileName] = sourceUrl # 必须要在shutil.move之前,否则发生self.fileSystemWatcher.directoryChanged.connect(self.removeFinishedTasksMap),导致最终合并的时候因为没有最后下载完成的文件作为key,发生keyError
try:
shutil.move(absoluteFileName, self.finishedDir) # 还是必须合并完成再移动,直接把合并的半成品文件放到finishedDir可能会致使用户播放不了半成品文件(失误啊!)
except FileNotFoundError as e:
errorMsg = str(process.readAllStandardError(), 'utf8')
logging.error('FileNotFoundError------------{}\n{}'.format(e, errorMsg))
QTimer.singleShot(10000, lambda: shutil.move(absoluteFileName, self.finishedDir))
except PermissionError as e:
logging.error('PermissionError------------{}'.format(e))
process.deleteLater() # Qt方面删除,解除process里的FFmpeg占用,既然结束了无论如何都是要删除的
del process # py方面进一步帮助清理,以便后面不占用合并好的文件和碎片文件
print('self.findChildren(QProcess)-----PermissionError----------', self.findChildren(QProcess))
QTimer.singleShot(3000, lambda: shutil.move(absoluteFileName, self.finishedDir))
except shutil.Error as e: # 结束目录里已经有同名文件
logging.error('shutil.Error------------{}'.format(e))
os.remove(os.path.join(self.finishedDir, fileName))
QTimer.singleShot(3000, lambda: shutil.move(absoluteFileName, self.finishedDir))
else:
self.trayIcon.showMessage('下载成功!', fileName)
self.resetModel(sourceUrl) # 上面转移好文件后从下载列表里去掉正在下载的任务,必须放在下面这个清楚残留文件之前
process.deleteLater() # Qt方面删除,解除process里的FFmpeg占用,既然结束了无论如何都是要删除的
del process # py方面进一步帮助清理,以便下面不占用合并好的文件和碎片文件
f = self.sourceUrl2UnmergedFiles.pop(sourceUrl)
self.deleteFileList(f)
if self.unfinishedUrls == set(): # 确保这个dir无残留,不能放在resetModel里,因为那个在合并之前就会执行了
self.deleteFileList([entry.path for entry in os.scandir(self.unfinishedDir)])
# print('mergeFinished---deleteFileList------', f)
# print('self.unfinishedUrls == set()----------------',self.unfinishedUrls)
os.remove(arguments[-5]) # 移除tempFile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment