From d828d7aae4164400ef61fd40166f21c08d9dd298 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sun, 6 Oct 2013 11:21:56 -0700 Subject: [PATCH] #380: correctly skip no-op transcodes The format key is now the (lower-cased) format name string used by beets, which means we can precisely detect which transcodes would be unnecessary. To facilitate this, I added an ALIASES dict which allows more convenient names to work for this (e.g., "wma" is easier to remember than "windows media"). --- beetsplug/convert.py | 22 ++++++++++++++++------ docs/plugins/convert.rst | 24 ++++++++++++++---------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/beetsplug/convert.py b/beetsplug/convert.py index 6a3d41669..0112712c3 100644 --- a/beetsplug/convert.py +++ b/beetsplug/convert.py @@ -31,6 +31,12 @@ DEVNULL = open(os.devnull, 'wb') _fs_lock = threading.Lock() _temp_files = [] # Keep track of temporary transcoded files for deletion. +# Some convenient alternate names for formats. +ALIASES = { + u'wma': u'windows media', + u'vorbis': u'ogg', +} + def _destination(dest_dir, item, keep_new, path_formats): """Return the path under `dest_dir` where the file should be placed @@ -50,7 +56,8 @@ def _destination(dest_dir, item, keep_new, path_formats): def get_format(): """Get the currently configured format command and extension. """ - format = config['convert']['format'].get(unicode) + format = config['convert']['format'].get(unicode).lower() + format = ALIASES.get(format, format) format_info = config['convert']['formats'][format].get(dict) try: return (format_info['command'].split(), @@ -89,7 +96,9 @@ def encode(source, dest): return if not quiet: - log.info(u'Finished encoding {0}'.format(util.displayable_path(source))) + log.info(u'Finished encoding {0}'.format( + util.displayable_path(source)) + ) def should_transcode(item): @@ -97,8 +106,9 @@ def should_transcode(item): conversion (i.e., its bitrate is high or it has the wrong format). """ maxbr = config['convert']['max_bitrate'].get(int) - - return item.format not in ['AAC', 'MP3', 'Opus', 'OGG', 'Windows Media'] or item.bitrate >= 1000 * maxbr + format_name = config['convert']['format'].get(unicode) + return format_name.lower() == item.format.lower() or \ + item.bitrate >= 1000 * maxbr def convert_item(dest_dir, keep_new, path_formats): @@ -235,11 +245,11 @@ class ConvertPlugin(BeetsPlugin): u'command': u'ffmpeg -i $source -y -acodec libopus -vn -ab 96k $dest', u'extension': u'opus', }, - u'vorbis': { + u'ogg': { u'command': u'ffmpeg -i $source -y -acodec libvorbis -vn -aq 2 $dest', u'extension': u'ogg', }, - u'wma': { + u'windows media': { u'command': u'ffmpeg -i $source -y -acodec wmav2 -vn $dest', u'extension': u'wma', }, diff --git a/docs/plugins/convert.rst b/docs/plugins/convert.rst index 7869aa40b..71191615a 100644 --- a/docs/plugins/convert.rst +++ b/docs/plugins/convert.rst @@ -1,13 +1,15 @@ Convert Plugin ============== -The ``convert`` plugin lets you convert parts of your collection to a directory -of your choice. It converts all input formats supported by `FFmpeg`_ to MP3. -It will skip files that are already present in the target directory. Converted -files follow the same path formats as your library. +The ``convert`` plugin lets you convert parts of your collection to a +directory of your choice, transcoding audio and embedding album art along the +way. It can transcode to and from any format using a configurable command +line. It will skip files that are already present in the target directory. +Converted files follow the same path formats as your library. .. _FFmpeg: http://ffmpeg.org + Installation ------------ @@ -20,6 +22,7 @@ by the plugin. Otherwise, configure the plugin to locate the executable:: convert: ffmpeg: /usr/bin/ffmpeg + Usage ----- @@ -52,11 +55,12 @@ The plugin offers several configuration options, all of which live under the transcoded and those with a lower bitrate will simply be copied. Note that this does not guarantee that all converted files will have a lower bitrate---that depends on the encoder and its configuration. -* ``format`` specify which format preset you would like to use. Default: mp3. -* ``formats`` lets you specify additional formats to convert to. Presets for - AAC, ALAC, FLAC, MP3, Opus, Vorbis and Windows Meda are provided, however - support may vary depending on your ffmpeg library. Each format is defined as - a command and a file extension. +* ``format`` is the name of the audio file format to transcode to. Files that + are already in the format (and are below the maximum bitrate) will not be + transcoded. Available formats include MP3, AAC, ALAC, FLAC, Opus, Vorbis, + and Windows Media; the default is MP3. +* ``formats`` lets you specify additional formats to convert to. Each format + is defined as a command and a file extension. * ``auto`` gives you the option to import transcoded versions of your files automatically during the ``import`` command. With this option enabled, the importer will transcode all non-MP3 files over the maximum bitrate before @@ -97,4 +101,4 @@ use ``$$`` to emit a dollars sign. In this example ``-aq `` is equivalent to the LAME option ``-V num``. If you want to specify a bitrate, use ``-ab ``. Refer to the `FFmpeg`_ -documentation for more details. \ No newline at end of file +documentation for more details.