Generate HTML catalogs from music notation files with git-based version tracking
Project description
GenList Butler
A command-line tool for generating HTML music archives from ChordPro files, PDFs, and other music notation files. Originally created for the Tuesday Ukulele Group, this tool scans a directory tree of music files and generates a searchable, filterable HTML catalog.
Features
- 📁 Smart File Discovery: Automatically finds ChordPro (.chopro, .cho), PDF, MuseScore, and other music files
- 🔍 Version Control Integration: Uses git timestamps to identify the newest version of duplicate files
- 🎯 Filtering Options: Hide older versions, mark easy songs, exclude specific files
- 📄 PDF Generation: Optional automatic PDF generation from ChordPro files
- 🌐 Interactive HTML: Generates searchable, filterable HTML catalogs with modern UI
- 🧠 Metadata-Aware Search: Parses
{title:},{subtitle:},{keywords:}(and optional lyrics) so the catalog can be filtered beyond filenames - 🎨 Beautiful Styling: Includes Tuesday Ukes' professional HTML template - no configuration needed!
- ⚡ Fast: Optimized git operations for quick catalog generation
Requirements
- Python 3.9 or later
- Git (for version tracking features)
Installation
Install using pipx (recommended):
pipx install genlist-butler
Or using pip:
pip install genlist-butler
Usage
Basic usage:
genlist <music_folder> <output_file>
Examples
Generate a catalog with default settings (newest versions only):
genlist ./music index.html
Show all file versions:
genlist ./music index.html --filter none
Hide only files marked with .hide extension:
genlist ./music index.html --filter hidden
Generate PDFs from ChordPro files before cataloging:
genlist ./music index.html --genPDF
Options
musicFolder- Path to the directory containing music filesoutputFile- Path where the HTML catalog will be written--filter [none|hidden|timestamp]- Filtering method (default: timestamp)none: Show all fileshidden: Hide files with.hideextensiontimestamp: Show only newest versions based on git history
--intro / --no-intro- Include/exclude introduction section (default: include)--genPDF / --no-genPDF- Generate PDFs from ChordPro files (default: no)--forcePDF / --no-forcePDF- Regenerate all PDFs even if they exist (default: no)
File Markers
GenList Butler uses special marker files:
.hidefiles: Create a file with.hideextension (e.g.,song.hide) to hide all files with the same base name from the catalog.easyfiles: Create a file with.easyextension (e.g.,song.easy) to mark all files with the same base name as "easy songs" for filtering
Search Metadata & Lyrics
The search bar now understands more than filenames:
{title: ...}/{t: ...}and{subtitle: ...}/{st: ...}directives are indexed automatically.{keywords: folk; jam; singalong}directives (or# keywords:inline comments) let you define search tags without changing filenames.- Full lyric text from
.choprofiles is indexed as well, and users can disable lyric-matching with the Include lyric search checkbox if they want faster filtering.
Add metadata directly in your ChordPro charts:
{title: Wagon Wheel}
{subtitle: Old Crow Medicine Show}
{keywords: campfire; beginner; singalong}
[G]Heading down south to the [D]land of the pines...
Those keywords/subtitles become instantly searchable in the generated HTML.
Custom HTML Styling
GenList-Butler includes a beautiful, professional HTML template out of the box (Tuesday Ukes' styling). However, you can customize it:
- Create your own
HTMLheader.txtfile in your working directory - Run genlist from that directory
- Your custom header will be used instead of the default
The generated HTML will use your custom styling while maintaining all the interactive search/filter functionality.
Requirements
- Python 3.9+
- Git (for timestamp-based filtering)
- ChordPro (optional, for PDF generation)
How It Works
- Scans the music folder recursively for supported file types
- Groups files by song title (normalized, ignoring articles)
- Filters based on the selected method:
- Uses git history to find the newest version of each file
- Respects
.hidemarker files - Processes
.easymarker files for special highlighting
- Generates an interactive HTML page with:
- Searchable song list
- Download links for all file formats
- Optional filtering for easy songs
- Toggle for showing all versions
Development
To contribute or modify:
# Clone the repository
git clone https://github.com/TuesdayUkes/genlist-butler.git
cd genlist-butler
# Install in development mode
pip install -e ".[dev]"
# Run tests
pytest
License
MIT License - see LICENSE file for details
Credits
Created for the Tuesday Ukulele Group (https://tuesdayukes.org/)
Maintained by the TUG community.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file genlist_butler-1.3.0.tar.gz.
File metadata
- Download URL: genlist_butler-1.3.0.tar.gz
- Upload date:
- Size: 25.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e93fc351c72d3fe8f36cf5f54d61217f36b5c6316c6895f2ceaaff1c8e90db8
|
|
| MD5 |
36e3a9332887a1366c70412ea94522b7
|
|
| BLAKE2b-256 |
ca999b2af65e2d0cc14a45e3cfceb53a708f1206eab4ed0cee5729e8c35bc60b
|
Provenance
The following attestation bundles were made for genlist_butler-1.3.0.tar.gz:
Publisher:
release.yml on TuesdayUkes/genlist-butler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
genlist_butler-1.3.0.tar.gz -
Subject digest:
5e93fc351c72d3fe8f36cf5f54d61217f36b5c6316c6895f2ceaaff1c8e90db8 - Sigstore transparency entry: 975532330
- Sigstore integration time:
-
Permalink:
TuesdayUkes/genlist-butler@b086f80c325178c3286837ee64416d37440b1e0c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/TuesdayUkes
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b086f80c325178c3286837ee64416d37440b1e0c -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file genlist_butler-1.3.0-py3-none-any.whl.
File metadata
- Download URL: genlist_butler-1.3.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93b0051a7bd884ebadb669132174ac40ff02e8565bbdd95e2743af2052bb1666
|
|
| MD5 |
8c8667ecd4318f9a2f556bb622b47e36
|
|
| BLAKE2b-256 |
36f0a069ffa255ead7dcb42bf54b23a2cee6e73f870b57819b68cfd6ece1903f
|
Provenance
The following attestation bundles were made for genlist_butler-1.3.0-py3-none-any.whl:
Publisher:
release.yml on TuesdayUkes/genlist-butler
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
genlist_butler-1.3.0-py3-none-any.whl -
Subject digest:
93b0051a7bd884ebadb669132174ac40ff02e8565bbdd95e2743af2052bb1666 - Sigstore transparency entry: 975532331
- Sigstore integration time:
-
Permalink:
TuesdayUkes/genlist-butler@b086f80c325178c3286837ee64416d37440b1e0c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/TuesdayUkes
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b086f80c325178c3286837ee64416d37440b1e0c -
Trigger Event:
workflow_dispatch
-
Statement type: