mirror of
https://github.com/alanorth/safari-bingo-cards.git
synced 2024-11-26 16:48:23 +01:00
Compare commits
6 Commits
05652369ad
...
5a02d07a11
Author | SHA1 | Date | |
---|---|---|---|
5a02d07a11 | |||
ab9cfb9db6 | |||
00ab133921 | |||
ef3dcd432f | |||
4465c08c78 | |||
267ade7677 |
23
README.md
23
README.md
@ -6,11 +6,34 @@ Fun proof of concept to generate random wildlife bingo cards for safaris with da
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
Once the requirements are satisfied you can generate a card. By default it generates a 4x4 grid with 16 images:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ ./generate.py -i data/animals.csv -o out.jpg
|
$ ./generate.py -i data/animals.csv -o out.jpg
|
||||||
|
[INFO] Generated random sample of 32 animals...
|
||||||
|
[INFO] > Creating thumbnail for Helmeted guineafowl...
|
||||||
|
[INFO] Generated card with a 4x4 grid of animals...
|
||||||
|
[INFO] Wrote out.jpg
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The script will download the images from Wikipedia, generate thumbnails for the sampled animals, and output a bingo card as a JPEG file.
|
||||||
|
|
||||||
|
# Requirements
|
||||||
|
Set up a Python 3.11+ virtual environment and install the requirements:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python3 -m .venv
|
||||||
|
$ source .venv/bin/activate
|
||||||
|
$ pip install -r requirements.lock
|
||||||
|
```
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
|
||||||
|
- Credit photographers — these photos are all some variation of CC-BY so we need to give attribution
|
||||||
|
- Add filtering by region — the metadata already exists, though perhaps needs to be adjusted
|
||||||
|
- Refactor — perhaps needs to be more object oriented
|
||||||
|
- Make a web frontend — I can imagine a light frontend that would shuffle the images in realtime and allow generation of a number of cards
|
||||||
|
|
||||||
# License
|
# License
|
||||||
This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
This work is licensed under the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html).
|
||||||
|
|
||||||
|
@ -155,8 +155,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
# Get a random list of animal IDs. We will build a square grid using the
|
# Get a random list of animal IDs. We will build a square grid using the
|
||||||
# "across" parameter passed by the user.
|
# "across" parameter passed by the user.
|
||||||
logger.info(f"Generating random sample of {animals_df.shape[0]} animals...")
|
|
||||||
animal_ids = animals_df["id"].sample(args.across * args.across)
|
animal_ids = animals_df["id"].sample(args.across * args.across)
|
||||||
|
logger.info(f"Generated random sample of {animals_df.shape[0]} animals...")
|
||||||
|
|
||||||
# Slice those random animals from the dataframe
|
# Slice those random animals from the dataframe
|
||||||
animals_df_random = animals_df[animals_df["id"].isin(animal_ids)]
|
animals_df_random = animals_df[animals_df["id"].isin(animal_ids)]
|
||||||
@ -174,6 +174,7 @@ if __name__ == "__main__":
|
|||||||
# Join all thumbnails together in an array of x across with a padding of 2
|
# Join all thumbnails together in an array of x across with a padding of 2
|
||||||
# pixels between each square.
|
# pixels between each square.
|
||||||
joined = pyvips.Image.arrayjoin(thumbnails, across=args.across, shim=2)
|
joined = pyvips.Image.arrayjoin(thumbnails, across=args.across, shim=2)
|
||||||
|
logger.info(f"Generated card with a {args.across}x{args.across} grid of animals...")
|
||||||
|
|
||||||
joined.jpegsave(args.output_file, optimize_coding=True, strip=True)
|
joined.jpegsave(args.output_file, optimize_coding=True, strip=True)
|
||||||
logger.info(f"Wrote {args.output_file}")
|
logger.info(f"Wrote {args.output_file}")
|
||||||
|
85
requirements-dev.lock
Normal file
85
requirements-dev.lock
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# generated by rye
|
||||||
|
# use `rye lock` or `rye sync` to update this lockfile
|
||||||
|
#
|
||||||
|
# last locked with the following flags:
|
||||||
|
# pre: false
|
||||||
|
# features: []
|
||||||
|
# all-features: false
|
||||||
|
# with-sources: false
|
||||||
|
|
||||||
|
-e file:.
|
||||||
|
asttokens==2.4.1
|
||||||
|
# via stack-data
|
||||||
|
black==24.2.0
|
||||||
|
certifi==2024.2.2
|
||||||
|
# via requests
|
||||||
|
cffi==1.16.0
|
||||||
|
# via pyvips
|
||||||
|
charset-normalizer==3.3.2
|
||||||
|
# via requests
|
||||||
|
click==8.1.7
|
||||||
|
# via black
|
||||||
|
colorama==0.4.6
|
||||||
|
# via safari-bingo-cards
|
||||||
|
decorator==5.1.1
|
||||||
|
# via ipython
|
||||||
|
executing==2.0.1
|
||||||
|
# via stack-data
|
||||||
|
idna==3.6
|
||||||
|
# via requests
|
||||||
|
ipython==8.22.1
|
||||||
|
isort==5.13.2
|
||||||
|
jedi==0.19.1
|
||||||
|
# via ipython
|
||||||
|
matplotlib-inline==0.1.6
|
||||||
|
# via ipython
|
||||||
|
mypy-extensions==1.0.0
|
||||||
|
# via black
|
||||||
|
numpy==1.26.4
|
||||||
|
# via pandas
|
||||||
|
packaging==23.2
|
||||||
|
# via black
|
||||||
|
pandas==2.2.1
|
||||||
|
# via safari-bingo-cards
|
||||||
|
parso==0.8.3
|
||||||
|
# via jedi
|
||||||
|
pathspec==0.12.1
|
||||||
|
# via black
|
||||||
|
pexpect==4.9.0
|
||||||
|
# via ipython
|
||||||
|
pkgconfig==1.5.5
|
||||||
|
# via pyvips
|
||||||
|
platformdirs==4.2.0
|
||||||
|
# via black
|
||||||
|
prompt-toolkit==3.0.43
|
||||||
|
# via ipython
|
||||||
|
ptyprocess==0.7.0
|
||||||
|
# via pexpect
|
||||||
|
pure-eval==0.2.2
|
||||||
|
# via stack-data
|
||||||
|
pycparser==2.21
|
||||||
|
# via cffi
|
||||||
|
pygments==2.17.2
|
||||||
|
# via ipython
|
||||||
|
python-dateutil==2.8.2
|
||||||
|
# via pandas
|
||||||
|
pytz==2024.1
|
||||||
|
# via pandas
|
||||||
|
pyvips==2.2.2
|
||||||
|
# via safari-bingo-cards
|
||||||
|
requests==2.31.0
|
||||||
|
# via safari-bingo-cards
|
||||||
|
six==1.16.0
|
||||||
|
# via asttokens
|
||||||
|
# via python-dateutil
|
||||||
|
stack-data==0.6.3
|
||||||
|
# via ipython
|
||||||
|
traitlets==5.14.1
|
||||||
|
# via ipython
|
||||||
|
# via matplotlib-inline
|
||||||
|
tzdata==2024.1
|
||||||
|
# via pandas
|
||||||
|
urllib3==2.2.1
|
||||||
|
# via requests
|
||||||
|
wcwidth==0.2.13
|
||||||
|
# via prompt-toolkit
|
42
requirements.lock
Normal file
42
requirements.lock
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# generated by rye
|
||||||
|
# use `rye lock` or `rye sync` to update this lockfile
|
||||||
|
#
|
||||||
|
# last locked with the following flags:
|
||||||
|
# pre: false
|
||||||
|
# features: []
|
||||||
|
# all-features: false
|
||||||
|
# with-sources: false
|
||||||
|
|
||||||
|
-e file:.
|
||||||
|
certifi==2024.2.2
|
||||||
|
# via requests
|
||||||
|
cffi==1.16.0
|
||||||
|
# via pyvips
|
||||||
|
charset-normalizer==3.3.2
|
||||||
|
# via requests
|
||||||
|
colorama==0.4.6
|
||||||
|
# via safari-bingo-cards
|
||||||
|
idna==3.6
|
||||||
|
# via requests
|
||||||
|
numpy==1.26.4
|
||||||
|
# via pandas
|
||||||
|
pandas==2.2.1
|
||||||
|
# via safari-bingo-cards
|
||||||
|
pkgconfig==1.5.5
|
||||||
|
# via pyvips
|
||||||
|
pycparser==2.21
|
||||||
|
# via cffi
|
||||||
|
python-dateutil==2.8.2
|
||||||
|
# via pandas
|
||||||
|
pytz==2024.1
|
||||||
|
# via pandas
|
||||||
|
pyvips==2.2.2
|
||||||
|
# via safari-bingo-cards
|
||||||
|
requests==2.31.0
|
||||||
|
# via safari-bingo-cards
|
||||||
|
six==1.16.0
|
||||||
|
# via python-dateutil
|
||||||
|
tzdata==2024.1
|
||||||
|
# via pandas
|
||||||
|
urllib3==2.2.1
|
||||||
|
# via requests
|
Loading…
Reference in New Issue
Block a user