Today I released Pyntrest v1.1.0. This release focuses on full Python 3 support. Furthermore rotation stored in EXIF information is now evaluated and applied to the images. Under the hood the most crucial libraries Django, Pillow and markdown have been updated to their latest versions.
What is Pyntrest?
Pyntrest is a flat-file image CMS written in Python that automatically generates a fully fledged web photo album from a local folder without the necessity to do boring stuff like setting up databases, content management systems or creating thumbnails. Pyntrest is for convenience lovers like me.
- Pyntrest uses a local folder and assumes that each (sub-) folder is a web photo album
- It will automatically scan for images and create web photo albums on request
- Web photo albums are browsable just like on your disk
- Albums and images are presented in fancy Pintrest-like canvas
- It’s responsive, it lazy-loads images and it’s minimalistic
Simple as that.
The optional stuff
A limited number of options are available to enrich the basic image albums. All optional of course.
- You can provide a text file providing album and image descriptions and some configuration options
- YouTube videos can be embedded as well
- Each folder can serve additional blog-like content either as intro before your album/images or between images. Blog content can be provided as Markdown or HTML (or combined)
See the configuration section below for details on how to configure.
Pyntrest is focussed on simple web photo albums. It is neither a blog CMS, nor does it support social features or some kind of a plug-in architecture. If you just want to share some photos with your family and friends on your own server, then Pyntrest is for you. If you want more, consider checking out other awesome flat-file CMS like Grav or Automad.
How to start
Basic instructions are as follows:
- Install Python 2.7.x or later (Python 3+ is also supported)
- Clone or download Pyntrest
- Go to Pyntrest’s root folder and install dependencies by running
pip install -r requirements.txt(assuming you have pip installed, Attention: On unix you also need to have
python-develpackages installed in order to compile
- Recommended: Run
python manage.py testto test the installation (see next chapter for possible solutions on errors)
python manage.py runserver(on image folders with lots of images this will take a while since Pyntrest performs a startup scan of your folder and creates all the necessary thumbnails)
- Open http://localhost:8000 in a browser and enjoy
The web photo album has been automatically generated from the local folder
<pyntrest>/sample_images. Of course you can also use your own images and brandings. For that please refer to
<pyntrest>/pyntrest/pyntrest_config.py and change the settings as you desire.
Pyntrest is fully compatible with wsgi servers like unicorn or Apache using mod_wsgi. Hence it is possible to use it in combination with production servers. Have a look into
devops-tools to find
init.d script examples.
For folder or file management, i.e., the actual content management, you can use whatever you want to use (Dropbox, Drive, FTP, etc.) I use Dropbox to synchronize a folder on my webspace with my mobile device. If the image arrives at the webspace’s folder, Pyntrest automatically detects the picture and it’s instantly available on the corresponding web photo album. The same applies to new subalbums, optional album info files or youtube hooks.
To enable album/image information you need to create a
__info__.txt file in your image (sub-) folder. It is used to provide information such as title, description, a cover image and details for individual photos or videos. The following options can be set.
In the album info section you can provide detailed information about the album itself. The section is labeled
[AlbumInfo]. After the section label you can provide various options in the form
<Key>=<Value> to configure the album. Valid options are:
Title- Title of the album. Will appear in the album header.
Description- Short description of the album. Will appear in the album header.
CoverImage- Image to be used as album cover. If not set, the first image will be used. If no image is available, then a placeholder will be created.
HideCover- Allowed values are
False. If set to true, the cover image will not appear within the sub album. If not set or set to false, the default (cover not hidden) will be used.
ReverseImages- Allowed values are
False. If set to true, the album images will be sorted in descending order. If not set or set to false, the default (ascending order) will be used. This has no effect on the folders within the album.
ModifiedAlbumsOnTop- Allowed values are
False. If set to true, the sub album folders will be sorted so that the album is on top that was modified or created last. If not set or set to false, the default order (ascending by name) will be used. This has no effect on the images within the album.
[AlbumInfo] Title=Pyntrest Description=Automated web photo albums for convenience lovers CoverImage=im-001.jpg HideCover=False ReverseImages=True ModifiedAlbumsOnTop=False
In the image info section you can provide details for individual photos. The section is labeled
[ImageInfo]. After the section label you can simply provide
<Image-Filename>=<Your-Description> to add an image description.
[ImageInfo] image-01.jpg=My favourite image! im-0041.youtube.ini=This funny video was made in 2009. image-02.jpeg=Oh! Look at Johnnys face :)
To add a YouTube hook you need to create a file with a name
- having the desired YouTube id enclosed with the
- ending with
To add an album introduction you need to create a file named
__intro__.txt in your image (sub-) folder. This file can contain Markdown and/or HTML and will be rendered to a webpage. Assuming you have the Pyntrest sample application running, you can see an example at http://localhost:8000/blog-example
You can also add blogs in between images. For this you need to create a file with a name that ends with
__blog__.txt. Like album introductions this file can contain Markdown and/or HTML and will be rendered to a webpage. The first line of the file will be used as blog title. Assuming you have the Pyntrest sample application running, you can see two examples in the root folder http://localhost:8000/, i.e., “The power of markdown” and “What is Python?”.
Common problems on startup
- If tests fail with an error like the one below, then you need to install
libjpeg-develfor your platform and rerun the Pillow installation
E.........EEEE.E ====================================================================== ERROR: test (pyntrest_tests.test_pyntrest_core.CoreTestSuite) ---------------------------------------------------------------------- Traceback (most recent call last): ... IOError: decoder jpeg not available
Pyntrest relies on a number of awesome open source projects:
- Django web framework
- Pillow - Python Image Library (PIL) fork
- markdown2 - Markdown in Python
- Masonry - Cascading grid layout library
- fancyBox - Fancy jQuery Lightbox Alternative
- jQuery Lazy - Delayed image loading plugin for jQuery
- FontAwesome - The iconic font and CSS toolkit
Furthermore I’ve incorporated numerous images for testing purposes. All those images are licensed under CC0 1.0 Universal (CC0 1.0) and were fetched at http://unsplash.com/
Pyntrest is licensed under GPLv3.