summaryrefslogtreecommitdiff
path: root/fbin/fbin.py
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2019-08-17 15:17:02 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2019-08-17 15:19:36 +0200
commit13d38291bd07401bd16b6e6805edc72bf0029b2f (patch)
tree2f550185745df9ffb219b468fc1e33447b5a7a22 /fbin/fbin.py
parentce47bae559df59be8d8b2016cefa62c2fa00d0e2 (diff)
Fetch and store thumbnails via storage modules
This will allow us to remotely store thumbnails in case of S3. For S3 the thumb bucket is configurable to allow these to be stored separately. The S3 key for thumbnails does not conflict with files, so these can be stored in the same bucket if needed.
Diffstat (limited to 'fbin/fbin.py')
-rwxr-xr-xfbin/fbin.py52
1 files changed, 28 insertions, 24 deletions
diff --git a/fbin/fbin.py b/fbin/fbin.py
index 983c1aa..d1dff76 100755
--- a/fbin/fbin.py
+++ b/fbin/fbin.py
@@ -359,33 +359,37 @@ def videos():
@app.route('/t/<hash:hash>')
@app.route('/thumb/<hash:hash>')
def thumb(hash):
- thumbfile = os.path.join(current_app.config['THUMB_DIRECTORY'], hash + '.jpg')
- if not os.access(thumbfile, os.F_OK):
- f = get_file(hash, update_accessed = False)
- if f.is_image():
- try:
- #im = Image.open(f.get_path())
+ f = get_file(hash, update_accessed=False)
+ response = storage.get_thumbnail(f)
+ if not response:
+ with tempfile.NamedTemporaryFile(suffix='.jpg') as ttf: # temporary thumb file
+ if f.is_image():
+ try:
+ with storage.temp_file(f) as tf:
+ im = Image.open(tf)
+ # Check for valid JPEG modes.
+ if im.mode not in ('1', 'L', 'RGB', 'RGBX', 'CMYK', 'YCbCr'):
+ im = im.convert('RGB')
+ im.thumbnail(current_app.config.get('THUMB_SIZE', (128, 128)), Image.ANTIALIAS)
+ im.save(ttf)
+ except IOError:
+ # We can't generate a thumbnail for this file, just say it doesn't exist.
+ abort(404)
+ elif f.is_video():
with storage.temp_file(f) as tf:
- im = Image.open(tf)
- # Check for valid JPEG modes.
- if im.mode not in ('1', 'L', 'RGB', 'RGBX', 'CMYK', 'YCbCr'):
- im = im.convert('RGB')
- im.thumbnail(current_app.config.get('THUMB_SIZE', (128, 128)), Image.ANTIALIAS)
- im.save(thumbfile)
- except IOError:
- # We can't generate a thumbnail for this file, just say it doesn't exist.
+ p = subprocess.run(['ffmpegthumbnailer', '-i', '-', '-o', ttf.name], stdin=tf)
+ if p.returncode != 0:
+ abort(404)
+ else:
abort(404)
- elif f.is_video():
- #p = subprocess.run(['ffmpegthumbnailer', '-i', f.get_path(), '-o', thumbfile])
- with storage.temp_file(f) as tf:
- p = subprocess.run(['ffmpegthumbnailer', '-i', '-', '-o', thumbfile], stdin=tf)
- if p.returncode != 0:
- if os.path.exists(thumbfile):
- os.unlink(thumbfile)
+ ttf.seek(0)
+ if not os.path.getsize(ttf.name):
abort(404)
- else:
- abort(404)
- return send_file(thumbfile)
+ storage.store_thumbnail(f, ttf)
+ response = storage.get_thumbnail(f)
+ if isinstance(response, Response):
+ return response
+ return send_file(response, attachment_filename='thumb.jpg')
@app.route('/h')
@app.route('/help')