music library manager and MusicBrainz tagger
MIT License
Bot releases are hidden (Show)
This release is our first experiment with time-based releases! We are aiming to publish a new release of beets every 3 months. We therefore have a healthy but not dizzyingly long list of new features and fixes.
With this release, beets now requires Python 3.6 or later (it removes support for Python 2.7, 3.4, and 3.5). There are also a few other dependency changes---if you're a maintainer of a beets package for a package manager, thank you for your ongoing efforts, and please see the list of notes below.
Major new features:
albumtypes
field. Thanks to edgars-supe
{.interpreted-text role="user"}. #2200albumtypes
includes some options for formatting this new albumtypes
field. Thanks to edgars-supe
{.interpreted-text role="user"}.Other new things:
permissions
: The plugin now sets cover art permissions to match the audio file permissions.unimported
: A new configuration option supports excluding specific subdirectories in library.info
: Add support for an --album
flag.export
: Similarly add support for an --album
flag.beet move
now highlights path differences in color (when enabled).fetchart
: Add a new option to store cover art as non-progressive image. This is useful for DAPs that do not support progressive images. Set deinterlace: yes
in your configuration to enable this conversion.fetchart
: Add a new option to change the file format of cover art images. This may also be useful for DAPs that only support some image formats.%aunique
. #2678 #3553%aunique
faster, especially when using inline fields. #4145Bug fixes:
lyrics
: Fix a crash when Beautiful Soup is not installed. #4027discogs
: Support a new Discogs URL format for IDs. #4080discogs
: Remove built-in rate-limiting because the Discogs Python library we use now has its own rate-limiting. š 4108
export
: Fix some duplicated output.aura
: Fix a potential security hole when serving image files. #4160For plugin developers:
beets.library.Item.destination
{.interpreted-text role="meth"} now accepts a replacements
argument to be used in favor of the default.pluginload
event is now sent after plugin types and queries are available, not before.album_removed
, is called when an album is removed from the library (even when its file is not deleted from disk).Here are some notes for packagers:
test_album_art
in the test_zero.py
file, that some distributions had disabled. Disabling this test should no longer be necessary. #4037 #4038gmusic
plugin was removed since Google Play Music has been shut down. Thus, the optional dependency on gmusicapi
does not exist anymore. #4089Published by sampsyo about 3 years ago
This long overdue release of beets includes far too many exciting and useful features than could ever be satisfactorily enumerated. As a technical detail, it also introduces two new external libraries: MediaFile and Confuse used to be part of beets but are now reusable dependencies---packagers, please take note. Finally, this is the last version of beets where we intend to support Python 2.x and 3.5; future releases will soon require Python 3.6.
One non-technical change is that we moved our official #beets
home on IRC from freenode to Libera.Chat.
Major new features:
beet list foo:bar
will not only find tracks with the foo
attribute; it will also find tracks on albums that have the foo
attribute. This may be particularly useful in the path-format-config`, which matches individual items to decide which path to use. Thanks to @FichteFoll. #2797 #2988reflink
config option instructs the importer to create fast, copy-on-write file clones on filesystems that support them. Thanks to @rubdos.unimported
lets you find untracked files in your library directory.aura
has arrived! Try out the future of remote music library access today.work
(the title), mb_workid
(the MBID), and work_disambig
(the disambiguation string). Thanks to @dosoe. #2580 #3272parentwork
gets information about the original work, which is useful for classical music. Thanks to @dosoe. #2580 #3279bpd
: BPD now supports most of the features of version 0.16 of the MPD protocol. This is enough to get it talking to more complicated clients like ncmpcpp, but there are still some incompatibilities, largely due to MPD commands we don't support yet. (Let us know if you find an MPD client that doesn't get along with BPD!) #3214 #800deezer
can autotag tracks and albums using the Deezer database. Thanks to @rhlahuja. #3355bareasc
provides a new query type: "bare ASCII" queries that ignore accented characters, treating them as though they were plain ASCII characters. Use the #
prefix with list
or other commands. #3882fetchart
: The plugin can now get album art from last.fm. #3530web
: The API now supports the HTTP DELETE
and PATCH
methods for modifying items. They are disabled by default; set readonly: no
in your configuration file to enable modification via the API. #3870Other new things:
beet remove
now also allows interactive selection of items from the query, similar to beet modify
.https
for custom servers. See musicbrainz-config
for more details.mpdstats
: Add a new strip_path
option to help build the right local path from MPD information.convert
: Conversion can now parallelize conversion jobs on Python 3.lastgenre
: Add a new title_case
config option to make title-case formatting optional.beet config
when there's no available configuration file. #3779chroma
: The plugin now updates file metadata after generating fingerprints through the submit
command.lastgenre
: Added more heavy metal genres to the built-in genre filter lists.subsonicplaylist
can import playlists from a Subsonic server.subsonicupdate
: The plugin now automatically chooses between token- and password-based authentication based on the server version.extra_tags
configuration option lets you use more metadata in MusicBrainz queries to further narrow the search.fish
adds Fish shell tab autocompletion to beets.plugins/fetchart
and plugins/embedart
: Added a new quality
option that controls the quality of the image output when the image is resized.plugins/keyfinder
: Added support for keyfinder-cli. Thanks to @BrainDamage.plugins/fetchart
: Added a new high_resolution
config option to allow downloading of higher resolution iTunes artwork (at the expense of file size). #3391plugins/discogs
: The plugin applies two new fields: discogs_labelid
and discogs_artistid
. #3413export
: Added a new -f
(--format
) flag, which can export your data as JSON, JSON lines, CSV, or XML. Thanks to @austinmm. #3402convert
: Added a new -l
(--link
) flag and link
option as well as the -H
(--hardlink
) flag and hardlink
option, which symlink or hardlink files that do not need to be converted (instead of copying them). #2324replaygain
: The plugin now supports a per_disc
option that enables calculation of album ReplayGain on disc level instead of album level. Thanks to @samuelnilsson. #293replaygain
: The new ffmpeg
ReplayGain backend supports R128_
tags. #3056plugins/replaygain
: A new r128_targetlevel
configuration option defines the reference volume for files using R128_
tags. targetlevel
only configures the reference volume for REPLAYGAIN_
files. #3065discogs
: The plugin now collects the "style" field. Thanks to @thedevilisinthedetails. #2579 #3251absubmit
: By default, the plugin now avoids re-analyzing files that already have AcousticBrainz data. There are new force
and pretend
options to help control this new behavior. Thanks to @SusannaMaria. #3318discogs
: The plugin now also gets genre information and a new discogs_albumid
field from the Discogs API. Thanks to @thedevilisinthedetails. #465 #3322acousticbrainz
: The plugin now fetches two more additional fields: moods_mirex
and timbre
. Thanks to @malcops. #2860playlist
and smartplaylist
: A new forward_slash
config option facilitates compatibility with MPD on Windows. Thanks to @MartyLake. #3331 #3334data_source
field, which indicates which metadata source was used during an autotagging import, is now also applied as an album-level flexible attribute. #3350 #1693beatport
: The plugin now gets the musical key, BPM, and genre for each track. #2080bpsync
can synchronize metadata changes from the Beatport database (like the existing mbsync
for MusicBrainz).hook
: The plugin now treats non-zero exit codes as errors. #3409subsonicupdate
: A new url
configuration replaces the older (and now deprecated) separate host
, port
, and contextpath
config options. As a consequence, the plugin can now talk to Subsonic over HTTPS. Thanks to @jef. #3449discogs
: The new index_tracks
option enables incorporation of work names and intra-work divisions into imported track titles. Thanks to cole-miller
. #3459web
: The query API now interprets backslashes as path separators to support path queries. Thanks to @nmeum. #3567beet import
now handles tar archives with bzip2 or gzip compression. #3606beet import
also now handles 7z archives, via the py7zr library. Thanks to @arogl. #3906plexupdate
: Added an option to use a secure connection to Plex server, and to ignore certificate validation errors if necessary. #2871convert
: A new delete_originals
configuration option can delete the source files after conversion during import. Thanks to logan-arens
. #2947--plugins
(or -p
) CLI flag to specify a list of plugins to load.genres
option fetches genre information from MusicBrainz. This functionality depends on functionality that is currently unreleased in the python-musicbrainzngs library: see PR #266 _. Thanks to :user:
aereaux`.replaygain
: Analysis now happens in parallel using the command
and ffmpeg
backends. #3478plugins/replaygain
: The bs1770gain backend is removed. Thanks to @SamuelCook.trackdisambig
which stores the recording disambiguation from MusicBrainz for each track. #1904plugins/fetchart
: The new max_filesize
configuration sets a maximum target image file size.badfiles
: Checkers can now run during import with the check_on_import
config option.export
: The plugin is now much faster when using the --include-keys
option is used. Thanks to @ssssam.metasync
: The plugin now also fetches the "Date Added" field from iTunes databases and stores it in the itunes_dateadded
field. Thanks to @sandersantema.lyrics
: Added a new Tekstowo.pl lyrics provider. Thanks to various people for the implementation and for reporting issues with the initial version. #3344 #3904 #3905 #3994beet update
will now confirm that the user still wants to update if their library folder cannot be found, preventing the user from accidentally wiping out their beets database. Thanks to user: logan-arens
. #1934Fixes:
ast
module in Python 3.8.beatport
: Fix the assignment of the genre
field, and rename musical_key
to initial_key
. #3387lyrics
: Fixed the Musixmatch backend for lyrics pages when lyrics are divided into multiple elements on the webpage, and when the lyrics are missing.web
: Allow use of the backslash character in regex queries. #3867web
: Fixed a small bug that caused the album art path to be redacted even when include_paths
option is set. #3866discogs
: Fixed a bug with the index_tracks
option that sometimes caused the index to be discarded. Also, remove the extra semicolon that was added when there is no index track.subsonicupdate
: The API client was using the POST
method rather the GET
method. Also includes better exception handling, response parsing, and tests.the
: Fixed incorrect regex for "the" that matched any 3-letter combination of the letters t, h, e. #3701fetchart
: Fixed a bug that caused the plugin to not take environment variables, such as proxy servers, into account when making requests. #3450fetchart
: Temporary files for fetched album art that fail validation are now removed.inline
: In function-style field definitions that refer to flexible attributes, values could stick around from one function invocation to the next. This meant that, when displaying a list of objects, later objects could seem to reuse values from earlier objects when they were missing a value for a given field. These values are now properly undefined. #2406bpd
: Seeking by fractions of a second now works as intended, fixing crashes in MPD clients like mpDris2 on seek. The playlistid
command now works properly in its zero-argument form. #3214replaygain
: Fix a Python 3 incompatibility in the Python Audio Tools backend. #3305importadded
: Fixed a crash that occurred when the after_write
signal was emitted. #3301plugins/replaygain
: Fix the storage format for R128 gain tags. #3311 #3314discogs
: Fixed a crash that occurred when the master URI isn't set in the API response. #2965 #3239spotify
: Fix handling of year-only release dates returned by the Spotify albums API. Thanks to @rhlahuja. #3343per_disc_numbering
option was set. #3346none_rec_action
does not import automatically when timid
is enabled. Thanks to @RollingStar. #3242beet import
now logs which files are ignored when in debug mode. #3764bpd
: Fix the transition to next track when in consume mode. Thanks to @aereaux. #3437lyrics
: Fix a corner-case with Genius lowercase artist names #3446parentwork
: Don't save tracks when nothing has changed. #3492include
directive of the configuration file fail to be imported. #3498bpm
would sometimes store non-integer values. #762 #3507 #3508lyrics
: Tolerate a missing lyrics div in the Genius scraper. Thanks to @thejli21. #3535 #3554lyrics
: Use the artist sort name to search for lyrics, which can help find matches when the artist name has special characters. Thanks to @hashhar. #3340 #3558replaygain
: Trying to calculate volume gain for an album consisting of some formats using ReplayGain
and some using R128
will no longer crash; instead it is skipped and and a message is logged. The log message has also been rewritten for to improve clarity. Thanks to @autrimpo. #3533lyrics
: Adapt the Genius backend to changes in markup to reduce the scraping failure rate. #3535 #3594lyrics
: Fix a crash when writing ReST files for a query without results or fetched lyrics. #2805fetchart
: Attempt to fetch pre-resized thumbnails from Cover Art Archive if the maxwidth
option matches one of the sizes supported by the Cover Art Archive API. Thanks to @trolley. #3637ipfs
: Fix Python 3 compatibility. Thanks to @musoke. #2554mpdstats
: Don't record a skip when stopping MPD, as MPD keeps the current track in the queue. Thanks to @aereaux. #3722fetchart
and the discogs
together. #3773 #3774plugins/keyfinder
: Catch output from keyfinder-cli
that is missing key. #2242plugins/replaygain
: Disable parallel analysis on import by default. #3819mpdstats
: Fix Python 2/3 compatibility #3798discogs
: Replace the deprecated official discogs-client
library with the community supported python3-discogs-client library. #3608chroma
: Fixed submitting AcoustID information for tracks that already have a fingerprint. #3834--set
option to the beet import
command. #2984%ifdef
now produce the expected behavior when used in conjunction with non-string fields from the types
. #3852lyrics
: Fix crashes when a website could not be retrieved, affecting at least the Genius source. #3970duplicates
: Fix a crash when running the dup
command with a query that returns no results. #3943beatport
: Fix the default assignment of the musical key. #3377lyrics
: Improved searching on the Genius backend when the artist contains special characters. #3634parentwork
: Also get the composition date of the parent work, instead of just the child work. Thanks to @aereaux. #3650lyrics
: Fix a bug in the heuristic for detecting valid lyrics in the Google source. #2969thumbnails
: Fix a crash due to an incorrect string type on Python 3. #3360fetchart
: The Cover Art Archive source now iterates over all front images instead of blindly selecting the first one.lyrics
: Removed the LyricWiki source (the site shut down on 21/09/2020).subsonicupdate
: The plugin is now functional again. A new auth
configuration option is required in the configuration to specify the flavor of authentication to use. #4002For plugin developers:
from beets import mediafile
, now just do import mediafile
. Beets re-exports MediaFile at the old location for backwards-compatibility, but a deprecation warning is raised if you do this since we might drop this wrapper in a future release.from beets.util import confit
, now just do import confuse
. The code is almost identical apart from the name change. Again, we'll re-export at the old location (with a deprecation warning) for backwards compatibility, but we might stop doing this in a future release.beets.util.command_output
now returns a named tuple containing both the standard output and the standard error data instead of just stdout alone. Client code will need to access the stdout
attribute on the return value. Thanks to @zsinskri. #3329test.test_player
. Hopefully these are fixed. If they resurface, please reopen the relevant issue. #3309 #3330beets.plugins.MetadataSourcePlugin
base class has been added to simplify development of plugins which query album, track, and search APIs to provide metadata matches for the importer. Refer to the spotify
and the deezer
for examples of using this template class. #3355Item
now falls back to the album's attributes. So, for example, item.foo
will first look for a field foo
on item
and, if it doesn't exist, next tries looking for a field named foo
on the album that contains item
. If you specifically want to access an item's attributes, use Item.get(key, with_album=False)
. #2988Item.keys
also has a with_album
argument now, defaulting to True
.revision
attribute has been added to Database
. It is increased on every transaction that mutates it. #2988AlbumInfo
and TrackInfo
now convey arbitrary attributes instead of a fixed, built-in set of field names (which was important to address #1547). Thanks to @dosoe.mb_album_extract
and mb_track_extract
, let plugins add new fields based on MusicBrainz data. Thanks to @dosoe.For packagers:
mediafile
. Beets now depends on this new package. Beets now depends on Mutagen transitively through MediaFile rather than directly, except in the case of one of beets' plugins (in particular, the scrub
).confuse
. Beets now depends on this package. Confuse has existed separately for some time and is used by unrelated projects, but until now we've been bundling a copy within beets.Published by sampsyo over 5 years ago
This small update is part of our attempt to release new versions more often! There are a few important fixes, and we're clearing the deck for a change to beets' dependencies in the next version.
The new feature is:
There are some fixes in this release:
gmusic
: The oauth_file
config option now supports more flexible path values, including ~
for the home directory. #3270gmusic
: Fix a crash when using version 12.0.0 or later of the gmusicapi
module. #3270Here's a note for packagers:
pathlib
is now an optional test dependency on Python 3.4+, removing the need for a Debian patch. #3275Published by sampsyo over 5 years ago
This release is far too long in coming, but it's a good one. There is the usual torrent of new features and a ridiculously long line of fixes, but there are also some crucial maintenance changes. We officially support Python 3.7 and 3.8, and some performance optimizations can (anecdotally) make listing your library more than three times faster than in the previous version.
The new core features are:
config-aunique
configuration option allows setting default options for the aunique
template function.albumdisambig
field no longer includes the MusicBrainz release group disambiguation comment. A new releasegroupdisambig
field has been added. #3024modify
command now allows resetting fixed attributes. For example, beet modify -a artist:beatles artpath!
resets artpath
attribute from matching albums back to the default value. #2497ignore_data_tracks
, lets you skip audio tracks contained in data files. #3021There are some new plugins:
playlist
can query the beets library using M3U playlists. Thanks to @Holzhaus and @Xenopathic. #123 #3145loadext
allows loading of SQLite extensions, primarily for use with the ICU SQLite extension for internationalization. #3160 #3226subsonicupdate
can automatically update your Subsonic library. Thanks to @maffo999. #3001And many improvements to existing plugins:
lastgenre
: Added option -A
to match individual tracks and singletons. #3220 #3219play
: The plugin can now emit a UTF-8 BOM, fixing some issues with foobar2000 and Winamp. Thanks to @mz2212. #2944gmusic
:
replaygain
: albumpeak
on large collections is calculated as the average, not the maximum. #3008 #3009chroma
:
preferred
configuration options. Thanks to @archer4499. #3017beet write
. Thanks to @Holzhaus. #3097 #2942convert
: The plugin now has an id3v23
option that allows you to override the global id3v23
option. Thanks to @Holzhaus. #3104spotify
:
ipfs
: The plugin now supports a nocopy
option which passes that flag to ipfs. Thanks to @wildthyme.discogs
: The plugin now has rate limiting for the Discogs API. #3081mpdstats
, mpdupdate
: These plugins now use the MPD_PORT
environment variable if no port is specified in the configuration file. #3223bpd
:
consume
and single
are now supported along with updated semantics for repeat
and previous
and new fields for status
. The bpd server now understands and ignores some additional commands. #3200 #800idle
is now supported, allowing the MPD version to be bumped to 0.14. #3205 #800decoders
is now supported. #3222--debug
flag has been removed. Thanks to @arcresu. #3196mbsync
: The plugin no longer queries MusicBrainz when either the mb_albumid
or mb_trackid
field is invalid. See also the discussion on Google Groups Thanks to @arogl.export
: The plugin now also exports path
field if the user explicitly specifies it with -i
parameter. This only works when exporting library fields. #3084acousticbrainz
: The plugin now declares types for all its fields, which enables easier querying and avoids a problem where very small numbers would be stored as strings. Thanks to @rain0r. #2790 #3238Some improvements have been focused on improving beets' performance:
absubmit
, badfiles
: Analysis now works in parallel (on Python 3 only). Thanks to @bemeurer. #2442 #3003mpdstats
: Use the currentsong
MPD command instead of playlist
to get the current song, improving performance when the playlist is long. Thanks to @ray66. #3207 #2752Several improvements are related to usability:
move
command now lists the number of items already in-place. Thanks to @RollingStar. #3117convert
plugin copies the art covers. #3063Many fixes have been focused on issues where beets would previously crash:
fetchart
: Added network connection error handling to backends so that beets won't crash if a request fails. Thanks to @Holzhaus. #1579badfiles
: Avoid a crash when the underlying tool emits undecodable output. #3165beatport
: Avoid a crash when the server produces an error. #3184bpd
: Fix crashes in the bpd server during exception handling. #3200bpd
: Fix a crash triggered when certain clients tried to list the albums belonging to a particular artist. #3007 #3215replaygain
: Avoid a crash when the bs1770gain
tool emits malformed XML. #2983 #3247There are many fixes related to compatibility with our dependencies including addressing changes interfaces:
jellyfish
requirement to version 0.6.0 for compatibility.re
module. #2978web
: Fix an error when using more recent versions of Flask with CORS enabled. Thanks to @rveachkc. #2979: #2980python-itunes
, which had gone unmaintained and was not Python-3-compatible. Thanks to @ocelma for creating python-itunes
in the first place. Thanks to @nathdwek. #2371 #2551 #2718lastgenre
, edit
: Avoid a deprecation warnings from the PyYAML
library by switching to the safe loader. Thanks to @translit and @sbraz. #3192 #3225PIL
/pillow
on Python 3. Thanks to @architek. #2504 #3029And there are many other fixes:
artist_credit
configuration option is set. #2953from_scratch
configuration option set, only writable fields are cleared. Beets now no longer ignores the format your music is saved in. #2972%aunique
template function now works correctly with the -f/--format
option. #3043%title
template function now works correctly with apostrophes. Thanks to @GuilhermeHideki. #3033lastgenre
: It's now possible to set the prefer_specific
option without also setting canonical
. #2973fetchart
: The plugin now respects the ignore
and ignore_hidden
settings. #1632hook
: Fix byte string interpolation in hook commands. #2967 #3167the
: Log a message when something has changed, not when it hasn't. Thanks to @arcresu. #3195lastgenre
: The force
config option now actually works. #2704 #3054convert
command that is not ImageMagick's by using the magick
executable when it is available. Thanks to @ababyduck. #2093 #3236There is one new thing for plugin developers to know about:
playlist
supports queries like playlist:name
although there is no field named playlist
. See extend-query
for details.And some messages for packagers:
jellyfish
and munkres
.python-itunes
dependency has been removed.Published by sampsyo over 6 years ago
This new release includes lots of new features in the importer and the metadata source backends that it uses. We've changed how the beets importer handles non-audio tracks listed in metadata sources like MusicBrainz:
There are other subtle improvements to metadata handling in the importer:
musicbrainz_releasetrackid
field. This is a first step toward #406. Thanks to @Rawrmonkeys.And there are even more new features:
replaygain
: The beet replaygain
command now has --force
, --write
and --nowrite
options. #2778fetchart
: The configuration options now support finer-grained control via the sources
option. You can now specify the search order for different matching strategies within different backends.web
: A new cors_supports_credentials
configuration option lets in-browser clients communicate with the server even when it is protected by an authorization mechanism (a proxy with HTTP authentication enabled, for example).sonosupdate
plugin automatically notifies Sonos controllers to update the music library when the beets library changes. Thanks to @cgtobi.discogs
: The plugin now stores master release IDs into mb_releasegroupid
. It also "simulates" track IDs using the release ID and the track list position. Thanks to @dbogdanov. #2336discogs
: Fetch the original year from master releases. #1122There are lots and lots of fixes:
replaygain
: Fix a corner-case with the bs1770gain
backend where ReplayGain values were assigned to the wrong files. The plugin now requires version 0.4.6 or later of the bs1770gain
tool. #2777lyrics
: The plugin no longer crashes in the Genius source when BeautifulSoup is not found. Instead, it just logs a message and disables the source. #2911lyrics
: Handle network and API errors when communicating with Genius. #2771lyrics
: The lyrics
command previously wrote ReST files by default, even when you didn't ask for them. This default has been fixed.lyrics
: When writing ReST files, the lyrics
command now groups lyrics by the albumartist
field, rather than artist
. #2924edit
provides show up more reliably after doing a secondary import search. #2441 #2731importadded
: Fix a crash on non-autotagged imports. Thanks to @m42i. #2601 #1918plexupdate
: The Plex token is now redacted in configuration output. Thanks to @Kovrinic. #2804convert
: The plugin now runs before other plugin-provided import stages, which addresses an issue with generating ReplayGain data incompatible between the source and target file formats. Thanks to @autrimpo. #2814ftintitle
: The drop
config option had no effect; it now does what it says it should do. #2817web
: The time display in the web interface would incorrectly jump at the 30-second mark of every minute. Now, it correctly changes over at zero seconds. #2822web
: Fetching album art now works (instead of throwing an exception) under Python 3. Additionally, the server will now return a 404 response when the album ID is unknown (instead of throwing an exception and producing a 500 response). #2823web
: Fix an exception on Python 3 for filenames with non-Latin1 characters. (These characters are now converted to their ASCII equivalents.) #2815replaygain
: Really fix album gain calculation using the GStreamer backend. #2846discogs
: Fix the medium
and medium_index
values, which were occasionally incorrect for releases with two-sided mediums such as vinyl. Also fix the medium_total
value, which now contains total number of tracks on the medium to which a track belongs, not the total number of different mediums present on the release. Thanks to @dbogdanov. #2887keyfinder
: Avoid a crash when trying to process unmatched tracks. #2537mbsync
: Support MusicBrainz recording ID changes, relying on release track IDs instead. Thanks to @jdetrey. #1234mbsync
: We can now successfully update albums even when the first track has a missing MusicBrainz recording ID. #2920There are a couple of changes for developers:
early_import_stages
list instead of plain import_stages
to request this behavior. #2814albuminfo_received
and trackinfo_received
in all cases, most notably when using the mbsync
plugin. This was a regression since version 1.4.1. #2921Published by sampsyo almost 7 years ago
The highlight of this release is "album merging," an oft-requested option in the importer to add new tracks to an existing album you already have in your library. This way, you no longer need to resort to removing the partial album from your library, combining the files manually, and importing again.
Here are the larger new features in this release:
lyrics
: The plugin can now produce reStructuredText files for beautiful, readable books of lyrics. Thanks to @anarcat. #2628from_scratch
configuration option makes the importer remove old metadata before applying new metadata. This new feature complements the zero
and scrub
plugins but is slightly different: beets clears out all the old tags it knows about and only keeps the new data it gets from the remote metadata source. Thanks to @tummychow. #934 #2755There are also somewhat littler, but still great, new features:
convert
: A new no_convert
option lets you skip transcoding items matching a query. Instead, the files are just copied as-is. Thanks to @Stunner. #2732 #2751fetchart
: A new quiet switch that only prints out messages when album art is missing. Thanks to @euri10. #2683mbcollection
: You can configure a custom MusicBrainz collection via the new collection
configuration option. #2685mbcollection
: The collection update command can now remove albums from collections that are longer in the beets library.fetchart
: The clearart
command now asks for confirmation before touching your files. Thanks to @konman2. #2708 #2427mpdstats
: The plugin now correctly updates song statistics when MPD switches from a song to a stream and when it plays the same song multiple times consecutively. #2707acousticbrainz
: The plugin can now be configured to write only a specific list of tags. Thanks to @woparry.There are lots and lots of bug fixes:
hook
: Fixed a problem where accessing non-string properties of item
or album
(e.g., item.track
) would cause a crash. Thanks to @broddo. #2740play
: When relative_to
is set, the plugin correctly emits relative paths even when querying for albums rather than tracks. Thanks to @j000. #2702BrokenPipeError
being ignored. This was an issue when using beets in simple shell scripts. Thanks to @Azphreal. #2622 #2631replaygain
: Fix a regression in the previous release related to the new R128 tags. #2615 #2623lyrics
: The MusixMatch backend now detects and warns when the server has blocked the client. Thanks to @anarcat. #2634 #2632importfeeds
: Fix an error on Python 3 in certain configurations. Thanks to @djl. #2467 #2658edit
: Fix a bug when editing items during a re-import with the -L
flag. Previously, diffs against against unrelated items could be shown or beets could crash. #2659kodiupdate
: Fix the server URL and add better error reporting. #2662edit
plugin when saving the text file without making changes to some music. #2667chroma
: Fix a crash when running the submit
command on Python 3 on Windows with non-ASCII filenames. #2671absubmit
: Fix an occasional crash on Python 3 when the AB analysis tool produced non-ASCII metadata. #2673duplicates
: Use the default tiebreak for items or albums when the configuration only specifies a tiebreak for the other kind of entity. Thanks to @cgevans. #2758duplicates
: Fix the --key
command line option, which was ignored.replaygain
: Fix album ReplayGain calculation with the GStreamer backend. #2636scrub
: Handle errors when manipulating files using newer versions of Mutagen. #2716fetchart
: The plugin no longer gets skipped during import when the "Edit Candidates" option is used from the edit
plugin. #2734fromfilename
: Recognize file names that contain only a track number, such as 01.mp3
. Also, the plugin now allows underscores as a separator between fields. Thanks to @Vrihub. #2738 #2759maxwidth
config option in the fetchart
and embedart
plugins.There are some changes for developers:
None
sometimes instead of just showing up as an empty string. #2605beets.library
module and the manipulate_files
function in beets.importer
to use a single parameter describing the file operation instead of multiple Boolean flags. There is a new numerated type describing how to move, copy, or link files. #2682Published by sampsyo over 7 years ago
Version 1.4.5 adds some oft-requested features. When you're importing files, you can now manually set fields on the new music. Date queries have gotten much more powerful: you can write precise queries down to the second, and we now have relative queries like -1w
, which means one week ago.
Here are the new features:
--set field=value
command-line flag or a new set_fields
configuration option under the importer
section. Thanks to @bartkl. #1881 #2581added:-1w..
to match music added in the last week, for example. Thanks to @euri10. #2598gmusic
lets you interact with your Google Play Music library. Thanks to @tigranl. #2553 #2586replaygain
: We now keep R128 data in separate tags from classic ReplayGain data for formats that need it (namely, Ogg Opus). A new r128
configuration option enables this behavior for specific formats. Thanks to @autrimpo. #2557 #2560move
command gained a new --export
flag, which copies files to an external location without changing their paths in the library database. Thanks to @SpirosChadoulos. #435 #2510There are also some bug fixes:
lastgenre
: Fix a crash when using the prefer_specific
and canonical
options together. Thanks to @yacoob. #2459 #2583web
: Fix a crash on Windows under Python 2 when serving non-ASCII filenames. Thanks to @robot3498712. #2592 #2593metasync
: Fix a crash in the Amarok backend when filenames contain quotes. Thanks to @aranc23. #2595 #2596Published by sampsyo over 7 years ago
This release built up a longer-than-normal list of nifty new features. We now support DSF audio files and the importer can hard-link your files, for example.
Here's a full list of new features:
kodiupdate
lets you keep your Kodi library in sync with beets. Thanks to @Pauligrinder. #2411import
section enables a terminal bell when input is required. Thanks to @SpirosChadoulos. #2366 #2495composer_sort
, is now supported and fetched from MusicBrainz. Thanks to @dosoe. #2519 #2529discogs
now both provide a new attribute called track_alt
that stores more nuanced, possibly non-numeric track index data. For example, some vinyl or tape media will report the side of the record using a letter instead of a number in that field. #1831 #2363web
: Added a new endpoint, /item/path/foo
, which will return the item info for the file at the given path, or 404.web
: Added a new config option, include_paths
, which will cause paths to be included in item API responses if set to true.%aunique
template function for aunique now takes a third argument that specifies which brackets to use around the disambiguator value. The argument can be any two characters that represent the left and right brackets. It defaults to []
and can also be blank to turn off bracketing. #2397 #2399--move
or -m
option to the importer so that the files can be moved to the library instead of being copied or added "in place." #2252 #2429badfiles
: Added a --verbose
or -v
option. Results are now displayed only for corrupted files by default and for all the files when the verbose option is set. #1654 #2434embedart
: The explicit embedart
command now asks for confirmation before embedding art into music files. Thanks topython -m beets
. #2453smartplaylist
: Different playlist specifications that generate identically-named playlist files no longer conflict; instead, the resulting lists of tracks are concatenated. #2468missing
: A new mode lets you see missing albums from artists you have in your library. Thanks to @qlyoung. #2481web
: Add new reverse_proxy
config option to allow serving the web plugins under a reverse proxy.play
: A new -y
or --yes
parameter lets you skip the warning message if you enqueue more items than the warning threshold usually allows.convert
. Thanks to @jansol. #2488 #2524There are also quite a few fixes:
absubmit
: We no longer filter audio files for specific formats---we will attempt the submission process for all formats. #2471mpdupdate
: Fix Python 3 compatibility. #2381replaygain
: Fix Python 3 compatibility in the bs1770gain
backend. #2382bpd
: Report playback times as integers. #2394mpdstats
: Fix Python 3 compatibility. The plugin also now requires version 0.4.2 or later of the python-mpd2
library. #2405mpdstats
: Improve handling of MPD status queries.badfiles
: Fix Python 3 compatibility.badfiles
: The command no longer bails out if the validator command is not found or exits with an error. #2430 #2433lyrics
: The Google search backend no longer crashes when the server responds with an error. #2437discogs
: You can now authenticate with Discogs using a personal access token. #2447duplicates
: Fix Python 3 compatibility when using the copy
and move
options. #2444mbsubmit
: The tracks are now sorted properly. Thanks tothumbnails
: Fix a string-related crash on Python 3. #2466beatport
: More than just 10 songs are now fetched per album. #2469convert
: The default configuration uses FFmpeg's built-in AAC codec instead of faac. Thanks to @jansol. #2484web
: Avoid a crash when sending binary data, such as Chromaprint fingerprints, in music attributes. #2542 #2532We removed backends from two metadata plugins because of bitrot:
lyrics
: The Lyrics.com backend has been removed. (It stopped working because of changes to the site's URL structure.) #2548 #2549fetchart
: The documentation no longer recommends iTunes Store artwork lookup because the unmaintained python-itunes is broken. Want to adopt it? #2371 #1610Published by sampsyo almost 8 years ago
Happy new year! This new version includes a cornucopia of new features from contributors, including new tags related to classical music and a new AcousticBrainz Submit plugin for performing acoustic analysis on your music. The Random plugin has a new mode that lets you generate time-limited music---for example, you might generate a random playlist that lasts the perfect length for your walk to work. We also access as many Web services as possible over secure connections now---HTTPS everywhere!
The most visible new features are:
absubmit
lets you run acoustic analysis software and upload the results for others to use. Thanks to @inytar. #2253 #2342play
: The plugin now provides an importer prompt choice to play the music you're about to import. Thanks to @diomekes. #2008 #2360random
: A new --time
option lets you generate a random playlist that takes a given amount of time. Thanks to @diomekes. #2305 #2322Some smaller new features:
zero
: A new zero
command manually triggers the zero plugin. Thanks to @SJoshBrown. #2274 #2329acousticbrainz
: The plugin will avoid re-downloading data for files that already have it by default. You can override this behavior using a new force
option. Thanks to @SusannaMaria. #2347 #2349bpm
: The import.write
configuration option now decides whether or not to write tracks after updating their BPM. #1992And the fixes:
bpd
: Fix a crash on non-ASCII MPD commands. #2332scrub
: Avoid a crash when files cannot be read or written. #2351scrub
: The image type values on scrubbed files are preserved instead of being reset to "other." #2339web
: Fix a crash on Python 3 when serving files from the filesystem. #2353discogs
: Improve the handling of releases that contain subtracks. #2318discogs
: Fix a crash when a release does not contain format information, and increase robustness when other fields are missing. #2302lyrics
: The plugin now reports a beets-specific User-Agent header when requesting lyrics. #2357embyupdate
: The plugin now checks whether an API key or a password is provided in the configuration.play
: The misspelled configuration option warning_treshold
is no longer supported.For plugin developers: when providing new importer prompt choices (see append_prompt_choices), you can now provide new candidates for the user to consider. For example, you might provide an alternative strategy for picking between the available alternatives or for looking up a release on MusicBrainz.
Published by sampsyo almost 8 years ago
This is just a little bug fix release. With 1.4.2, we're also confident enough to recommend that anyone who's interested give Python 3 a try: bugs may still lurk, but we've deemed things safe enough for broad adoption. If you can, please install beets with pip3
instead of pip2
this time and let us know how it goes!
Here are the fixes:
badfiles
: Fix a crash on non-ASCII filenames. #2299%asciify{}
path formatting function and the asciify-paths setting properly substitute path separators generated by converting some Unicode characters, such as Ā½ and Ā¢, into ASCII.convert
: Fix a logging-related crash when filenames contain curly braces. Thanks to @kierdavis. #2323Also, we've removed some special handling for logging in the discogs
that we believe was unnecessary. If spurious log messages appear in this version, please let us know by filing a bug.
Published by sampsyo almost 8 years ago
Version 1.4 has alpha-level Python 3 support. Thanks to the heroic efforts of @jrobeson, beets should run both under Python 2.7, as before, and now under Python 3.4 and above. The support is still new: it undoubtedly contains bugs, so it may replace all your music with Limp Bizkitābut if you're brave and you have backups, please try installing on Python 3. Let us know how it goes.
If you package beets for distribution, here's what you'll want to know:
This version also makes a few changes to the command-line interface and configuration that you may need to know about:
duplicates
: The duplicates
command no longer accepts multiple field arguments in the form -k title albumartist album
. Each argument must be prefixed with -k
, as in -k title -k albumartist -k album
.colors
configuration option has been removed (the setting is now under ui
).list_format_album
and list_format_item
configuration options have been removed (see format_album and format_item).The are a few new features:
mpdupdate
, mpdstats
: When the host
option is not set, these plugins will now look for the $MPD_HOST
environment variable before falling back to localhost
. Thanks to @tarruda. #2175web
: Added an expand
option to show the items of an album. #2050embyupdate
: The plugin can now use an API key instead of a password to authenticate with Emby. #2045 #2117acousticbrainz
: The plugin now adds a bpm
field.beet --version
now includes the Python version used to run beets.,
) when they are not part of a function call. #2166 #2213update
command takes a new -F
flag to specify the fields to update. Thanks to @dangmai. #2229 #2231And there are a few bug fixes too:
convert
: The plugin no longer asks for confirmation if the query did not return anything to convert. #2260 #2262embedart
: The plugin now uses jpg
as an extension rather than jpeg
, to ensure consistency with the plugins/fetchart. Thanks to @tweitzel. #2254 #2255embedart
: The plugin now works for all jpeg files, including those that are only recognizable by their magic bytes. #1545 #2255web
: The JSON output is no longer pretty-printed (for a space savings). #2050permissions
: Fix a regression in the previous release where the plugin would always fail to set permissions (and log a warning). #2089beatport
: Use track numbers from Beatport (instead of determining them from the order of tracks) and set the medium_index
value.beatport
) would not set the track number at all. This is fixed. #2085play
: Fix $args
getting passed verbatim to the play command if it was set in the configuration but -A
or --args
was omitted.embyupdate
: Fixes authentication header problem that caused a problem that it was not possible to get tokens from the Emby API.lyrics
: Some titles use a colon to separate the main title from a subtitle. To find more matches, the plugin now also searches for lyrics using the part part preceding the colon character. #2206discogs
: Subtracks are now detected and combined into a single track, two-sided mediums are treated as single discs, and tracks have media
, medium_total
and medium
set correctly. #2222 #2228.missing
: missing
is now treated as an integer, allowing the use of (for example) ranges in queries.smartplaylist
: Playlist names will be sanitized to ensure valid filenames. #2258The last release, 1.3.19, also erroneously reported its version as "1.3.18" when you typed beet version
. This has been corrected.
Published by sampsyo over 8 years ago
This is primarily a bug fix release: it cleans up a couple of regressions that appeared in the last version. But it also features the triumphant return of the beatport
and a modernized bpd
.
It's also the first version where beets passes all its tests on Windows! May this herald a new age of cross-platform reliability for beets.
New features:
beatport
: This metadata source plugin has arisen from the dead! It now works with Beatport's new OAuth-based API. Thanks tobpd
: The plugin now uses the modern GStreamer 1.0 instead of the old 0.10. Thanks to @philippbeckmann. #2057 #2062--force
option for the remove
command allows removal of items without prompting beforehand. #2042Some fixes for Windows:
embedart
: Image similarity comparison with ImageMagick should now work on Windows.fetchart
: The plugin should work more reliably with non-ASCII paths.And other fixes:
replaygain
: The bs1770gain
backend now correctly calculates sample peak instead of true peak. This comes with a major speed increase. #2031lyrics
: Avoid a crash and a spurious warning introduced in the last version about a Google API key, which appeared even when you hadn't enabled the Google lyrics source.bash-completion
to work better with Homebrew installations. Thanks to @bismark. #2038-f
option for many commands. #2063fetchart
: Determine the file extension for downloaded images based on the image's magic bytes. The plugin prints a warning if result is not consistent with the server-supplied Content-Type
header. In previous versions, the plugin would use a .jpg
extension for all images. #2053Published by sampsyo over 8 years ago
This update adds a new hook
that lets you integrate beets with command-line tools and an export
that can dump data from the beets database as JSON. You can also automatically translate lyrics using a machine translation service.
The echonest
plugin has been removed in this version because the API it used is shutting down. You might want to try the acousticbrainz
instead.
Some of the larger new features:
hook
lets you execute commands in response to beets events.export
can export data from beets' database as JSON. Thanks to @GuilhermeHideki.lyrics
: The plugin can now translate the fetched lyrics to your native language using the Bing translation API. Thanks to @Kraymer.fetchart
: Album art can now be fetched from fanart.tv.Smaller new things:
%first
and %ifdef
. See template-functions.convert
: A new album_art_maxwidth
setting lets you resize album art while copying it.convert
: The extension
setting is now optional for conversion formats. By default, the extension is the same as the name of the configured format.importadded
: A new preserve_write_mtimes
option lets you preserve mtime of files even when beets updates their metadata.fetchart
: The enforce_ratio
option now lets you tolerate images that are almost square but differ slightly from an exact 1:1 aspect ratio.fetchart
: The plugin can now optionally save the artwork's source in an attribute in the database.web
: A new values
endpoint lets you get the distinct values of a field. Thanks to @sumpfralle. #2010Fixes:
stats
command in exact mode when filenames on Windows use non-ASCII characters. #1891mbcollection
: The plugin now redacts your MusicBrainz password in the beet config
output. #1907scrub
: Fix an occasional problem where scrubbing on import could undo the id3v23 setting. #1903lyrics
: Add compatibility with some changes to the LyricsWiki page markup. #1912 #1909lyrics
: Fix retrieval from Musixmatch by improving the way we guess the URL for lyrics on that service. #1880edit
: Fail gracefully when the configured text editor command can't be invoked. #1927fetchart
: Fix a crash in the Wikipedia backend on non-ASCII artist and album names. #1960convert
: Change the default ogg
encoding quality from 2 to 3 (to fit the default from the oggenc(1)
manpage). #1982convert
: The never_convert_lossy_files
option now considers AIFF a lossless format. #2005web
: A proper 404 error, instead of an internal exception, is returned when missing album art is requested. Thanks tolost+found
directory by default.acousticbrainz
: AcousticBrainz lookups are now done over HTTPS. Thanks to @Freso. #2007Published by sampsyo over 8 years ago
This release introduces one new plugin to fetch audio information from the AcousticBrainz project and another plugin to make it easier to submit your handcrafted metadata back to MusicBrainz. The importer also gained two oft-requested features: a way to skip the initial search process by specifying an ID ahead of time, and a way to manually provide metadata in the middle of the import process (via the edit
plugin).
Also, as of this release, the beets project has some new Internet homes! Our new domain name is beets.io, and we have a shiny new GitHub organization: beetbox.
Here are the big new features:
acousticbrainz
fetches acoustic-analysis information from the AcousticBrainz project. Thanks to @opatel99, and thanks to Google Code-In! #1784mbsubmit
lets you print music's current metadata in a format that the MusicBrainz data parser can understand. You can trigger it during an interactive import session. #1779--search-id
importer option lets you manually specify IDs (i.e., MBIDs or Discogs IDs) for imported music. Doing this skips the initial candidate search, which can be important for huge albums where this initial lookup is slow. Also, the enter Id
prompt choice now accepts several IDs, separated by spaces. #1808edit
: You can now edit metadata on the fly during the import process. The plugin provides two new interactive options: one to edit your music's metadata, and one to edit the matched metadata retrieved from MusicBrainz (or another data source). This feature is still in its early stages, so please send feedback if you find anything missing. #1846 #396There are even more new features:
fetchart
: The Google Images backend has been restored. It now requires an API key from Google. Thanks to @lcharlick. #1778info
: A new option will print only fields' names and not their values. Thanks to @GuilhermeHideki. #1812fields
command now displays flexible attributes. Thanks to @GuilhermeHideki. #1818modify
command lets you interactively select which albums or items you want to change. #1843move
command gained a new --timid
flag to print and confirm which files you want to move. #1843move
command no longer prints filenames for files that don't actually need to be moved. #1583Fixes:
play
: Fix a regression in the last version where there was no default command. #1793lastimport
: The plugin now works again after being broken by some unannounced changes to the Last.fm API. #1574play
: Fixed a typo in a configuration option. The option is now warning_threshold
instead of warning_treshold
, but we kept the old name around for compatibility. Thanks to @JesseWeinstein. #1802 #1803edit
: Editing metadata now moves files, when appropriate (like the modify
command). #1804stats
command no longer crashes when files are missing or inaccessible. #1806fetchart
: Possibly fix a Unicode-related crash when using some versions of pyOpenSSL. #1805replaygain
: Fix an intermittent crash with the GStreamer backend. #1855lastimport
: The plugin now works with the beets API key by default. You can still provide a different key the configuration.replaygain
: Fix a crash using the Python Audio Tools backend. #1873Published by sampsyo almost 9 years ago
The big news in this release is a new interactive editor plugin. It's really nifty: you can now change your music's metadata by making changes in a visual text editor, which can sometimes be far more efficient than the built-in modify-cmd` command. No more carefully retyping the same artist name with slight capitalization changes.
This version also adds an oft-requested "not" operator to beets' queries, so you can exclude music from any operation. It also brings friendlier formatting (and querying!) of song durations.
The big new stuff:
edit
lets you manually edit your music's metadata using your favorite text editor. #164 #1706^
before part of a query to exclude matching music from the results. For example, beet list -a beatles ^album:1
will find all your albums by the Beatles except for their singles compilation, "1." See not_query. #819 #1728embyupdate
can trigger a library refresh on an Emby server when your beets database changes.beet list length:5:30..
will find all your tracks that have a duration over 5 minutes and 30 seconds. You can turn off this new behavior using the format_raw_length
configuration option. #1749Smaller changes:
modify
, update
, and mbsync
, would previously move files by default after changing their metadata. Now, these commands will only move files if you have the config-import-copy or config-import-move options enabled in your importer configuration. This way, if you configure the importer not to touch your filenames, other commands will respect that decision by default too. Each command also sprouted a --move
command-line option to override this default (in addition to the --nomove
flag they already had). #1697va_name
, controls the album artist name for various-artists albums. The setting defaults to "Various Artists," the MusicBrainz standard. In order to match MusicBrainz, the discogs
also adopts the same setting.info
: The info
command now accepts a -f/--format
option for customizing how items are displayed, just like the built-in list
command. #1737Some changes for developers:
albuminfo_received
and trackinfo_received
, let plugins intercept metadata as soon as it is received, before it is applied to music in the database. #872Fixes:
plexupdate
: Fix a crash when Plex libraries use non-ASCII collection names. #1649discogs
: Maybe fix a crash when using some versions of the requests
library. #1656fetchart
: In auto mode, the plugin now skips albums that already have art attached to them so as not to interfere with re-imports. #314fetchart
: The plugin now only resizes album art if necessary, rather than always by default. #1264fetchart
: Fix a bug where a database reference to a non-existent album art file would prevent the command from fetching new art. #1126thumbnails
: Fix a crash with Unicode paths. #1686embedart
: The remove_art_file
option now works on import (as well as with the explicit command). #1662 #1675metasync
: Fix a crash when syncing with recent versions of iTunes. #1700duplicates
: Fix a crash when merging items. #1699smartplaylist
: More gracefully handle malformed queries and missing configuration.thumbnails
: Fix a nasty segmentation fault crash that arose with some library versions. #1433convert
: Fix a crash with Unicode paths in --pretend
mode. #1735fetchart
: The Google Images backend has been removed. It used an API that has been shut down. #1760lyrics
: Fix a crash in the Google backend when searching for bands with regular-expression characters in their names, like Sunn O))). #1673scrub
: In auto
mode, the plugin now actually only scrubs files on import, as the documentation always claimed it did---not every time files were written, as it previously did. #1657scrub
: Also in auto
mode, album art is now correctly restored. #1657%aunique
template function. #1775lyrics
: The Genius backend is now more robust to communication errors. The backend has also been disabled by default, since the API it depends on is currently down. #1770Published by sampsyo about 9 years ago
This release adds a new plugin for checking file quality and a new source for lyrics. The larger features are:
badfiles
helps you scan for corruption in your music collection. Thanks to @fxthomas. #1568lyrics
: You can now fetch lyrics from Genius.com. Thanks to @sadatay. #1626 #1639zero
: The plugin can now use a "whitelist" policy as an alternative to the (default) "blacklist" mode. Thanks to @adkow. #1621 #1641And there are smaller new features too:
play
: A new --args
option lets you specify options for the player command. #1532play
: A new raw
configuration option lets the command work with players (such as VLC) that expect music filenames as arguments, rather than in a playlist. Thanks to @nathdwek. #1578play
: You can now configure the number of tracks that trigger a "lots of music" warning. #1577embedart
: A new remove_art_file
option lets you clean up if you prefer only embedded album art. Thanks to @jackwilsdon. #1591 #733plexupdate
: A new library_name
option allows you to select which Plex library to update. #1572 #1595include
option lets you import external configuration files.This release has plenty of fixes:
lastgenre
: Fix a bug that prevented tag popularity from being considered. Thanks to @svoos. #1559clearart
command from the embedart
. Thanks to @nathdwek. #1565fetchart
: The Google Images source is disabled by default (as it was before beets 1.3.9), as is the Wikipedia source (which was causing lots of unnecessary delays due to DBpedia downtime). To re-enable these sources, add wikipedia google
to your sources
configuration option.list
command's help output now has a small query and format string example. Thanks to @pkess. #1582fetchart
: The plugin now fetches PNGs but not GIFs. (It still fetches JPEGs.) This avoids an error when trying to embed images, since not all formats support GIFs. #1588replaygain
: Avoid a crash when the PyAudioTools backend encounters an error. #1592Published by sampsyo about 9 years ago
This is mainly a bugfix release, but we also have a nifty new plugin for ipfs and a bunch of new configuration options.
The new features:
ipfs
plugin lets you share music via a new, global, decentralized filesystem. #1397duplicates
: You can now merge duplicate track metadata (when detecting duplicate items), or duplicate album tracks (when detecting duplicate albums).duplicates
: Duplicate resolution now uses an ordering to prioritize duplicates. By default, it prefers music with more complete metadata, but you can configure it to use any list of attributes.metasync
: Added a new backend to fetch metadata from iTunes. This plugin is still in an experimental phase. #1450move
command has a new --pretend
option, making the command show how the items will be moved without actually changing anything.musicbrainzngs
library that is not yet released, but will start working when it is available.) Thanks to @ruippeixotog. #1104 #1493plexupdate
: A new token
configuration option lets you specify a key for Plex Home setups. Thanks to @edcarroll. #1494zero
: A new update_database
configuration option nulls out fields in the database along with files' tags. #1516Fixes:
fetchart
: Complain when the enforce_ratio
or min_width
options are enabled but no local imaging backend is available to carry them out. #1460importfeeds
: Avoid generating incorrect m3u filename when both of the m3u
and m3u_multi
options are enabled. #1490duplicates
: Avoid a crash when misconfigured. #1457mpdstats
: Avoid a crash when the music played is not in the beets library. Thanks to @CodyReichert. #1443embedart
, fetchart
, and thumbnails
). #1448permissions
: Fix an error with non-ASCII paths. #1449embedart
: Avoid an error when trying to embed invalid images into MPEG-4 files.fetchart
: The Wikipedia source can now better deal artists that use non-standard capitalization (e.g., alt-J, dEUS).web
: Fix searching for non-ASCII queries. Thanks tompdupdate
: We now recommend the newer python-mpd2
library instead of its unmaintained parent. Thanks to @Somasis. #1472keyfinder
: Fix handling of Unicode paths. #1502fetchart
: When album art is already present, the message is now printed in the text_highlight_minor
color (light gray). Thanks toreplaygain
: Missing GStreamer plugins now cause a helpful error message instead of a crash. #1518/usr/sbin
seems not to be on the user's path by default).fields
command no longer separates built-in fields from plugin-provided ones. This distinction was becoming increasingly unreliable.duplicates
: Fix a Unicode warning when paths contained non-ASCII characters. #1551fetchart
: Work around a urllib3 bug that could cause a crash. #1555 #1556beet config -e
and the file does not exist, beets creates an empty file before editing it. This fixes an error on OS X, where the open
command does not work with non-existent files. #1480Published by sampsyo over 9 years ago
This is a tiny bug-fix release. It copes with a dependency upgrade that broke beets. There are just two fixes:
embedart
: In auto
mode (the import hook), the plugin now respects the write
config option under import
. If this is disabled, album art is no longer embedded on import in order to leave files untouched---in effect, auto
is implicitly disabled. #1427Published by sampsyo over 9 years ago
This little update makes queries more powerful, sorts music more intelligently, and removes a performance bottleneck. There's an experimental new plugin for synchronizing metadata with music players.
Packagers should also note a new dependency in this version: the Jellyfish Python library makes our text comparisons (a big part of the auto-tagging process) go much faster.
New features:
beet ls foo , bar
will get all the items matching foo
or matching bar
. See combiningqueries. #1423metasync
lets you get metadata from your favorite music players, starting with Amarok. #1386fetchart
: There are new settings to control what constitutes "acceptable" images. The minwidth
option constrains the minimum image width in pixels and the enforce_ratio
option requires that images be square. #1394Little fixes and improvements:
fetchart
: Remove a hard size limit when fetching from the Cover Art Archive.fields
command is now sorted. Thanks to @multikatt. #1402replaygain
: Fix a number of issues with the new bs1770gain
backend on Windows. Also, fix missing debug output in import mode. #1398discogs
: Better error handling when we can't communicate with Discogs on setup. #1417importadded
: Fix a crash when importing singletons in-place. #1416fuzzy
: Fix a regression causing a crash in the last release. #1422date
and original_date
(which are not built-in beets fields). #1404Published by sampsyo over 9 years ago
In this release, we refactored the logging system to be more flexible and more useful. There are more granular levels of verbosity, the output from plugins should be more consistent, and several kinds of logging bugs should be impossible in the future.
There are also two new plugins: one for filtering the files you import and an evolved plugin for using album art as directory thumbnails in file managers. There's a new source for album art, and the importer now records the source of match data. This is a particularly huge release---there's lots more below.
There's one big change with this release: Python 2.6 is no longer supported. You'll need Python 2.7. Please trust us when we say this let us remove a surprising number of ugly hacks throughout the code.
Major new features and bigger changes:
-v
or very verbose with -vv
. For the importer especially, this makes the first verbose mode much more manageable, while still preserving an option for overwhelmingly verbose debug output. #1244filefilter
plugin lets you write regular expressions to automatically avoid importing certain files. Thanks to @mried. #1186thumbnails
plugin generates cover-art thumbnails for album folders for Freedesktop.org-compliant file managers. (This replaces the freedesktop
, which only worked with the Dolphin file manager.)replaygain
: There is a new backend that uses the bs1770gain analysis tool. Thanks to @jmwatte. #1343filesize
field on items indicates the number of bytes in the file. #1291searchlimit
configuration option allows you to specify how many search results you wish to see when looking up releases at MusicBrainz during import. #1245data_source
on items and albums. #1311colors
, nested under the option ui
. (Also, the color
config option has been moved from top-level to under ui
. Beets will respect the old color setting, but will warn the user with a deprecation message.) #1238fetchart
: There's a new Wikipedia image source that uses DBpedia to find albums. Thanks to Tom Jaspers. #1194config
command, the output is now redacted by default. Sensitive information like passwords and API keys is not included. The new --clear
option disables redaction. #1376You should probably also know about these core changes to the way beets works:
tracktotal
attribute is now a track-level field instead of an album-level one. This field stores the total number of tracks on the album, or if the per_disc_numbering config option is set, the total number of tracks on a particular medium (i.e., disc). The field was causing problems with that per_disc_numbering mode: different discs on the same album needed different track totals. The field can now work correctly in either mode.tracktotal
as an album-level field, there is a new albumtotal
computed attribute that provides the total number of tracks on the album. (The per_disc_numbering option has no influence on this field.)list_format_album
and list_format_item
configuration keys now affect (almost) every place where objects are printed and logged. (Previously, they only controlled the list
command and a few other scattered pieces.) #1269beet
program now accept top-level options --format-item
and --format-album
before any subcommand to control how items and albums are displayed. #1271list_format_album
and list_format_album
have respectively been renamed format_album and format_item. The old names still work but each triggers a warning message. #1271There are also lots of medium-sized features in this update:
duplicates
: The command has a new --strict
option that will only report duplicates if all attributes are explicitly set. #1000smartplaylist
: Playlist updating should now be faster: the plugin detects, for each playlist, whether it needs to be regenerated, instead of obliviously regenerating all of them. The splupdate
command can now also take additional parameters that indicate the names of the playlists to regenerate.play
: The command shows the output of the underlying player command and lets you interact with it. #1321lastgenre
: Add comedy, humor, and stand-up as well as a longer list of classical music genre tags to the built-in whitelist and canonicalization tree. #1206 #1239 #1240web
: Add support for cross-origin resource sharing for more flexible in-browser clients. Thanks to Andre Miller. #1236 #1237-f/--format
option controls the output format when listing unrecognized items. The output is also now more helpful by default. #1246fetchart
: A new option, -n
, extracts the cover art of all matched albums into their respective directories. Another new flag, -a
, associates the extracted files with the albums in the database. #1261info
: A new option, -i
, can display only a specified subset of properties. #1287permissions
: The plugin now also adjusts the permissions of the directories. (Previously, it only affected files.) #1308 #1324ftintitle
: You can now configure the format that the plugin uses to add the artist to the title. Thanks to @amishb. #1377And many little fixes and improvements:
replaygain
: Stop applying replaygain directly to source files when using the mp3gain backend. #1316lyrics
: Silence a warning about insecure requests in the new MusixMatch backend. #1204beet
is invoked without arguments. #1205 #1207fetchart
: Do not attempt to import directories as album art. #1177 #1211mpdstats
: Avoid double-counting some play events. #773 #1212--pretend
mode. #1214smartplaylist
: Fix album_query
so that individual files are added to the playlist instead of directories. #1225beatport
plugin. Beatport_ has shut off public access to their API and denied our request for an account. We have not heard from the company since 2013, so we are assuming access will not be restored.embedart
: Handle errors in ImageMagick's output. #1241keyfinder
: Parse the underlying tool's output more robustly. #1248embedart
: We now show a comprehensible error message when beet embedart -f FILE
is given a non-existent path. #1252importfeeds
and smartplaylist
: Automatically create parent directories for playlist files (instead of crashing when the parent directory does not exist). #1266embedart
: Fix a crash that occured when used together with the check plugin. #1241scrub
: Log an error instead of stopping when the beet scrub
command cannot write a file. Also, avoid problems on Windows with Unicode filenames. #1297discogs
: Handle and log more kinds of communication errors. #1299 #1305lastgenre
: Bugs in the pylast
library can no longer crash beets.convert
: You can now configure the temporary directory for conversions. Thanks to @autochthe. #1382 #1383rewrite
: Fix a regression that prevented the plugin's rewriting from applying to album-level fields like $albumartist
. #1393play
: The plugin now sorts items according to the configuration in album mode.fetchart
: The name for extracted art files is taken from the art_filename
configuration option. #1258For developers:
database_change
event now sends the item or album that is subject to a change.OptionParser
is now a CommonOptionsParser
that offers facilities for adding usual options (--album
, --path
and --format
). See add_subcommands. #1271{}
-style string formatting lazily. See plugin-logging in the plugin API docs.import_task_created
event lets you manipulate import tasks immediately after they are initialized. It's also possible to replace the originally created tasks by returning new ones using this event.