audiolibrarian 0.16.3__py3-none-any.whl → 0.16.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,4 +16,4 @@
16
16
  # You should have received a copy of the GNU General Public License along with audiolibrarian.
17
17
  # If not, see <https://www.gnu.org/licenses/>.
18
18
  #
19
- __version__ = "0.16.3"
19
+ __version__ = "0.16.5"
@@ -118,10 +118,10 @@ class CDAudioSource(AudioSource):
118
118
  cwd = pathlib.Path.cwd()
119
119
  os.chdir(self._temp_dir)
120
120
  try:
121
- subprocess.run(("cd-paranoia", "-B"), check=True) # noqa: S603
121
+ subprocess.run(("cd-paranoia", "-B"), check=True)
122
122
  finally:
123
123
  os.chdir(cwd)
124
- subprocess.run(("eject",), check=False) # noqa: S603
124
+ subprocess.run(("eject",), check=False)
125
125
 
126
126
 
127
127
  class FilesAudioSource(AudioSource):
@@ -51,8 +51,8 @@ class Convert(_Command, base.Base):
51
51
  parser = argparse.ArgumentParser()
52
52
  parser.add_argument("--artist", "-a", help="provide artist (ignore tags)")
53
53
  parser.add_argument("--album", "-m", help="provide album (ignore tags)")
54
- parser.add_argument("--mb-artist-id", help="Musicbrainz artist ID")
55
- parser.add_argument("--mb-release-id", help="Musicbrainz release ID")
54
+ parser.add_argument("--mb-artist-id", help="MusicBrainz artist ID")
55
+ parser.add_argument("--mb-release-id", help="MusicBrainz release ID")
56
56
  parser.add_argument("--disc", "-d", help="format: x/y: disc x of y for multi-disc release")
57
57
  parser.add_argument("filename", nargs="+", help="directory name or audio file name")
58
58
 
@@ -79,14 +79,14 @@ class Genre(_Command):
79
79
  parser = argparse.ArgumentParser(
80
80
  description=(
81
81
  "Process all audio files in the given directory(ies), allowing the user to *update* "
82
- "the genre in Musicbrainz or *tag* audio files with the user-defined genre in "
83
- "Musicbrainz."
82
+ "the genre in MusicBrainz or *tag* audio files with the user-defined genre in "
83
+ "MusicBrainz."
84
84
  )
85
85
  )
86
86
  parser.add_argument("directory", nargs="+", help="root of directory tree to process")
87
87
  parser_action = parser.add_mutually_exclusive_group()
88
88
  parser_action.add_argument("--tag", action="store_true", help="update tags")
89
- parser_action.add_argument("--update", action="store_true", help="update Musicbrainz")
89
+ parser_action.add_argument("--update", action="store_true", help="update MusicBrainz")
90
90
 
91
91
  def __init__(self, args: argparse.Namespace) -> None:
92
92
  """Initialize a Genre command handler."""
@@ -106,8 +106,8 @@ class Manifest(_Command, base.Base):
106
106
  parser.add_argument("--artist", "-a", help="provide artist (ignore tags)")
107
107
  parser.add_argument("--album", "-m", help="provide album (ignore tags)")
108
108
  parser.add_argument("--cd", "-c", action="store_true", help="original source was a CD")
109
- parser.add_argument("--mb-artist-id", help="Musicbrainz artist ID")
110
- parser.add_argument("--mb-release-id", help="Musicbrainz release ID")
109
+ parser.add_argument("--mb-artist-id", help="MusicBrainz artist ID")
110
+ parser.add_argument("--mb-release-id", help="MusicBrainz release ID")
111
111
  parser.add_argument("--disc", "-d", help="format: x/y: disc x of y for multi-disc release")
112
112
  parser.add_argument("filename", nargs="+", help="directory name or audio file name")
113
113
 
@@ -229,8 +229,8 @@ class Rip(_Command, base.Base):
229
229
  parser = argparse.ArgumentParser()
230
230
  parser.add_argument("--artist", "-a", help="provide artist")
