I do not fully understand how the building process works, and have some doubts
on what a "source distribution" should be.
The sdist might be polluted if a "man" directory exists at the project root
when building the distribution.
The inclusion of man pages in the wheel requires it to be built from the sdist,
so it's best to build both at the same time using "python -m build".
Closes#215
Metadata in `setup.cfg` rather than `pyproject.toml` as I'm a bit confused
about `setuptools` support for PEP-621.
Test stuff still in `setup.py`, this needs updating and I'm not satisfied with
the way they are loaded/discovered.
Example use case:
```
Some Album/
├── CD1
│ └── <songs>
├── CD2
│ └── <songs>
└── cover.jpg
```
Previously, downloading the `Some Album` folder would result in no data
being sent (not even `cover.jpg`)
This commit changes folder-based downloads so that the entire folder
tree (including any non-music) is added to the returned zip file. This
allows any included album art, scans, notes, etc. to be distributed with
the files.
Album-based downloads are unaffected.
- Fixes zip downloads failing when zipping enough data that Zip64
extensions are required by automatically enabling them if needed.
- Fixes zip downloads failing when a file has a datestamp that zipfiles
cannot store (pre-1980 or post-2108) by clamping them within the
supported range.
- Massively speeds up zip downloads by disabling compression (audio
files generally don't compress well anyway)
- Computes the total size of a generated zip file before streaming it
and sets the `Content-Length` header. This allows clients to show a
final size and progress bar while downloading, as well as detect if
the download fails.
- Adds a check to prevent sending an empty zip file to the client if
there was no content to download (will error out instead).
- Only includes cover art in the zip file if it's provided separately
from the files (ie. doesn't extract it from the tracks)
- Refactors the existing code for implementing the `/getCoverArt` API
endpoint to allow it to be reused.