134 lines
3.8 KiB
Python
Executable File
134 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Created by br@re-web.eu, 2015
|
|
|
|
from gui import GUI_PyGame as GuiModule
|
|
|
|
import os
|
|
from datetime import datetime
|
|
import subprocess
|
|
import thread
|
|
from time import sleep
|
|
|
|
#####################
|
|
### Configuration ###
|
|
#####################
|
|
|
|
# Screen size
|
|
display_size = (1024, 768)
|
|
|
|
# Directory for slideshow pictures
|
|
slideshow_directory = "slideshow/"
|
|
|
|
# Source directory, can also be remote.
|
|
# Leave empty to disable sync
|
|
source_directory = "pi@photobooth:photobooth/" + datetime.now().strftime("%Y-%m-%d")
|
|
|
|
# Display time (in seconds) for slideshow pictures
|
|
display_time = 3
|
|
|
|
# Waiting time (in seconds) between synchronizations
|
|
sync_time = 60
|
|
|
|
###############
|
|
### Classes ###
|
|
###############
|
|
|
|
class Slideshow:
|
|
def __init__(self, display_size, display_time, directory, recursive=True):
|
|
self.directory = directory
|
|
self.recursive = recursive
|
|
self.filelist = []
|
|
self.display = GuiModule("Slideshow", display_size)
|
|
self.display_time = display_time
|
|
self.next = 0
|
|
|
|
def scan(self):
|
|
filelist = []
|
|
|
|
if self.recursive:
|
|
# Recursively walk all entries in the directory
|
|
for root, dirnames, filenames in os.walk(self.directory, followlinks=True):
|
|
for filename in filenames:
|
|
filelist.append(os.path.join(root, filename))
|
|
else:
|
|
# Add all entries in the directory
|
|
for item in os.listdir(self.directory):
|
|
filename = os.path.join(self.directory, item)
|
|
if os.path.isfile(filename):
|
|
filelist.append(filename)
|
|
|
|
self.filelist = filelist
|
|
self.next = 0
|
|
|
|
def handle_event(self, event):
|
|
if event.type == 0:
|
|
self.teardown()
|
|
elif event.type == 1:
|
|
self.handle_keypress(event.value)
|
|
|
|
def handle_keypress(self, key):
|
|
# Exit the application
|
|
if key == ord('q'):
|
|
self.teardown()
|
|
|
|
def display_next(self, text=""):
|
|
if self.next >= len(self.filelist):
|
|
self.scan()
|
|
if not self.filelist:
|
|
self.display.clear()
|
|
if text:
|
|
self.display.show_message(text)
|
|
else:
|
|
self.display.show_message("No pictures available!")
|
|
self.display.apply()
|
|
else:
|
|
filename = self.filelist[self.next]
|
|
self.next += 1
|
|
self.display.clear()
|
|
self.display.show_picture(filename)
|
|
if text:
|
|
self.display.show_message(text)
|
|
self.display.apply()
|
|
|
|
def run(self):
|
|
while True:
|
|
self.display_next()
|
|
sleep(self.display_time)
|
|
r, e = self.display.check_for_event()
|
|
if r:
|
|
self.handle_event(e)
|
|
|
|
def teardown(self):
|
|
self.display.teardown()
|
|
exit(0)
|
|
|
|
|
|
#################
|
|
### Functions ###
|
|
#################
|
|
|
|
def sync_folders(source_directory, target_directory, wait_time):
|
|
sleep(5)
|
|
while True:
|
|
print("[" + datetime.now().strftime("%H:%M:%S") + "] Sync "
|
|
+ source_directory + " --> " + target_directory)
|
|
try:
|
|
cmd = "rsync -rtu " + source_directory + " " + target_directory
|
|
output = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as e:
|
|
print("ERROR executing '" + e.cmd + "':\n" + e.output)
|
|
sleep(wait_time)
|
|
|
|
def main():
|
|
# Start a thread for syncing files
|
|
if len(source_directory) > 0:
|
|
thread.start_new_thread(sync_folders, (source_directory, slideshow_directory, sync_time) )
|
|
|
|
# Start the slideshow
|
|
slideshow = Slideshow(display_size, display_time, slideshow_directory, True)
|
|
slideshow.run()
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
exit(main()) |