231
231
  parser.add_argument("--album", "-m", help="provide album")
232
- parser.add_argument("--mb-artist-id", help="Musicbrainz artist ID")
233
- parser.add_argument("--mb-release-id", help="Musicbrainz release ID")
232
+ parser.add_argument("--mb-artist-id", help="MusicBrainz artist ID")
233
+ parser.add_argument("--mb-release-id", help="MusicBrainz release ID")
234
234
  parser.add_argument("--disc", "-d", help="x/y: disc x of y; multi-disc release")
235
235
 
236
236
  def __init__(self, args: argparse.Namespace) -> None:
@@ -139,11 +139,11 @@ class GenreManager:
139
139
  def _get_genres_by_artist(
140
140
  self,
141
141
  ) -> tuple[dict[str, str], dict[str, dict[str, Any]]]:
142
- """Return two dicts mapping Musicbrainz-artist-ID to user and community.
142
+ """Return two dicts mapping MusicBrainz-artist-ID to user and community.
143
143
 
144
144
  Returns:
145
- user: a single genre, set in Musicbrainz by this app's user
146
- community: a list genre records (dicts) set in Musicbrainz by the community
145
+ user: a single genre, set in MusicBrainz by this app's user
146
+ community: a list genre records (dicts) set in MusicBrainz by the community
147
147
  with "name" and "count" fields
