Giter VIP home page Giter VIP logo

jack's Introduction

Jack

Jack is command-line CD ripper. It extracts audio from a CD, encodes it using 3rd party software and augments it with metadata from various sources.

As all CLI things, Jack is fast and efficient, and that's why we like it.

Recent features

  • port to Python 3
  • replace CDDB.py with libdiscid
  • replace eyeD3 with mutagen
  • add support for MusicBrainz while keeping support for freedb/gnudb
  • add support for extended tagging, compatible with MusicBrainz Picard
  • add support for M4A, using fdkaac and mutagen
  • transcoding from lossless to lossy formats
  • automatic downloading of album art from coverartarchive, iTunes and discogs
  • automatic, highly configurable embedding of album art

Requirements

  • Python 3
  • libdiscid, a shared library written in C
  • a Python 3 wrapper for libdiscid, either python-libdiscid or python-discid
  • Python 3 modules mutagen, requests, pillow and python-dateutil
  • an encoder like oggenc (Ogg/Vorbis), flac, lame (MP3) or fdkaac (M4A/AAC)
  • a ripper like cdparanoia (recommended), cdda2wav, dagrab or tosha

Usage

jack [option]...

Options of type bool can be negated with --no-[option]. Options that take an argument get that argument from the next option, or from the form --[option]=[argument]. Options that take a list argument take that list from the following arguments terminated with ';', the next option or the end of the options.

Option Type Default value Description
--debug bool no show debug information
--debug-write bool no write debug information to a file
--ripper str 'cdparanoia' which program to use for extracting the audio data

use which program to rip: cdparanoia, tosha, cdda2wav, dagrab (untested)
--device str '/dev/cdrom' use which device for ripping
--encoder-name, -E str 'oggenc' use which encoder

this is a symbolic name (see helpers), NOT the executable's name
--vbr, -v bool yes generate variable bitrate files

use variable bitrate for encoders which support it
--quality float 6 vbr encoding quality. -1 is lowest, 10 highest.
--bitrate, -b int 160 target bitrate in kbit/s

default bitrate
--server str 'musicbrainz' use which metadata server

your metadata server, see metadata_servers
--rename-fmt str '%a - %l - %n - %t' format of normal files

specify how the resulting files are named:
%n: track number
%a: artist
%t: track title
%l: album title
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%g: album genre - individual track genres are unsupported
--rename-fmt-va str '%l - %n - %a - %t' format of Various Artists files

specify how the resulting files are named:
%n: track number
%a: artist
%t: track title
%l: album title
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%g: album genre - individual track genres are unsupported
--rename-num str '%02d' track number format for %n, printf() style
--rename-dir bool yes rename directory as well
--append-year str '' append this string to the directory name
--dir-template str '%a/%l' if directories are renamed, this is the format used

specify how the resulting files are named:
%a: artist
%l: album title
%g: album genre - individual track genres are unsupported
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%d: disc number
%D: number of discs
%t: disc title
--dir-multi-cd-template str '%a/%l (CD %d)' dir_template, if album consists of multiple discs

specify how the resulting files are named:
%a: artist
%l: album title
%g: album genre - individual track genres are unsupported
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%d: disc number
%D: number of discs
%t: disc title
--dir-multi-cd-unknown-number-template str '%a/%l (CD %d)' dir_template, if album consists of multiple discs, and the number of discs is unknown

specify how the resulting files are named:
%a: artist
%l: album title
%g: album genre - individual track genres are unsupported
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%d: disc number
%D: number of discs
%t: disc title
--dir-titled-cd-template str '%a/%l (CD %d: %t)' dir_template, if album consists of multiple discs, and the current disc has a title

specify how the resulting files are named:
%a: artist
%l: album title
%g: album genre - individual track genres are unsupported
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%d: disc number
%D: number of discs
%t: disc title
--dir-titled-cd-unknown-number-template str '%a/%l (CD %d: %t)' dir_template, if album consists of an unknown number of multiple discs, and the current disc has a title

