All Projects → Martchus → Tageditor

Martchus / Tageditor

Licence: gpl-2.0
A tag editor with Qt GUI and command-line interface supporting MP4/M4A/AAC (iTunes), ID3, Vorbis, Opus, FLAC and Matroska

Projects that are alternatives of or similar to Tageditor

Symphonia
Pure Rust multimedia format demuxing, tag reading, and audio decoding library
Stars: ✭ 191 (-16.59%)
Mutual labels:  mp4, aac, flac
Mediafile
A unified reader of metadata from audio & video files.
Stars: ✭ 138 (-39.74%)
Mutual labels:  mp4, aac, flac
Gogglesmm
Goggles Music Manager
Stars: ✭ 41 (-82.1%)
Mutual labels:  mp4, aac, flac
Mutagen
Python module for handling audio metadata
Stars: ✭ 760 (+231.88%)
Mutual labels:  tagging, mp4, flac
Atldotnet
Fully managed, portable and easy-to-use C# library to read and edit audio data and metadata (tags) from various audio formats, playlists and CUE sheets
Stars: ✭ 180 (-21.4%)
Mutual labels:  mp4, aac, flac
aplay-
a simple BitPerfect player
Stars: ✭ 23 (-89.96%)
Mutual labels:  mp4, aac, flac
Av Converter
[av-converter.com] Audio and Video Converter, and YouTube downloader. Convert to MP3, MP4, AAC, FLAC, AC3, WAV, etc.
Stars: ✭ 97 (-57.64%)
Mutual labels:  mp4, aac, flac
loudgain
ReplayGain 2.0 loudness normalizer based on the EBU R128/ITU BS.1770 standard (-18 LUFS, FLAC, Ogg, MP2, MP3, MP4, M4A, AAC, ALAC, Opus, ASF, WMA, WAV, AIFF, WavPack, APE)
Stars: ✭ 127 (-44.54%)
Mutual labels:  mp4, aac, flac
slibs
Single file libraries for C/C++
Stars: ✭ 80 (-65.07%)
Mutual labels:  mp4, aac, flac
Ar Gif
Easy to use augmented reality web components
Stars: ✭ 52 (-77.29%)
Mutual labels:  hacktoberfest, mp4
Redoflacs
Parallel BASH commandline FLAC compressor, verifier, organizer, analyzer, and retagger
Stars: ✭ 71 (-69%)
Mutual labels:  tagging, flac
Faad2
Freeware Advanced Audio (AAC) Decoder faad2 mirror
Stars: ✭ 82 (-64.19%)
Mutual labels:  mp4, aac
Audioworks
A cross-platform, multi-format audio conversion and tagging suite
Stars: ✭ 35 (-84.72%)
Mutual labels:  aac, flac
Esp8266audio
Arduino library to play MOD, WAV, FLAC, MIDI, RTTTL, MP3, and AAC files on I2S DACs or with a software emulated delta-sigma DAC on the ESP8266 and ESP32
Stars: ✭ 972 (+324.45%)
Mutual labels:  aac, flac
Faac
Freeware Advanced Audio Coder faac mirror
Stars: ✭ 102 (-55.46%)
Mutual labels:  mp4, aac
Audiovideocodec
一款视频录像机,支持AudioRecord录音、MediaCodec输出AAC、MediaMuxer合成音频视频并输出mp4,支持自动对焦、屏幕亮度调节、录制视频时长监听、手势缩放调整焦距等
Stars: ✭ 113 (-50.66%)
Mutual labels:  mp4, aac
Youtubedownloader
Downloads videos and playlists from YouTube
Stars: ✭ 2,202 (+861.57%)
Mutual labels:  hacktoberfest, mp4
Ni Media
NI Media is a C++ library for reading and writing audio streams.
Stars: ✭ 158 (-31%)
Mutual labels:  mp4, flac
Audioplayer
Audio Player for Nextcloud and ownCloud
Stars: ✭ 179 (-21.83%)
Mutual labels:  mp4, flac
Axiom
An FFmpeg GUI for Windows
Stars: ✭ 560 (+144.54%)
Mutual labels:  mp4, flac

Tag Editor

A tag editor with Qt GUI and command-line interface. Supports MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska.

Supported formats

The tag editor can read and write the following tag formats:

  • iTunes-style MP4/M4A tags (MP4-DASH is supported)
  • ID3v1 and ID3v2 tags
    • conversion between ID3v1 and different versions of ID3v2 is possible
  • Vorbis, Opus and FLAC comments in Ogg streams
    • cover art via "METADATA_BLOCK_PICTURE" is supported
  • Vorbis comments and "METADATA_BLOCK_PICTURE" in raw FLAC streams
  • Matroska/WebM tags and attachments

