57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
# Python imports
|
|
import subprocess
|
|
|
|
# Gtk imports
|
|
import gi
|
|
gi.require_version('Gtk', '3.0')
|
|
from gi.repository import Gtk
|
|
from gi.repository import GdkPixbuf
|
|
|
|
# Application imports
|
|
|
|
|
|
class ThumbnailMixin:
|
|
"""docstring for ThumbnailMixin"""
|
|
|
|
def create_gtk_image(self, path, wxh):
|
|
try:
|
|
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
|
|
filename = path,
|
|
width = wxh[0],
|
|
height = wxh[1],
|
|
preserve_aspect_ratio = True)
|
|
return Gtk.Image.new_from_pixbuf(pixbuf)
|
|
except Exception as e:
|
|
print(repr(e))
|
|
|
|
return Gtk.Image()
|
|
|
|
def generate_thumbnail(self, fullPathFile, hashImgpth):
|
|
# Stream duration
|
|
command = ["ffprobe", "-v", "error", "-select_streams", "v:0", "-show_entries", "stream=duration", "-of", "default=noprint_wrappers=1:nokey=1", fullPathFile]
|
|
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", fullPathFile]
|
|
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", fullPathFile]
|
|
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", fullPathFile]
|
|
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, "-i", fullPathFile, "-an", "-vframes", "1", "-s", "320x180", "-q:v", "2", hashImgpth]
|
|
subprocess.call(command)
|