specify how the resulting files are named:
%a: artist
%l: album title
%g: album genre - individual track genres are unsupported
%y: album release year - individual track years are unsupported
%Y: smart year - transforms to the append_year template if year is set
%d: disc number
%D: number of discs
%t: disc title
--file-artist str 'as-in-mb' which MusicBrainz artist name to use for filenames

valid arguments are 'as-in-mb' (default), 'as-credited' or 'as-sort-name'
--add-disambiguation bool no add disambiguation to the album title
--char-filter str '' convert file names using a python method

an example which converts to lowercase, even with non-ascii charsets: ".lower()"
--charset str 'UTF-8' charset of filenames

examples: latin-1, utf-8, ...
--unusable-chars list ['/', '\r'] characters which can't be used in filenames

put chars which can't be used in filenames here and their replacements
in replacement_chars.

example 1: replace all " " by "":
unusable_chars = " "
replacement_chars = "
"

example 2: replace umlauts by an alternate representation and kill some
special characters:
unusable_chars = "äöüÄÖÜß?*^()[]{}"
replacement_chars = ["ae", "oe", "ue", "Ae", "Oe", "Ue", "ss", ""]
--replacement-chars list ['%', ''] unusable chars are replaced by the corresponding list item

this is stretched to match unusable_chars' length using the last char as fill
--scan-dirs int 2 scan in cwd n dir levels deep, e.g. 0 to disable
--search list ['.'] search which directories
--workdir, -w str '.' where to create directories and put the files
--max-load float 10.0 only start new encoders if load < max_load
--usage-win bool yes show the help screen while running
--encoders, -e int 1 encode how many files in parallel
--otf bool no on-the-fly encoding *experimental*
--create-dirs, -D bool yes create subdir for files
--reorder, -r bool no reorder tracks to save space while encoding
--keep-wavs, -k bool no do not delete WAVs after encoding them
--only-dae, -O bool no only produce WAVs, implies --keep_wavs
--read-ahead, -a int 99 read how many WAVs in advance
--nice, -n int 12 nice-level of encoders
--overwrite, -o bool no overwrite existing files
--remove-files bool no remove jack.* file when done
--silent-mode bool no be quiet (no screen output)
--exec, -x bool no run predefined command when finished
--force bool no don't ask.
--swab, -S bool yes swap byteorder when reading from image
--todo bool no print what would be done and exit
--space, -s int 0 force usable disk space, in bytes
--check-toc bool no compare toc-file and cd-toc, then exit
--undo-rename, -u bool no undo the last file renaming and exit
--dont-work, -d bool no don't do DAE, encoding, renaming or tagging
--update-metadata, -U bool no update the metadata info and exit
--refresh-metadata bool no forget about choices made in previous queries
--tracks, -t str '' which tracks to process (e.g. 1, 3, 5-9, 12-)
--query-now, -Q bool no do metadata query when starting
--query-if-needed bool no query metadata server when starting if not queried already
--query, -q bool no do metadata query when all is done
--cont-failed-query bool no continue without metadata data if query fails
--edit-metadata bool no edit metadata information before using it
--various bool - assume CD has various artists
--various-swap bool no exchange artist and title
--extt-is-artist bool no extt contains artist
--extt-is-title bool no extt contains track title
--extt-is-comment bool no extt contains track comment
--rename, -R bool no rename according to metadata file, eg. after editing it
--lookup bool no start a browser and look up the CD
--set-dae-tag bool no set DAE info tags

