summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorGermainZ <germanosz@gmail.com>2014-03-09 12:46:36 +0200
committerGermainZ <germanosz@gmail.com>2014-03-09 12:46:36 +0200
commit085ea1e99122a032424133104fca2e76610d8b1d (patch)
tree29176b2ca3fdd7a02d7653ed155a399714831121
parentf61fbfae9257363979ded4688240f6a83c3f3233 (diff)
downloadranger-085ea1e99122a032424133104fca2e76610d8b1d.tar.gz
Allow scope.sh to be used for image previews
-rw-r--r--ranger/__init__.py1
-rw-r--r--ranger/container/file.py3
-rw-r--r--ranger/core/actions.py28
-rw-r--r--ranger/core/main.py6
-rwxr-xr-xranger/data/scope.sh4
-rw-r--r--ranger/gui/widgets/browsercolumn.py5
6 files changed, 42 insertions, 5 deletions
diff --git a/ranger/__init__.py b/ranger/__init__.py
index c3f05d3d..05d2f623 100644
--- a/ranger/__init__.py
+++ b/ranger/__init__.py
@@ -25,6 +25,7 @@ MAX_RESTORABLE_TABS = 3
 MACRO_DELIMITER = '%'
 DEFAULT_PAGER = 'less'
 LOGFILE = '/tmp/ranger_errorlog'
+CACHEDIR = os.path.expanduser("~/.cache/ranger")
 USAGE = '%prog [options] [path]'
 VERSION = 'ranger-master %s\n\nPython %s' % (__version__, sys.version)
 
diff --git a/ranger/container/file.py b/ranger/container/file.py
index 7c83cace..a404ef91 100644
--- a/ranger/container/file.py
+++ b/ranger/container/file.py
@@ -87,3 +87,6 @@ class File(FileSystemObject):
 
     def get_preview_source(self, width, height):
         return self.fm.get_preview(self, width, height)
+
+    def is_image_preview(self):
+        return 'imagepreview' in self.fm.previews[self.realpath]
diff --git a/ranger/core/actions.py b/ranger/core/actions.py
index 80b35970..9f20adbb 100644
--- a/ranger/core/actions.py
+++ b/ranger/core/actions.py
@@ -11,6 +11,7 @@ from os.path import join, isdir, realpath, exists
 from os import link, symlink, getcwd, listdir, stat
 from inspect import cleandoc
 from stat import S_IEXEC
+from hashlib import sha1
 
 import ranger
 from ranger.ext.direction import Direction
@@ -782,7 +783,11 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware):
         if self.settings.preview_images and self.thisfile.image:
             pager.set_image(self.thisfile.realpath)
         else:
-            pager.set_source(self.thisfile.get_preview_source(pager.wid, pager.hei))
+            f = self.thisfile.get_preview_source(pager.wid, pager.hei)
+            if self.thisfile.is_image_preview:
+                pager.set_image(f)
+            else:
+                pager.set_source(f)
 
     # --------------------------
     # -- Previews
@@ -836,8 +841,17 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware):
                     return None
 
                 data['loading'] = True
+
+                cacheimg = os.path.join(ranger.CACHEDIR, sha1(path.encode()).hexdigest() + '.jpg')
+                if (os.path.isfile(cacheimg) and os.path.getmtime(cacheimg) > os.path.getmtime(path)):
+                    data['foundpreview'] = True
+                    data['imagepreview'] = True
+                    pager.set_image(cacheimg)
+                    data['loading'] = False
+                    return cacheimg
+
                 loadable = CommandLoader(args=[self.settings.preview_script,
-                    path, str(width), str(height)], read=True,
+                    path, str(width), str(height), cacheimg], read=True,
                     silent=True, descr="Getting preview of %s" % path)
                 def on_after(signal):
                     exit = signal.process.poll()
@@ -851,6 +865,8 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware):
                         data[(width, -1)] = content
                     elif exit == 5:
                         data[(-1, -1)] = content
+                    elif exit == 6:
+                        data['imagepreview'] = True
                     elif exit == 1:
                         data[(-1, -1)] = None
                         data['foundpreview'] = False
@@ -871,8 +887,12 @@ class Actions(FileManagerAware, EnvironmentAware, SettingsAware):
                     data['loading'] = False
                     pager = self.ui.get_pager()
                     if self.thisfile and self.thisfile.is_file:
-                        pager.set_source(self.thisfile.get_preview_source(
-                            pager.wid, pager.hei))
+                        if 'imagepreview' in data:
+                            pager.set_image(cacheimg)
+                            return cacheimg
+                        else:
+                            pager.set_source(self.thisfile.get_preview_source(
+                                pager.wid, pager.hei))
                 def on_destroy(signal):
                     try:
                         del self.previews[path]
diff --git a/ranger/core/main.py b/ranger/core/main.py
index ff4e02d6..631209cd 100644
--- a/ranger/core/main.py
+++ b/ranger/core/main.py
@@ -110,6 +110,12 @@ def main():
             from ranger.ext import curses_interrupt_handler
             curses_interrupt_handler.install_interrupt_handler()
 
+        # Create cache directory
+        if fm.settings.preview_images and fm.settings.use_preview_script:
+            from ranger import CACHEDIR
+            if not os.path.exists(CACHEDIR):
+                os.makedirs(CACHEDIR)
+
         # Run the file manager
         fm.initialize()
         ranger.api.hook_init(fm)
diff --git a/ranger/data/scope.sh b/ranger/data/scope.sh
index 76481f94..eb905d99 100755
--- a/ranger/data/scope.sh
+++ b/ranger/data/scope.sh
@@ -16,11 +16,13 @@
 # 3    | fix width  | success. Don't reload when width changes
 # 4    | fix height | success. Don't reload when height changes
 # 5    | fix both   | success. Don't ever reload
+# 6    | image      | success. display the image $cached points to as an image preview
 
 # Meaningful aliases for arguments:
 path="$1"    # Full path of the selected file
 width="$2"   # Width of the preview pane (number of fitting characters)
 height="$3"  # Height of the preview pane (number of fitting characters)
+cached="$4"  # Path that should be used to cache image previews
 
 maxln=200    # Stop after $maxln lines.  Can be used like ls | head -n $maxln
 
@@ -75,6 +77,8 @@ case "$mimetype" in
     image/*)
         img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;;
     # Display information about media files:
+    video/*)
+        ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;;
     video/* | audio/*)
         exiftool "$path" && exit 5
         # Use sed to remove spaces so the output fits into the narrow window
diff --git a/ranger/gui/widgets/browsercolumn.py b/ranger/gui/widgets/browsercolumn.py
index d705e6ba..14900e8b 100644
--- a/ranger/gui/widgets/browsercolumn.py
+++ b/ranger/gui/widgets/browsercolumn.py
@@ -186,7 +186,10 @@ class BrowserColumn(Pager):
             if f is None:
                 Pager.close(self)
             else:
-                self.set_source(f)
+                if self.target.is_image_preview():
+                    self.set_image(f)
+                else:
+                    self.set_source(f)
                 Pager.draw(self)
 
     def _draw_directory(self):