Additional features

The tag editor can also display technical information such as the ID, format, language, bitrate, duration, size, timestamps, sampling frequency, FPS and other information of the tracks.

It also allows to inspect and validate the element structure of MP4 and Matroska files.

Backup/temporary files

Sometimes the tag editor has to rewrite the entire file in order to apply changes. With the default settings this will happen most of the times.

The next section describes how to tweak settings to avoid this at the cost of having some padding within the files and/or storing tags at the end of the file. Note that temporary files also serve as a backup in case something goes wrong, e.g. your computer crashes while saving or a bug within the tag editor breaks particularly structured files. To be save it might therefore even be desirable to enforce the creation of a temporary file. That is also possible to configure within the GUI and the CLI option --force-rewrite.

Nevertheless, it will not always be possible to avoid rewriting a file in all cases anyways. You can configure a directory for temporary files within the GUI settings or the CLI option --temp-dir. Then you can easily clean up all temporary files at some point together. For efficiency the temporary directory should be on the same file system as the files you are editing. A feature to delete temporary files automatically has not been implemented yet.

File layout options

Tag position

The editor allows you to choose whether tags should be placed at the beginning or at the end of an MP4/Matroska file. Placing tags at the end of the file can avoid having to rewrite the entire file to apply changes.

In the CLI, this is controlled via --tag-pos option. To enfore a specific --tag-pos, even if this requires the file to be rewritten, combine with the --force option.

ID3v2 tags and Vorbis/Opus comments can only be placed at the beginning. ID3v1 tags can only be placed at the end of the file. Hence this configuration has no effect when dealing with such tags.

Index position

It is also possible to control the position of the index/cues. However, this is currently only supported when dealing with Matroska files.

Note: This can not be implemented for MP4 since tags and index are tied to each other. When dealing with MP4 files the index position will always be the same as the tag position.

Faststart

Putting the index at the beginning of the file is sometimes called faststart.

For forcing faststart via CLI the following options are required:

tageditor set --index-pos front --force

Padding

Padding allows adding additional tag information without rewriting the entire file or appending the tag. Usage of padding can be configured:

  • minimum/maximum padding: The file is rewritten if the padding would fall below/exceed the specifed limits.
  • preferred padding: If the file needs to be rewritten the preferred padding is used.

Default value for minimum and maximum padding is zero (in the CLI and GUI). This leads to the fact that the Tag Editor will almost always have to rewrite the entire file to apply changes. To prevent this, set at least the maximum padding to a higher value.

However, it is also possible to force rewriting the entire file.

The relevant CLI options are --min-padding, --max-padding and --force-rewrite.

Taking advantage of padding is currently not supported when dealing with Ogg streams (it is supported when dealing with raw FLAC streams).

Download

Source

See the release section on GitHub.

Packages and binaries

Usage

The Tag Editor has a Qt-based GUI and a command line interface. For a C++ library interface checkout the underlying tagparser library.

GUI

The GUI should be self-explaining - a lot of the UI elements have tooltips with further explanations. The basic workflow is quite simple:

  1. Open a file
  2. Edit the tags
  3. Save changes

You can set the behaviour of the editor to keep previous values, so you don't have to enter information like album name or artist for all files in an album again and again.

Screenshots

Main window under Openbox/qt5ct with Breeze theme/icons

main window/Openbox/qt5ct/Breeze theme

Main window under Plasma 5 with dark Breeze theme/icons

This screenshot shows the experimental MusicBrainz/LyricWiki search.

main window/Plasma 5/dark Breeze theme

Settings

Checkout the settings dialog. You can

  • customize which fields the editor shows and in which order.
  • change settings regarding the tag processing (ID3 version(s) to be used, preferred character set, usage of padding, ...).
  • set whether unknown/unsupported tags should be ignored/kept or removed.
  • set whether ID3v1 and ID3v2 tags should be edited together or separately.
  • set the directory used to store temporary files.
  • set the desired file layout options (see section "File layout options").
  • enable auto-correction features like trimming whitespaces.

Settings of the GUI do not affect the CLI.

File renaming

There is also a tool to rename files using the tag information stored in the files. The new name for each file is generated by a small JavaScript which can be customized. An example script is provided. Before any actual changes are made, you will see a preview with the generated file names. As shown in the example script it is also possible to move files into another directory.

MusicBrainz, Cover Art Archive and LyricWiki search