depends on set_extended_tag
--genre, -G str - overrule genre from metadata
--year, -Y str - overrule year from metadata (0=don't set)
--from-tocfile, -f str - read another toc file which may point to an image-file
--from-image, -F bytes - read audio from an image file
--guess-toc, -g list [] guess TOC from files (until terminating ";")
--upd-progress bool no re-generate progress file if "lost"
--multi-mode bool no try to query metadata server for all dirs in searchdirs which have no metadata
--claim-dir, -C bool no rename the dir even if it was not created by jack
--wait bool no wait for key press before quitting
--save bool no save options to rc file and exit
--get str - show value of a config option
--write-m3u bool no create a playlist in .m3u format
--download-progress-interval int 5 interval in seconds for showing progress of slow downloads, zero is no progress
--embed-albumart bool no embed album art
--show-albumart bool no show the album art that has been embedded in an external viewer
--albumart-file str - specific album art file to embed
--albumart-search list ['.*[Cc]over.*\.(jpg|jpeg|png)$', '.*[Ff]ront.*\.(jpg|jpeg|png)$', '^[Ff]older\.(jpg|jpeg|png)$', '^jack\.caa\.front.*\.jpg$', '^jack\.itunes.*\.jpg$', '^jack\.discogs.*\.jpg$'] list of regex patterns for matching local album art files
--albumart-ignorecase bool yes ignore case when searching for local album art
--albumart-recurse bool no recurse into subfolders when searching for local album art
--albumart-max-size int 1000000 maximum size when considering album art file
--albumart-min-size int 5000 minimum size when considering album art file
--albumart-max-width int 1200 maximum width when considering album art file
--albumart-min-width int 250 minimum width when considering album art file
--albumart-max-height int 1200 maximum height when considering album art file
--albumart-min-height int 250 minimum height when considering album art file
--albumart-save-prefix str 'jack.saved.' prefix for saving existing embedded album art
--fetch-albumart bool no download album art while querying
--overwrite-albumart str 'conditional' whether to overwrite existing album art files, 'always', 'never' or 'conditional' (the default)
--albumart-providers list ['coverartarchive', 'iTunes', 'discogs'] list of sources for album art, currently 'coverartarchive', 'iTunes' or 'discogs'
--caa-albumart-prefix str 'jack.caa.' prefix for saving fetched album art files from coverartarchive
--caa-albumart-sizes list ['original', 'large'] list of album art sizes to download from coverartarchive: 'original', 'small', 'large', '250', '500' or '1200'
--caa-albumart-types list ['front'] download these album arts from coverartarchive ('front' and/or 'back')
--itunes-albumart-sizes list ['standard', 'high'] list of album art sizes to download from iTunes: 'thumb', 'standard' or 'high'
--itunes-albumart-limit int 1 limit number of matches when querying for iTunes album art, zero is no limit
--itunes-albumart-country str 'us' two letter country code of iTunes store to query
--itunes-albumart-prefix str 'jack.itunes.' prefix for saving fetched iTunes album art files
--discogs-albumart-prefix str 'jack.discogs.' prefix for saving fetched discogs album art files
--discogs-albumart-types list ['primary'] download these album arts from discogs ('primary' and/or 'secondary')
--discogs-albumart-token str - discogs personal authentication token
--readme str - export README.md to given file

Interaction

While Jack is running, press q or Q to quit, p or P to disable ripping (you need the CD drive) p or P (again) or c or C to resume, e or E to pause/continue all encoders and r or R to pause/continue all rippers.

Authors and Copyrights

Jack is Free Libre Open Source Software distributed under the GNU General Public License version 2, or (at your option) any later version.

The original home of the project was http://www.home.unix-ag.org/arne/jack/ and the code was hosted in SourceForge.

Jack has first been developed by the following authors, be they praised:

Contributions

Pull Requests and contributions in general are welcome.

jack's People

Contributors

gaetano-guerriero avatar madarche avatar madmartin avatar pimzand avatar zzarne avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

jack's Issues

setuptools-scm is failing

I currently can't install any change in my local git repo,

sudo python setup.py install
 
Traceback (most recent call last):
  File "/home/pim/os/linux/sound/jack/jack-cli-cd-ripper/jack/setup.py", line 28, in <module>
    setup(
  File "/usr/lib/python3.10/site-packages/setuptools/__init__.py", line 153, in setup
    return distutils.core.setup(**attrs)
  File "/usr/lib64/python3.10/distutils/core.py", line 108, in setup
    _setup_distribution = dist = klass(attrs)
  File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 459, in __init__
    _Distribution.__init__(
  File "/usr/lib64/python3.10/distutils/dist.py", line 292, in __init__
    self.finalize_options()
  File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 837, in finalize_options
    ep(self)
  File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 858, in _finalize_setup_keywords
    ep.load()(self, ep.name, value)
  File "/usr/lib/python3.10/site-packages/setuptools_scm/integration.py", line 75, in version_keyword
    _assign_version(dist, config)
  File "/usr/lib/python3.10/site-packages/setuptools_scm/integration.py", line 51, in _assign_version
    _version_missing(config)
  File "/usr/lib/python3.10/site-packages/setuptools_scm/__init__.py", line 106, in _version_missing
    raise LookupError(
LookupError: setuptools-scm was unable to detect version for /home/pim/os/linux/sound/jack/jack-cli-cd-ripper/jack.

Make sure you're either building from a fully intact git repository or PyPI tarballs. Most other sources (such as GitHub's tarballs, a git checkout without the .git folder) don't contain the necessary metadata and will not work.

For example, if you're using pip, instead of https://github.com/user/proj/archive/master.zip use git+https://github.com/user/proj.git#egg=proj

Default to the Python 3 version of jack

I want to discuss two issues here:

  1. Are we ready to default the Python 3 version?
  2. How do we do it?

I think we are ready, but maybe we want to fix #16 first.

I've never done this, but it should be as simple as

git checkout python3-mb
git checkout -b main
git push --set-upstream origin main

and then change the default branch in github Settings->Branches to main.

We then could rename the master branch to e.g. python2 to avoid confusion.

What do you say? Comments welcome.

python3-mb: MusicBrainz fuzzy toc matching does not work

MusicBrainz may return a number of releases if there is a fuzzy match with the submitted toc.
Jack will then present the user a choice, but this will not be processed, since other code requires a perfect match.

This is because a release may contain multiple media, and the discid is used to match the current medium.

Build fails on current releases of Debian/Ubuntu systems.

The latest version from this repository fails to build on

PRETTY_NAME="Ubuntu 23.10"
NAME="Ubuntu"
VERSION_ID="23.10"
VERSION="23.10 (Mantic Minotaur)"
VERSION_CODENAME=mantic
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=mantic
LOGO=ubuntu-logo

/usr/lib/python3/dist-packages/setuptools/__init__.py:84: _DeprecatedInstaller: setuptools.installer and fetch_build_eggs are deprecated.
!!

        ********************************************************************************
        Requirements should be satisfied by a PEP 517 installer.
        If you are using pip, you can try `pip install --use-pep517`.
        ********************************************************************************

!!
  dist.fetch_build_eggs(dist.setup_requires)
[12/08/23 11:58:48] WARNING  toml section missing 'pyproject.toml does not contain a tool.setuptools_scm section' pyproject_reading.py:42
Traceback (most recent call last):
  File "/home/amon/Desktop/TASK-JackPython3/20230919-jack-python3/jack-python3-mb/./setup.py", line 28, in <module>
    setup(
  File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 107, in setup
    return distutils.core.setup(**attrs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 147, in setup
    _setup_distribution = dist = klass(attrs)
                                 ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 485, in __init__
    _Distribution.__init__(
  File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 283, in __init__
    self.finalize_options()
  File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 926, in finalize_options
    ep(self)
  File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 946, in _finalize_setup_keywords
    ep.load()(self, ep.name, value)
  File "/home/amon/Desktop/TASK-JackPython3/20230919-jack-python3/jack-python3-mb/.eggs/setuptools_scm-8.0.4-py3.11.egg/setuptools_scm/_integration/setuptools.py", line 101, in version_keyword
    _assign_version(dist, config)
  File "/home/amon/Desktop/TASK-JackPython3/20230919-jack-python3/jack-python3-mb/.eggs/setuptools_scm-8.0.4-py3.11.egg/setuptools_scm/_integration/setuptools.py", line 56, in _assign_version
    _version_missing(config)
  File "/home/amon/Desktop/TASK-JackPython3/20230919-jack-python3/jack-python3-mb/.eggs/setuptools_scm-8.0.4-py3.11.egg/setuptools_scm/_get_version_impl.py", line 112, in _version_missing
    raise LookupError(
LookupError: setuptools-scm was unable to detect version for /home/amon/Desktop/TASK-JackPython3/20230919-jack-python3/jack-python3-mb.

Make sure you're either building from a fully intact git repository or PyPI tarballs. Most other sources (such as GitHub's tarballs, a git checkout without the .git folder) don't contain the necessary metadata and will not work.

For example, if you're using pip, instead of https://github.com/user/proj/archive/master.zip use git+https://github.com/user/proj.git#egg=proj

python3-mb: musicbrainz_template() breaks smart metadata selection

Before commit 4f709db, jack would use the most recently modified cached metadata (ie, jack.freedb or jack.musicbrainz), regardless of the default metadata provider. This behaviour is now broken when musicbrainz is the default metadata provider, yet jack.freedb is the only available cached metadata. Jack now creates an empty jack.musicbrainz which will then be selected because of its newer modification date, leading to failure.

Reading the TOC of a disc can be slow

Reading the TOC of a disc can be very slow, especially when extracting MCN and ISRC, which is done by default.

There are a number of strategies that could improve the speed, preferably without disabling MCN and ISRC extraction.

  • add debug statements to measure the time that (lib)discid and cdparanoia are taking to list the contents of a CD.
  • measure discid vs libdiscid speed
  • never enable MCN and ISRC extraction when we are only looking for a matching existing jack.toc
  • use the read_sparse() instead of the read() method of libdiscid, and check whether discid has such a method

python3-mb: get rid of exec()

Concept draft:

  • define an interface
  • convert helpers.py to separate modules for each helper
  • allow custom helper modules in ~/.jack_plugins

download album art in the background, in parallel

Downloading album art in the original size can take quite a while, and currently ripping is not started until all downloads finish.

Using the concurrent library, these downloads could be performed in parallel, in the background.
The downloads should be waited for after ripping and encoding, when they can be needed for embedding.

wav support missing?

If I do a "jack -Q -g *wav" with the python3 version I get:
error unsupported format SndHeaders(filetype='wav', framerate=44100,
nchannels=2, nframes=14427756, sampwidth=16)....
it worked with the python2 version, is there an easy fix?

switch from dateparser to dateutil

Jack (python3-mb) uses dateparser to parse the Last-Modified date string from album art downloads.

Current dateparser is broken and is taking forever to get fixed, even though a solution has been proposed.
See scrapinghub/dateparser#1052
This mostly affects users that install their python libraries using their Linux distro.

dateparser can be replaced with dateutil which appears to be a more popular library.

port to python 3

How hard would it be to port this application to python 3?
I am still using this on Fedora, and Fedora 32, released today has deprecated python 2.

m4a encoded files are not optimized for streaming

Some streaming applications, such as play:Sub for iOS, need to download m4a files completely before they start playing.
This happens with m4a tracks encoded by jack, but not with tracks purchased from Apple.

This can be solved by adding the "--moov-before-mdat " option to the fdkaac command line.
This will cause the tags and album art to be placed in front of the encoded music data.

It's likely possible to add this option using a custom jack4rc, but this option should be added to the default command line.

python3-mb: force clean refresh of MusicBrainz data

Whenever a user queries MusicBrainz, jack first reads the old MusicBrainz data and will remember the choice of release.
If the new query again presents multiple releases, jack will automatically pick the choice the user made previously.
There should be a way to force jack to present the user a new choice, without manually deleting the jack.musicbrainz file.

support only python-discid as Python libdiscid wrapper

The python3-mb branch of Jack depends on a C library called libdiscid (https://musicbrainz.org/doc/libdiscid).
There are two competing Python wrappers for this library:

python-discid, using ctypes (no compilation)
python-libdiscid, using cython (compiled)

@pimzand started coding using python-libdiscid, because that was available as a package in the distro he was using (Fedora).
@zzarne added python-discid, because apparently, python-libdiscid cannot be installed using pip.

As a result, both libraries are now supported using a wrapper.

I propose we remove this wrapper and support python-discid directly, as the only supported wrapper.
Because:

  • python-discid is now available as a package in Fedora
  • python-discid is the wrapper used by MusicBrainz Picard
  • python-discid can be installed with pip

The benefits are:

  • easier to read code
  • easier documentation
  • easier to detect that requirements are met at runtime and install time

python3-mb: encoder progress is broken

I did not understand the encoder progress code when porting to Python 3, and had to disable it.
It should be restored for lame, oggenc and flac, and implemented for fdk-aac.

Increase the level of PEP8 compliance

In the .travis.yml file, there are many exclusions of PEP8 conformance points: --ignore=E501,W604,W601,E721,E402,E711,E713,E741

Those exclusions have no reason apart from the lack of time when this repository was setup in GitHub.

Since the pep8 tool is at the moment the only safeguard, it would be better to use it to its full extent.

python3-mb: should not use the artist name as credited for directory names

MusicBrainz provides three names for the album artiist. As credited, as in MusicBrainz, and as a sortable name.
Jack currently uses the album artist as credited for tagging purposes, just like MusicBrainz Picard.
Jack currently also uses the name as credited for constructing the path to store files.
This makes less sense, as it will cause lots of differently spelled names for the same artist.
If the spelling just differs in case, it could cause problems with sharing the data to Windows or storing it on case-insensitive filesystems.

The default should be the artist name as in MusicBrainz. Ideally the choice should be user configurable.

Album art embedding

Jack should be able to embed local and remote album art into audio files.

python3-mb: exception message when using an unknown option

unknown option `--whatever'
Traceback (most recent call last):
File "/usr/local/bin/jack", line 80, in
help, argv_cf = jack.argv.parse_argv(cf, sys.argv)
File "/usr/local/lib/python3.8/site-packages/jack/argv.py", line 229, in parse_argv
show_usage(cf)
TypeError: show_usage() missing 1 required positional argument: 'longhelp'

python3-mb: group vocal and instrumental performers separately

The MusicBrainz tagging code was designed with the goal to achieve the exact same results as MusicBrainz Picard would do.

Picard appears to create separate performer tags, when a performer is both credited as vocal performer, and an instrumental performer. Jack currently tags differently.

This can be seen in this release.
https://musicbrainz.org/release/94bc2804-ff37-32d0-9d01-6c5f63185d2f

Jack creates these vorbiscomment tags:

PERFORMER=John Acock (harmonium, mellotron and piano)
PERFORMER=Phil Collins (guest, membranophone, percussion, vibraphone and additional)
PERFORMER=John Hackett (bell, flute, guest and synthesizer)
PERFORMER=Steve Hackett (acoustic guitar, autoharp, bell, electric guitar, harmonium, mellotron and vocals)
PERFORMER=Robin Miller (cor anglais and oboe)
PERFORMER=Mike Rutherford (12 string guitar, bass guitar, bass pedals and guest)
PERFORMER=Nigel Warren-Green (cello and solo)

Picard would use these tags:

PERFORMER=John Acock (harmonium, mellotron and piano)
PERFORMER=Phil Collins (guest membranophone, percussion and vibraphone)
PERFORMER=John Hackett (guest bell, flute and synthesizer)
PERFORMER=Steve Hackett (acoustic guitar, autoharp, bell, electric guitar, harmonium and mellotron)
PERFORMER=Robin Miller (cor anglais and oboe)
PERFORMER=Mike Rutherford (guest 12 string guitar, bass guitar and bass pedals)
PERFORMER=Nigel Warren-Green (solo cello)
PERFORMER=Phil Collins (additional vocals)
PERFORMER=Steve Hackett (vocals)

Note the special handling of the word "guest".

We need more disambiguation options

--add-disambiguation is a boolean option. It currently means to append the disambiguation string from MusicBrainz to the album filename only.

Ideally, we would have four types of disambiguation

  • album filename
  • album name tag
  • artist filename
  • artist name tag

@zzarne what would you propose for the option names?
We could change --add-disambiguation to require an option argument with some string that encodes all four possibilities.
We could load the boolean value that is currently saved in jack,musicbrainz, and save that into a string.

python3-mb: transcoding

It should be possible to encode to mp3, m4a and ogg from flac files instead of from wav files only.

This could be a two-step process, ie decode to wav first, or a single command line.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.