Need a Linux solution for looped slideshow from pictures in some folder. Pictures may be deleted and added, so it's a bonus if it doesn't stop/crash if currently shown picture is deleted.
This is going to sound crazy, but it works (better than I expected even) and is not that hard to setup. The idea is to make your viewing program look at a single file and then have a command line process that copies each of your files in your directory to that file you view. I tested this with Geeqie and gthumb and it actually works pretty well. gthumb even can handle the image being updated every second and both supported the name of the file type being different from the actual file type (jpg, png, gif, etc).
So here is what you do:
- Make a directory with only your pictures in them.
- open a terminal window and change to the directory made in the previous step.
Run this command, substituting 5 with however many seconds you want to wait in between updates.
while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done
Open gthumb and view the image in your home directory called slideshow.jpg, it should rotate the picture. You can make gthumb full screen now if you need to.
Try adding and removing pictures from the picture directory. It won't actually update until its finished going through the whole directory each time, but it will update. The echo $i is in there just so you can see what picture it just copied into place each time.
When you are ready to stop the slideshow, you can press Ctrl-C in the terminal window.
feh -Y -x -q -D 5 -B black -F -Z -z -r /media/
Impressive does the job well, with (or without if you wish) transitions.
Slideshow in random (
-X) order with 3 seconds delay (
-a 3) and autoquit at the end (
impressive -XQa3 *
It's worth noticing that it allows scripting, and is multiplatform.
The only drawback is that it currently crashes if there is a directory in the list of files.
I looked at many different solutions to this problem, including fbi, feh, and more.
I ended up using pygame of all things. This may not be clean, ideal, or optimal, but it does the job, it provides quick changes between slides without a long dark space between (fbi does this if you needed it to exit and restart to vary the timing between slide changes as is my case). Nonetheless, it is running (tested, deployed) code. As an added advantage, this code appears to be impossible to break out of into a shell and appears to be safe to run from .bashrc on an autologin. (This is added safety on a system that has no keyboard).
If you change the slide list and/or timing in the configuration file, you'll need to restart the script for changes to take effect. If you just replace the existing slide files, the changes will be picked up at the next slide change.
import pygame import sys import time import os import re # Initialize the display #pygame.init() os.environ['SDL_NOMOUSE'] = '1' pygame.display.init() pygame.mouse.set_visible(False) size = (pygame.display.Info().current_w, pygame.display.Info().current_h) black = 0, 0, 0 print("Obtained screen dimensions (", size, ")") screen = pygame.display.set_mode(size, flags=pygame.HWSURFACE|pygame.DOUBLEBUF) # Get the slide show data LIST = open(os.environ['HOME']+"/data_dir/slide_order.txt","r") slides =  for line in LIST: line = line.rstrip('\r\n') if (re.match('^[\w\d\. ]+\t+\d+$', line)): (fn, duration) = re.split('\t+', line) duration = int(duration) print("Adding file:", fn, "for", duration, "seconds") slides.append([fn, duration]) LIST.close() while True: for (index, values) in enumerate(slides): print("Retrieved (",values,") at index:",index) (fn, duration) = values print("Loading image") image = pygame.image.load(os.environ['HOME']+"/data_dir/"+fn) print("Scaling image") image = pygame.transform.scale(image, size) irect = image.get_rect() print("Clearing buffer") screen.fill(black) print("BLIT") screen.blit(image, irect) print("Display Image") pygame.display.flip() print("Sleeping...") time.sleep(duration) print("Awake") sys.exit(0)