mirror of
https://github.com/dnet/pySSTV.git
synced 2025-12-31 21:59:57 +01:00
added repeater example
This commit is contained in:
parent
43d5e616ae
commit
eb5bc8d55b
73
examples/repeater.py
Normal file
73
examples/repeater.py
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
"""
|
||||
Simple repeater that monitors a single directory using inotify, and if
|
||||
an image appears, it tries to repeat it on using the PyAudio example,
|
||||
trying to match the mode used for receiving it. It can be tested by
|
||||
simply copying/linking images to the directory or suing an SSTV
|
||||
receiver such as slowrx or QSSTV.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_CREATE
|
||||
from pyaudio_sstv import PyAudioSSTV
|
||||
from color import MartinM1, MartinM2, ScottieS1, ScottieS2
|
||||
from grayscale import Robot8BW, Robot24BW
|
||||
from PIL import Image
|
||||
from os import path
|
||||
|
||||
# matches the abbreviations used by slowrx and QSSTV
|
||||
MODE_MAP = {
|
||||
'M1': MartinM1,
|
||||
'M2': MartinM2,
|
||||
'S1': ScottieS1,
|
||||
'S2': ScottieS2,
|
||||
'R8BW': Robot8BW,
|
||||
'R24BW': Robot24BW,
|
||||
}
|
||||
|
||||
class EventHandler(ProcessEvent):
|
||||
def process_IN_CREATE(self, event):
|
||||
filename = event.pathname
|
||||
print('Found image', filename)
|
||||
mode = get_module_for_filename(filename)
|
||||
img = Image.open(filename)
|
||||
if mode is None:
|
||||
mode = get_module_for_image(img)
|
||||
if mode is None:
|
||||
print('No suitable mode found to repeat', filename)
|
||||
return
|
||||
print('Repeating image using', mode.__name__)
|
||||
sstv = mode(img, 44100, 16)
|
||||
sstv.vox_enabled = True
|
||||
PyAudioSSTV(sstv).execute()
|
||||
|
||||
def get_module_for_filename(filename):
|
||||
basename, _ = path.splitext(path.basename(filename))
|
||||
for mode, module in MODE_MAP.iteritems():
|
||||
if mode in basename:
|
||||
return module
|
||||
|
||||
def get_module_for_image(image):
|
||||
size = image.size
|
||||
for mode in MODE_MAP.itervalues():
|
||||
if all(i >= m for i, m in zip(size, (mode.WIDTH, mode.HEIGHT))):
|
||||
return mode
|
||||
|
||||
def main():
|
||||
from sys import argv, stderr
|
||||
try:
|
||||
directory = argv[1]
|
||||
except IndexError:
|
||||
print("Usage: {0} <directory>".format(argv[0]), file=stderr)
|
||||
else:
|
||||
watch(directory)
|
||||
|
||||
def watch(directory):
|
||||
wm = WatchManager()
|
||||
notifier = Notifier(wm, EventHandler())
|
||||
wm.add_watch(directory, IN_CREATE)
|
||||
notifier.loop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Loading…
Reference in a new issue