148
148
  """
149
149
  user: dict[str, str] = {}
@@ -417,7 +417,7 @@ class Searcher:
417
417
  log.info("RELEASE_GROUPS: {release_group_ids}")
418
418
  release_id = self._prompt_release_id(release_group_ids)
419
419
  else:
420
- release_id = self._prompt_uuid("Musicbrainz Release ID: ")
420
+ release_id = self._prompt_uuid("MusicBrainz Release ID: ")
421
421
 
422
422
  return MusicBrainzRelease(release_id).get_release()
423
423
 
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.4
2
+ Name: audiolibrarian
3
+ Version: 0.16.5
4
+ Summary: Manage my audio library.
5
+ Project-URL: Repository, https://github.com/toadstule/audiolibrarian
6
+ Author-email: Steve Jibson <steve@jibson.com>
7
+ License-File: COPYING
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
11
+ Classifier: Programming Language :: Python
12
+ Requires-Python: <3.14,>=3.12
13
+ Requires-Dist: ansicolors
14
+ Requires-Dist: discid
15
+ Requires-Dist: filelock
16
+ Requires-Dist: fuzzywuzzy
17
+ Requires-Dist: musicbrainzngs
18
+ Requires-Dist: mutagen
19
+ Requires-Dist: pydantic-settings
20
+ Requires-Dist: python-levenshtein
21
+ Requires-Dist: pyyaml
22
+ Requires-Dist: requests
23
+ Requires-Dist: xdg-base-dirs
24
+ Description-Content-Type: text/markdown
25
+
26
+ # audiolibrarian
27
+
28
+ [![PyPI](https://img.shields.io/pypi/v/audiolibrarian)](https://pypi.org/project/audiolibrarian/)
29
+ [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
30
+ [![Documentation Status](https://readthedocs.org/projects/audiolibrarian/badge/?version=latest)](https://audiolibrarian.readthedocs.io/)
31
+
32
+ `audiolibrarian` is a command-line tool for ripping audio from CDs (or taking
33
+ high-quality audio from local files), tagging them with comprehensive metadata from MusicBrainz,
34
+ converting them to multiple formats, and organizing them in a clean directory structure.
35
+
36
+ ## Features
37
+
38
+ - **CD Ripping**: Extract audio from CDs with accurate metadata lookup
39
+ - **Audio Conversion**: Convert between multiple audio formats (FLAC, M4A, MP3)
40
+ - **Metadata Management**: Automatically fetch and apply rich metadata from MusicBrainz
41
+ - **File Organization**: Intelligently organize music files into a clean directory structure
42
+ - **Batch Processing**: Handle multiple files and directories efficiently
43
+
44
+ ## Basic Usage
45
+
46
+ ```bash
47
+ # Rip audio from a CD
48
+ audiolibrarian rip
49
+
50
+ # Convert audio files
51
+ audiolibrarian convert /path/to/audio/files
52
+
53
+ # Get help
54
+ audiolibrarian --help
55
+ ```
56
+
57
+ ## Documentation
58
+
59
+ For complete documentation, including installation instructions, configuration, and advanced usage, visit:
60
+
61
+ [https://audiolibrarian.readthedocs.io/](https://audiolibrarian.readthedocs.io/)
62
+
63
+ ## License
64
+
65
+ This project is licensed under the GPL-3.0 License - see the [LICENSE](LICENSE) file for details.
66
+
67
+ ## Contributing
68
+
69
+ Contributions are welcome! Please see our [contributing guide](CONTRIBUTING.md) for details.
70
+
71
+ ## Support
72
+
73
+ For support, please [open an issue](https://github.com/toadstule/audiolibrarian/issues) on GitHub.
@@ -1,10 +1,10 @@
1
- audiolibrarian/__init__.py,sha256=TA0WxXg92zvPld0b_-oYxDuKp-7Svu7k09p45NcRxBk,787
2
- audiolibrarian/audiosource.py,sha256=EtoSQb6R2zfHUwxiR9ZqGwjxrX2mTB5gPpmKangps4s,8573
1
+ audiolibrarian/__init__.py,sha256=gY9TxON-FJ8rKpy6s2RKFMpH0qMDrgDtE9Nn6q8xIjM,787
2
+ audiolibrarian/audiosource.py,sha256=hQVFc2VQfCPV1kQRGOwwNAuMx4AXno0zcf_0Ps_Y2ts,8545
3
3
  audiolibrarian/base.py,sha256=54s_NacDvyGpvc_uOJO5apmQin4HKUGfPrlw0XFiJoI,19428
4
4
  audiolibrarian/cli.py,sha256=azX49RO2t4q8qyUJ9WTOlDqUO13p17mq0wNmEdl6QGw,4211
5
- audiolibrarian/commands.py,sha256=8R9aagOaaLE798lGYPWknW-NiIHkxEbQbiM43RZrPTU,11166
6
- audiolibrarian/genremanager.py,sha256=ZciuJb3GoaM31h33_khowNg8iv4MVGkjJM-beijSF3k,7357
7
- audiolibrarian/musicbrainz.py,sha256=DAodaLVySqq6nSbGCLfUktXSAm95OfPhkOXyyexMj6w,19312
5
+ audiolibrarian/commands.py,sha256=4oyXDSvzlL2vb1SyD2GVy8bDD9MTJz9IuTMl2PMLOQ4,11166
6
+ audiolibrarian/genremanager.py,sha256=omjsn-8Bdz3etLu-qNAXhPUOyY4Byy6muwvkHyPM6so,7357
7
+ audiolibrarian/musicbrainz.py,sha256=GwTrwvn-hLZw4uLD7CshyegLCM1tfeNL00rqz2Xsl20,19312
8
8
  audiolibrarian/output.py,sha256=JHuttwEMEzUxty7P8e2jaL6702q52fTWAdZEgb85bxQ,1702
9
9
  audiolibrarian/records.py,sha256=BovHwNVd0nTTwQPYkhOAOIVASWz9l47j6cGdXAx5VjM,7929
10
10
  audiolibrarian/settings.py,sha256=qKQ9JYfKr2k_JceWfYPiMlpBKylujCQI_2pmxWpsGFo,2550
@@ -17,12 +17,12 @@ audiolibrarian/audiofile/formats/__init__.py,sha256=ZV5urTtQQ4ZX_K2s9qFsSzDunvdQ
17
17
  audiolibrarian/audiofile/formats/flac.py,sha256=3MfzdgnAqTVSbAraAVde2BSHwdAyi-fKkc55OvuRNSc,9708
18
18
  audiolibrarian/audiofile/formats/m4a.py,sha256=S0aFZxMzgwpzkwYE2D_K_US0Dnh0objK21ph1S_8rJk,10552
19
19
  audiolibrarian/audiofile/formats/mp3.py,sha256=ipuanK7CIYSk9LqW0AvAgKAUZeU9ecwK0uZf2AhAGXo,12881
20
- picard_src/README.md,sha256=TTnzIGmZ8_G11G1VCz5DHdlidIrtkGFYxWFooyTKcbI,403
20
+ picard_src/README.md,sha256=mtJ7RNLlC7Oz9M038WU-3ciPa7jPdXlFLYdJBL8iRQo,411
21
21
  picard_src/__init__.py,sha256=acu0-oac_qfEgiB0rw0RvuL---O15-rOckWboVMxWtM,198
22
22
  picard_src/textencoding.py,sha256=0MRHFwhqEwauQbjTTz6gpgzo6YH1VDPfdJqQoCWHtjM,26234
23
- audiolibrarian-0.16.3.dist-info/METADATA,sha256=2nYUbyqd_w-sUmlSMhwYGUk2rvqKjbLeyPdtFddOfUQ,10533
24
- audiolibrarian-0.16.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
- audiolibrarian-0.16.3.dist-info/entry_points.txt,sha256=reubnr_SGbTTDXji8j7z8aTmIL0AEQKVSLcnmFG3YYY,59
26
- audiolibrarian-0.16.3.dist-info/licenses/COPYING,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
27
- audiolibrarian-0.16.3.dist-info/licenses/LICENSE,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
28
- audiolibrarian-0.16.3.dist-info/RECORD,,
23
+ audiolibrarian-0.16.5.dist-info/METADATA,sha256=m92zy8tCb5anGh-_ltl2Hca0jkB8QRW6locAtVnuskQ,2546
24
+ audiolibrarian-0.16.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
+ audiolibrarian-0.16.5.dist-info/entry_points.txt,sha256=reubnr_SGbTTDXji8j7z8aTmIL0AEQKVSLcnmFG3YYY,59
26
+ audiolibrarian-0.16.5.dist-info/licenses/COPYING,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
27
+ audiolibrarian-0.16.5.dist-info/licenses/LICENSE,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
28
+ audiolibrarian-0.16.5.dist-info/RECORD,,
picard_src/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  Code in this directory comes from (or is derived from) the super-cool Picard project.
4
4
 
5
- https://github.com/metabrainz/picard
5
+ [Picard](https://github.com/metabrainz/picard)
6
6
 
7
7
  I'd like to express my thanks to all of have contributed to that project.
8
8
 
9
- Note: we could have just set the Picard library as a dependency of audiolibrarian, but
10
- it includes other dependencies (such as PyQT) that add a lot of overhead not required
9
+ Note: we could have just set the Picard library as a dependency of audiolibrarian, but
10
+ it includes other dependencies (such as PyQT) that add a lot of overhead not required
11
11
  by this project.
@@ -1,328 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: audiolibrarian
3
- Version: 0.16.3
4
- Summary: Manage my audio library.
5
- Project-URL: Repository, https://github.com/toadstule/audiolibrarian
6
- Author-email: Steve Jibson <steve@jibson.com>
7
- License-File: COPYING
8
- License-File: LICENSE
9
- Classifier: Development Status :: 4 - Beta
10
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
11
- Classifier: Programming Language :: Python
12
- Requires-Python: ==3.13.*
13
- Requires-Dist: ansicolors
14
- Requires-Dist: discid
15
- Requires-Dist: filelock
16
- Requires-Dist: fuzzywuzzy
17
- Requires-Dist: musicbrainzngs
18
- Requires-Dist: mutagen
19
- Requires-Dist: pydantic-settings
20
- Requires-Dist: python-levenshtein
21
- Requires-Dist: pyyaml
22
- Requires-Dist: requests
23
- Requires-Dist: xdg-base-dirs
24
- Description-Content-Type: text/markdown
25
-
26
- # audiolibrarian #
27
-
28
- ## Overview ##
29
-
30
- `audiolibrarian` is a powerful command-line tool for managing digital music libraries. It provides a streamlined
31
- workflow for ripping, converting, organizing, and tagging audio files with high-quality metadata from MusicBrainz.
32
-
33
- ### Key Features ###
34
-
35
- - **CD Ripping**: Extract audio from CDs with accurate metadata lookup
36
- - **Audio Conversion**: Convert between multiple audio formats (FLAC, M4A, MP3)
37
- - **Metadata Management**: Automatically fetch and apply rich metadata from MusicBrainz
38
- - **File Organization**: Intelligently organize music files into a clean directory structure
39
- - **Batch Processing**: Handle multiple files and directories efficiently
40
- - **Genre Management**: Work with MusicBrainz genres and tags
41
- - **Flexible Configuration**: Customize behavior through config files and environment variables
42
-
43
- ### Why audiolibrarian? ###
44
-
45
- - **Consistent Quality**: Maintains audio quality through the conversion process
46
- - **Accurate Metadata**: Leverages MusicBrainz for comprehensive music information
47
- - **Automated Workflow**: Reduces manual work in organizing and tagging music
48
- - **Scriptable**: Perfect for automating large music library management tasks
49
- - **Open Source**: Free to use and modify under the GPL-3.0 license
50
-
51
- Whether you're digitizing a CD collection, organizing existing music files, or managing a large digital library,
52
- `audiolibrarian` provides the tools you need to keep your music collection well-organized and properly tagged.
53
-
54
-
55
- ## Installation ##
56
-
57
- ### External Requirements ###
58
-
59
- `audiolibrarian` uses a few command-line tools to run:
60
-
61
- * `cd-paranoia`: [cd-paranoia](https://www.gnu.org/software/libcdio/)
62
- * `eject`: [util-linux](https://github.com/util-linux/util-linux)
63
- * `faad`: [faad2](https://github.com/knik0/faad2)
64
- * `fdkaac`: [fdkaac](https://github.com/nu774/fdkaac)
65
- * `flac`: [flac](https://github.com/xiph/flac)
66
- * `lame`: [lame](https://lame.sourceforge.io/)
67
- * `mpg123`: [mpg123](https://www.mpg123.de/)
68
- * `sndfile-convert`: [libsndfile](https://github.com/libsndfile/libsndfile)
69
- * `wavegain`: [wavegain](https://rarewares.org/others.php)
70
-
71
- ### Install from PyPI ###
72
-
73
- `audiolibrarian` is available on PyPI:
74
-
75
- ```bash
76
- pip install audiolibrarian
77
- ```
78
-
79
- ## Configuration ##
80
-
81
- `audiolibrarian` uses a flexible configuration system that supports multiple configuration sources, listed in order of precedence:
82
-
83
- 1. **Environment Variables** (highest precedence)
84
- - Prefix: `AUDIOLIBRARIAN__`
85
- - Nested fields: Use `__` as delimiter (e.g., `AUDIOLIBRARIAN__MUSICBRAINZ__USERNAME`)
86
- - Example:
87
- ```bash
88
- # Override library directory
89
- export AUDIOLIBRARIAN__LIBRARY_DIR="/mnt/music/library"
90
-
91
- # Set MusicBrainz credentials
92
- export AUDIOLIBRARIAN__MUSICBRAINZ__USERNAME="your_username"
93
- export AUDIOLIBRARIAN__MUSICBRAINZ__PASSWORD="your_password"
94
- ```
95
-
96
- 2. **YAML Configuration File**
97
- - Location: `~/.config/audiolibrarian/config.yaml` (or `$XDG_CONFIG_HOME/audiolibrarian/config.yaml` if set)
98
- - Example:
99
- ```yaml
100
- # Base directory for your music library
101
- library_dir: "~/music/library"
102
-
103
- # Cache and working directory
104
- work_dir: "~/.cache/audiolibrarian"
105
-
106
- # CD/DVD device path (use null for default device)
107
- discid_device: null
108
-
109
- # Audio normalization settings
110
- normalize_gain: 5 # dB gain for normalization
111
- normalize_preset: "radio" # "album" or "radio"
112
-
113
- # MusicBrainz API settings (optional)
114
- musicbrainz:
115
- username: "your_username" # For personal genre preferences
116
- password: "your_password" # Will be stored securely
117
- rate_limit: 1.5 # Seconds between API requests
118
- ```
119
-
120
- 3. **Default Values** (lowest precedence)
121
- - Built-in defaults from the application
122
-
123
- ### Available Settings ###
124
-
125
- | Setting | Default | Description |
126
- |--------------------------|----------------------------------|-------------------------------------------|
127
- | `library_dir` | `library` (in the current dir) | Directory for storing audio files |
128
- | `work_dir` | `$XDG_CACHE_HOME/audiolibrarian` | Directory for temporary files |
129
- | `discid_device` | `null` | CD device path (null for default device) |
130
- | `normalize_gain` | `5` | Normalization gain in dB |
131
- | `normalize_preset` | `"radio"` | Normalization preset ("album" or "radio") |
132
- | `musicbrainz.username` | (not set) | MusicBrainz username |
133
- | `musicbrainz.password` | (not set) | MusicBrainz password |
134
- | `musicbrainz.rate_limit` | `1.5` | Seconds between requests |
135
-
136
- > **Note**: The `musicbrainz` section is optional but recommended for accessing personal genre preferences on [MusicBrainz](https://musicbrainz.org/).
137
-
138
- ## Usage ##
139
-
140
- ### Basic Commands ###
141
-
142
- ```bash
143
- # Rip audio from a CD
144
- audiolibrarian rip
145
-
146
- # Convert audio files
147
- audiolibrarian convert /path/to/audio/files
148
-
149
- # Create or update manifest files
150
- audiolibrarian manifest /path/to/audio/files
151
-
152
- # Reconvert files from existing source
153
- audiolibrarian reconvert /path/to/source/directories
154
-
155
- # Rename files based on tags
156
- audiolibrarian rename /path/to/audio/directories
157
-
158
- # Manage MusicBrainz genres
159
- audiolibrarian genre /path/to/audio/directories --tag # Update tags with MB genres
160
-
161
- # Show help for all commands
162
- audiolibrarian --help
163
- ```
164
-
165
- ### Combining Configuration Sources ###
166
-
167
- Configuration sources are combined with the following precedence (highest to lowest):
168
- 1. Environment variables
169
- 2. YAML configuration file
170
- 3. Default values
171
-
172
- For example, with this `config.yaml`:
173
-
174
- ```yaml
175
- # config.yaml
176
- library_dir: /media/music/library
177
- normalize_gain: 5.0
178
- ```
179
-
180
- And this environment variable:
181
- ```bash
182
- export AUDIOLIBRARIAN__NORMALIZE_GAIN="8.0"
183
- ```
184
-
185
- The effective value of `normalize_gain` will be `8.0` (from the environment variable), while `library_dir` will be set to `/media/music/library` from the YAML file.
186
-
187
- ### Advanced Usage ###
188
-
189
- 1. **Ripping CDs**
190
-
191
- ```bash
192
- # Basic CD rip
193
- audiolibrarian rip
194
-
195
- # Specify artist and album
196
- audiolibrarian rip --artist "Artist Name" --album "Album Name"
197
-
198
- # Specify MusicBrainz release ID (for better metadata)
199
- audiolibrarian rip --mb-release-id "12345678-1234-1234-1234-123456789012"
200
-
201
- # Specify disc number for multi-disc sets
202
- audiolibrarian rip --disc "1/2" # First disc of two
203
- ```
204
-
205
- 2. **Converting Audio Files**
206
-
207
- ```bash
208
- # Convert with specific artist and album
209
- audiolibrarian convert --artist "Artist Name" --album "Album Name" /path/to/audio/files
210
-
211
- # Convert with MusicBrainz release ID
212
- audiolibrarian convert --mb-release-id "12345678-1234-1234-1234-123456789012" /path/to/audio/files
213
-
214
- # Convert multi-disc release
215
- audiolibrarian convert --disc "1/2" /path/to/disc1/files
216
- ```
217
-
218
- 2. **Working with Manifests**
219
-
220
- ```bash
221
- # Create manifest for existing files
222
- audiolibrarian manifest /path/to/audio/files
223
-
224
- # Specify CD as source
225
- audiolibrarian manifest --cd /path/to/audio/files
226
-
227
- # Specify MusicBrainz artist and release IDs
228
- audiolibrarian manifest --mb-artist-id "12345678-1234-1234-1234-123456789012" \
229
- --mb-release-id "12345678-1234-1234-1234-123456789012" /path/to/audio/files
230
- ```
231
-
232
- 3. **Reconverting Files**
233
-
234
- ```bash
235
- # Reconvert all files in directory
236
- audiolibrarian reconvert /path/to/source/directories
237
-
238
- # Reconvert with dry run (no changes)
239
- audiolibrarian reconvert --dry-run /path/to/source/directories
240
- ```
241
-
242
- 4. **Renaming Files**
243
-
244
- ```bash
245
- # Rename files based on tags
246
- audiolibrarian rename /path/to/audio/directories
247
-
248
- # Preview renames without making changes
249
- audiolibrarian rename --dry-run /path/to/audio/directories
250
- ```
251
-
252
- 5. **Using Different Normalization Presets**
253
-
254
- ```bash
255
- # Use radio normalization preset (default)
256
- export AUDIOLIBRARIAN__NORMALIZE_PRESET="radio"
257
-
258
- # Use album normalization preset
259
- export AUDIOLIBRARIAN__NORMALIZE_PRESET="album"
260
- ```
261
-
262
- ### Troubleshooting ###
263
-
264
- 1. **Increasing Verbosity**
265
-
266
- ```bash
267
- # Show more detailed output
268
- audiolibrarian --log-level INFO cd
269
-
270
- # Show debug information
271
- audiolibrarian --log-level DEBUG cd
272
- ```
273
-
274
- 2. **Checking Dependencies**
275
-
276
- ```bash
277
- # Verify all required tools are installed
278
- audiolibrarian --log-level DEBUG cd
279
- ```
280
-
281
- 3. **MusicBrainz Issues**
282
-
283
- If you encounter MusicBrainz-related errors:
284
-
285
- 1. Verify your credentials are correct
286
- 2. Check your internet connection
287
- 3. Use the debug log level to get more information
288
- 4. Increase the rate limit if you're hitting rate limits
289
-
290
- ```bash
291
- export AUDIOLIBRARIAN__MUSICBRAINZ__RATE_LIMIT="2.0"
292
- ```
293
-
294
- ### Directory Structure ###
295
-
296
- `audiolibrarian` organizes files in the following structure:
297
-
298
- 1. **Source files** (original audio files):
299
- ```
300
- library/source/
301
- └── Artist/
302
- └── YYYY__Album/
303
- ├── 01__Track_Title.flac
304
- ├── 02__Another_Track.flac
305
- └── Manifest.yaml
306
- ```
307
-
308
- 2. **Processed audio files** (organized by format):
309
- ```
310
- library/
311
- ├── flac/
312
- │ └── Artist/
313
- │ └── YYYY__Album/
314
- │ ├── 01__Track_Title.flac
315
- │ └── 02__Another_Track.flac
316
- ├── m4a/
317
- │ └── Artist/
318
- │ └── YYYY__Album/
319
- │ ├── 01__Track_Title.m4a
320
- │ └── 02__Another_Track.m4a
321
- └── mp3/
322
- └── Artist/
323
- └── YYYY__Album/
324
- ├── 01__Track_Title.mp3
325
- └── 02__Another_Track.mp3
326
- ```
327
-
328
- Each track filename follows the format: `track_number__track_name.extension` (e.g., `01__Call_to_Arms.flac`).