initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
out
|
||||||
22
config.toml
Normal file
22
config.toml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[loop]
|
||||||
|
enable = true # run process in a loop, default: false
|
||||||
|
sleep = 60 # (seconds) time to sleep between generating images, default: 60
|
||||||
|
|
||||||
|
[[image]]
|
||||||
|
output = "out/itistoday.gif" # required
|
||||||
|
template = "./res/templates/pastel rainbow border.gif"
|
||||||
|
# size=[120, 20] # specify size if template is not specified
|
||||||
|
command = ["/usr/bin/date", "+It is %a %d %b"] # required, command to generate text
|
||||||
|
|
||||||
|
font = "./res/curie.bdf" # required, only BDF fonts are supported atm
|
||||||
|
text_filters = [ "lowercase" ] # text_filters available: lowercase, uppercase
|
||||||
|
text_offset = [24, 4] # offset the text to move it around the image, default: [0, 0]
|
||||||
|
|
||||||
|
[[image]]
|
||||||
|
output = "out/uptime.gif"
|
||||||
|
template = "./res/templates/pastel rainbow border.gif"
|
||||||
|
command = ["bash", "-c", "/usr/bin/uptime -p | cut -d, -f-2"]
|
||||||
|
|
||||||
|
font = "./res/curie.bdf"
|
||||||
|
text_filters = [ "lowercase" ]
|
||||||
|
text_offset = [21, 4]
|
||||||
16
readme.md
Normal file
16
readme.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# nowblinkie
|
||||||
|
|
||||||
|
generate dynamic blinkies to use on your website,
|
||||||
|
using the output of arbitrary commands.
|
||||||
|
|
||||||
|
## usage
|
||||||
|
|
||||||
|
1. install requirements: `pip install -r requirements.txt`
|
||||||
|
2. run: `python main/src.py [-c config-file] [-L]`.
|
||||||
|
|
||||||
|
## config
|
||||||
|
|
||||||
|
the provided [example config file](./config.toml) lists all the options that can be used.
|
||||||
|
the blinkie templates and the font
|
||||||
|
([curie](https://github.com/oppiliappan/curie))
|
||||||
|
required to render them are included in the repository.
|
||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pillow==12.2.0
|
||||||
6493
res/curie.bdf
Executable file
6493
res/curie.bdf
Executable file
File diff suppressed because it is too large
Load Diff
83
res/curie.license.txt
Normal file
83
res/curie.license.txt
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
Copyright (c) 2018 Akshay Oppiliappan (nerdypepper@tuta.io)
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
----------------------------------------------------------- SIL OPEN FONT
|
||||||
|
LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation efforts
|
||||||
|
of academic and linguistic communities, and to provide a free and open framework
|
||||||
|
in which fonts may be shared and improved in partnership with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The fonts,
|
||||||
|
including any derivative works, can be bundled, embedded, redistributed and/or
|
||||||
|
sold with any software provided that any reserved names are not used by
|
||||||
|
derivative works. The fonts and derivatives, however, cannot be released under
|
||||||
|
any other type of license. The requirement for fonts to remain under this
|
||||||
|
license does not apply to any document created using the fonts or their
|
||||||
|
derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS "Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may include source
|
||||||
|
files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the copyright
|
||||||
|
statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting, or
|
||||||
|
substituting -- in part or in whole -- any of the components of the Original
|
||||||
|
Version, by changing formats or by porting the Font Software to a new
|
||||||
|
environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical writer or other
|
||||||
|
person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION AND CONDITIONS Permission is hereby granted, free of charge, to any
|
||||||
|
person obtaining a copy of the Font Software, to use, study, copy, merge, embed,
|
||||||
|
modify, redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components, in Original
|
||||||
|
or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy contains
|
||||||
|
the above copyright notice and this license. These can be included either as
|
||||||
|
stand-alone text files, human-readable headers or in the appropriate
|
||||||
|
machine-readable metadata fields within text or binary files as long as those
|
||||||
|
fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font Name(s)
|
||||||
|
unless explicit written permission is granted by the corresponding Copyright
|
||||||
|
Holder. This restriction only applies to the primary font name as presented to
|
||||||
|
the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software
|
||||||
|
shall not be used to promote, endorse or advertise any Modified Version, except
|
||||||
|
to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s)
|
||||||
|
or with their explicit written permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole, must be
|
||||||
|
distributed entirely under this license, and must not be distributed under any
|
||||||
|
other license. The requirement for fonts to remain under this license does not
|
||||||
|
apply to any document created using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION This license becomes null and void if any of the above conditions
|
||||||
|
are not met.
|
||||||
|
|
||||||
|
DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY
|
||||||
|
TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||||
BIN
res/templates/pastel rainbow border.gif
Normal file
BIN
res/templates/pastel rainbow border.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
BIN
res/templates/window.gif
Normal file
BIN
res/templates/window.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 247 B |
78
src/main.py
Executable file
78
src/main.py
Executable file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# Akbar Rahman <hi@alv.cx>
|
||||||
|
#
|
||||||
|
|
||||||
|
import shlex
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import tomllib
|
||||||
|
|
||||||
|
from PIL import Image, ImageDraw, BdfFontFile
|
||||||
|
|
||||||
|
|
||||||
|
def get_args():
|
||||||
|
""" Get command line arguments """
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("-c", "--config", type=str, default="config.toml")
|
||||||
|
parser.add_argument("-L", "--no-loop", action="store_true")
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def generate(config):
|
||||||
|
if config.get('template'):
|
||||||
|
img = Image.open(config['template'])
|
||||||
|
else:
|
||||||
|
img = Image.new(mode="RGBA", size = config['size'])
|
||||||
|
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
with open(config['font'], "rb") as fp:
|
||||||
|
font = BdfFontFile.BdfFontFile(fp).to_imagefont()
|
||||||
|
|
||||||
|
process = subprocess.run(config['command'], stdout=subprocess.PIPE, shell=False)
|
||||||
|
if process.returncode != config.get('return_code', 0):
|
||||||
|
# process did not run succesfully.
|
||||||
|
# do not risk displaying that to user
|
||||||
|
return
|
||||||
|
|
||||||
|
text = process.stdout.decode('utf-8').split('\n')[0]
|
||||||
|
for filter in config.get('text_filters', []):
|
||||||
|
if filter == "lowercase":
|
||||||
|
text = text.lower()
|
||||||
|
elif filter == "uppercase":
|
||||||
|
text = text.upper()
|
||||||
|
|
||||||
|
draw.text(config.get('text_offset', [0, 0]), text, font=font)
|
||||||
|
|
||||||
|
img.save(config['output'], save_all=True)
|
||||||
|
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
""" Entry point for script """
|
||||||
|
with open(args.config, "rb") as f:
|
||||||
|
config = tomllib.load(f)
|
||||||
|
|
||||||
|
print(f"{config=}")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for c in config['image']:
|
||||||
|
generate(c)
|
||||||
|
|
||||||
|
if args.no_loop:
|
||||||
|
break
|
||||||
|
|
||||||
|
if not config.get('loop', {}).get('enable'):
|
||||||
|
break
|
||||||
|
|
||||||
|
time.sleep(config.get('loop', {}).get('sleep', 60))
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
sys.exit(main(get_args()))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
sys.exit(0)
|
||||||
Reference in New Issue
Block a user