From 2904e7817ee31c4b9ca21d3158264f80cfaa0f64 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Sun, 9 Feb 2020 19:53:03 -0600 Subject: [PATCH] Added ffprobe checks --- bin/pytop-0-0-1-x64.deb | Bin 24232 -> 24500 bytes src/Pytop/widgets/Grid.py | 12 ++++++++---- src/Pytop/widgets/Icon.py | 28 +++++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/bin/pytop-0-0-1-x64.deb b/bin/pytop-0-0-1-x64.deb index e0e02c936ae8985fdb7a0072aadade9a40ae55e0..68dd6fbee6d470f3b03b115d71bcbdf010f340fa 100644 GIT binary patch delta 3845 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 diff --git a/src/Pytop/widgets/Grid.py b/src/Pytop/widgets/Grid.py index 6e81166..3154bd9 100644 --- a/src/Pytop/widgets/Grid.py +++ b/src/Pytop/widgets/Grid.py @@ -38,7 +38,6 @@ class Grid: self.vidsFilter = settings.returnVidsFilter() self.imagesFilter = settings.returnImagesFilter() self.iconFactory = Icon(settings) - self.helperThread = None # Helper thread object self.selectedFiles = [] self.currentPath = "" @@ -94,6 +93,7 @@ class Grid: image = self.iconFactory.createIcon(dirPath, file).get_pixbuf() glib.idle_add(self.addToGrid, (image, file,)) + @threaded def fillVideoIcons(self, dirPath, files, start): model = self.grid.get_model() @@ -104,11 +104,15 @@ class Grid: i = start for file in files: - image = self.iconFactory.createThumbnail(dirPath, file).get_pixbuf() - iter = model.get_iter_from_string(str(i)) - glib.idle_add(self.replaceInGrid, (iter, image,)) + self.updateGrid(model, dirPath, file, i) i += 1 + @threaded + def updateGrid(self, model, dirPath, file, i): + image = self.iconFactory.createThumbnail(dirPath, file).get_pixbuf() + iter = model.get_iter_from_string(str(i)) + glib.idle_add(self.replaceInGrid, (iter, image,)) + def addToGrid(self, dataSet): self.store.append([dataSet[0], dataSet[1]]) diff --git a/src/Pytop/widgets/Icon.py b/src/Pytop/widgets/Icon.py index e7a067a..e443d42 100644 --- a/src/Pytop/widgets/Icon.py +++ b/src/Pytop/widgets/Icon.py @@ -176,7 +176,33 @@ class Icon: def generateVideoThumbnail(self, fullPath, hashImgPth): proc = None try: - proc = subprocess.Popen(["ffmpeg", "-i", fullPath, "-vframes", "1", "-s", "320x180", "-q:v", "2", hashImgPth]) + # Stream duration + command = ["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=duration", "-of", "default=noprint_wrappers=1:nokey=1", fullPath] + data = subprocess.run(command, stdout=subprocess.PIPE) + duration = data.stdout.decode('utf-8') + + # Format (container) duration + if "N/A" in duration: + command = ["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", fullPath] + data = subprocess.run(command , stdout=subprocess.PIPE) + duration = data.stdout.decode('utf-8') + + # Stream duration type: image2 + if "N/A" in duration: + command = ["ffprobe", "-v", "error", "-select_streams", "v:0", "-f", "image2", "-show_entries", "stream=duration", "-of", "default=noprint_wrappers=1:nokey=1", fullPath] + data = subprocess.run(command, stdout=subprocess.PIPE) + duration = data.stdout.decode('utf-8') + + # Format (container) duration type: image2 + if "N/A" in duration: + command = ["ffprobe", "-v", "error", "-f", "image2", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", fullPath] + data = subprocess.run(command , stdout=subprocess.PIPE) + duration = data.stdout.decode('utf-8') + + # Get frame roughly 35% through video + grabTime = str( int( float( duration.split(".")[0] ) * 0.35) ) + command = ["ffmpeg", "-ss", grabTime, "-an", "-i", fullPath, "-s", "320x180", "-vframes", "1", hashImgPth] + proc = subprocess.Popen(command) proc.wait() except Exception as e: print("Video thumbnail generation issue in thread:")