The tag editor also features a MusicBrainz, Cover Art Archive and LyricWiki search.

  1. Open the search by pressing F10.
  2. Open the first file in the album.
  3. If album and artist are already present those are automatically inserted as search terms. Otherwise you need to enter the album and artist to search for manually. It makes most sense to search for an entire album and therefore leave the fields for track number and title blank.
  4. Click on "Search" and select on of the query options.
  5. Select the row and fields to be used and click on "Use row". You can also double click the row you want to use.
  6. Use the "Insert automatically" option to insert search results for the next files automatically when you open them. To find the matching row for the song in the search results the title or track number needs to be present. If artist and album are present as well these are also tried to match for further disambiguation.
Notes
  • The context menu on the list of results provides further options, e.g. to open the result in a web browser.
  • There are shortcuts to trigger the different queries.
  • LyricWiki was shut down completely on September 21, 2020 so the LyricWiki search is no longer working.

CLI

Usage

tageditor <operation> [options]

Checkout the available operations and options with --help. For a list of all available field names, track attribute names and modifier, use the CLI option --print-field-names.

Examples

Here are some Bash examples which illustrate getting and setting tag information:

Reading tags
  • Displays title, album and artist of all *.m4a files in the specified directory:

    tageditor get title album artist --files /some/dir/*.m4a
    
  • Displays all supported fields of all *.mkv files in the specified directory:

    tageditor get --files /some/dir/*.mkv
    
  • Extracts the cover of the specified (Opus) file:

    tageditor extract cover --output-file the-cover.jpg --file some-file.opus
    
    • No conversion is done by the tag editor. This command assumes that the cover is a JPEG image.
    • The extraction works for other fields like lyrics as well.
    • For Matroska attachments one needs to use --attachment.
  • Displays technical information about all *.m4a files in the specified directory:

    tageditor info --files /some/dir/*.m4a
    
Modifying tags and track attributes
  • Sets title, album, artist, cover and track number of all *.m4a files in the specified directory:

    tageditor set title="Title of "{1st,2nd,3rd}" file" title="Title of "{4..16}"th file" \
      album="The Album" artist="The Artist" \
      cover=/path/to/image track={1..16}/16 --files /some/dir/*.m4a
    
    • The first file will get the title Title of 1st file, the second file will get the name Title of 2nd file and so on.
    • The 16th and following files will all get the title Title of the 16th file.
    • The same scheme is used for the track numbers.
    • All files will get the album name The Album, the artist The Artist and the cover image from the file /path/to/image.
  • Sets title of both specified files and the album of the second specified file:

    tageditor set title0="Title for both files" album1="Album for 2nd file" \
      --files file1.ogg file2.mp3
    

    The number after the field name specifies the index of the first file to use the value for. The first index is 0.

  • Sets the title specificly for the track with the ID 3134325680 and removes the tags targeting the song/track and the album/movie/episode in general:

    tageditor set target-level=30 target-tracks=3134325680 title="Title for track 3134325680" \
      --remove-targets target-level=50 , target-level=30 \
      --files file.mka
    

    For more information checkout the Matroska specification.

  • Sets custom fields:

    tageditor set mkv:FOO=bar1 mp4:©foo=bar2 -f file.mkv file.m4a
    
    • In particular, the custom field FOO is set to bar1 in file.mkv and the custom field ©foo is set to bar2 in file.m4a. So the prefixes tell the tag editor that the specified field ID is a native field ID of a particular tag format rather than a generic identifier. Native fields are only applied to the corresponding format of course.
    • The following prefixes are supported:
      • mp4: iTune-style MP4/M4A ID (must be exactly 4 characters)
      • mkv: Matroska ID
      • id3: ID3v2 ID (must be exactly 3 or 4 characters depending on the tag version)
      • vorbis: Vorbis comment ID, also works for Opus (which uses Vorbis comments as well)
  • Removes the "forced" flag from all tracks, flags the track with the ID 2 as "default" and sets its language to "ger":

    tageditor set track-id=all forced=no track-id=2 default=yes language=ger
    
    • So modifying track attributes is possible as well and it works like setting tag fields.
    • Specific tracks can currently only be referred by ID.
  • Here is another example, demonstrating the use of arrays and the syntax to auto-increase numeric fields such as the track number:

    cd some/dir
    # create an empty array
    titles=()
    # iterate through all music files in the directory
    for file in *.m4a; do \
        # truncate the first 10 characters
        title="${file:10}"; \
        # append the title truncating the extension
        titles+=("title=${title%.*}"); \
    done
    # now set the titles and other tag information
    tageditor set "${titles[@]}" album="Some Album" track+=1/25 disk=1/1 -f *.m4a
    

    Note: The + sign after the field name track which indicates that the field value should be increased after a file has been processed.

Text encoding / unicode support

  1. It is possible to set the preferred encoding used within the tags via CLI option --encoding and in the GUI settings.
    • However, in the GUI this only affects visible fields. In the CLI only specified fields are affected. So reencoding all text fields is currently not supported.
    • The option is ignored (with a warning) when the specified encoding is not supported by the tag format.
  2. The CLI assumes all arguments to be UTF-8 encoded (no matter which preferred encoding is specified) and file names are just passed as specified.
  3. The CLI prints all values in UTF-8 encoding (no matter which encoding is actually used in the tag).

Windows only

  • Codepage is set to UTF-8 to ensure 3. is handled correctly by the terminal. So far it seems that this effort just causes weird truncating behaviour in some cases and might prevent pipes/redirections to function. One can use MSYS2 terminal to work around this.
  • All UTF-16 encoded arguments as provided by WinAPI are converted to UTF-8 so 2. shouldn't cause any trouble.
  • A workaround to support filenames containing non-ASCII characters (despite the lack of an UTF-8 supporting std::fstream under Windows) can be enabled by adding -DUSE_NATIVE_FILE_BUFFER=ON to the CMake arguments when building c++utilities. It is not sufficient to specify this option only when building tagparser or Tag Editor.

Build instructions

The application depends on c++utilities and tagparser and is built the same way as these libaries. For basic instructions checkout the README file of c++utilities.
When the Qt GUI is enabled, Qt and qtutilities are required, too.

Building with Qt GUI

The following Qt modules are requried (version 5.6 or higher): core concurrent gui network widgets declarative/script webenginewidgets/webkitwidgets

Note that old Qt versions like 5.6 lack support for modern JavaScript features. To use the JavaScript-based renaming tool is recommend to use at least Qt 5.12.

Select Qt module for web view and JavaScript

  • Add -DWEBVIEW_PROVIDER:STRING=webkit/webengine/none to the CMake arguments to use either Qt WebKit (works with 'revived' version as well), Qt WebEngine or no web view at all. If no web view is used, the file information can only be shown using a plain tree view. Otherwise the user can choose between a web page and a tree view.
  • Add -DJS_PROVIDER:STRING=script/qml/none to the CMake arguments to use either Qt Script, Qt QML or no JavaScript engine at all. If no JavaScript engine is used, the renaming utility is disabled.

Building without Qt GUI

It is possible to build without the GUI if only the CLI is needed. In this case no Qt dependencies (including qtutilities) are required.

To build without GUI, add the following parameters to the CMake call:

-DWIDGETS_GUI=OFF -DQUICK_GUI=OFF

JSON export

As a small demo for Reflective RapidJSON, the tag editor features an optional JSON export. To enable it, add -DENABLE_JSON_EXPORT to the CMake arguments.

When enabled, the following additional dependencies are required (only at build-time): rapidjson, reflective-rapidjson and llvm/clang

Building this straight

  1. Install (preferably the latest version of) g++ or clang, the required Qt modules and CMake.
  2. Get the sources of additional dependencies and the tag editor itself. For the lastest version from Git clone the following repositories:
    cd $SOURCES
    git clone https://github.com/Martchus/cpp-utilities.git c++utilities
    git clone https://github.com/Martchus/tagparser.git
    git clone https://github.com/Martchus/qtutilities.git                  # only required for Qt GUI
    git clone https://github.com/Martchus/reflective-rapidjson.git         # only required for JSON export
    git clone https://github.com/Martchus/tageditor.git
    git clone https://github.com/Martchus/subdirs.git
    
  3. Configure the build
    cd $BUILD_DIR
    cmake \
     -DCMAKE_BUILD_TYPE=Release \
     -DCMAKE_INSTALL_PREFIX="/install/prefix" \
     $SOURCES/subdirs/tageditor
    
    • Replace /install/prefix with the directory where you want to install.
  4. Build and install everything in one step:
    cd $BUILD_DIR
    make install -j$(nproc)
    
    • If the install directory is not writable, do not conduct the build as root. Instead, set DESTDIR to a writable location (e.g. make DESTDIR="temporary/install/dir" install …) and move the files from there to the desired location afterwards.

TODOs

  • Support more formats (JPEG/EXIF, PDF metadata, Theora in Ogg, ...)
  • Allow adding tags to specific streams when dealing with Ogg
  • Set tag information concurrently if multiple files have been specified (CLI)
  • Support adding cue-sheet to FLAC files

Bugs

  • Large file information is not shown when using Qt WebEngine
  • It is recommend to create backups before editing because I can not test whether the underlying library works with all kinds of files (when forcing rewrite a backup is always created).
  • Also note the issue tracker on GitHub

More TODOs and bugs are tracked in the issue section at GitHub.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].