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