beets/beetsplug
henry b902352139
New Plugin: Titlecase (#6133)
This plugin aims to address the shortcomings of the %title function, as
brought up in issues #152, #3298 and an initial look to improvement with
#3411. It supplies a new string format command, `%titlecase` which
doesn't interfere with any prior expected behavior of the `%title`
format command.

It also adds the ability to apply titlecase logic to metadata fields
that a user selects, which is useful if you, like me, are looking for
stylistic consistency and the minor stylistic differences between
Musizbrainz, Discogs, Deezer etc, with title case are slightly
infuriating.

This will add an optional dependency of
[titlecase](https://pypi.org/project/titlecase/), which allows the
titlecase core logic to be externally maintained.

If there's not enough draw to have this as a core plugin, I can also
spin this into an independent one, but it seemed like a recurring theme
that the %title string format didn't really behave as expected, and I
wanted my metadata to match too.

- [x] Documentation. (If you've added a new command-line flag, for
example, find the appropriate page under `docs/` to describe it.)
- [x] Changelog. (Add an entry to `docs/changelog.rst` to the bottom of
one of the lists near the top of the document.)
- [x] Tests. - Not 100% coverage, but didn't see a lot of other plugins
with testing for import stages.
2025-11-23 10:34:05 -08:00
..
_utils Move vfs.py to beetsplug._utils package to avoid polluting core namespace (#6017) 2025-10-01 12:28:18 +02:00
bpd Catch ValueError when setting gst required version 2025-11-19 14:43:30 +03:00
lastgenre pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
metasync Replace logging f-strings with arguments 2025-08-30 23:10:21 +01:00
web Web plugin: add type hint for g.lib 2025-11-15 21:02:43 +01:00
_typing.py Resurrect translation functionality 2025-02-20 03:47:04 +00:00
absubmit.py Do not use backslashes to deal with long strings 2025-08-30 23:10:20 +01:00
acousticbrainz.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
advancedrewrite.py refactor: convert _types from class attributes to cached properties 2025-07-16 14:45:25 +01:00
albumtypes.py Move musicbrainz to beetsplug directory 2025-05-16 19:56:50 +01:00
aura.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
autobpm.py Fix plugin types 2025-07-16 14:06:34 +01:00
badfiles.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
bareasc.py Do not assign args to query 2025-07-08 11:37:34 +01:00
beatport.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
bench.py Move vfs.py to beetsplug._utils package to avoid polluting core namespace (#6017) 2025-10-01 12:28:18 +02:00
bpm.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
bpsync.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
bucket.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
chroma.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
convert.py Add option to not write metadata 2025-09-24 21:52:57 -04:00
deezer.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
discogs.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
duplicates.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
edit.py refactor: moved some more imports that are only used in the commands 2025-11-03 14:03:25 +01:00
embedart.py New import location for art.py 2025-09-21 08:01:48 -07:00
embyupdate.py Replace logging f-strings with arguments 2025-08-30 23:10:21 +01:00
export.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
fetchart.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
filefilter.py Reformat the codebase 2024-09-21 11:57:48 +01:00
fish.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
freedesktop.py Reformat the codebase 2024-09-21 11:57:48 +01:00
fromfilename.py Improve regexp and module docstring 2025-09-30 15:46:26 +02:00
ftintitle.py Add album template value in ftintitle plugin 2025-11-21 18:31:59 +01:00
fuzzy.py Reformat the codebase 2024-09-21 11:57:48 +01:00
gmusic.py Apply formatting tools to all files 2023-10-22 09:53:18 +10:00
hook.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
ihate.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
importadded.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
importfeeds.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
importsource.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
info.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
inline.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
ipfs.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
keyfinder.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
kodiupdate.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
lastimport.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
limit.py Do not assign args to query 2025-07-08 11:37:34 +01:00
listenbrainz.py Removed data source as listenbrainz is not an metadata source plugin. 2025-09-04 17:41:12 +02:00
loadext.py Use only plugins/disabled_plugins config in plugin loading 2025-08-09 15:11:58 +01:00
lyrics.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
mbcollection.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
mbpseudo.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
mbsubmit.py Replace logging f-strings with arguments 2025-08-30 23:10:21 +01:00
mbsync.py Renamed import in mbsync and missing plugins. 2025-07-15 15:03:14 +02:00
missing.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
mpdstats.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
mpdupdate.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
musicbrainz.py Apply suggestions from code review 2025-11-11 13:18:51 -08:00
parentwork.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
permissions.py Apply formatting 2024-03-01 15:21:25 +10:00
play.py play plugin: $playlist marker for precise control where the playlist … (#4728) 2025-10-19 08:38:20 +02:00
playlist.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
plexupdate.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
random.py Do not assign args to query 2025-07-08 11:37:34 +01:00
replace.py Feat: Add replace plugin (#5644) 2025-05-27 00:17:52 +02:00
replaygain.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
rewrite.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
scrub.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
smartplaylist.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
sonosupdate.py Apply formatting tools to all files 2023-10-22 09:53:18 +10:00
spotify.py pyupgrade Python 3.10 2025-11-08 12:09:52 +00:00
subsonicplaylist.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
subsonicupdate.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
substitute.py Apply substitute rules in sequence 2024-10-16 16:36:36 +02:00
the.py Do not use explicit indices for logging args when not needed 2025-08-30 23:10:21 +01:00
thumbnails.py Delegate attribute access to logging 2025-08-30 23:10:21 +01:00
titlecase.py New Plugin: Titlecase (#6133) 2025-11-23 10:34:05 -08:00
types.py Replace format calls with f-strings 2025-08-30 18:42:26 +01:00
unimported.py Replace string concatenation (' + ') 2025-08-30 23:10:15 +01:00
zero.py Remove tests. Update docs. Remove unnecessary return 2025-10-14 03:17:34 +01:00