Bandcamp autotagger plugin for [beets]. It mostly focuses on
- Staying up-to-date with information Bandcamp provide in the JSON metadata
- Parsing all possible (if relevant) metadata from various places
- Correctness of the data
- Compliance with MusicBrainz fields format, to remove the need for pre-processing if, for
Thanks to [unrblt] for [beets-bandcamp] providing the idea and initial implementation.
[beets]: https://github.com/beetbox/beets [unrblt]: https://github.com/unrblt [beets-bandcamp]: https://github.com/unrblt/beets-bandcamp
Installation
Recommended method
- Install
beetswithpipxso that it's isolated from your system and other projects
pipx install beets
- Inject
beetcampand other dependencies that you need. The--include-appsflag is
beetcamp is made available in your command line.
pipx inject --include-apps beets beetcamp [python-mpd2 ...]
- Add
bandcampto thepluginslist to your beets configuration file.
Otherwise
Navigate to your beets virtual environment and install the plug-in with
pip install beetcamp
CLI
The plugin exposes some of its functionality through a command-line application
beetcamp:
usage: beetcamp [-h] [-a] [-l] [-t] [-o INDEX] [-p PAGE] (release_url | query)
Get bandcamp release metadata from the given <release-url> or perform
bandcamp search with <query>. Anything that does not start with https://
will be assumed to be a query. Search type flags: -a for albums, -l for
labels and artists, -t for tracks. By default, all types are searched.
positional arguments:
release_url Release URL, starting with https:// OR
query Search query
optional arguments:
-h, --help show this help message and exit
-a, --album Search albums
-l, --label Search labels and artists
-t, --track Search tracks
-o INDEX, --open INDEX
Open search result indexed by INDEX in the browser
-p PAGE, --page PAGE Deprecated; accepted for compatibility but has no effect
- Use
beetcampto return release metadata in JSON format. - Use
beetcamp [-alt]to search albums, labels and tracks on Bandcamp and return
- Search results are indexed - add
-oin order to open the chosen URL in the
-p/--pageis deprecated and ignored because searches now return all available
You can see how the data looks below (the output is prettified with [rich-tables]).
[rich-tables]: https://github.com/snejus/rich-tables
Configuration
Default
bandcamp:
include_digital_only_tracks: true
search_max: 2
art: yes
comments_separator: "\n---\n"
truncate_comments: no
exclude_extra_fields: []
genre:
capitalize: no
maximum: 0
always_include: []
mode: progressive # classical, progressive or psychedelic
include_digital_only_tracks
- Type: bool
- Default:
true
Digital Media, include all tracks, even if their titles contain
digital only (or alike).
If you have False here, then, for example, a Vinyl media of an album will only include
the tracks that are supposed to be found in that media.
search_max
- Type: int
- Default:
2.
art
- Type: bool
- Default:
false.
FetchArt plug-in enabled).
[!TIP]
The plugin returnscover_art_urlfield, thus if you are usingbeetsversion2.4.0
or above, configurecover_art_urlsource in yourfetchartconfiguration instead:
>> sources: > - cover_art_url > ... your other sources >> fetchart:
comments_separator
- Type: string
- Default:
"\n---\n".
comments
field. By default you would get
Description --- Media description --- Credits
truncate_comments
- Type: bool
- Default:
false.
This configuration option truncates the comments field to the maximum length that MPD
can handle, and saves the full comment as a flexible attribute on the album.
exclude_extra_fields
- Type: list
- Default: _
empty_
comments irrelevant and are not interested in lyrics, you could specify
bandcamp:
search_max: 5
exclude_extra_fields:
- lyrics
- comments
and the plugin will skip them.
You cannot exclude album, album_id, artist_id, media and data_url album fields.
genre
- Type: object
- Default:
genre:
capitalize: no
maximum: 0 # no maximum
mode: progressive
always_include: []
genre.capitalize: Classical, Techno instead of default classical, techno. For
consistency, this option also applies to the style field.
genre.maximum caps the maximum number of included genres. This may be of value in those cases where artists/labels begin the list with the most relevant keywords, however be aware it is rarely the case.
genre.mode accepts one of the following options: classical (less genres) or progressive or psychedelic (more genres). Each later one is more flexible regarding what is a valid genre and what is not. See below (we use the list of [musicbrainz genres] for reference).
genre.always_include: genre patterns that override the mode and always match
successfully. For example, if you want to bypass checks for every keyword that ends with
core, you could specify
genre:
always_include:
- "core$"
##### genre modes
We can place all keywords into the following buckets:
| type | | |
| :---: | ------------------------------------ | -------------------------------------------------------------------- |
| 1 | genre | a valid single-word musicbrainz genre |
| 1 | more specific genre | a valid musicbrainz genre made of multiple words |
| 2 | somegenre someothergenre | each of the words is a valid musicbrainz genre, but the combo is not |
| 3 | very specific genre | not all words are valid genres, but the very last one is |
| 4 | maybe genre but | but it is followed by noise at the end |
| 4 | some sort of location | irrelevant |
- classical mode strictly follows the musicbrainz list of genres, therefore it covers
- progressive mode, in addition to the above, takes into account each of the words
- psychedelic (or noise) mode, in addition to the above, treats the keyword as a
- or -
trends which may not be ideal. It should though be the best option for those who enjoy
detailed, fine-grained stats.
- type 4 is ignored in each case (can be overridden and included through the
genre.include option).
See below for some examples and a comparison between the modes.
| type | keyword | classical | progressive | psychedelic |
| ----: | ----------------------- | :-------: | :---------: | :---------: |
| 1 | techno | ✔ | ✔ | ✔ |
| 1 | funk | ✔ | ✔ | ✔ |
| 1 | ambient | ✔ | ✔ | ✔ |
| 1 | noise | ✔ | ✔ | ✔ |
| 1 | ambient techno | ✔ | ✔ | ✔ |
| 2 | techno funk | ✖ | ✔ | ✔ |
| 4 | funky | ✖ | ✖ | ✖ |
| 4 | bleep | ✖ | ✖ | ✖ |
| 3 | funky techno | ✖ | ✖ | ✔ |
| 4 | bleepy beep | ✖ | ✖ | ✖ |
| 3 | bleepy beep noise | ✖ | ✖ | ✔ |
| 4 | bleepy noise beep | ✖ | ✖ | ✖ |
Usage
This plug-in uses Bandcamp release URL as album_id (.../album/... for albums and
.../track/... for singletons). If no matching release is found during the import you can
select enter Id and paste the URL that you have.
Supported metadata
| field | singleton | album track | album | note |
| ---------------: | :-------: | :---------: | :---: | :---------------------------------------------------------------------------------: |
| album | | | ✔ | |
| album_id | | | ✔ | release Bandcamp URL |
| albumartist | | | ✔ | |
| albumstatus | | | ✔ | |
| albumtype | ✔ | | ✔ | |
| albumtypes | \✔ | | \✔ | |
| artist | ✔ | ✔ | ✔ | |
| artist_id | ✔ | | ✔ | label / publisher Bandcamp URL |
| artists | \^✔ | \^✔ | \^✔ | |
| artists_credit | \^✔ | \^✔ | \^✔ | |
| artists_ids | \^✔ | \^✔ | \^✔ | |
| artists_sort | \^✔ | \^✔ | \^✔ | |
| catalognum | ✔ | | ✔ | |
| comments | ✔ | | ✔ | release and media descriptions, and credits |
| country | ✔ | | ✔ | |
| cover_art_url | ✔ | | ✔ | |
| day | ✔ | | ✔ | |
| disctitle | ✔ | ✔ | | |
| genre | ✔ | | ✔ | comma-delimited list of release keywords which match [musicbrainz genres] |
| index | | ✔ | | |
| label | ✔ | | ✔ | |
| length | ✔ | ✔ | | |
| lyrics | ✔ | ✔ | | |
| media | ✔ | ✔ | ✔ | |
| medium | | ✔ | | likely to be inaccurate, since it depends on information in the release description |
| mediums | | | ✔ | |
| medium_index | | ✔ | | for now, same as index |
| medium_total | | ✔ | | total number of tracks in the release |
| original_year | ✔ | | ✔ | |
| original_month | ✔ | | ✔ | |
| original_day | ✔ | | ✔ | |
| month | ✔ | | ✔ | |
| style | ✔ | | ✔ | Bandcamp genre tag |
| title | ✔ | ✔ | | |
| track_alt | ✔ | ✔ | | |
| track_id | | ✔ | | track URL |
| va | | | ✔ | |
| year | ✔ | | ✔ | |
\* Requires beets>=1.6
\^ Requires beets>=2
[musicbrainz genres]: https://beta.musicbrainz.org/genres