def getFileUrls(self, url, segment, unmute): original = Utils.joinUrl(url, segment.fileName) unmuted = Utils.joinUrl(url, segment.getUnmutedFileName()) muted = Utils.joinUrl(url, segment.getMutedFileName()) if segment.muted: if not unmute: return [unmuted, muted, original] return [original, unmuted, muted]
def setAds(self): adArea = self.findChildren(QtWidgets.QWidget, QtCore.QRegExp("^adArea_\d+$")) adGroup = self.findChildren(QtWidgets.QWidget, QtCore.QRegExp("^adGroup_\d+$")) if AdManager.Config.SHOW: for widget in adArea: Utils.setPlaceholder( widget, AdManager.Ad(minimumSize=widget.minimumSize(), responsive=True)) else: for widget in adArea + adGroup: widget.setParent(None)
def download(self): with self.actionLock: if self.status.terminateState.isProcessing(): return self.FFmpeg = FFmpeg(self.setup.downloadInfo.getUrl(), self.setup.downloadInfo.getAbsoluteFileName()) self.status.setDownloading() self.syncStatus() for progress in self.FFmpeg.output(): time = progress.get("time") if time != None: self.progress.seconds = Utils.toSeconds( *time.split(".")[0].split(":")) size = progress.get("size") or progress.get("Lsize") if size != None: self.progress.totalSize = Utils.formatByteSize(size) self.progress.size = self.progress.totalSize self.syncProgress()
def setupSegmentDownload(self): try: self.tempDirectory = TempManager.createTempDirectory(self.setup.downloadInfo.directory) except: raise Exceptions.FileSystemError self.playlist = Playlist( self.setup.downloadInfo.getUrl(), Utils.joinPath(self.tempDirectory.name, "{}.m3u8".format(Config.PLAYLIST_FILE_NAME)) ) self.playlist.setRange(*self.setup.downloadInfo.range) self.syncPlaylistProgress()
def downloadSegments(self): url = self.setup.downloadInfo.getUrl().rsplit("/", 1)[0] processedFiles = [] with self.actionLock: self.taskManager.taskCompleteSignal.connect(self.segmentDownloadResult) self.taskManager.ifPaused.connect(self.taskPaused) self.taskManager.start() while self.status.terminateState.isFalse(): self.status.setDownloading() self.syncStatus() for segment in self.playlist.getSegments(): if segment.fileName not in processedFiles: processedFiles.append(segment.fileName) segmentDownloader = SegmentDownloader( url=url, segment=segment, unmute=self.setup.unmuteVideo, saveAs=Utils.joinPath(self.tempDirectory.name, segment.fileName), priority=self.setup.priority + 1 if self.status.isUpdateFound() else self.setup.priority ) self.taskManager.add(task=segmentDownloader) self.taskManager.waitForDone() if not (self.setup.updateTrack and self.playlist.timeRange.timeTo == None): break self.status.setWaiting() waitEnd = time.time() + Config.UPDATE_TRACK_DURATION while True: prevWaiting = self.status.getWaitingTime() self.status.setWaitingTime(math.ceil(waitEnd - time.time())) if self.status.getWaitingTime() != prevWaiting: self.syncStatus() if self.status.getWaitingTime() <= 0 or self.status.terminateState.isProcessing() or self.status.isDownloadSkipped(): break if self.status.isWaitingSkipped(): self.status.setSkipWaiting(False) break time.sleep(0.1) self.status.setWaitingTime(None) self.status.setUpdating() self.syncStatus() if self.status.terminateState.isProcessing() or self.status.isDownloadSkipped(): break prevFiles = self.playlist.getFileList() try: self.playlist.updatePlaylist() self.syncPlaylistProgress() if prevFiles == self.playlist.getFileList(): break else: self.status.setUpdateFound() except: break
def encode(self): with self.actionLock: if self.status.terminateState.isProcessing(): return self.status.setEncoding() self.syncStatus() self.FFmpeg = FFmpeg(self.playlist.filePath, self.setup.downloadInfo.getAbsoluteFileName()) processingFile = None for progress in self.FFmpeg.output(): file = progress.get("file") if file != None: if processingFile != None: self.removeFile(processingFile) processingFile = file time = progress.get("time") if time != None: self.progress.seconds = Utils.toSeconds(*time.split(".")[0].split(":")) size = progress.get("size") or progress.get("Lsize") if size != None: self.progress.totalSize = Utils.formatByteSize(size) self.progress.size = self.progress.totalSize self.syncProgress()
def getAbsoluteFileName(self): return "{}.{}".format(Utils.joinPath(self.directory, self.fileName), self.fileFormat)
def createFileName(self): return Utils.getValidFileName( Utils.injectionSafeFormat(self.getFileNameTemplate(), **self.getFileNameTemplateVariables()))
def handleDownloadResult(self, downloader): if downloader.status.terminateState.isTrue(): error = downloader.status.getError() if error != None: if error == Exceptions.FileSystemError: Utils.info(*Messages.INFO.FILE_SYSTEM_ERROR) elif error == Exceptions.NetworkError: Utils.info(*Messages.INFO.NETWORK_ERROR) else: Utils.info(*Messages.INFO.DOWNLOAD_ERROR) elif DB.general.isAutoCloseEnabled( ) and not downloader.setup.downloadInfo.type.isClip(): App.exit() else: fileName = downloader.setup.downloadInfo.getAbsoluteFileName() if Utils.ask("download-complete", "{}\n\n{}".format(T("#Download completed."), fileName), okText="open", cancelText="ok"): try: Utils.openFile(fileName) except: Utils.info(*Messages.INFO.FILE_NOT_FOUND)
def removeFile(self, fileName): try: Utils.removeFile(fileName) except: pass
def loadUi(ui_name): try: UiClass = uic.loadUiType("{}.ui".format( Utils.joinPath(Config.UI_ROOT, ui_name)))[0] except: raise Exceptions.FileSystemError class UiManager(UiClass): def __init__(self, useWindowGeometry=True): self.useWindowGeometry = useWindowGeometry self.setupUi(self) self.setupUiLayout() self.ignoreKeys = [] def setupUiLayout(self): if isinstance(self, QtWidgets.QMainWindow) or isinstance( self, QtWidgets.QDialog): self.setWindowIcon(QtGui.QIcon(Config.ICON_IMAGE)) title = self.windowTitle() if title == "": self.setWindowTitle(Config.APP_NAME) else: self.setWindowTitle("{} - {}".format( Config.APP_NAME, T(title))) self.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False) if self.useWindowGeometry: windowGeometry = DB.temp.getWindowGeometry( self.__class__.__name__) if windowGeometry != None: self.restoreGeometry( QtCore.QByteArray.fromBase64(windowGeometry)) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setAds() self.setFont(Translator.getFont()) for widget in self.findChildren(QtWidgets.QTextBrowser): widget.setFont(Translator.getDocFont(widget.font())) for widget in self.findChildren(QtWidgets.QLabel): widget.setFont(Translator.getFont(widget.font())) def setAds(self): adArea = self.findChildren(QtWidgets.QWidget, QtCore.QRegExp("^adArea_\d+$")) adGroup = self.findChildren(QtWidgets.QWidget, QtCore.QRegExp("^adGroup_\d+$")) if AdManager.Config.SHOW: for widget in adArea: Utils.setPlaceholder( widget, AdManager.Ad(minimumSize=widget.minimumSize(), responsive=True)) else: for widget in adArea + adGroup: widget.setParent(None) def ignoreKey(self, *args): for key in args: self.ignoreKeys.append(key) def keyPressEvent(self, event): if event.key() in self.ignoreKeys: return event.ignore() else: return self.keyPressEvent(event) def done(self, *args, **kwargs): self.saveWindow() return self.done(*args, **kwargs) def saveWindow(self): if self.useWindowGeometry: DB.temp.setWindowGeometry( self.__class__.__name__, self.saveGeometry().toBase64().data()) return UiManager