KID3(1)
KID3(1) โ The Kid3 Handbook ๐โจ
Okay bestie, manual name: kid3, kid3-qt, kid3-cli. It's the Kid3 ID3 Tagger. No cap.
๐ NAME ๐
kid3, kid3-qt, kid3-cli โ Kid3 ID3 Tagger
โจ SYNOPSIS โจ
kid3 [--help | --author | --version | --license | --desktopfile FILE]
[FILE...]
kid3-qt [--portable] [Qt-options] [FILE...]
kid3-cli [--portable] [--dbus] [-h | --help] [-c COMMAND1]
[-c COMMAND2...] [FILE...]
๐ OPTIONS ๐
--portableโ Stores your config in the filekid3.iniinside the application folder. It's giving portable bestie energy.FILEโ IfFILEis the path to a folder, that folder gets opened. If you pass one or more file paths, their common folder gets opened and those files get selected. Slay.
kid3
--helpโ Shows help about options.--authorโ Shows author information.--versionโ Shows version information.--licenseโ Shows license information.--desktopfile FILEโ The base file name of the desktop entry for this application.
kid3-qt
Qt-optionsโ Seeqt5options(7).
kid3-cli
--dbusโ Activates the D-Bus interface.-cโ Executes a command. You can use multiple-coptions, they run in sequence. See the section aboutkid3-clifor the available commands.-h|--helpโ Shows help about options and commands.
๐ธ INTRODUCTION ๐ธ
Kid3 is an app for editing ID3v1 and ID3v2 tags in MP3 files, and it does it efficiently. Most MP3 players can edit these tags, but not in a very comfortable and efficient way. Kid3 also supports tags in Ogg/Vorbis, Opus, DSF, FLAC, MPC, APE, MP4/AAC, MP2, Speex, TrueAudio, WavPack, WMA, WAV, AIFF files and tracker modules (MOD, S3M, IT, XM). Obsessed.
Kid3 does not grab nor encode MP3 files. It's targeted at editing ID3 tags of all files of an album efficiently, i.e. with as few mouse clicks and key strokes as possible. Where most other programs can edit either ID3v1 or ID3v2 tags, Kid3 has full control over both versions, can convert tags between the two formats and has access to all ID3v2 tags. Tags of multiple files can be set to the same value, e.g. the artist, album, year and genre of all files of an album typically have the same values and can be set together. If the information for the tags is contained in the file name, the tags can be automatically set from the file name. It is also possible to set the file name according to the tags found in the file in arbitrary formats.
Editing is further supported by automatic replacement of characters or substrings, for instance to remove illegal characters from filenames. Automatic control of upper and lower case characters makes it easy to use a consistent naming scheme in all tags.
The tag information for full albums can be taken from gnudb.org[1], MusicBrainz[2], Discogs[3], Amazon[4] or other sources of track lists. The import format is freely configurable by regular expressions.
Please report any problems or feature requests to the author.
๐ฆ USING KID3 ๐ฆ
Kid3 features
- Edit ID3v1.1 tags
- Edit all ID3v2.3 and ID3v2.4 frames
- Edit tags of multiple files
- Convert between ID3v1 and ID3v2 tags
- Edit MP3, Ogg/Vorbis, Opus, DSF, FLAC, MPC, APE, MP4/AAC, MP2, Speex, TrueAudio, WavPack, WMA, WAV and AIFF tags
- Generate tags from filename
- Generate tags from the contents of tag fields
- Generate filename from tags
- Generate and change folder names from tags
- Generate playlist file
- Automatic case conversion and string translation
- Import from gnudb.org[1], MusicBrainz[2], Discogs[3], Amazon[4] and other data sources
- Export as CSV, HTML, playlist, Kover XML and other formats. Exported CSV files can be imported again.
Example Usage
Okay so imagine a folder with MP3 files from the album "Let's Tag" by the band "One Hit Wonder". The folder is named in the "artist - album" format, so here it's One Hit Wonder - Let's Tag. The folder has the tracks in the "track title.mp3" format. I think that's useful because filenames are short (important when using mobile MP3 players with small displays) and in the correct order when sorted alphabetically (important when using hardware MP3 players which play the tracks in alphabetical order or in the order in which they are burnt on CD and that order is alphabetical when using mkisofs). Besides this, artist and album info is already in the folder name and does not have to be repeated in the filename. But back to the example, the folder listing looks like this:
01 Intro.mp3
02 We Only Got This One.mp3
03 Outro.mp3
These files have no tags yet and we want to generate them using Kid3. We use File โ Open menu item (or toolbar button) and select one of the files in this folder. All files will be displayed in the file listbox. Lazy as we are, we want to use the information in the folder and file names to generate tags. Therefore we select all files, then click the To: Tag 1 button in the File section. This will set the title, artist, album and track values in all files. To set the year and genre values of all files, we keep all files selected and type in "2002" for the Date and select "Pop" from the Genre combobox. To set only these two values, their check boxes are automatically checked and all other check boxes are left unchecked. Now we change the selection by only selecting the first file and we see that all tags contain the correct values. The tags of the other files can be verified too by selecting them one by one. When we are satisfied with the tags, we use File โ Save menu item (or toolbar button). Selecting File โ Create Playlist menu item (or toolbar button) will generate a file One Hit Wonder - Let's Tag.m3u in the folder.
๐ COMMAND REFERENCE ๐
The GUI Elements
The Kid3 GUI is separated in six sections: At the left are the file and folder listboxes, the right side contains the File, Tag 1, Tag 2 and Tag 3 sections.
To navigate between the different sections using the keyboard, several keyboard shortcuts are supported. In the tag sections, the shortcuts are active while not editing text or when being in the first column.
Alt+Left: Go to previous section (Command+[on macOSยฎ)Alt+Right: Go to next section (Command+]on macOSยฎ)Ctrl+Shift+V: From other tagCtrl+C: CopyCtrl+V: PasteShift+Delete: RemoveF2: EditInsert: AddDelete: Delete
File List
The file list contains the names of all the files in the opened folder which match the selected file name filter (typically *.mp3 *.ogg *.opus *.dsf *.flac *.mpc *.aac *.m4a *.m4b *.m4p *.mp4 *.mp2 *.spx *.tta *.wv *.wma *.wav *.aiff *.ape). A single or multiple files can be selected. To select no file, click into the empty area after the listbox entries. The selection determines the files which are affected by the operations which are available by using the buttons described below.
Besides Name, also other columns Size, Type, Date Modified with file details can be displayed. Columns can be hidden by unchecking their name in the context menu of the list header. The order of the columns can be changed by drag and drop. The sort order can be toggled by clicking on the column header.
The values of the standard tags can also be displayed and edited in columns of the file list.
At the left of the names an icon can be displayed: a disc to show that the file has been modified or information about which tags are present (V1, V2, V1V2 or NO TAG, no icon is displayed if the file has not been read in yet).
Folders are displayed with a folder icon. If a folder is opened, its files are displayed in a hierarchical tree. By selecting files from subfolders, operations can be executed on files in different folders, which is useful if the music collection is organized with a folder for each artist containing folders for albums of this artist.
Clicking the right mouse button inside the file list opens a context menu with the following commands:
- Expand all: Expands all folder trees (only the current tree if the Shift key is pressed)
- Collapse all: Collapses all folder trees
- Rename: Changes the name of a file
- Move to Trash: Moves a file to the trash
- Play: Plays a file, see Play. If the selected file is a playlist, the files of the playlist will be played.
- Edit: Edit a playlist, see Edit Playlist.
- The subsequent entries are user commands, which can be defined in the User Actions tab of Configure Kid3. The playback on double click can also be activated there.
When Select file on play is activated, the currently played track is automatically selected in the file list.
Edit Playlist
A playlist can be created empty or containing the tracks of a folder, see Create Playlist. The playlist file created in such a way can be edited by double click or using Edit from the file list context menu. A dialog with the entries of the playlist is shown. It is possible to open multiple playlists simultaneously.
New entries can be added by drag and drop from the file list, a file manager or another playlist. If an entry is dragged from another playlist, it will be moved or copied depending on the system. To invoke the other operation, respectively, the Shift, Ctrl or Alt (to copy instead of move on macOSยฎ) key has to be pressed. Reordering entries within the playlist is also possible via drag and drop. Alternatively, entries can be moved using the keyboard shortcuts Ctrl+Shift+Up and Ctrl+Shift+Down (on macOSยฎ Command has to be pressed instead of Ctrl). An entry can be removed using the Delete key.
Please note the following: To drag entries from the file list, they have to be held at the left side (near the icons), the same gesture at the right side will perform a multi selection, such an action is hereby still easily possible.
When a playlist has been modified, the changes can be stored using Save or discarded using Cancel. When the window is closed, a confirmation prompt is shown if there are unsaved changes.
Tracks selected in a playlist will be automatically selected in the file list, thereby making it possible to edit their tags.
okay bestie, so to actually do stuff to a playlist, its file has to be selected in the file list first โ no selection, no service. Edit from the context menu is what drops you into the dialog we're about to yap about all the way down below ๐, and Play is gonna fire up the media player with the tracks from that playlist. and it's not just those two: user actions can act on playlists as well, like Export Playlist Folder, which copies the files from a playlist straight into a folder. so handy ๐ซถ
๐๏ธ Folder List ๐๏ธ
this list holds the names of the folders inside the opened folder, plus the current (.) and the parent (..) folder. it's the fast lane, fr โ you can hop to another folder without ever touching the Open command or doing drag and drop. ๐
and yes, column visibility, order and sorting can all be configured exactly as described in the section about the file list. โจ
๐ง File ๐ง
this panel shows you the info about the encoding (MP3, Ogg, Opus, DSF, FLAC, MPC, APE, MP2, MP4, AAC, Speex, TrueAudio, WavPack, WMA, WAV, AIFF), the bit rate, the sample rate, the channels, and the length of the file. the whole vibe check of your audio, basically ๐
the Name line edit holds the name of the file (when only a single file is selected). change that name and the file gets renamed the moment you use the Save command. iconic little rename pipeline โจ
the Format combo box + line edit is the format that gets used when the filename is generated from the first or the second tag. the filename can contain arbitrary characters โ even a folder part separated by a slash from the file name โ but heads up ๐จ that folder has to already exist for the renaming to succeed. the following special codes insert tag values into the filename:
%s%{title}โ Title (Song)%a%{artist}โ Artist%l%{album}โ Album%c%{comment}โ Comment%y%{year}โ Year%t%{track}โ Track (e.g.01)%t%{track.n}โ Track with field width n (e.g.001for%{track.3})%T%{tracknumber}โ Track (without leading zeros, e.g.1)%g%{genre}โ Genre%{ignore}โ Ignored when generating tags from the file name
and no, the format codes are not restricted to the examples above. any frame name can be used โ unified frame names like %{albumartist}, %{discnumber.1}, %{bpm}, or format specific names like %{popm}. go wild ๐ซ
you can also prepend and append strings to a format code's replacement by putting them in double quotes inside the curly braces of that format code. these strings only land in the resulting string if the format code spits out a nonempty value. example time ๐: if the file name should contain both the title and the subtitle, you could use %{title} [%{subtitle}] in the format string โ but that would give you a string ending with [] if no subtitle frame exists for a file. to omit the brackets when there's no subtitle, use %{title}%{" ["subtitle"]"} instead. that version drops the brackets, the leading space and the subtitle if no subtitle exists. chef's kiss ๐
the list of available formats can be edited in the dialog that shows up when you click the Filename from tag button in the File tab of the settings.
a second Format combo box (with arrow down โฌ๏ธ) is the one that generates the tags from the filename. if the format of the filename doesn't match that pattern, a few other commonly used formats get tried. real ones, we don't leave you hanging ๐
some commonly used filename formats are already sitting in the combo box, but you can absolutely type some special format of your own into the line edit. main character behaviour ๐
that list of available formats gets edited in the dialog that appears when you click the Tag from filename button in the File tab of the settings.
internally, a regular expression is built from the format codes. so if you need advanced regular expressions, the format used to generate the tags from the filenames can be given as a complete regular expression with captures preceded by the format codes. e.g. to extract the track numbers without removal of leading zeros, a format like this works:
/%{track}(\d+) %{title}(.*)
From: Tag 1, Tag 2โ sets the filename using the selected format and the first tag, or the second tag, respectively.To: Tag 1, Tag 2โ the tags are set from the filename. first, the format specified in Format is used. if the existing filename doesn't match that format, the following formats are tried:Artist - Album/Track SongAlbum/Track - Artist - Song/Artist - Album - Track - SongAlbum/Artist - Track - SongAlbum/Artist - SongArtist/Album/Track Song
if a single file is selected, the GUI controls get filled with the values extracted from the filename. if multiple files are selected, the tags of the files are directly set according to the filenames. no middleman ๐ง
๐ท๏ธ Tag 1 ๐ท๏ธ
the line edit widgets for Title, Artist, Album, Comment, Date, Track Number and Genre are what edit the corresponding value in the first tag of the selected files. the value gets changed when the file selection is altered, or before operations like Save and Quit, and only when the corresponding check box at the left of the field name is checked. this is lowkey so good for changing just some values and leaving the rest untouched ๐
if a single file is selected, all check boxes are checked and the line edit widgets contain the values found in the tags of that file. if a tag isn't found in the file, the corresponding empty value is displayed โ that's an empty string for the Title, Artist, Album and Comment line edits, 0 for the numerical Date and Track Number edits, and an empty selected value for the Genre combo box. the values can be changed, and if the corresponding check box is checked, they'll be set for the selected file after the selection is changed. the file then gets marked as modified by a disk symbol ๐พ in the file listbox but stays untouched until the Save command is used.
if multiple files are selected, only the values which are identical in all selected files get displayed. in all other controls, those empty values described above show up instead. all check boxes are unchecked, to avoid unwanted changes โ very "we're not touching anything you didn't ask for" of it ๐. if a value has to be set for all selected files, edit it and set the check box. the values get set for all selected files when the selection changes and can be saved with the Save command.
the check boxes also control the operation of most commands affecting the tags, such as copy, paste and transfer between tags 1 and 2. and to make it easier to use with multiple files where all check boxes are unchecked, these commands behave in the same way when all check boxes are checked and when all check boxes are unchecked. yes, symmetrical like that ๐ค
From Tag 2โ the tag 1 fields get set from the corresponding values in tag 2. if a single file is selected, the GUI controls get filled with the values from tag 2. if multiple files are selected, the tags of the files are directly set.Copyโ fills the copy buffer with the Tag 1 values. only values with a checked check box will be used in subsequent Paste commands.Pasteโ pastes the values from the copy buffer into the GUI controls.Removeโ sets all GUI controls to their empty values, which results in removing all values. the saved file will then contain no tag 1. poof, gone ๐
๐ Tag 2 ๐
the GUI controls function in the same way as described for the Tag 1 section, but the size of the strings is not limited. freedom fr ๐ฆ
for the tag 2 Genre you can also use your own names besides the genres listed in the combo box โ just type the name into the line edit. your genres, your rules ๐
the tag 2 cannot only contain the same values as the tag 1: the format is built in a flexible way from several frames, which are themselves composed of several fields. the tag 2 table shows all the frames which are available in the selected file. it's giving โจorganizedโจ
Editโ opens a window which lets you edit all fields of the selected frame. if multiple files are selected, the edited fields are applied to all selected files which contain such a frame.Addโ a requester to select the frame type will appear, and a frame of the selected type can be edited and added to the file. this also works to add a frame to multiple selected files.Deleteโ deletes the selected frame in the selected files.Drag album artwork hereโ shown if the file does not contain embedded cover art. a picture can be added using drag and drop from a browser or file manager and will be displayed right here. picture frames can be edited or added by double clicking on this control. album art slay ๐ผ๏ธ
๐ Tag 3 ๐
some files can have more than two tags, and a third tag section is visible. the following file types can have such a Tag 3 section:
- MP3 files can have an ID3v1.1 tag, an ID3v2 (2.3.0 or 2.4.0) tag and, in the third section, an APE tag. such APE tags are used for replay gain information. in the Tag 3 section this information is visible, and the APE tag can be removed with the Remove button.
- the RIFF INFO chunk of WAV files is available in the Tag 3 section because the Tag 1 section is dedicated to ID3v1.1 tags and handles their restrictions. the Tag 2 is still used for ID3v2.4.0 tags, which are also supported for WAV files, but RIFF INFO chunks seem to be supported better.
- FLAC files normally use a Vorbis comment for their meta data. however, there are FLAC files which have ID3v1 and ID3v2 tags, which can be found in the Tag 1 and Tag 3 sections. ID3 tags in FLAC files are only supported by TagLib, therefore the OggFlacMetadata plugin has to be disabled in the Plugins tab of the settings. โ ๏ธ note that one, it's a whole thing.
the GUI controls work in the same way as in the Tag 2 section. ๐ซถ
๐ค Synchronized Lyrics and Event Timing Codes ๐ค
for information synchronized with the audio data, there's a specific editor available. these frames are supported for ID3v2.3.0 and ID3v2.4.0 tags. to add such a frame, the specific frame name has to be selected in the list which appears when the Add button is clicked โ Synchronized Lyrics or Event Timing Codes, respectively. the editor is the same for both types: for the event timing codes, only a predefined set of events is available, whereas for the synchronized lyrics, text has to be entered. in the following, editing synchronized lyrics is explained.
So picture this, bestie: you've got a file with an ID3v2 tag selected, and to get into the lyrics editor you hit Add and pick Synchronized Lyrics. ๐ Already got a Synchronized Lyrics frame? Then just select it and click Edit. Kid3 will open the player for you automatically with the current file, so you can play and pause your way through getting those lyrics synced. โจ
The settings up at the top of the SYLT editor usually do not need to be touched, ngl. The one case where you do want to change something: if your lyrics have characters that aren't in the Latin 1 character set, it's advisable to switch the text encoding to UTF16 (or UTF8 for ID3v2.4.0). If your lyrics are English and you want maximum compatibility? Use ISO-8859-1, periodt.
The Lyrics section ๐
There are five buttons at the top:
- Add โ drops a new time event into the table. The time is taken from the position of the player, so if you add an entry while the track is playing, you'll get a line for the currently played position. The events in the table have to be chronologically ordered, so the row gets inserted in the right spot accordingly.
- Entries with an invalid time are handled in their own special little way: if the currently selected row has an invalid time, its time stamp gets replaced with the current time instead of adding a new row. And if the current time isn't invalid, the first row with an invalid time gets used, if one is present. This is the behavior that makes adding time stamps actually bearable when the lyrics text is already sitting in the table but the time stamps are missing โ which is exactly the situation you're in when you import unsynchronized lyrics. โญ
Heads up: the invalid time is represented as 00:00.00 โ which, yes, is the same as the time at the absolute beginning of the track, and that one is not invalid. To actually make a time invalid, press the Delete key, or use Clear from the context menu.
New rows you insert using Insert row from the context menu, or rows created when importing unsynchronized lyrics with From Clipboard or Import, also come with invalid time stamps. And you can delete rows in the table by clicking the Delete button or by using Delete rows from the context menu. ๐๏ธ
Synchronized lyrics can be imported from a file using Import. The expected format is simple or enhanced LRC. If the selected file doesn't contain a square bracket in its first line, Kid3 assumes it's a simple text file with unsynchronized lyrics โ and the lines from that file get imported with invalid time stamps, so you'll have to add the time information yourself with the Add button or by typing it in manually. You can also bring lyrics in via copy-paste using From Clipboard. ๐ซถ
Synchronized lyrics can be written out to LRC files using Export. But note: only entries with valid time stamps get exported, and the entries will be sorted by time. Entries with invalid time won't be stored in the SYLT frame either, so make sure you've got all your timing information in there before you leave the dialog, okay??
The ID3 specification[5] suggests a time stamp for each syllable. But most players only support the granularity of a line or a sentence. To support both use cases, Kid3 follows the same conventions as SYLT Editor[6]:
- Text entered into the table is assumed to start a new line โ unless it starts with a space or a hyphen.
- There are exceptions to this rule: start a line with an underscore (
_) to force continuation, or a hash mark (#) to force a new line. - These escape characters are not stored inside the SYLT frame.
- Inside the SYLT frame, new lines start with a line feed character (hex
0A), whereas continuations do not. - When reading SYLT frames, Kid3 checks whether the first entry starts with a line feed. If it doesn't, it assumes that all entries are new lines and that no syllable continuations are used.
While the track is playing, the row associated with the current playing position gets highlighted, so you can verify that your synchronization info is actually correct. ๐ธ If you need to add an offset to one or more time stamps, do it with Add offset in the context menu โ and yes, negative values work, they reduce the time. And with Seek to position in the context menu, you can set the playing position to the time of the selected row. ๐
Recommended procedure to add new synchronized lyrics
- Get the unsynchronized lyrics, e.g. using Lyrics โ Embed Lyrics from the file list context menu.
- Copy the unsynchronized lyrics to the clipboard โ just go to the Lyrics row in the frame table and press Ctrl+C.
- Add a synchronized lyrics frame (Add..., Synchronized Lyrics, OK), then click From Clipboard.
- Now all the lines from the unsynchronized lyrics are in the table, and all the time stamps are invalid (
0:0:0.00). You can delete empty entries beforehand if you want. - Start playing the song by clicking the play button โบ in the play toolbar at the bottom of the main window.
- When the next lyrics line with an invalid timestamp comes up, click Add or press Alt+A โ and the timestamp will be updated.
- Continue like this until all timestamps are set. If you missed something, stop playback and clear the timestamps using the Delete key, or by selecting them and using Clear from the context menu. To restart playback from a given timestamp, use Seek to position from the context menu.
Chapters in MP4 Files
MP4 audiobooks typically have a .m4b extension and are rather large, because they cram all the chapters into a single file. ๐ญ To navigate around in files like that, they can contain chapter marks โ and you can edit those in Kid3 using a pseudo "Chapters" frame with the exact same editor that's used for synchronized lyrics. There are two types of chapters in MP4 files: "Nero" and "QuickTime (QT)".
The chapter information in MP3 audiobooks is stored in multiple "Chapter" (CHAP) frames, which are referenced by a "Table of Contents" (CTOC) frame โ and these frames have embedded subframes. To edit all of that in a single place, a pseudo "Chapters" frame can also be used for ID3v2 tags. Its contents are used to create the real chapter, table of contents and embedded frames:
- The Description is used as the table of contents title.
- The Text column contains the chapter titles.
- The corresponding Time value will be the chapter start time and the end time of the preceding chapter.
- The end time of last chapter is determined by the Time of the last row if its Text is empty.
The File Menu ๐
File โ Open... (Ctrl+O)
Opens a folder. All files matching the selected file name filter will be displayed in the file listbox, and the chosen file is selected.
File โ Open Recent
Opens a recently opened folder. โจ
File โ Open Folder... (Ctrl+D)
Opens a folder. All files matching the selected file name filter will be displayed in the file listbox.
File โ Reload (F5)
Reload folder. Modified files have to be saved before you do this. Expanded subfolders will be collapsed.
File โ Save (Ctrl+S)
Saves all changed files in the folder. The changed files are marked with a disk symbol ๐พ in the file listbox. If any file names have been changed, those files will be renamed.
File โ Revert
Reverts the changes of one or multiple files. If no files are selected in the file listbox, the changes of all files will be reverted โ otherwise only the changes of the selected files are reverted.
File โ Import...
The Import dialog can be used to import data directly from a freedb.org server, from a MusicBrainz server, from Discogs, Amazon or other sources of album track lists in textual format. ๐
Import from a freedb.org server is possible using a dialog which appears when From Server: gnudb.org is selected. The artist and album name to search for can be entered in the two topmost fields; the albums which match the query will be displayed when Find is clicked and the results from www.gnudb.org[7] are received. Importing the track data for an album is done by double-clicking the album in the list. The freedb.org server to import from can be selected as well as the CGI path. The imported data is displayed in the preview table of the import dialog. When you're satisfied with the displayed tracks, they can be imported by terminating the import dialog with OK.
If you already have a search result open in the web browser, you can enter the URL into the first search field. The result will then appear in the album list and can be directly imported into Kid3. ๐ฆ
An e-mail address registered at gnudb.org[8] can be entered into the Token field.
A search on the Discogs server can be performed using Discogs. As in the gnudb.org dialog, you can enter artist and album and then choose from a list of releases. A Token can be entered to use the RESTful Discogs API instead of their web interface โ which is often changed, thereby breaking the import parser. ๐ You have to register for an account on Discogs[9] and then generate a token on their web site (Settings/Developers, Generate new token). Don't forget to Save Settings after entering the token in order to use it in subsequent requests too. If Standard Tags is marked, the standard information is imported, e.g. artist, album, and title. If Additional Tags is marked, more information is imported if available, e.g. performers, arrangers, or the publisher. If Cover Art is marked, cover art will be downloaded if available. ๐จ
A search on Amazon can be performed using Amazon. As in the gnudb.org dialog, you can enter artist and album and then choose from a list of releases. If Additional Tags is marked, more information is imported if available, e.g. performers, arrangers, or the publisher. If Cover Art is marked, cover art will be downloaded if available.
You can search in the same way in the release database of MusicBrainz using From MusicBrainz Release. The workflow is the same as described for From gnudb.org. ๐
Import from a MusicBrainz server? Yes bestie, absolutely possible โจ it uses the dialog that pops up when you pick From MusicBrainz Fingerprint. You pick the Server just like in the freedb import dialog, no biggie. Underneath there's a table showing the imported track data, and the right column is the state of the MusicBrainz query. When the dialog opens it starts at "Pending" โ then the fingerprint gets looked up, and if that gives you nothing back, it tries another lookup using the tags already in the file. So lowkey, if you want a successful MusicBrainz query, it helps to store known info (like artist and album) in the tags before the import. If it found something, the search ends in the state "Recognized" ๐ otherwise nothing was found, or there were multiple ambiguous results and you have to pick one yourself. OK and Apply use the imported data, Cancel closes the dialog. Heads up though โ the closing can take a while, because the whole MusicBrainz machinery has to shut down ๐ญ it's giving dramatic exit.
For importing textual data, From File/Clipboard opens a subdialog with several preconfigured import formats ready to go ๐
The first two, "CSV unquoted" and "CSV quoted", are for importing data that was exported by the Export dialog. You can edit that CSV data in a spreadsheet, and it shall be written using tabs as delimiters. Import should then be possible using "CSV quoted", which is more flexible than "CSV unquoted". That said, its fields cannot contain any double quotes ๐ซ. And if you only export from Kid3 and import later, "CSV unquoted" can be used as a simple format for exactly that purpose. Oh and also โ there are "Export CSV" and "Import CSV" commands in the context menu of the file list, which use scripts to export and import CSV data in a more complete, powerful and flexible way ๐ iykyk.
Next up: "freedb HTML text" ๐ฆ you can use it to copy information from an HTML page of freedb.org[10]. Search an album in freedb, and if the info you want is displayed in the web browser, copy the contents to the clipboard. Then click the From Clipboard button and the imported tracks will show up in the preview table at the top of the dialog. If you're happy with the imported data, close the dialog with OK and it'll insert the data into the tags of the current folder. The destination (Tag 1, Tag 2 or Tag 1 and Tag 2) can be selected with a combo box. Your files in the current folder should be in the correct track order so their tags get assigned properly โ which is the case if they're numbered ๐ข.
The next preconfigured format, "freedb HTML source", is your girl when the data is available as an HTML document. Import is possible using the From File button, which opens a file selector, or by copying its contents from an editor and then importing from clipboard. This format is useful for offline import, although honestly the HTML document could also just be opened in a browser and then imported in the first format via the clipboard ๐.
More preconfigured formats are available, e.g. "Track Title Time". An empty custom format can be created with Add for the user to set up. Two lines below the format name can be set with a regular expression to capture the fields from the import text:
- The first regular expression will be parsed once per document to gather per-album data such as artist, album, year and genre ๐
- The second line is tried to match from the start of the document to the end to get track data, usually number and title.
The regular expressions include all the features offered by Qt(TM), which is most of what Perl offers ๐
. Bracketing constructs (..) create capture buffers for the fields to import and are preceded by Kid3 specific codes to specify which field to capture. The codes are the same as used for the filename format, and besides the codes listed below, any frame name is possible:
%s%{title}โ Title (Song)%a%{artist}โ Artist%l%{album}โ Album%c%{comment}โ Comment%y%{year}โ Year%t%{track}โ Track%g%{genre}โ Genre%d%{duration}โ Duration
For example, a track regular expression (second line) to import from an .m3u playlist could be:
"%{track}(\d+)\s+%{title}(\S[^\r\n]*)\.mp3[\r\n]"
All formats can be changed by editing the regular expressions and the name, then clicking Save Settings. They get stored in the kid3rc file in the configuration folder ๐๏ธ. You can edit that file directly if you want more import formats, or delete it to revert to the default formats. Formats can be deleted using Remove.
Accuracy shows an estimation of how good the imported information matches the given tracks โ it uses track durations or file names to calculate the level of similarity in percent ๐. Cover Art shows the URL of the album cover image which will be downloaded ๐ผ๏ธ.
To check whether the imported tracks match the current set of files, the duration of the imported tracks can be compared with the duration of the files. This option can be enabled with the check box Check maximum allowable time difference (sec): and the maximum tolerated difference in time can be set in seconds. If a mismatch in a length is detected, the length is displayed with a red background in the preview table ๐จ.
If the files are ordered differently than the imported tracks, their assigned tracks have to be changed. This task can be facilitated using the Match with option with the buttons Length, Track and Title, which will reorder the tracks according to the corresponding field. To correct the assignments manually, a track can be dragged with the left mouse button while holding down the Ctrl key, and then dropped at the new location ๐ฑ๏ธ.
If there are more imported tracks than files โ for example if the current folder contains only the second disc of a two disc album but the tracks of both discs were imported โ you can delete the tracks of the first disc like this:
- Select them by clicking on the row label of the first track.
- Then click on the row label of the last track of the first disc while holding down Shift.
- Finally remove the tracks by pressing the Delete key.
When the import dialog is opened, it contains the actual contents of the tags. The tag type (Tag 1, Tag 2, Tag 1 and Tag 2) can be selected using the Destination combo box. The button on the right of this combo box can be used to revert the table to the current contents of the tags. The check boxes in the first table column select which tracks are imported โ super handy if a folder contains the tracks of both CDs of a double CD and you only want the tracks of the second CD ๐ฟ.
To identify the tracks which are imported, you can display the file names or the full paths to the files using the context menu of the table header. The values in the import table can be edited. That revert-button to the right of the Destination combo box can be used to restore the contents of the tags, which is also useful after changing the Destination โป๏ธ.
Almost all dialogs feature a Save Settings button, which can be used to store the dialog specific settings and the window size persistently ๐พ iconic.
From Tags leads to a subdialog to set tag frames from the contents of other tag frames. You can use it to simply copy information between tags, or extract a part from one frame and insert it in another ๐ง.
Just like in the import from file/clipboard dialog, there are freely configurable formats to perform different operations. Already preconfigured are formats to:
- copy the Album value to Album Artist, Composer or Conductor
- extract the Track Number from Title fields which contain a number
- extract a Subtitle from a Title field
Here's a little example explaining how to add a custom format which sets the information from the Subtitle field also in the Comment field ๐:
- Create a new format using the Add button and set a new name, e.g. "Subtitle to Comment".
- Then enter
"%{subtitle}"in Source and"%{comment}(.*)"for Extraction. - Click Save Settings.
The expression in Source can contain format codes for arbitrary tag frames โ multiple codes can be used to combine the contents from different frames. For each track, a text is generated from its tags using the Source format, and the regular expression from Extraction is applied to this text to set new values for the tags. Format codes are used before the capturing parentheses to specify the tag frame where the captured text shall be stored. It works in the same way as for the import from file/clipboard ๐ .
Import from Tags... is also directly available from the File menu. The difference between these two functions is that the import dialog subdialog operates on all files of the current folder, whereas the menu function operates on the selected files (which can be in different folders). The menu function supports an additional code "%{__return}" to return the extracted value, which can be useful with the CLI and QML interfaces โจ.
File โ Import from gnudb.org...โ import from a freedb.org server using gnudb.org album search. This menu item opens the same import dialog as Import..., but opens directly the gnudb.org dialog ๐File โ Import from Discogs...โ import from the Discogs server. This menu item opens the same import dialog as Import..., but opens directly the From Discogs dialog ๐ฟFile โ Import from Amazon...โ import from Amazon. This menu item opens the same import dialog as Import..., but opens directly the From Amazon dialog ๐ฆFile โ Import from MusicBrainz Release...โ import from the MusicBrainz release database. This menu item opens the same import dialog as Import..., but opens directly the From MusicBrainz Release dialog ๐ถFile โ Import from MusicBrainz Fingerprint...โ import from a MusicBrainz server. This menu item opens the same import dialog as Import..., but opens directly the From MusicBrainz Fingerprint dialog ๐ซFile โ Import from Tags...โ like From Tags, but the import is applied to the selected files ๐ฏ
File โ Automatic Import... โจ
okay so Automatic Import is the one that lets you pull info for multiple albums at once from a whole bunch of web services ๐. If you've got folders selected in the file list, then the track data for those folders gets imported. If nothing's selected? Then it just goes and imports every folder in the file list. no cap.
The tag type โ Tag 1, Tag 2, or Tag 1 and Tag 2 โ is picked with the Destination combo box ๐.
Profiles decide which servers get contacted to fetch album info. Some are already there for you: All, MusicBrainz, Discogs, Cover Art ๐ฆ. Wanna make your own? Hit the Add button on the right of the Profile combo box, bestie.
The table underneath shows which servers get used when you import album info with the selected profile. Here's the tea โ: the import process for an album is finished once all the required info has been found โ so the order of the rows in the table actually matters. Change it with Move Up and Move Down. Edit lets you change an existing entry. The Server selection offers the same servers you can use in the import functions. Standard Tags, Additional Tags, and Cover Art decide what info shall be fetched from the server. And finally, Accuracy is the minimum accuracy that must be achieved to accept the imported data โ if the accuracy isn't good enough, the next server in the list gets tried ๐ฅ. The same dialog with the server properties pops up when you click Add to add a new server entry. Existing entries can be deleted with Remove.
To launch an automatic batch import with the selected profile, click Start. Details about the running import show up at the top of the dialog, and you can Abort the whole thing with the Abort button ๐
.
File โ Browse Cover Art... ๐จ
The Browse Cover Art dialog is your bestie for finding album cover art ๐ซถ. Artist/Album gets filled from the tags if possible. Source offers a whole variety of websites with album cover art โ and the URL with artist and album as parameters is right there beneath the name. URL-encoded values for artist and album can be inserted using "%u{artist}" and "%u{album}", and other values from the tags work too, just like described in Configure Kid3, User Actions โจ.
Wanna add more sources? After the entry "Custom Source", replace "Custom Source" with the source's name, press Enter, then insert the URL, and finally press Save Settings. So iconic. The resulting browser command shows at the top of the dialog and can be started by clicking Browse. The browser (which you configure in the settings) launches with the selected source. Then you just drag a cover image from the browser into the Kid3 window and boom ๐ฅ โ it's set in the picture frame of the selected files.
Now, the messy part ๐ญ: not all browsers support drag and drop of images, and pictures on websites often have a URL. In those cases Kid3 receives the URL, not the picture. If that URL points to a picture, it gets downloaded, easy. But if the URL refers to some other web resource, it has to be translated into the corresponding picture. Those mappings live in the table URL extraction. The left column Match holds a regular expression which gets compared with the URL โ if it matches, the captured expressions in parentheses are inserted into the pattern of the right Picture URL column (at the positions marked with \1 etc.). That replaced regular expression contains the URL of the picture ๐. So by this means, cover art can be imported from Amazon, Google Images, etc. using drag and drop. And yes, you can define your own mappings too. main character energy fr fr.
File โ Export... ๐ค
The Export Dialog stores data from the tags into a file or onto the clipboard ๐. The editor at the top shows a preview of the data you're about to export. If the export data contain tabulator characters, the export is displayed in a table (cute). The data gets generated from the tags in the current folder according to the configured format.
The format settings are similar to the Import dialog: the topmost field contains the title (e.g. "CSV unquoted"), followed by the header, which is generated at the begin of the file. Then comes the track data โ it's used for every track. Finally the trailer can be used to generate some finishing text ๐.
Heads up tho: the format fields do not contain regular expressions like in the Import dialog. They only contain output format expressions with special %-expressions, which get replaced by values from the tags. The whole thing works like the file name format, and the same codes are used plus some additional codes ๐. And not only the codes listed below โ all tag frame names can be used.
%s%{title}โ Title (Song)%a%{artist}โ Artist%l%{album}โ Album%c%{comment}โ Comment%y%{year}โ Year%t%{track}โ Track (e.g.01)%t%{track.n}โ Track with field width n (e.g.001for%{track.3})%T%{tracknumber}โ Track (without leading zeros, e.g.1)%g%{genre}โ Genre%f%{file}โ File name%p%{filepath}โ Path%{modificationdate}โ Modification date%{creationdate}โ Creation date%u%{url}โ URL%{dirname}โ Folder name%d%{duration}โ Duration in minutes:seconds%D%{seconds}โ Duration in seconds%n%{tracks}โ Number of tracks of the album%e%{extension}โ File extension%O%{tag1}โ The format of tag 1 (ID3v1.1or empty if not existing)%o%{tag2}โ The format of tag 2 (ID3v2.3.0,ID3v2.4.0,ID3v2.2.0,ID3v2.2.1,Vorbis,APE,MP4,ASF, or empty if not existing)%b%{bitrate}โ Bit rate in kbit/s%v%{vbr}โVBRor empty (only for ID3v2.3 with id3lib)%r%{samplerate}โ Sample rate in Hz%m%{mode}โ Channel mode (StereoorJoint Stereo)%h%{channels}โ Number of channels (1or2)%k%{codec}โ Codec (e.g.MPEG 1 Layer 3,MP4,Ogg Vorbis,FLAC,MPC,APE,ASF,AIFF,WAV)
A few formats are already predefined, like the little icons they are ๐:
"CSV unquoted"separates the fields by tabs. Data in this format can be imported again into Kid3 using the import format with the same name ๐"CSV quoted"additionally encloses the fields by double quotes, which eases the import into spreadsheet applications. > However, the fields shall not contain any double quotes when this format is used."Extended M3U"and"Extended PLS"generate playlists with extended attributes and absolute path names."HTML"can be used to generate an HTML page with hyperlinks to the tracks."Kover XML"creates a file which can be imported by the cover printing program Kover."Technical Details"provides information about bit rate, sample rate, channels, etc."Custom Format"is left empty for definition of a custom format.
You can define more formats of your own by adding lines in the file kid3rc in the configuration folder ๐. The other formats can be adapted to your needs.
The Source of the tags to generate the export data (Tag 1 or Tag 2) is selected with a combo box. Pushing To File or To Clipboard stores the data in a file or on the clipboard ๐. OK and Cancel close the dialog, whereas OK accepts the current dialog settings. slay.
File โ Create Playlist... ๐ต
Creates a playlist ๐. The format and contents of the playlist can be set by various options.
The name of the playlist can be the Same as folder name or use a Format with values from the tags, e.g. "%{artist} - %{album}" to have the artist and album name in the playlist file name ๐. The format codes are the same as for Export. The list of available formats can be edited in the Format section of the Files tab in the settings. Create new empty playlist will make an empty playlist with the given name. The extension depends on the playlist format.
The location of the generated playlist is determined by the selection of the Create in combo box.
Current folderโ The playlist is created in the current folder and contains only files of the current folder. The current folder is the folder where the current file is located. If multiple files are selected, the current file is probably the last selected file.Every folderโ A playlist is created in every folder which contains listed files, and each playlist contains the files of that folder.Top-level folderโ Only one playlist is created in the top-level folder (i.e. the folder of the file list) and it contains the listed files of the top-level folder and all of its sub-folders.
The Format of the playlist can be M3U, PLS or XSPF โจ.
If Include only the selected files is checked, only the selected files will be included in the playlist. If a folder is selected, all of its files are selected. If this check box is not activated, all audio files are included in the playlist ๐
Sort by file name selects the usual case where the files are ordered by file name. With Sort by tag field, it's possible to sort by a format string with values from tag fields ๐ฅ. For instance, "%{track.3}" can be used to sort by track number (the .3 is used to get three digits with leading zeros because strings are used for sorting). It's also possible to use multiple fields, e.g. "%{genre}%{year}" to sort using a string composed of genre and year.
The playlist entries will have relative or absolute file paths depending on whether Use relative path for files in playlist or Use full path for files in playlist is set.
When Write only list of files is set, the playlist will only contain the paths to the files. To generate an extended playlist with additional information, a format string can be set using the Write info using control ๐.
File โ Quit (Ctrl+Q)
Quits the application. bye bestie ๐ญ๐
The Edit Menu โ๏ธ
Edit โ Select All (Alt+A)
Selects all files. all of them. every single one ๐
Edit โ Deselect (Ctrl+Shift+A)
Deselects all files. (yes it's the anti-Select-All, we love a symmetrical queen ๐ซถ)
Edit โ Select All in Folder
Selects all files of the current folder ๐โจ
Edit โ Previous File (Alt+Up)
Selects the previous file โฌ๏ธ
Edit โ Next File (Alt+Down)
Selects the next file โฌ๏ธ
Edit โ Find... (Ctrl+F)
Find strings in the file names and the tags ๐๐ธ. The Find dialog is a subset of the Replace dialog, which is described below. iykyk.
Edit โ Replace... (Ctrl+R)
okay so this one opens a whole dialog that finds and replaces strings โ and not just in the file names, bestie, in the tags too ๐ . Double threat behavior.
Wanna keep it focused? The set of frames where the search is performed can be restricted โ just deactivate the Select all check box and select the frames which shall be searched. There are also search options available: search backwards, search case sensitively, and use regular expressions โจ.
Real talk ๐ซถ depending on the number of files, the search might take some time. If it's giving loading screen forever, it can be aborted by closing the dialog. no cap.
๐ The Tools Menu
Tools โ Apply Filename Format
When Automatically apply format is switched off for the filename format over in the configuration dialog, this menu item can be used to apply the configured format to the names of the selected files. And plot twist โ it's also a vibe check ๐: you can use it to check whether the file names conform with the configured format by applying the format to all saved files and then checking if any files were changed (they'd be marked with a disk symbol in the file listbox, iykyk).
Tools โ Apply Tag Format
Same energy, but for the tags ๐. When Automatically apply format is switched off for the tag format in the configuration dialog, this menu item can be used to apply the configured format to the tags of the selected files. And yep, same check trick: you can use it to check whether the tags conform with the configured format by applying the format to all saved files and then checking if any files were changed (and therefore marked with a disk symbol in the file listbox).
Tools โ Apply Text Encoding
Sets the Text encoding selected in Settings โ Configure Kid3... โ Tags section โ Tag 2 tab for all selected files. Tiny caveat, don't @ me: if UTF8 is selected, UTF16 will be used for ID3v2.3.0 tags, because UTF8 is not supported for this format. periodt.
Tools โ Rename Folder...
This dialog offers the possibility to automatically rename the currently open folder according to the tags in the files ๐ธ. Several formats are preconfigured to include information about artist, album and year in the folder name. You can also set a custom format and Edit the list of available formats. These special codes are the ones that insert tag values into the folder name:
%s,%{title}โ Title (Song)%a,%{artist}โ Artist%l,%{album}โ Album%c,%{comment}โ Comment%y,%{year}โ Year%t,%{track}โ Track (e.g.01)%t,%{track.n}โ Track with field width n (e.g.001for%{track.3})%T,%{tracknumber}โ Track (without leading zeros, e.g.1)%g,%{genre}โ Genre%{dirname}โ Folder name (e.g.%{year" "}%{dirname}will prepend the year to the current folder name)%{max-year}โ The maximum year value found for this folder, can also be used with other codes than"year"%{min-year}โ The minimum year value found for this folder%{unq-year}โ The unique year value found for this folder or empty if not unique
If a folder separator "/" is found in the format, multiple folders are created โจ. And if what you actually want is to create a new folder instead of renaming the current folder, in the Action combo box select Create Folder instead of Rename Folder. The Source of the tag information can be chosen between Tag 1 and Tag 2, Tag 1 and Tag 2. A preview for the rename operation performed on the first file can be seen in the From and To sections of the dialog. Obsessed ๐.
Multiple folders can be renamed by selecting them.
Tools โ Number Tracks...
If the track numbers in the tags are not set or have the wrong values, this function can number the tracks automatically in ascending order. The start number can be set in the dialog. And if only part of the tracks have to be numbered, they must be selected first โ selective queen behavior ๐.
When Total number of tracks is checked, the number of tracks will also be set in the tags.
It is possible to number the tracks over multiple folders. The folders have to be expanded and selected.
If Reset counter for each folder is checked, track numbering is restarted with the given number for each folder when multiple folders are selected.
The number tracks dialog can also be used to format existing track numbers without changing the values when the check box left to Start number is deactivated. The total number of tracks will be added if the corresponding check box is active, which can be used to set the total for all selected tracks. And if only formatting of the existing numbers is desired, this check box has to be deactivated too.
Tools โ Filter...
The filter can be used to display only those files which match certain criteria ๐ฆ. This is helpful if you want to organize a large collection and only edit those files which are not in the desired scheme. The expression defining which files to display uses the same format codes which are used in the file name format, import and export. So yes, same language, different font.
%s,%{title}โ Title (Song)%a,%{artist}โ Artist%l,%{album}โ Album%c,%{comment}โ Comment%y,%{year}โ Year%t,%{track}โ Track (e.g.01)%t,%{track.n}โ Track with field width n (e.g.001for%{track.3})%T,%{tracknumber}โ Track (without leading zeros, e.g.1)%g,%{genre}โ Genre%f,%{file}โ File name%p,%{filepath}โ Absolute path to file%e,%{extension}โ File extension%O,%{tag1}โ The format of tag 1 (ID3v1.1or empty if not existing)%o,%{tag2}โ The format of tag 2 (ID3v2.3.0,ID3v2.4.0,ID3v2.2.0,ID3v2.2.1,Vorbis,APE,MP4,ASF, or empty if not existing)%b,%{bitrate}โ Bit rate in kbit/s%v,%{vbr}โVBRor empty (only for ID3v2.3 with id3lib)%r,%{samplerate}โ Sample rate in Hz%m,%{mode}โ Channel mode (StereoorJoint Stereo)%h,%{channels}โ Number of channels (1or2)%k,%{codec}โ Codec (e.g.MPEG 1 Layer 3,MP4,Ogg Vorbis,FLAC,MPC,APE,ASF,AIFF,WAV)%w,%{marked}โ Marked, is1if the file is marked (e.g. because of truncation or standard violation), empty otherwise%1a,%1{artist}, ... โ Use the prefix1to get values of tag 1%2a,%2{artist}, ... โ Use the prefix2to get values of tag 2
These codes are replaced with the values for the file, and the resulting strings can be compared with the following operations:
s1equalss2โ true ifs1ands2are equal.s1containss2โ true ifs1containss2, i.e.s2is a substring ofs1.smatchesreโ true ifsmatches the regular expressionre.
True expressions are replaced by 1, false by 0. True values are represented by 1, true, on and yes, false values by 0, false, off and no. Boolean operations are not, and, or (in this order of precedence) and can be grouped by parentheses. Genuinely such a clean little grammar, ngl ๐
.
Some filter rules are predefined and can serve as examples for your own expressions ๐:
All
When the file list is filtered โ this is shown by "[filtered]" in the window title โ and all files shall be displayed again, the filtering can be reverted using this filter. It uses an empty expression, but a true value would have the same effect.
Filename Tag Mismatch
not (%{filepath} contains "%{artist} - %{album}/%{track} %{title}")
Tests if the file path conforms with the file name format. This rule is automatically adapted if the file name format changes.
No Tag 1
%{tag1} equals ""
Displays only files which do not have a tag 1.
No Tag 2
%{tag2} equals ""
Displays only files which do not have a tag 2.
ID3v2.3.0 Tag
%{tag2} equals "ID3v2.3.0"
Displays only files which have an ID3v2.3.0 tag.
ID3v2.4.0 Tag
%{tag2} equals "ID3v2.4.0"
Displays only files which have an ID3v2.4.0 tag.
Tag 1 != Tag 2
not (%1{title} equals %2{title} and %1{album} equals %2{album} and %1{artist} equals %2{artist} and %1{comment} equals %2{comment} and %1{year} equals %2{year} and %1{track} equals %2{track} and %1{genre} equals %2{genre})
Displays files with differences between tag 1 and tag2.
Tag 1 == Tag 2
%1{title} equals %2{title} and %1{album} equals %2{album} and %1{artist} equals %2{artist} and %1{comment} equals %2{comment} and %1{year} equals %2{year} and %1{track} equals %2{track} and %1{genre} equals %2{genre}
Displays files with identical tag 1 and tag 2.
Incomplete
%{title} equals "" or %{artist} equals "" or %{album} equals "" or %{year} equals "" or %{tracknumber} equals "" or %{genre} equals ""
Displays files with empty values in the standard tags (title, artist, album, date, track number, genre).
No Picture
%{picture} equals ""
Displays only files which do not have a picture.
Marked
not (%{marked} equals "")
Displays only files which are marked because they violate the ID3 standard, are truncated or the picture is too large.
Custom Filter
To add your own filter, select this entry. For instance, if you want to have a filter for artists starting with "The", replace "Custom Filter" with the name "The Bands" and press Enter. Then insert the following expression into the line edit:
%{artist} matches "The.*"
Then click Save Settings. Click Apply to filter the files. All files processed are displayed in the text view, with a "+" for those who match the filter and a "-" for the others. When finished, only the files with an artist starting with "The" are displayed, and the window title is marked with "[filtered]". Main character filtering fr fr ๐.
Tools โ Convert ID3v2.3 to ID3v2.4
If there are any ID3v2.3 tags in the selected files, they will be converted to ID3v2.4 tags. Quick warning bestie: frames which are not supported by TagLib will be discarded ๐. Only files without unsaved changes will be converted.
Tools โ Convert ID3v2.4 to ID3v2.3
If there are any ID3v2.4 tags in the selected files, they will be converted to ID3v2.3 tags. Only files without unsaved changes will be converted.
๐ง Tools โ Play
okay so this one opens a simple little toolbar whose entire job is playing audio files โ it's giving mini media player energy โจ. What's in it:
- buttons for the basic operations: Play/Pause, Stop playback, Previous Track, Next Track, Close
- sliders for position and volume
- a display of the current position
If multiple files are selected, the selected tracks are played. Else, all files will be played. That's the whole rule, no cap ๐
Also cute detail: the time displayed can be toggled between elapsed and remaining time by clicking on the display. Obsessed ๐
๐ The Settings Menu ๐
Settings โ Show Toolbar
Toggles displaying of the toolbar. On, off, your call bestie โจ
Settings โ Show Statusbar
Toggles displaying of the statusbar โ and that bar is the one displaying longer actions such as opening or saving a folder. So if you like knowing what's going on, keep it ๐ซถ
Settings โ Show Picture
Toggles displaying of the album cover art preview picture. Your lil cover art moment ๐
Settings โ Auto Hide Tags
Empty tags are automatically hidden if this option is active. The clutter? Gone ๐
And heads up: the File, Tag 1 and Tag 2 sections can be manually collapsed and expanded by clicking on the corresponding -/+ buttons. So you still have the wheel, you're just not forced to hold it.
Settings โ Configure Shortcut keys...
Opens a dialog to assign keyboard shortcuts for most of the program functions โจ๏ธ And the slay part: there are even functions without corresponding menu or button available, e.g. next file, previous file, select all. iykyk โ keyboard girlies stay winning โญ
Settings โ Configure Kid3...
Opens the configuration dialog, which consists of pages for tags, files, user actions, and network settings. Four whole areas of vibes.
Tag specific options can be found on the Tags page, which is itself separated into four tabs for Tag 1, Tag 2, Tag 3, and All Tags. Four tabs, four moods โจ
If Mark truncated fields is checked, truncated ID3v1.1 fields will be marked red ๐จ Here's the tea: the text fields of ID3v1.1 tags can only have 30 characters, the comment only 28 characters. Also the genre and track numbers are restricted, so that fields can be truncated when imported or transferred from ID3v2. Truncated fields and the file will be marked red, and the mark will be removed after the field has been edited. So it's a temporary scarlet letter, not a forever one ๐ซถ
With Text encoding for ID3v1 it is possible to set the character set used in ID3v1 tags. This encoding is supposed to be ISO-8859-1, so it is recommended to keep this default value. However, there are tags around with different encoding, so it can be set here โ and the ID3v1 tags can then be copied to ID3v2 which supports Unicode. Glow-up pipeline, we love to see it ๐
The check box Use track/total number of tracks format controls whether the track number field of ID3v2 tags contains simply the track number or additionally the total number of tracks in the folder.
When Genre as text instead of numeric string is checked, all ID3v2 genres will be stored as a text string even if there is a corresponding code for ID3v1 genres. If this option is not set, genres for which an ID3v1 code exists are stored as the number of the genre code (in parentheses for ID3v2.3). Thus the genre Metal is stored as "Metal" or "(9)" depending on this option. Genres which are not in the list of ID3v1 genres are always stored as a text string. The purpose of this option is improved compatibility with devices which do not correctly interpret genre codes ๐ฅ
When WAV files with lowercase id3 chunk is checked, the RIFF chunk used to store ID3v2 tags in WAV files will be named "id3 " instead of "ID3 ". (yes bestie, the trailing space is literally part of the name ๐) By default, Kid3 and other applications using TagLib accept both the lowercase and the uppercase variant when reading WAV files, but they use "ID3 " when writing ID3v2 tags to WAV files. As there exist other applications which only accept "id3 " (e.g. JRiver Media Center and foobar2000), this option can be used to create tags which can be read by such applications.
When Mark standard violations is checked, ID3v2 fields which violate the standard will be marked red. Details about the violation are shown in a tooltip:
- Must be unique
- New line is forbidden
- Carriage return is forbidden
- Owner must be non-empty
- Must be numeric
- Must be numeric or number/total
- Format is
DDMM - Format is
HHMM - Format is
YYYY - Must begin with a year and a space character
- Must be ISO 8601 date/time
- Must be musical key, 3 characters,
A-G,b,#,m,o - Must have ISO 639-2 language code, 3 lowercase characters
- Must be ISRC code, 12 characters
- Must be list of strings separated by
'|' - Has excess white space
The ID3 standard documents are available online:
- ID3 tag version 2.3.0[11]
- ID3 tag version 2.4.0 - Main Structure[12]
- ID3 tag version 2.4.0 - Native Frames[5]
Text encoding defines the default encoding used for ID3v2 frames and can be set to ISO-8859-1, UTF16, or UTF8. Careful though ๐จ UTF8 is not valid for ID3v2.3.0 frames; if it is set, UTF16 will be used instead. For ID3v2.4.0 frames, all three encodings are possible ๐
Version used for new tags determines whether new ID3v2 tags are created as version 2.3.0 or 2.4.0.
Track number digits is the number of digits in Track Number fields. Leading zeros are used to pad. For instance, with a value of 2 the track number 5 is set as "05" โจ
The combo box Comment field name is only relevant for Ogg/Vorbis and FLAC files and sets the name of the field used for comments. Different applications seem to use different names โ "COMMENT" for instance is used by XMMS, whereas Amarok uses "DESCRIPTION". The chaos of it all ๐ญ
The format of pictures in Ogg/Vorbis files is determined by Picture field name, which can be "METADATA_BLOCK_PICTURE" or "COVERART". The first is the official standard and uses the same format as pictures in FLAC tags. "COVERART" is an earlier unofficial way to include pictures in Vorbis comments. It can be used for compatibility with legacy players ๐
The mode used when saving Matroska files can be selected with Write mode. It controls the trade-off between file size and write speed when saving tags, attachments and chapters to the file. For very large files and/or slow (network) filesystems, using Avoid insert will reduce write time significantly. There are three possible modes:
Compactโ Write tags, attachments and chapters as compact as possible. This is the default mode.Do not shrinkโ Do not shrink blocks when writing, add padding when content gets smaller. Allow inserts when content gets larger.Avoid insertโ Like Do not shrink but also avoid inserts for blocks which are not at the end of the file: Replace a growing non-last block with padding of the old size and append a new block at the end of the file.
If the Mark if larger than (bytes) check box is activated, files containing embedded album cover art exceeding the given size in bytes are marked red ๐จ This can be used to find files containing oversized pictures which are not accepted by some applications and players. The default value is 131072 bytes (128 KB).
Custom Genres can be used to define genres which are not available in the standard genre list, e.g. "Gothic Metal". Such custom genres will appear in the Genre combo box of Tag 2. For ID3v1.1 tags, only the predefined genres can be used. Sorry ID3v1.1 girlies ๐
The list of custom genres can also be used to reduce the number of genres available in the Genre combo box to those typically used. So if your collection mostly contains music in the genres Metal, Gothic Metal, Ancient and Hard Rock, you can enter those genres and mark Show only custom genres. The Tag 2 Genre combo box will then only contain those four genres and you will not have to search through the complete genres list for them. In this example, only Metal and Hard Rock will be listed in the tag 1 genres list, because those two custom genres entries are standard genres. If Show only custom genres is not active, the custom genres can be found at the end of the genres list ๐
In Custom Frames, up to eight custom frame names can be defined, which can then be used like the unified frames, for example as quick access frames. Eight of them!! Count them โญ
Quick Access Frames defines which frame types are always shown in the Tag 2 section. Such frames can then be added without first using the Add button. The order of these quick access frames can be changed by dragging and dropping items. Drag and drop is very main character behavior, honestly ๐
The combo box Track number field name is only relevant for RIFF INFO and sets the name of the field used for track numbers. Track numbers are not specified in the original RIFF standard, there are applications which use "ITRK", others use "IPRT". Pick your fighter ๐ญ
Tag Format contains options for the format of the tags. Let me break it down bestie:
- When Automatically apply format is checked, the format configuration is automatically used while editing text in the line edits.
- Validation enables validators in the controls with track/total and date/time values.
- The Case conversion can be set to No changes, All lowercase, All uppercase, First letter uppercase or All first letters uppercase.
- To use locale-aware conversion between lowercase and uppercase characters, a locale can be selected in the combobox below.
- The string replacement list can be set to arbitrary string mappings.
- To add a new mapping, select the From cell of a row and insert the text to replace, then go to the To column and enter the replacement text.
- When the text to replace starts and ends with a slash (
"/"), a regular expression is used. - For regular expressions containing capturing groups, occurrences of
\1,\2, ... in To are replaced with the string captured by the corresponding capturing group. - To remove a mapping set the From cell to an empty value (e.g. by first typing space and then backspace).
- Inserting and deleting rows is also possible using a context menu which appears when the right mouse button is clicked.
- Replacement is only active, if the String replacement check box is checked. Periodt ๐
The Rating table holds the mapping from star ratings โ the actual values that get stored in the tag, bestie. The frames that carry rating info are listed in the Rating row of the frame list. For those frames, you set the rating by picking a number of stars out of five. ๐ Different tag formats and different apps use different values to map stars โ the value stored in the tag, and to show the right number of stars, Kid3 looks up a map in this table. The lookup key is the frame name โ like "RATING" for Vorbis comments, or "IRTD" for RIFF INFO. For ID3v2 tags, the key is a combo of the frame ID "POPM" of the Popularimeter frame plus its "Email" field, separated by a dot. So yeah, multiple keys exist for ID3v2, e.g. "POPM.Windows Media Player 9 Series" for the mapping Windows Media Player and Explorer use, and just plain "POPM" for POPM frames with an empty "Email" field. Since multiple entries for "POPM" can exist, their order matters. When Kid3 adds a new Popularimeter frame, it uses the first "POPM" entry to figure out what to write into the "Email" field. That value then decides which mapping gets used for star ratings. The first entry is also the fallback when no key was found โ so it's the default entry. ๐
Besides the Name column holding the keys, the table has columns 1 through 5 for the values to store when you give that many stars. Flip it around and those values determine how many stars get displayed for a value stored in the frame. For instance, the row below has the values 1, 64, 128, 196, 255. The thresholds for how many stars get displayed sit between those values, and they're compatible with what Windowsยฎ Explorer does.
Table 1. Entry in Rating Table
POPMโ 1 star:1, 2 stars:64, 3 stars:128, 4 stars:196, 5 stars:255Rangeโ 1 star:1-31, 2 stars:32-95, 3 stars:96-159, 4 stars:160-223, 5 stars:224-255
Over on the Files page you can tick the Load last-opened files check box so Kid3 opens and selects the last-selected file when it starts up next time. ๐ Preserve file timestamp can be checked to keep the file modification time stamp. Filename for cover sets the name that gets suggested when an embedded image is exported to a file. With Text encoding (Export, Playlist) you set the encoding used when writing files. The default System can be changed, for example if playlists have to be used on a different device.
If Mark changes is active, changed fields get marked with a light gray label background. ๐
The File List section decides which files show up in the file list. A Filter can restrict the items in this list to files with supported extensions. To explicitly say which folders to show in the file list, or to exclude certain folders, use the Include folders and Exclude folders options. They can hold wildcard expressions โ for instance */Music/* to include only the Music folder, or */iTunes/* to exclude the iTunes folder from the file list. If you need multiple such expressions, separate them with spaces or semicolons. โจ
The buttons Filename from tag and Tag from filename in the Format section open dialogs to edit the formats available in the Format combo boxes (with arrows up and down), which you'll find in the File section of the main window.
The Playlist button lets you edit the file name formats available in the Create Playlist dialog. ๐
Filename Format contains options for the format of the filenames. The same options as in Tag Format are available.
On top of that, you can set the Maximum length allowed for file names. Most modern file systems cap out at 255 characters, but if you want to burn the files to CD, you should set the limit to 64. If Use for playlist and folder names is checked, the file name format also gets used when creating playlists and renaming folders.
The User Actions page has a table of the commands available in the context menu of the file list. For critical operations like deleting files, it's advisable to tick Confirm to pop up a confirmation dialog before running the command. ๐ Output can be ticked to see the output written by console commands (standard output and standard error). Name is the name displayed in the context menu. Command is the command line to execute. Arguments can be passed using these codes:
%F%{files}โ File paths (a list if multiple files selected)%f%{file}โ File path to single file%uF%{urls}โ URLs (a list if multiple files selected)%uf%{url}โ URL to single file%d%{directory}โ Folder%s%{title}โ Title (Song)%a%{artist}โ Artist%l%{album}โ Album%c%{comment}โ Comment%y%{year}โ Year%t%{track}โ Track (e.g.01)%t%{track.n}โ Track with field width n (e.g.001for%{track.3})%T%{tracknumber}โ Track (without leading zeros, e.g.1)%g%{genre}โ Genre%b%{browser}โ Command to start the web browser%q%{qmlpath}โ Base folder of provided QML files
The special code @separator can be set as a command to insert a separator into the user actions context menu. Menu items can be put into a submenu by wrapping them with @beginmenu and @endmenu commands. The submenu's name comes from the Name column of the @beginmenu command. ๐๏ธ
To run QML scripts, @qml is used as the command name. The path to the QML script gets passed as a parameter. The provided scripts live in the folder %{qmlpath}/script/ (on Linuxยฎ typically /usr/share/kid3/qml/script/, on Windows qml/script/ inside the installation folder, and on macOSยฎ in the app folder kid3.app/Contents/Resources/qml/script/). Custom scripts can be stored in any folder. If the QML code uses GUI components, @qmlview shall be used instead of @qml. Extra parameters are passed to the QML script where they'll be available through the getArguments() function. An overview of some functions and properties available in QML can be found in the appendix QML Interface. ๐ง
The command inserted with %{browser} can be defined in the Web browser line edit above. Commands starting with %{browser} can be used to fetch info about the audio files from the web, for instance
%{browser} http://lyricwiki.org/%u{artist}:%u{title}
will query the lyrics for the current song in LyricWiki[13]. The "u" in %u{artist} and %u{title} is used to URL-encode the artist %{artist} and song %{title} information. It's easy to define your own queries the same way, e.g. an image search with Google[14]:
%{browser} http://images.google.com/images?q=%u{artist}%20%u{album}
To add album cover art to tag 2, you can search for images with Google or Amazon using the commands described above. The picture can be added to the tag with drag and drop. You can also add an image with Add, then select the Picture frame and import an image file or paste from the clipboard. Picture frames are supported for ID3v2, MP4, FLAC, Ogg and ASF tags. ๐ผ๏ธ
To add and delete entries in the table, a context menu can be used.
The Network page contains only a field to insert the proxy address and optionally the port, separated by a colon. The proxy gets used when importing from an Internet server, when the check box is checked. ๐
In the Plugins page, available plugins can be enabled or disabled. The plugins are split into two sections. The Metadata Plugins & Priority list contains plugins that support audio file formats. The order of the plugins matters, because they're tried from top to bottom. Some formats are supported by multiple plugins, so files get opened with the first plugin that supports them. TaglibMetadata supports most formats, so if it's at the top of the list, it'll open most of the files. If you want a different plugin for a file format, make sure it's listed before the TaglibMetadata plugin. Details about the metadata plugins and why you might want them instead of TagLib are listed below. ๐
- Id3libMetadata: Uses id3lib[15] for ID3v1.1 and ID3v2.3 tags in MP3, MP2, AAC files. Supports a few more frame types than TagLib.
- OggFlacMetadata: Uses libogg[16], libvorbis, libvorbisfile[17] for Ogg files, and additionally libFLAC++ and libFLAC[18] for FLAC files. These are the official libraries for these formats.
- TaglibMetadata: Uses TagLib[19] which supports a lot of audio file formats. It can be used for all audio files supported by Kid3.
- Mp4v2Metadata: mp4v2[20] was originally used by Kid3 to support M4A files. Can be used in case of problems with the M4A support of TagLib.
The Available Plugins section lists the remaining plugins. Their order doesn't matter, but they can be enabled or disabled with the check boxes. โจ
- AmazonImport: Used for the Import from Amazon... function.
- DiscogsImport: Used for the Import from Discogs... function.
- FreedbImport: Used for the Import from gnudb.org... function.
- MusicBrainzImport: Used for the Import from MusicBrainz Release... function.
- AcoustidImport: Used for the Import from MusicBrainz Fingerprint... function, which depends on the Chromaprint[21] and libav[22] libraries.
Plugins that are turned off justโฆ don't load, bestie. That's the whole point โ it saves your resources and makes startup zippier. โจ Heads up though: everything on this page only kicks in after you restart Kid3. No restart, no vibe. ๐
๐ซถ The Help Menu ๐ซถ
- Help โ Kid3 Handbook โ opens this very handbook. yes, the one you're reading. meta. ๐ฆ
- Help โ About Kid3 โ pops up a lil' bit of info about Kid3. short and sweet, like a story post.
๐ง KID3-CLI ๐ง
๐ป Commands ๐ป
kid3-cli is literally the command-line-interface for Kid3 โ same energy, terminal edition. ๐ค
Here's the tea on how it opens stuff:
- give it a folder path โ that folder gets opened.
- give it one or more file paths โ the common folder gets opened and those files get selected.
- after that, every command you send works on those files.
- commands come in through the
-coption. ๐ซฐ - pass multiple commands and they run in the order you gave them, no cap.
- if the commands change files, they get saved at the end. ๐พ
- pass no command options at all? Then
kid3-clistarts in interactive mode, where you type commands and they act on the current selection. yes bestie, you just chill in there and type.
The next sections list every command available. all of them. we're not skipping any. ๐
Help
help [COMMAND-NAME]
Shows you help for the parameters of COMMAND-NAME โ or, if you don't name a command, help about all the commands. it's giving built-in tutor. ๐
Timeout
timeout [default | off | TIME]
Overwrites the default command timeout. The CLI commands bail out once their command-specific timeout expires. Here's the breakdown (write these down ๐):
- 10 seconds for
lsandalbumart - 60 seconds for
autoimportandfilter - 3 seconds for everything else
If you've got a huge number of files to process, those timeouts might be way too restrictive for you. So this command lets you set the timeout for all commands to TIME ms, switch it off entirely, or leave it at the default values. your call, bestie. ๐ฐ๏ธ
Quit application
exit [force]
Exits the application. If you've got modified, unsaved files hanging around, you need the force parameter. otherwise it's not going anywhere. ๐ค
Change folder
cd [FOLDER]
- no FOLDER? โ changes to your home folder. ๐
- give it a folder? โ changes into that folder.
- give it one or more file paths? โ changes to their common folder and selects those files.
Print the filename of the current folder
pwd
Prints the filename of the current working folder. classic. iconic. required. ๐
Folder list
ls
Lists what's inside the current folder โ same as the file list in the Kid3 GUI. The five characters before each file name are the state report, so let's decode them:
>โ the file is selected.*โ the file is modified.1โ the file has a tag 1; otherwise a-shows up.2โ the file has a tag 2; otherwise a-shows up.3โ the file has a tag 3; otherwise a-shows up.
kid3-cli> ls
1-- 01 Intro.mp3
> 12- 02 We Only Got This One.mp3
*1-- 03 Outro.mp3
So in this example: every file has a tag 1, the second file also has a tag 2 and it's selected, and the third file is modified. see? the little characters are telling a whole story. ๐ต๏ธโโ๏ธ
Save the changed files
save
that's it. that's the command. it saves the changed files. ๐ซก
Select file
select [all | none | first | previous | next | FILE...]
- select everything โ
select all - deselect everything โ
select none - walk through the files in the current folder: start with
select first, then go forward withselect nextor backward withselect previous - wanna add specific files to the current selection? just hand over their file names. Wildcards work, so
select *.mp3selects every MP3 in the current folder. ๐ฏ
kid3-cli> select first
kid3-cli> ls
> 1-- 01 Intro.mp3
12- 02 We Only Got This One.mp3
*1-- 03 Outro.mp3
kid3-cli> select next
kid3-cli> ls
1-- 01 Intro.mp3
> 12- 02 We Only Got This One.mp3
*1-- 03 Outro.mp3
kid3-cli> select *.mp3
kid3-cli> ls
> 1-- 01 Intro.mp3
> 12- 02 We Only Got This One.mp3
>*1-- 03 Outro.mp3
watch the > hop down the list. so satisfying. ๐
Select tag
tag [TAG-NUMBERS]
Lots of commands have an optional TAG-NUMBERS parameter that says whether the command works on tag 1, 2, or 3. Skip that parameter and the default tag numbers get used โ and this command is how you set those defaults. ๐
At startup it's set to 12, which means:
- information is read from tag 2 if it's available, otherwise from tag 1
- modifications are done on tag 2
TAG-NUMBERS can be set to 1, 2, or 3 to work only on that matching tag. And if you omit the parameter entirely? The current setting gets displayed. peek-a-boo. ๐
Get tag frame
get [all | FRAME-NAME] [TAG-NUMBERS]
Reads the value of one specific tag frame, or gives you info about all the tag frames (if you omit the argument or use all). Modified frames get marked with a *. โจ
kid3-cli> get
File: MPEG 1 Layer 3 192 kbps 44100 Hz Joint Stereo
Name: 01 Intro.mp3
Tag 1: ID3v1.1
Title Intro
Artist One Hit Wonder
Album Let's Tag
Date 2013
Track Number 1
Genre Pop
kid3-cli> get title
Intro
Wanna save the contents of a picture frame to a file? bestie, use:
get picture:'/path/to/folder.jpg'
Wanna save synchronized lyrics to an LRC file? that's:
get SYLT:'/path/to/lyrics.lrc'
You can also grab just a specific field from a frame โ for example get POPM.Email for the Email field of a Popularimeter frame. ๐
Got multiple frames of the same kind in one file? Index them with brackets. So the first performer from a Vorbis comment is get performer[0], the second is get performer[1]. numbering starts at zero, as is tradition.
There's a pseudo field name "selected" you can use to check whether a frame is selected โ get artist.selected returns 1 if the artist frame is selected, otherwise 0. โ
And there's a pseudo frame name "ratingstars" that gets you the value of the "rating" frame as the format specific value matching the number of stars (0 to 5). If you use "rating" instead, you get the internal value back. โญ
Set tag frame
set {FRAME-NAME} {FRAME-VALUE} [TAG-NUMBERS]
Sets the value of one specific tag frame. And if FRAME-VALUE is empty, the frame gets deleted. gone. poof. ๐จ
kid3-cli> set remixer 'O.H. Wonder'
Setting a picture frame from a file? literally:
set picture:'/path/to/folder.jpg' 'Picture Description'
Setting synchronized lyrics from an LRC file? go off:
set SYLT:'/path/to/lyrics.lrc' 'Lyrics Description'
Wanna set a specific field of a frame? put the field name after a dot. e.g. to set the Counter field of a Popularimeter frame, you'd use
set POPM.Counter 5
One real-world use for field specifications: you want a custom TXXX frame with the "rating" description instead of a standard Popularimeter frame (some plugins seem to roll that way). You can make that TXXX rating frame with kid3-cli, but here's the trick โ you have to create a TXXX frame with the description "rating" first, and only then set the value of that frame to the rating value. order matters, bestie. ๐ง
kid3-cli> set rating ""
kid3-cli> set TXXX.Description rating
kid3-cli> set rating 5
That first command deletes any existing POPM frame, because if a POPM frame is sitting there, set rating 5 would set the POPM frame and not the TXXX frame. ๐ญ Another route would be set TXXX.Text 5, but that one only works if there's no other TXXX frame present.
To set multiple frames of the same kind, drop an index in brackets. e.g. to set multiple performers in a Vorbis comment:
kid3-cli> set performer[0] 'Liza don Getti (soprano)'
kid3-cli> set performer[1] 'Joe Barr (piano)'
Wanna select certain frames before a copy, paste or remove action? use the pseudo field name "selected". Normally all frames are selected, so to deselect everything you'd do set '*.selected' 0, and then e.g. set artist.selected 1 to select the artist frame. checkbox queen. โ๏ธ
Want the pseudo frame name "ratingstars"? That sets the value of the "rating" frame to the format specific value matching the number of stars (0 to 5). The frame name "rating" sets the internal value instead.
โ ๏ธ BIG WARNING: setting"ratingstars"on multiple files that have different tag formats will not work, because the frame with the value mapped from the star count gets created for the first file and then reused for all the files. So instead ofkid3-cli -c "set ratingstars 2" *you should really dofor f in *; do kid3-cli -c "set ratingstars 2" "$f"; done. one by one, bestie. no shortcuts. ๐
Revert
revert
Reverts all modifications in the selected files โ or in all files if nothing is selected. undo button energy. โฉ๏ธ
Import from file
import {FILE} {FORMAT-NAME} [TAG-NUMBERS]
Tags get imported from the file FILE in the format named FORMAT-NAME (e.g. "CSV unquoted", see Import). ๐ฅ
If tags is given for FILE, tags are imported from other tags. In that case you need SOURCE and EXTRACTION instead of the FORMAT-NAME parameters โ see Import from Tags. And to apply the import from tags to the selected files, use tagsel instead of tags. This function also supports outputting the extracted value by using an EXTRACTION with the value %{__return}(.+). fancy. ๐
Automatic import
autoimport [PROFILE-NAME] [TAG-NUMBERS]
Batch import using the profile PROFILE-NAME (see Automatic Import โ "All" is used if you omit it). ๐๏ธ
Download album cover artwork
albumart {URL} [all]
Sets the album artwork by downloading a picture from URL. The rules defined in the Browse Cover Art dialog are used to transform general URLs (like ones from Amazon) into a picture URL. ๐
Wanna set the album cover from a local picture file instead? that's the set command's job, bestie.
kid3-cli> albumart
http://www.amazon.com/Versus-World-Amon-Amarth/dp/B000078DOC
Export to file
export {FILE} {FORMAT-NAME} [TAG-NUMBERS]
Tags get exported to the file FILE in the format named FORMAT-NAME (e.g. "CSV unquoted", see Export). ๐ค
Create playlist
playlist
Creates a playlist in the format set in the configuration โ see Create Playlist. ๐ต
Apply filename format
filenameformat
Applies the file name format set in the configuration โ see Apply Filename Format. ๐ท๏ธ
Apply tag format
tagformat
Applies the tag name format set in the configuration โ see Apply Tag Format. ๐ซ
Apply text encoding
textencoding
Applies the text encoding set in the configuration โ see Apply Text Encoding. ๐ค
Rename folder
renamedir [FORMAT] [create | rename | dryrun] [TAG-NUMBERS]
(bestie, this one's mid-explanation โ the rest is coming up next, don't go anywhere) ๐
Bestie, this command renames or creates folders straight from the values chillin' in your tags, shaped by whatever FORMAT you hand it โ like %{artist} - %{album} (peep Rename Folder for the whole vibe). If you don't pass a format, it just uses whatever format is already set in the Rename folder dialog. Default mode is rename; to actually create folders you have to say create out loud, explicitly. And heads up: the rename actions happen immediately โ so if you just wanna see what it would do without touching anything, use the dryrun option. ๐ซถ
Number tracks
numbertracks [TRACK-NUMBER] [TAG-NUMBERS]
Numbers your selected tracks, starting at TRACK-NUMBER (and if you omit it, it starts at 1). Simple as that. โจ
Filter
filter [FILTER-NAME | FILTER-FORMAT]
Filters the files so only the ones matching FILTER-FORMAT are visible. You can also drop in the name of a predefined filter expression instead of writing an expression yourself โ like "Filename Tag Mismatch" โ see Filter for the full menu of those.
kid3-cli> filter '%{title} contains "tro"'
Started
/home/urs/One Hit Wonder - Let's Tag
+ 01 Intro.mp3
- 02 We Only Got This One.mp3
+ 03 Outro.mp3
Finished
kid3-cli> ls
1-- 01 Intro.mp3
1-- 03 Outro.mp3
kid3-cli> filter All
Started
/home/urs/One Hit Wonder - Let's Tag
+ 01 Intro.mp3
+ 02 We Only Got This One.mp3
+ 03 Outro.mp3
Finished
kid3-cli> ls
1-- 01 Intro.mp3
12- 02 We Only Got This One.mp3
1-- 03 Outro.mp3
Convert ID3v2.3 to ID3v2.4
to24
Convert ID3v2.4 to ID3v2.3
to23
Filename from tag
fromtag [FORMAT] [TAG-NUMBERS]
Sets the file names of the selected files from values in the tags. Example: fromtag '%{track} - %{title}' 1. If you don't specify a format, it uses the one set in the GUI. ๐
Tag from filename
totag [FORMAT] [TAG-NUMBERS]
Sets the tag frames from the file names. Example: totag '%{albumartist} - %{album}/%{track} %{title}' 2. No format specified? It uses the GUI one. And if your filename doesn't match that pattern, it'll try a few other commonly used formats too, so don't panic. ๐ฆ
Tag to other tag
syncto {TAG-NUMBER}
Copies tag frames from one tag over to the other tag. Like, if you wanna set the ID3v2 tag from the ID3v1 tag, you'd go syncto 2. ๐
Copy
copy [TAG-NUMBER]
Copies the tag frames of the selected file into the internal copy buffer. Then you can slap them onto another file with the paste command. Iconic little duo, honestly.
And if you only wanna copy a subset of the frames? Use the "selected" pseudo field with the set command. For example, to copy just the disc number and copyright frames:
set '*.selected' 0
set discnumber.selected 1
set copyright.selected 1
copy
Paste
paste [TAG-NUMBER]
Sets tag frames from whatever's sitting in the copy buffer onto your selected files. ๐
Remove
remove [TAG-NUMBER]
Removes a tag. Bye bestie. ๐
You can also remove just a subset of the frames by selecting them the same way described up in the copy command.
Configure Kid3
config [OPTION] [VALUE]
Query or set a configuration option. ๐
The OPTION is a group name and a property name glued together with a dot. Here's the tea:
- No
OPTIONat all? All available groups get displayed. - Just a group name? All available properties of that group get shown.
- Group name and property? The currently configured value pops up.
- Wanna change the setting? Pass the new value as the second argument.
One thing to watch: if a setting's value is a list, every single list element has to be passed as an argument. Which means to append an element to an existing list, you have to pass all the existing elements followed by your new one. In that situation it's way easier to use the JSON mode, where you can just copy the current list and tack the new element onto the end. ๐
Execute program or QML script
execute [@qml] {FILE} [ARGS]
Runs a QML script or an executable. โจ
Without @qml, a program gets executed with arguments. But when @qml is the first argument, the stuff after it is the QML script and its arguments. For example, you can export a folder's tags to the file export.csv like this:
kid3-cli -c "execute @qml
/usr/share/kid3/qml/script/ExportCsv.qml export.csv"
/path/to/folder/
Here export.csv is the argument for the ExportCsv.qml script, while /path/to/folder/ is the FILE argument for kid3-cli. Two different jobs, don't mix 'em up. ๐
Examples
Set a title containing an apostrophe. Commands passed to kid3-cli with -c have to be in quotes if they don't consist of just a single word. And if that command itself has an argument containing spaces, that argument has to be quoted too. In UNIXยฎ shells you can use single or double quotes, but on the Windows Command Prompt it's important that the outer quoting uses double quotes, and inside those quotes you use single quotes. If the text inside the single quotes contains a single quote, it has to be escaped with a backslash character, like in this example:
kid3-cli -c "set title 'I\'ll be there for you'" /path/to/folder
Set the album cover in all files of a folder using the batch import function:
kid3-cli -c "autoimport 'Cover Art'" /path/to/folder
Remove comment frames and apply the tag format in both tags of all MP3 files of a folder:
kid3-cli -c "set comment '' 1" -c "set comment '' 2" \
-c "tagformat 1" -c "tagformat 2" /path/to/folder/*.mp3
Automatically import tag 2, synchronize to tag 1, set file names from tag 2 and finally create a playlist:
kid3-cli -c autoimport -c "syncto 1" -c fromtag -c playlist \
/path/to/folder/*.mp3
For all files with an ID3v2.4.0 tag, convert to ID3v2.3.0 and remove the arranger frame:
kid3-cli -c "filter 'ID3v2.4.0 Tag'" -c "select all" -c to23 \
-c "set arranger ''" /path/to/folder
This Python script uses kid3-cli to generate iTunes Sound Check iTunNORM frames from replay gain information. ๐ง
#!/usr/bin/env python3
# Generate iTunes Sound Check from ReplayGain.
import os, sys, subprocess
def rg2sc(dirpath):
for root, dirs, files in os.walk(dirpath):
for name in files:
if name.endswith(('.mp3', '.m4a', '.aiff', '.aif')):
fn = os.path.join(root, name)
rg = subprocess.check_output([
'kid3-cli', '-c', 'get "replaygain_track_gain"',
fn]).strip()
if rg.endswith(b' dB'):
rg = rg[:-3]
try:
rg = float(rg)
except ValueError:
print('Value %s of %s in not a float' % (rg, fn))
continue
sc = (' ' + ('%08X' % int((10 ** (-rg / 10)) * 1000) )) * 10
subprocess.call([
'kid3-cli', '-c', 'set iTunNORM "%s"' % sc, fn])
if __name__ == '__main__':
rg2sc(sys.argv[1])
JSON Format
So that parsing results from kid3-cli is less of a struggle, you can get the output in JSON format. ๐
The rules, bestie:
- When the request is in JSON format, the response will also be JSON.
- A compact format of the request gives you a compact representation of the response.
- If the request contains an
"id"field, it's assumed to be a JSON-RPC request โ so the response will contain a"jsonrpc"field and the"id"of the request. - The request format uses the same commands as the standard CLI; the
"method"field holds the command, and the parameters (if any) go in the"params"list. - The response contains a
"result"object, which can also benullif the correspondingkid3-clicommand doesn't return a result. - If something goes wrong, an
"error"object is returned with"code"and"message"fields, as used in JSON-RPC.
kid3-cli> {"method":"set","params":["artist","An Artist"]}
{"result":null}
kid3-cli> {"method":"get","params":["artist",2]}
{"result":"An Artist"}
kid3-cli> {"method": "get", "params": ["artist"]}
{
"result": "An Artist"
}
kid3-cli> {"jsonrpc":"2.0","id":"123","method":"get","params":["artist"]}
{"id":"123","jsonrpc":"2.0","result":"An Artist"}
๐ CREDITS AND LICENSE ๐
Kid3
Program written by Urs Fleisch <ufleisch at users.sourceforge.net> ๐
FDL[23]
GPL[24]
๐พ INSTALLATION ๐พ
okay bestie, here's how you actually get this thing onto your machine. it's giving "slightly involved but so worth it" ๐
๐ How to obtain Kid3
Kid3 can be found at https://kid3.kde.org. that's the link, that's the vibe, go get it ๐ฆ
๐งธ Requirements
Kid3 needs Qt(TM)[25]. KDE[26] is recommended but not necessary, because Kid3 can also be compiled as a Qt(TM) application. Kid3 can be compiled for systems where these libraries are available โ e.g. for GNU/Linuxยฎ, Windowsยฎ and macOSยฎ.
now here's the format-specific tea โ:
- ๐ต to tag Ogg/Vorbis files you need
libogg[16],libvorbisandlibvorbisfile[17] - ๐ฟ for FLAC files:
libFLAC++andlibFLAC[18] - ๐ง
id3lib[15] is used for MP3 files
These four formats are also supported by TagLib[19], which can also handle Opus, MPC, APE, MP2, Speex, TrueAudio, WavPack, WMA, WAV, AIFF files and tracker modules. no cap, TagLib is the moment ๐
To import from acoustic fingerprints, Chromaprint[21] and libav[22] are used.
Kid3 is available for most Linuxยฎ distributions, Windowsยฎ and macOSยฎ. Links can be found on https://kid3.kde.org. ๐ซถ
๐ ๏ธ Compilation and Installation
You can compile Kid3 with or without KDE. Without KDE, Kid3 is a simple Qt(TM) application and lacks some configuration and session features. so like, know what you're signing up for ๐
For a KDE version, go into the top folder and type
% cmake .
% make
% make install
periodt. that's the whole build ๐
To compile for different versions of Qt(TM) or KDE, set the corresponding cmake options.
โ ๏ธ If not all libraries are present, Kid3 is built with reduced functionality. So you should take care to have all desired development packages installed, bestie.
On the other side, cmake-options control which libraries are compiled in. The default is:
-DWITH_TAGLIB:BOOL=ON -DWITH_MP4V2:BOOL=OFF -DWITH_ID3LIB:BOOL=ON -DWITH_CHROMAPRINT:BOOL=ON -DWITH_VORBIS:BOOL=ON -DWITH_FLAC:BOOL=ON
These options can be disabled using OFF.
To build Kid3 as a Qt(TM) application without KDE, use the cmake option -DWITH_APPS=Qt. To build both a KDE and a Qt(TM) application, set -DWITH_APPS="Qt;KDE".
To use a specific Qt(TM) installation, set -DQT_QMAKE_EXECUTABLE=/path/to/qmake.
Generation of RPM-Packages is supported by the file kid3.spec. For Debianยฎ Packages, run build.sh deb. ๐ฅ
The Qt(TM) application can also be compiled for Windowsยฎ and macOSยฎ. The script build.sh can be used to download and build all required libraries and create a Kid3 package. ๐
โ๏ธ Configuration
With KDE, the settings are stored in .config/kid3rc, and the application state in .local/share/kid3/kid3staterc.
As a Qt(TM) application, this file is in .config/Kid3/Kid3.conf.
where stuff hides on other platforms, cause she's portable like that:
- ๐ช On Windowsยฎ, the configuration is stored in the registry.
- ๐ on macOSยฎ, in a plist file.
The environment variable KID3_CONFIG_FILE can be used to set the path of the configuration file. iykyk ๐
๐ D-BUS INTERFACE ๐
okay bestie, plot twist: on Linuxยฎ you can drive Kid3 with a D-Bus interface and run the whole thing from scripts. you can write those scripts in literally any language that has D-Bus bindings (Python says hi ๐), and โ this is the cute part โ you can drop them into User Actions to extend Kid3 itself. iconic behavior fr fr ๐
โจ D-Bus Examples โจ
๐ Shell
so let's say you want the artist in tag 2 of the current file to be "One Hit Wonder". here's the whole vibe:
dbus-send --dest=org.kde.kid3 --print-reply=literal \
/Kid3 org.kde.Kid3.setFrame int32:2 string:'Artist' \
string:'One Hit Wonder'
or, easier (and lowkey nicer), with Qt(TM)'s qdbus โ and btw qdbusviewer lets you poke around the whole interface in a GUI like the little explorer it is ๐ซถ:
qdbus org.kde.kid3 /Kid3 setFrame 2 Artist \
'One Hit Wonder'
๐ Python
import dbus
kid3 = dbus.SessionBus().get_object(
'org.kde.kid3', '/Kid3')
kid3.setFrame(2, 'Artist', 'One Hit Wonder')
๐ช Perl
use Net::DBus;
$kid3 = Net::DBus->session->get_service(
"org.kde.kid3")->get_object(
"/Kid3", "org.kde.Kid3");
$kid3->setFrame(2, "Artist", "One Hit Wonder");
๐ D-Bus API ๐
the whole D-Bus API lives in org.kde.Kid3.xml, and the Kid3 interface comes with the following methods. buckle up, there's a lot, but every single one is a slay ๐
๐ Open file or folder
boolean openDirectory(string path);
pathโ path to file or folder
Returns true if OK.
๐งน Unload the tags of all files which are not modified or selected
unloadAllTags(void);
๐พ Save all modified files
boolean save(void);
Returns true if OK.
๐จ Get a detailed error message provided by some methods
string getErrorMessage(void);
Returns detailed error message.
โฉ๏ธ Revert changes in the selected files
revert(void);
๐ฅ Start an automatic batch import
boolean batchImport(int32 tagMask, string profileName);
tagMaskโ tag mask (bit 0 for tag 1, bit 1 for tag 2)profileNameโ name of batch import profile to use
๐ Import tags from a file
boolean importFromFile(int32 tagMask, string path, int32 fmtIdx);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)pathโ path of filefmtIdxโ index of format
Returns true if OK.
๐ Import tags from other tags
importFromTags(int32 tagMask, string source, string extraction);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)sourceโ format to get source text from tagsextractionโ regular expression with frame names and captures to extract from source text
๐ Import tags from other tags on selected files
array importFromTagsToSelection(int32 tagMask, string source,
string extraction);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)sourceโ format to get source text from tagsextractionโ regular expression with frame names and captures to extract from source textreturnValuesโ extracted value for"%{__return}(.+)"
๐ผ๏ธ Download album cover art
downloadAlbumArt(string url, boolean allFilesInDir);
urlโ URL of picture file or album art resourceallFilesInDirโtrueto add the image to all files in the folder
๐ค Export tags to a file
boolean exportToFile(int32 tagMask, string path, int32 fmtIdx);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)pathโ path of filefmtIdxโ index of format
Returns true if OK.
๐ง Create a playlist
boolean createPlaylist(void);
Returns true if OK.
๐ Get items of a playlist
array getPlaylistItems(string path);
pathโ path to playlist file
Returns list of absolute paths to playlist items.
โ๏ธ Set items of a playlist
boolean setPlaylistItems(string path, array items);
pathโ path to playlist fileitemsโ list of absolute paths to playlist items
Returns true if OK, false if not all items were found and added or saving failed.
๐ Quit the application
quit(void);
โ Select all files
selectAll(void);
โ Deselect all files
deselectAll(void);
โฎ๏ธ Set the first file as the current file
boolean firstFile(void);
Returns true if there is a first file.
โช Set the previous file as the current file
boolean previousFile(void);
Returns true if there is a previous file.
โฉ Set the next file as the current file
boolean nextFile(void);
Returns true if there is a next file.
๐ฅ Select the first file
boolean selectFirstFile(void);
Returns true if there is a first file.
๐ Select the previous file
boolean selectPreviousFile(void);
Returns true if there is a previous file.
๐ Select the next file
boolean selectNextFile(void);
Returns true if there is a next file.
๐ฏ Select the current file
boolean selectCurrentFile(void);
Returns true if there is a current file.
๐ฒ Expand or collapse the current file item if it is a folder
boolean expandDirectory(void);
a file list item counts as a folder if getFileName() returns a name with '/' as the last character, iykyk.
Returns true if current file item is a folder.
๐ท๏ธ Apply the file name format
applyFilenameFormat(void);
๐ท๏ธ Apply the tag format
applyTagFormat(void);
๐ค Apply text encoding
applyTextEncoding(void);
๐ Set the folder name from the tags
boolean setDirNameFromTag(int32 tagMask, string format,
boolean create);
tagMaskโ tag mask (bit 0 for tag 1, bit 1 for tag 2)formatโ folder name formatcreateโtrueto create,falseto rename
Returns true if OK, else the error message is available using getErrorMessage().
๐ข Set subsequent track numbers in the selected files
numberTracks(int32 tagMask, int32 firstTrackNr);
tagMaskโ tag mask (bit 0 for tag 1, bit 1 for tag 2)firstTrackNrโ number to use for first file
๐ Filter the files
filter(string expression);
expressionโ filter expression
๐ Convert ID3v2.3 tags to ID3v2.4
convertToId3v24(void);
๐ Convert ID3v2.4 tags to ID3v2.3
convertToId3v23(void);
Returns true if OK.
๐ Get path of folder
string getDirectoryName(void);
Returns absolute path of folder.
๐๏ธ Get name of current file
string getFileName(void);
Returns true absolute file name, ends with "/" if it is a folder.
โ๏ธ Set name of selected file
setFileName(string name);
nameโ file name
The file will be renamed when the folder is saved.
๐งฉ Set format to use when setting the filename from the tags
setFileNameFormat(string format);
formatโ file name format
๐ผ Set the file names of the selected files from the tags
setFileNameFromTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐ Get value of frame
string getFrame(int32 tagMask, string name);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)nameโ name of frame (e.g."artist")
to grab binary data like a picture, you can add the name of a file to write after the name, e.g. "Picture:/path/to/file". same deal for synchronized lyrics, e.g. "SYLT:/path/to/file" โจ
Returns value of frame.
๐๏ธ Set value of frame
boolean setFrame(int32 tagMask, string name, string value);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)nameโ name of frame (e.g."artist")valueโ value of frame
for tag 2 (tagMask 2), if no frame with name exists, a new frame is added; if value is empty, the frame is deleted. to add binary data like a picture, a file can be added after the name, e.g. "Picture:/path/to/file". "SYLT:/path/to/file" can be used to import synchronized lyrics.
Returns true if OK.
๐ Get all frames of a tag
array of string getTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
Returns list with alternating frame names and values.
โน๏ธ Get technical information about file
array of string getInformation(void);
properties are Format, Bitrate, Samplerate, Channels, Duration, Channel Mode, VBR, Tag 1, Tag 2. properties which are not available are omitted.
Returns list with alternating property names and values.
๐ Set tag from file name
setTagFromFileName(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐ Set tag from other tag
setTagFromOtherTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐ Copy tag
copyTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐ Paste tag
pasteTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐๏ธ Remove tag
removeTag(int32 tagMask);
tagMaskโ tag bit (1 for tag 1, 2 for tag 2)
๐ Reparse the configuration
reparseConfiguration(void);
automated configuration changes are possible by modifying the configuration file and then reparsing the configuration. glow-up for your config, no cap ๐
โถ๏ธ Plays the selected files
playAudio(void);
๐ฆ QML INTERFACE ๐ฆ
โจ QML Examples โจ
QML scripts can be invoked via the context menu of the file list and can be set in the tab User Actions of the settings dialog. the scripts sitting there? they're literally your built-in example library for writing custom ones, use them ๐ซถ
QML uses JavaScript, so here's the obligatory "Hello World" โ every coder's origin story:
import Kid3 1.0
Kid3Script {
onRun: {
console.log("Hello world, folder is", app.dirName)
Qt.quit()
}
}
so if you save this script as /path/to/Example.qml, the user command can be defined as @qml /path/to/Example.qml with name QML Test and Output checked. then you can start it with the QML Test item in the file list context menu, and the output shows up in the window. main character energy tbh ๐
unfortunate news bestie ๐ญ starting QML scripts with theqmlcommand (likeqml -apptype widget -I /usr/lib/kid3/plugins/imports /path/to/Example.qml) is broken in recent versions of Qt. not your fault. not mine either.
but!! kid3-cli offers an alternative way to run a QML script from the command line using its execute command, and it works:
kid3-cli -c "execute @qml /path/to/Example.qml"
Heads up bestie, we're still deep in QML land here ๐ โ this is the rest of the QML stuff, so buckle up.
To list the titles in the tags 2 of all files in the current folder, the following script could be used:
import Kid3 1.0
Kid3Script {
onRun: {
app.firstFile()
do {
if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
console.log(app.getFrame(tagv2, "title"))
}
} while (app.nextFile())
}
}
If the folder contains many files, such a script might block the user interface for some time ๐ญ โ for longer operations it should therefore take a little break from time to time, like, hydrate bestie. The alternative implementation below has the work for a single file moved out into a function. That function invokes itself with a timeout of 1 ms at the end, given that more files still have to be processed. This will ensure that the GUI remains responsive while the script is running. Iconic behaviour, honestly.
import Kid3 1.0
Kid3Script {
onRun: {
function doWork() {
if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
console.log(app.getFrame(tagv2, "title"))
}
if (!app.nextFile()) {
Qt.quit()
} else {
setTimeout(doWork, 1)
}
}
app.firstFile()
doWork()
}
}
When using app.firstFile() with app.nextFile(), all files of the current folder will be processed. If only the selected files shall be affected, use firstFile() and nextFile() instead โ these are convenience functions of the Kid3Script component. The following example is a script which copies only the disc number and copyright frames of the selected file. Surgical. Precise. Ate.
import Kid3 1.1
Kid3Script {
onRun: {
function doWork() {
if (app.selectionInfo.tag(Frame.Tag_2).tagFormat) {
app.setFrame(tagv2, "*.selected", false)
app.setFrame(tagv2, "discnumber.selected", true)
app.setFrame(tagv2, "copyright.selected", true)
app.copyTags(tagv2)
}
if (!nextFile()) {
Qt.quit()
} else {
setTimeout(doWork, 1)
}
}
firstFile()
doWork()
}
}
More example scripts come with Kid3 and are already registered as user commands ๐ so you literally don't have to do anything but click:
- ReplayGain to SoundCheck (
ReplayGain2SoundCheck.qml) โ Create iTunNORM SoundCheck information from replay gain frames. - Resize Album Art (
ResizeAlbumArt.qml) โ Resize embedded cover art images which are larger than 500x500 pixels. - Extract Album Art (
ExtractAlbumArt.qml) โ Extract all embedded cover art pictures avoiding duplicates. - Embed Album Art (
EmbedAlbumArt.qml) โ Embed cover art found in image files into audio files in the same folder. - Embed Lyrics (
EmbedLyrics.qml) โ Fetch unsynchronized lyrics from web service. - Text Encoding ID3v1 (
ShowTextEncodingV1.qml) โ Helps to find the encoding of ID3v1 tags by showing the tags of the current file in all available character encodings. - ID3v1 to ASCII (
Tag1ToAscii.qml) โ Transliterate extended latin characters in the ID3v1 tag to ASCII. - English Title Case (
TitleCase.qml) โ Formats text in the tags to English title case. - Rewrite Tags (
RewriteTags.qml) โ Rewrite all tags in the selected files. - Export CSV (
ExportCsv.qml) โ Export recursively all tags of all files to a CSV file. - Import CSV (
ImportCsv.qml) โ Import recursively all tags of all files from a CSV file. - Export JSON (
ExportJson.qml) โ Export recursively all tags of all files to a JSON file. - Import JSON (
ImportJson.qml) โ Import recursively all tags of all files from a JSON file. - Export Playlist Folder (
ExportPlaylist.qml) โ Copy all files from a playlist into a folder and rename them according to their position. - QML Console (
QmlConsole.qml) โ Simple console to play with Kid3's QML API.
๐ฆ QML API ๐ฆ
The API can be easily explored using the QML Console, which is available as an example script with a user interface. Go poke at it, it's genuinely the fun way to learn this.
๐ธ Kid3Script ๐ธ
Kid3Script is a regular QML component located inside the plugin folder. You could use another QML component just as well. Using Kid3Script makes it easy to start the script function using the onRun signal handler. Moreover it offers some functions:
onRunโ Signal handler which is invoked when the script is startedtagv1,tagv2,tagv2v1โ Constants for tag parametersscriptโ Access to scripting functionsconfigsโ Access to configuration objectsgetArguments()โ List of script argumentsisStandalone()โtrueif the script was not started from within Kid3setTimeout(callback, delay)โ StartscallbackafterdelaymsfirstFile()โ To first selected filenextFile()โ To next selected file
๐ Scripting Functions ๐
As JavaScript and therefore QML too has only a limited set of functions for scripting, the script object has some additional methods, for instance:
script.properties(obj)โ String with Qt propertiesscript.writeFile(filePath, data)โ Write data to file,trueif OKscript.readFile(filePath)โ Read data from filescript.removeFile(filePath)โ Delete file,trueif OKscript.fileExists(filePath)โtrueif file existsscript.fileIsWritable(filePath)โtrueif file is writablescript.getFilePermissions(filePath)โ Get file permission mode bitsscript.setFilePermissions(filePath, modeBits)โ Set file permission mode bitsscript.classifyFile(filePath)โ Get class of file (folder"/", symlink"@", exe"*", file" ")script.renameFile(oldName, newName)โ Rename file,trueif OKscript.copyFile(source, dest)โ Copy file,trueif OKscript.makeDir(path)โ Create folder,trueif OKscript.removeDir(path)โ Remove folder,trueif OKscript.tempPath()โ Path to temporary folderscript.musicPath()โ Path to music folderscript.listDir(path, [nameFilters], [classify])โ List folder entriesscript.system(program, [args], [msecs])โ Synchronously start a system command,[exit code, standard output, standard error]if not timeoutscript.systemAsync(program, [args], [callback])โ Asynchronously start a system command,callbackwill be called with[exit code, standard output, standard error]script.getEnv(varName)โ Get value of environment variablescript.setEnv(varName, value)โ Set value of environment variablescript.getQtVersion()โ Qt version string, e.g."5.4.1"script.getDataMd5(data)โ Get hex string of the MD5 hash of datascript.getDataSize(data)โ Get size of byte arrayscript.dataToImage(data, [format])โ Create an image from data bytesscript.dataFromImage(img, [format])โ Get data bytes from imagescript.loadImage(filePath)โ Load an image from a filescript.saveImage(img, filePath, [format])โ Save an image to a file,trueif OKscript.imageProperties(img)โ Get properties of an image, map containing"width","height","depth"and"colorCount", empty if invalid imagescript.scaleImage(img, width, [height])โ Scale an image, returns scaled image
โจ Application Context โจ
Using QML, a large part of the Kid3 functions are accessible. The API is similar to the one used for D-Bus. For details, refer to the respective notes. iykyk ๐
app.openDirectory(path)โ Open folderapp.unloadAllTags()โ Unload all tagsapp.saveDirectory()โ Save folderapp.revertFileModifications()โ Revertapp.importTags(tag, path, fmtIdx)โ Import fileapp.importFromTags(tag, source, extraction)โ Import from tagsapp.importFromTagsToSelection(tag, source, extraction)โ Import from tags of selected filesapp.downloadImage(url, allFilesInDir)โ Download imageapp.exportTags(tag, path, fmtIdx)โ Export fileapp.writePlaylist()โ Write playlistapp.getPlaylistItems(path)โ Get items of a playlistapp.setPlaylistItems(path, items)โ Set items of a playlistapp.selectAllFiles()โ Select allapp.deselectAllFiles()โ Deselectapp.firstFile([select], [onlyTaggedFiles])โ To first fileapp.nextFile([select], [onlyTaggedFiles])โ To next fileapp.previousFile([select], [onlyTaggedFiles])โ To previous fileapp.selectCurrentFile([select])โ Select current fileapp.selectFile(path, [select])โ Select a specific fileapp.getSelectedFilePaths([onlyTaggedFiles])โ Get paths of selected filesapp.requestExpandFileList()โ Expand allapp.applyFilenameFormat()โ Apply filename formatapp.applyTagFormat()โ Apply tag formatapp.applyTextEncoding()โ Apply text encodingapp.numberTracks(nr, total, tag, [options])โ Number tracksapp.applyFilter(expr)โ Filterapp.convertToId3v23()โ Convert ID3v2.4.0 to ID3v2.3.0app.convertToId3v24()โ Convert ID3v2.3.0 to ID3v2.4.0app.getFilenameFromTags(tag)โ Filename from tagsapp.getTagsFromFilename(tag)โ Filename to tagsapp.getAllFrames(tag)โ Get object with all framesapp.getFrame(tag, name)โ Get frameapp.setFrame(tag, name, value)โ Set frameapp.getPictureData()โ Get data from picture frameapp.setPictureData(data)โ Set data in picture frameapp.copyToOtherTag(tag)โ Tags to other tagsapp.copyTags(tag)โ Copyapp.pasteTags(tag)โ Pasteapp.removeTags(tag)โ Removeapp.playAudio()โ Playapp.readConfig()โ Read configurationapp.applyChangedConfiguration()โ Apply configurationapp.dirNameโ Folder nameapp.selectionInfo.fileNameโ File nameapp.selectionInfo.filePathโ Absolute file pathapp.selectionInfo.detailInfoโ Format detailsapp.selectionInfo.tag(Frame.Tag_1).tagFormatโ Tag 1 formatapp.selectionInfo.tag(Frame.Tag_2).tagFormatโ Tag 2 formatapp.selectionInfo.formatString(tag, format)โ Substitute codes in format stringapp.selectFileName(caption, dir, filter, saveFile)โ Open file dialog to select a fileapp.selectDirName(caption, dir)โ Open file dialog to select a folder
For asynchronous operations, callbacks can be connected to signals ๐ซถ
function automaticImport(profile) {
function onAutomaticImportFinished() {
app.batchImporter.finished.disconnect(onAutomaticImportFinished)
}
app.batchImporter.finished.connect(onAutomaticImportFinished)
app.batchImport(profile, tagv2)
}
function renameDirectory(format) {
function onRenameActionsScheduled() {
app.renameActionsScheduled.disconnect(onRenameActionsScheduled)
app.performRenameActions()
}
app.renameActionsScheduled.connect(onRenameActionsScheduled)
app.renameDirectory(tagv2v1, format, false)
}
โจ Configuration Objects โจ
okay so every different config section lives behind a method of configs ๐
you can literally just peek at what properties any of them has by listing them in the QML console like this:
script.properties(configs.networkConfig())
and bestie, you can set them too:
configs.networkConfig().useProxy = false
here's the whole roster of config sections, no gatekeeping ๐ซถ:
configs.batchImportConfig()configs.exportConfig()configs.fileConfig()configs.filenameFormatConfig()configs.filterConfig()configs.findReplaceConfig()configs.guiConfig()configs.importConfig()configs.mainWindowConfig()configs.networkConfig()configs.numberTracksConfig()configs.playlistConfig()configs.renDirConfig()configs.tagConfig()configs.tagFormatConfig()configs.userActionsConfig()
๐ AUTHOR ๐
Urs Fleisch <ufleisch at users.sourceforge.net>
- Software development
๐ COPYRIGHT ๐
Copyright ยฉ 2026 Urs Fleisch
FDL
๐ธ NOTES ๐ธ
okay so this is the citation list, aka the receipts โจ every single one of these is linked in the text above, and yes you can absolutely go read them all, i believe in you:
- gnudb.org โ
http://gnudb.org - MusicBrainz โ
http://musicbrainz.org - Discogs โ
http://discogs.com - Amazon โ
http://www.amazon.com - ID3 specification โ
http://id3.org/id3v2.4.0-frames - SYLT Editor โ
http://www.compuphase.com/software_sylteditor.htm - www.gnudb.org โ
http://www.gnudb.org - gnudb.org โ
https://gnudb.org/info.php - Discogs โ
https://www.discogs.com/ - freedb.org โ
http://freedb.org - ID3 tag version 2.3.0 โ
http://id3.org/id3v2.3.0 - ID3 tag version 2.4.0 - Main Structure โ
http://id3.org/id3v2.4.0-structure - LyricWiki โ
http://www.lyricwiki.org - Google โ
http://www.google.com - id3lib โ
http://id3lib.sourceforge.net - libogg โ
http://xiph.org/ogg/ - libvorbis, libvorbisfile โ
http://xiph.org/vorbis/ - libFLAC++ and libFLAC โ
http://flac.sourceforge.net - TagLib โ
http://taglib.github.io/ - mp4v2 โ
https://mp4v2.org/ - Chromaprint โ
http://acoustid.org/chromaprint - libav โ
http://libav.org/ - FDL โ
http://www.gnu.org/licenses/licenses.html#FDL - GPL โ
http://www.gnu.org/licenses/licenses.html#GPL - Qt(TM) โ
https://www.qt.io - KDE โ
http://www.kde.org
and that's the whole page, bestie ๐ญ๐ซถ you made it to the very end of the Kid3 3.10.1 manual, dated 2026-07-24, page KID3(1) โ go tag something, mwah ๐โจ
๐ฆ where this page comes from
- ubuntu stonking: kid3-core 3.10.1-3 ยท GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms