Giter Site home page Giter Site logo

martchus / tageditor Goto Github PK

View Code? Open in Web Editor NEW
624.0 25.0 58.0 2.67 MB

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

License: GNU General Public License v2.0

C++ 96.01% JavaScript 2.45% CMake 0.92% C 0.61% Shell 0.01%
mp4 aac flac vorbis id3 qt-gui opus matroska matroska-files tagging

tageditor's Introduction

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
    • mainly for use in MP3 files but can be added to any kind of file
  • 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

Further remarks:

  • Unsupported file contents (such as unsupported tag formats) are generally preserved as-is.
  • Note that APE tags are not supported. APE tags in the beginning of a file are strongly unrecommended and thus discarded when applying changes. APE tags at the end of the file are preserved as-is when applying changes.

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. This leads to the creation of a temporary file. With the GUI's default settings this is even enforced to be conservative as the 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. When using the CLI it is therefore also recommend to use --force-rewrite.

The next section describes how to tweak settings to avoid rewriting at the cost of having no backup, having some padding within the files and/or storing tags at the end of the file.

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 enforce 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 specified limits.
  • preferred padding: If the file is rewritten the preferred padding is used.

It is also possible to force rewriting the entire file to enforce the preferred padding is used.

The relevant CLI options are --min-padding, --max-padding, --preferred-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).

Avoid rewriting files

As explained in the "Backup/temporary files" section, this is not a good idea as the temporary file that is created when rewriting the entire file also serves as backup. However, if you nevertheless want to avoid rewriting the file as much as possible, set the following in the GUI's "File layout" settings:

  • "Force rewrite…" option: unchecked
  • "Use preferred position…" options: unchecked
  • Minimum padding: 0
  • Maximum padding: 429496729 (simply a very high number)

When using the CLI, you just need to add --max-padding 429496729 to the CLI arguments (and avoid any of the other arguments mentioned in previous sections).

Improve performance

Editing big files (especially Matroska files) can take some time. To improve the performance, put the index at the end of the file (CLI option --index-pos back) because then the size of the index will never have to be recalculated. Also follow the advice from the "Backup/temporary files" section to force rewriting and to put the temporary directory on the same filesystem as the file you are editing. Forcing a rewrite can improve the performance because then the tag editor will not even try to see whether it could be avoided and can thus skip computations that can take a notable time for big Matroska files.

Of course being able to avoid a rewrite would still be more optimal. Checkout the previous section for how to achieve that. To improve performance further when avoiding a rewrite, put the tag at the end (CLI option --tag-pos back). Then the tag editor will not even try to put tags at the front and can thus skip a few computations. (Avoiding a rewrite is still not a good idea in general.)

Download

Source

See the release section on GitHub.

Packages and binaries

  • Arch Linux
  • Tumbleweed, Leap, Fedora
  • Exherbo
  • Gentoo
  • Void Linux
  • Other GNU/Linux systems
    • for generic, self-contained binaries checkout the release section on GitHub
      • Requires glibc>=2.26, OpenGL and libX11
        • openSUSE Leap 15, Fedora 27, Debian 10 and Ubuntu 18.04 are recent enough (be sure the package libopengl0 is installed on Debian/Ubuntu)
      • Supports X11 and Wayland (set the environment variable QT_QPA_PLATFORM=xcb to disable native Wayland support if it does not work on your system)
      • Binaries are signed with the GPG key B9E36A7275FC61B464B67907E06FE8F53CDC6A4C.
  • Windows
    • for binaries checkout the release section on GitHub
      • Windows SmartScreen will likely block the execution (you'll get a window saying "Windows protected your PC"); right click on the executable, select properties and tick the checkbox to allow the execution
      • Antivirus software often wrongly considers the executable harmful. This is a known problem. Please don't create issues about it.
      • the Qt 6 based version is stable and preferable but only supports Windows 10 version 1809 and newer
      • the Qt 5 based version should still work on older versions down to Windows 7 although this is not regularly checked
      • Binaries are signed with the GPG key B9E36A7275FC61B464B67907E06FE8F53CDC6A4C.
    • there is also a Chocolatey package maintained by bcurran3
    • for mingw-w64 PKGBUILDs checkout my GitHub repository

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.

Limitations

The GUI does not support setting multiple values of the same field (besides covers of different types). If a file already contains fields with multiple values, the additional values are discarded. Use the CLI if support for multiple values per field is required. Not all tag formats support this anyways, though.

The GUI does not support batch processing. I recommend using the CLI for this.

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.

Note that Windows users must use tageditor-cli.exe instead of tageditor.exe or use Mintty as terminal. Checkout the "Windows-specific issues" section for details.

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' lyrics'>=/path/to/lyrics' track'+=1/16' --files /some/dir/*.m4a
    
    • As shown, it is possible to specify multiple files at once.
    • The > after the field name lyrics causes the tag editor to read the value from the specified file. This works for other fields as well and is implied for cover.
    • The + sign after the field name track indicates that the field value should be increased after a file has been processed.
    • Specifying a field multiple times allows to specify different values for the different files.
      • So in this example, 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.
      • All files will get the album name The Album, the artist The Artist and the cover image from the file /path/to/image and the lyrics from the file /path/to/lyrics.
  • 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 specifically 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-target target-level=50 --remove-target 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
    
  • Sets a cover of a special type with a description:

    tageditor set cover=":front-cover" cover0="/path/to/back-cover.jpg:back-cover:The description" -f foo.mp3
    
    • The general syntax is path:cover-type:description. The cover type and description are optional.
    • The 0 after the 2nd cover is required. Otherwise the 2nd cover would only be set in the 2nd file (which is not even specified in this example).
    • In this example the front cover is removed (by passing an empty path) and the back cover set to the specified file and description. Existing covers of other types and with other descriptions are not affected.
    • When specifying a cover without type, all existing covers are replaced and the new cover will be of the type "other".
      • To replace all existing covers when specifying a cover type use e.g. … cover= cover0="/path/to/back-cover.jpg:back-cover".
    • It is possible to add multiple covers of the same type with only different descriptions. However, when leaving the description out (2nd : is absent), all existing covers of the specified type are replaced and the new cover will have an empty description.
      • To affect only the covers with an empty description, be sure to keep the trailing :.
      • To remove all existing covers of a certain type but regardless of the description use e.g. … cover=":back-cover".
    • The names of all cover types can be shown via tageditor --print-field-names.
    • This is only supported by the tag formats ID3v2 and Vorbis Comment. The type and description are ignored when dealing with a different format.
  • Sets fields by running a script to compute changes dynamically:

    tageditor set --pedantic debug --script path/to/script.js -f foo.mp3
    
    • This feature is still experimental. The script API is still subject to change.
    • The script needs to be ECMAScript as supported by the Qt framework.
    • This feature requires the tag editor to be configured with Qt QML as JavaScript provider at compile time. Checkout the build instructions under "Building with Qt GUI" for details.
    • The script needs to export a main() function. This function is invoked for every file and passed an object representing the current file as first argument.
    • Checkout the file testfiles/set-tags.js in this repository for an example that applies basic fixes and tries to fetch lyrics and cover art when according settings are passed (e.g. --script-settings addCover=1 addLyrics=1).
    • For debugging, the option --pedantic debug is very useful. You may also add --script-settings dryRun=1 and check for that setting within the script as shown in the mentioned example script.
    • Common tag fields are exposed as object properties as shown in the mentioned example.
      • Only properties for fields that are supported by the tag are added to the "fields" object.
      • Adding properties of unsupported fields manually does not work; those will just be ignored.
      • The properties for fields that are absent in the tag have an empty array assigned. You may also assign an empty array to fields to delete them.
      • The content of binary fields is exposed as ArrayBuffer. Use must also use an ArrayBuffer to set the value of binary fields such as the cover.
      • The content of other fields is mostly exposed as String or Number. You must also use one of those types to set the value of those fields. The string-representation of the assigned content will then be converted automatically to what's needed internally.
    • The utility object exposes useful methods, e.g. for logging and controlling the event loop.
    • Checkout the file testfiles/http.js in this repository for an example of using XHR and controlling the event loop.
    • The script runs after tags are added/removed (according to options like --id3v1-usage). So the tags present during script execution don't necessarily represent tags that are actually already present in the file.
    • The script is executed before any other modifications are applied. So if you also specify values as usual (via --values) then these values have precedence over values set by the script.
    • It is also possible to rename the file (via e.g. file.rename(newPath)). This will be done immediately and also if main() returns a falsy value (so it is possible to only rename a file without modifying it by returning a falsy value). If the specified path is relative, it is interpreted relative to current directory of the file (and not to the current working directory of the tag editor).
    • It is also possible to open another file via utility.openFile(path). This makes it possible to copy tags over from another file, e.g. to insert tags back from original files that have been lost when converting to a different format. The mentioned example script set-tags.js also demonstrates this for covers and lyrics when according script settings are passed (e.g. --script-settings addCover=1 originalDir=… originalExt=…).
Further useful commands
  • Let the tag editor return with a non-zero exit code even if only non-fatal problems have been encountered
    • when saving a file:
      tageditor set ... --pedantic warning -f ...
      
    • when printing technical information to validate the structure of a file:
      tageditor info  --pedantic warning --validate -f ...
      
      • This is especially useful for MP4 and Matroska files where the tag editor will be able to emit warnings and critical messages when those files are truncated or have a broken index.

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).

Build instructions

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

To avoid building c++utilities/tagparser/qtutilities separately, follow the instructions under "Building this straight". There's also documentation about various build variables which can be passed to CMake to influence the build.

Building with Qt GUI

The Qt GUI is enabled by default. The following Qt modules are required (only the latest Qt 5 and Qt 6 version tested): core concurrent gui network widgets declarative/script webenginewidgets/webkitwidgets

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

To specify the major Qt version to use, set QT_PACKAGE_PREFIX (e.g. add -DQT_PACKAGE_PREFIX:STRING=Qt6 to the CMake arguments).

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=ON 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) the GCC toolchain or Clang, the required Qt modules, iso-codes, iconv, zlib, CMake and Ninja.
  2. Get the sources of additional dependencies and the tag editor itself. For the latest version from Git clone the following repositories:
    cd "$SOURCES"
    git config core.symlinks true                                          # only required on Windows
    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
    
    Note that git config core.symlinks=true is only required under Windows to handle symlinks correctly. This requires a recent Git version and a filesystem which supports symlinks (NTFS works). Additionally, you need to enable Windows Developer Mode. If you run into "not found" errors on symlink creation use git reset --hard within the repository to fix this.
  3. Configure the build
    cd "$BUILD_DIR"
    cmake \
     -G Ninja \
     -DCMAKE_BUILD_TYPE=Release \
     -DLANGUAGE_FILE_ISO_639_2="/usr/share/iso-codes/json/iso_639-2.json" \
     -DCMAKE_INSTALL_PREFIX="/install/prefix" \
     "$SOURCES/subdirs/tageditor"
    
    • Replace /install/prefix with the directory where you want to install.
    • Replace /usr/…/iso_639-2.json with the path for your iso-codes installation.
  4. Build and install everything in one step:
    cd "$BUILD_DIR"
    ninja install
    
    • If the install directory is not writable, do not conduct the build as root. Instead, set DESTDIR to a writable location (e.g. DESTDIR="temporary/install/dir" ninja install) and move the files from there to the desired location afterwards.

TODOs and known problems

  • 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
  • Generally improve the CLI to make its use more convenient and cover more use-cases

Known problems and caveats

  • Large file information is not shown when using Qt WebEngine or the GUI becomes unresponsive. Use the feature to parse the full file structure in combination with the Qt WebEngine-based view with caution.
  • 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).
  • More TODOs and bugs are tracked in the issue section at GitHub.

Windows-specific issues

The following caveats can be worked around by using the CLI-wrapper instead of the main executable. This is the file that ends with -cli.exe. Alternatively you may use Mintty (e.g. via MSYS2) which is also not affected by those issues:

  • The console's codepage is set to UTF-8 to ensure point 3. of the "Text encoding" section is handled correctly. This may not work well under older Windows versions. Use set ENABLE_CP_UTF8=0 if this is not wanted.
  • The main application is built as a GUI application. To nevertheless enable console output it is attaching to the parent processes' console. However, this prevents redirections to work in most cases. If redirections are needed, use set ENABLE_CONSOLE=0 to disable that behavior.

The dark mode introduced with Windows 10 is not affecting traditional desktop applications but can be enabled by selecting the Fusion style.


Tag Editor supports PMv2 out of the box as of Qt 6. You may tweak settings according to the Qt documentation.

Copyright notice and license

Copyright © 2015-2024 Marius Kittler

All code is licensed under GPL-2-or-later.

Attribution for 3rd party content

  • The program icon is based on icons taken from the KDE/Breeze project.
  • Other icons found in this repository are taken from the KDE/Breeze project (without modification).

tageditor's People

Contributors

martchus avatar milahu avatar stentonian avatar techie2000 avatar

Stargazers

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

Watchers

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

tageditor's Issues

Saved tags don't show up in Windows explorer.

Windows 8.1 x64
"tageditor-devel-2-static-x86_64-w64-mingw32.tar.xz"

mp3 file resaved using tageditor doesn't show tags in Windows explorer. Tried resaving with different ID3v1 and ID3v2 tags.

TagScanner edited mp3 takes forever to parse.

Windows 8.1 x64
"tageditor-devel-2-static-x86_64-w64-mingw32.tar.xz"

mp3 files edited using TagScanner software don't load, they show "The file is beeing parsed..." and it keeps going forever.

Machine parsable duration

Using this file (regionsAllowed=DE,US):

youtube-dl --format 140 --output journey.m4a k5dX9sjXYVk

FFmpeg can get machine parsable duration:

$ ffprobe -v 0 -of csv=p=0 -show_entries stream=duration journey.m4a
610.800998

However TagEditor cannot:

$ tageditor -if journey.m4a
Technical information for "journey.m4a":
  Container format: MPEG-4 Part 14
    Document type                 isom
    Version                       512
    Duration                      10 min 10 s 801 ms

m4a file is unseekable after adding cover image

Hi there,

I'm trying some ways to add cover to my m4a (aac) files, and I found a solution lead to your project
https://askubuntu.com/a/849220

My tageditor binary is built on Ubuntu 16.04 by myself after following the build instructions

I used tageditor cli to add cover image (see attachment for input files)
add_cover_unseekable.zip

tageditor -s cover=cover.jpg --max-padding 100000 -f audio.m4a

I can play and seek the input file by any player but after adding cover, the result file play like normal but stuck if I seek to another position on VLC or default Ubuntu media player (it is still playable and seekable by chrome and firefox browser)

Am I using wrong command or my tageditor built is broken?

If you need any other information, just tell me and please help me to make my audio is seekable and also has a cover.

Thank you in advance

Random crashes when setting up JS execution for renaming utility

The tag editor crashes in a random line in TagEditorObject::parseFileInfo or RenamingEngine::setProgram (segfault). I changed nothing in the relevant code path so it is not clear why it suddenly ceased to work. It helps switching to the JavaScript engine from Qt Script (instead of using the one from Qt Qml). That makes it look like a change in Qt is responsible.

So far I reproduced the crashes under Tumbleweed and Arch Linux.


Backtrace:

Thread 29 (Thread 0x7fff9affd700 (LWP 30844)):
#0  0x00007fffee3b4cf5 in QV4::PersistentValueStorage::allocate() () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#1  0x00007fffee3b28eb in QJSValue::setProperty(QString const&, QJSValue const&) () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#2  0x00000000006c5a07 in RenamingUtility::operator<< (tagObject=..., tag=...) at /hdd/projects/c++/cmake/tageditor/renamingutility/tageditorobject.cpp:57
        fieldNames = {0x6e4af5 "title", 0x6d647d "artist", 0x6d267a "albumartist", 0x6d08d3 "album", 0x6d1742 "year", 0x6d2076 "comment", 0x6d173c "genre", 0x6d176d "encoder", 0x6d1794 "language", 0x6d17e5 "description", 0x0}
        fields = {TagParser::KnownField::Title, TagParser::KnownField::Artist, TagParser::KnownField::AlbumArtist, TagParser::KnownField::Album, TagParser::KnownField::Year, TagParser::KnownField::Comment, TagParser::KnownField::Genre, TagParser::KnownField::Encoder, TagParser::KnownField::Language, TagParser::KnownField::Description}
        fieldName = 0x7709e8 <RenamingUtility::operator<<(QJSValue&, TagParser::Tag const&)::fieldNames+24>
        field = 0x6e680c <RenamingUtility::operator<<(QJSValue&, TagParser::Tag const&)::fields+12>
        pos = {m_position = 1, m_total = 1}
#3  0x00000000006c7188 in RenamingUtility::TagEditorObject::parseFileInfo (this=0x3ec16b0, fileName=...) at /hdd/projects/c++/cmake/tageditor/renamingutility/tageditorobject.cpp:195
        tag = @0x7fff7c020710: {_vptr$Tag = 0x7ffff7eb04c8 <vtable for TagParser::Mp4Tag+16>, m_version = <incomplete type>, m_size = 230436, m_target = {m_level = 0, m_levelName = <incomplete type>, m_tracks = {<std::_Vector_base<unsigned long, std::allocator<unsigned long> >> = {_M_impl = {<std::allocator<unsigned long>> = {<__gnu_cxx::new_allocator<unsigned long>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<unsigned long, std::allocator<unsigned long> >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}, m_chapters = {<std::_Vector_base<unsigned long, std::allocator<unsigned long> >> = {_M_impl = {<std::allocator<unsigned long>> = {<__gnu_cxx::new_allocator<unsigned long>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<unsigned long, std::allocator<unsigned long> >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}, m_editions = {<std::_Vector_base<unsigned long, std::allocator<unsigned long> >> = {_M_impl = {<std::allocator<unsigned long>> = {<__gnu_cxx::new_allocator<unsigned long>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<unsigned long, std::allocator<unsigned long> >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}, m_attachments = {<std::_Vector_base<unsigned long, std::allocator<unsigned long> >> = {_M_impl = {<std::allocator<unsigned long>> = {<__gnu_cxx::new_allocator<unsigned long>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<unsigned long, std::allocator<unsigned long> >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}}}
        tagObject = {d = 140736793702880}
        tagIterator = {_M_current = 0x7fff7c00d420}
        end = {_M_current = 0x7fff7c00d428}
        diag = {<std::vector<TagParser::DiagMessage, std::allocator<TagParser::DiagMessage> >> = {<std::_Vector_base<TagParser::DiagMessage, std::allocator<TagParser::DiagMessage> >> = {_M_impl = {<std::allocator<TagParser::DiagMessage>> = {<__gnu_cxx::new_allocator<TagParser::DiagMessage>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<TagParser::DiagMessage, std::allocator<TagParser::DiagMessage> >::_Vector_impl_data> = {_M_start = 0x7fff7c01aef0, _M_finish = 0x7fff7c01af90, _M_end_of_storage = 0x7fff7c01af90}, <No data fields>}}, <No data fields>}, <No data fields>}
        fileInfo = {<TagParser::BasicFileInfo> = {_vptr$BasicFileInfo = 0x7ffff7eb0058 <vtable for TagParser::MediaFileInfo+16>, m_path = <incomplete type>, m_file = {<std::basic_iostream<char, std::char_traits<char> >> = {<std::basic_istream<char, std::char_traits<char> >> = {<std::basic_ios<char, std::char_traits<char> >> = {<No data fields>}, _vptr$basic_istream = 0x7ffff685a9e0 <vtable for CppUtilities::NativeFileStream+24>, _M_gcount = 13}, <std::basic_ostream<char, std::char_traits<char> >> = {_vptr$basic_ostream = 0x7ffff685aa08 <vtable for CppUtilities::NativeFileStream+64>}, <No data fields>}, m_data = {buffer = {_M_t = {_M_t = {<std::_Tuple_impl<0, std::basic_streambuf<char>*, std::default_delete<std::basic_streambuf<char> > >> = {<std::_Tuple_impl<1, std::default_delete<std::basic_streambuf<char> > >> = {<std::_Head_base<1, std::default_delete<std::basic_streambuf<char> >, true>> = {<std::default_delete<std::basic_streambuf<char> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, std::basic_streambuf<char>*, false>> = {_M_head_impl = 0x7fff7c020550}, <No data fields>}, <No data fields>}}}, descriptor = 76}, m_openMode = 28}, m_size = 4314745, m_readOnly = false}, m_containerParsingStatus = TagParser::ParsingStatus::Ok, m_containerFormat = TagParser::ContainerFormat::Mp4, m_containerOffset = 0, m_paddingSize = 0, m_actualExistingId3v1Tag = false, m_actualId3v2TagOffsets = {<std::_Vector_base<long, std::allocator<long> >> = {_M_impl = {<std::allocator<long>> = {<__gnu_cxx::new_allocator<long>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<long, std::allocator<long> >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}, m_container = {_M_t = {_M_t = {<std::_Tuple_impl<0, TagParser::AbstractContainer*, std::default_delete<TagParser::AbstractContainer> >> = {<std::_Tuple_impl<1, std::default_delete<TagParser::AbstractContainer> >> = {<std::_Head_base<1, std::default_delete<TagParser::AbstractContainer>, true>> = {<std::default_delete<TagParser::AbstractContainer>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, TagParser::AbstractContainer*, false>> = {_M_head_impl = 0x7fff7c014ca0}, <No data fields>}, <No data fields>}}}, m_tracksParsingStatus = TagParser::ParsingStatus::Ok, m_singleTrack = {_M_t = {_M_t = {<std::_Tuple_impl<0, TagParser::AbstractTrack*, std::default_delete<TagParser::AbstractTrack> >> = {<std::_Tuple_impl<1, std::default_delete<TagParser::AbstractTrack> >> = {<std::_Head_base<1, std::default_delete<TagParser::AbstractTrack>, true>> = {<std::default_delete<TagParser::AbstractTrack>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, TagParser::AbstractTrack*, false>> = {_M_head_impl = 0x0}, <No data fields>}, <No data fields>}}}, m_tagsParsingStatus = TagParser::ParsingStatus::Ok, m_id3v1Tag = {_M_t = {_M_t = {<std::_Tuple_impl<0, TagParser::Id3v1Tag*, std::default_delete<TagParser::Id3v1Tag> >> = {<std::_Tuple_impl<1, std::default_delete<TagParser::Id3v1Tag> >> = {<std::_Head_base<1, std::default_delete<TagParser::Id3v1Tag>, true>> = {<std::default_delete<TagParser::Id3v1Tag>> = {<No data fields>}, <No data fields>}, <No data fields>}, <std::_Head_base<0, TagParser::Id3v1Tag*, false>> = {_M_head_impl = 0x0}, <No data fields>}, <No data fields>}}}, m_id3v2Tags = {<std::_Vector_base<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> >, std::allocator<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> > > >> = {_M_impl = {<std::allocator<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> > >> = {<__gnu_cxx::new_allocator<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> > >> = {<No data fields>}, <No data fields>}, <std::_Vector_base<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> >, std::allocator<std::unique_ptr<TagParser::Id3v2Tag, std::default_delete<TagParser::Id3v2Tag> > > >::_Vector_impl_data> = {_M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}, <No data fields>}}, <No data fields>}, m_chaptersParsingStatus = TagParser::ParsingStatus::NotSupported, m_attachmentsParsingStatus = TagParser::ParsingStatus::NotSupported, m_backupDirectory = <incomplete type>, m_saveFilePath = <incomplete type>, m_writingApplication = <incomplete type>, m_minPadding = 0, m_maxPadding = 0, m_preferredPadding = 0, m_tagPosition = TagParser::ElementPosition::BeforeData, m_indexPosition = TagParser::ElementPosition::BeforeData, m_forceFullParse = false, m_forceRewrite = true, m_forceTagPosition = true, m_forceIndexPosition = true}
        suffix = {static null = {<No data fields>}, d = 0x7fff7c01e6f0}
        criticalParseingErrorOccured = false
        ioErrorOccured = false
        diagObj = {d = 140736793702928}
        tags = {<std::_Vector_base<TagParser::Tag*, std::allocator<TagParser::Tag*> >> = {_M_impl = {<std::allocator<TagParser::Tag*>> = {<__gnu_cxx::new_allocator<TagParser::Tag*>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<TagParser::Tag*, std::allocator<TagParser::Tag*> >::_Vector_impl_data> = {_M_start = 0x7fff7c00d420, _M_finish = 0x7fff7c00d428, _M_end_of_storage = 0x7fff7c00d428}, <No data fields>}}, <No data fields>}
        combinedTagObject = {d = 140736793702912}
        tagsObject = {d = 140736793702904}
        tagIndex = 0
        tracks = {<std::_Vector_base<TagParser::AbstractTrack*, std::allocator<TagParser::AbstractTrack*> >> = {_M_impl = {<std::allocator<TagParser::AbstractTrack*>> = {<__gnu_cxx::new_allocator<TagParser::AbstractTrack*>> = {<No data fields>}, <No data fields>}, <std::_Vector_base<TagParser::AbstractTrack*, std::allocator<TagParser::AbstractTrack*> >::_Vector_impl_data> = {_M_start = 0x7fff7c01d7f8, _M_finish = 0x7fff7c00c7c8, _M_end_of_storage = 0x7fff7c00c7c8}, <No data fields>}}, <No data fields>}
        tracksObject = {d = 140736793702912}
        trackIndex = 32767
        fileInfoObject = {d = 140736793702888}
#4  0x0000000000566814 in RenamingUtility::TagEditorObject::qt_static_metacall (_o=0x3ec16b0, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fff9affbee0) at tageditor_autogen/4IW5KZDV66/moc_tageditorobject.cpp:123
        _r = {d = 140736793702888}
        _t = 0x3ec16b0
#5  0x0000000000566e05 in RenamingUtility::TagEditorObject::qt_metacall (this=0x3ec16b0, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fff9affbee0) at tageditor_autogen/4IW5KZDV66/moc_tageditorobject.cpp:199
No locals.
#6  0x00007fffee54063d in ?? () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#7  0x00007fffee433d6d in ?? () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#8  0x00007fffee4361a4 in ?? () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#9  0x00007fffee436f8e in QV4::QObjectMethod::callInternal(QV4::Value const*, QV4::Value const*, int) const () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#10 0x00007fffee4c84d5 in QV4::Runtime::method_callProperty(QV4::ExecutionEngine*, QV4::Value*, int, QV4::Value*, int) () from /usr/lib64/libQt5Qml.so.5
No symbol table info available.
#11 0x00007fffd69813e3 in ?? ()
No symbol table info available.
#12 0x0000000000000000 in ?? ()
No symbol table info available.

Segmentation fault with binutils 2.28.1

Using these build scripts:

and with this file (regionsAllowed=DE,US):

youtube-dl --add-metadata --format m4a --output z.m4a wMeyeS_7YXU

I am getting this error when building with binutils 2.28.1:

$ tageditor -gf z.m4a
Segmentation fault

Note that building with binutils 2.25.0 works as expected:

$ tageditor -gf z.m4a
Tag information for "z.m4a":
 - MP4/iTunes tag
    Title             Aphex Twin - Stone In Focus
    Artist            Diego Acosta
    Year              20160503
    Encoder           Lavf57.82.101

Broken encoding when setting tags on certain ID3v2 combinations

I'm using the command line options to set id3 tags on mp3:

~/src/tageditor/tageditor -s --encoding=utf8 -v 'artist=Very good artist' -f *.mp3

If no id3v2 version is specified and I set the desired encoding to utf8 and the file is of version id3v2.3 for example, then the tag in written with broken encoding.
It is flagged as UTF16 in the tag, but the value is never converted from UTF-8 which will break some tools, but not all.
Problematic part is in mainfeatures.cpp:

                                        TagTextEncoding usedEncoding = denotedEncoding;
                                        cerr << "denoted encoding: " <<  textEncodingToCodecName(denotedEncoding) << endl;
                                        if(!tag->canEncodingBeUsed(denotedEncoding)) {
                                            usedEncoding = tag->proposedTextEncoding();
                                        }
                                        
                                        cerr << "used encoding: " <<  textEncodingToCodecName(usedEncoding) << endl;
                                        convertedValues.emplace_back(relevantDenotedValue->value, TagTextEncoding::Utf8, usedEncoding);

I added some debugging output.
usedEncoding gets set to UTF16 when I don't specify a id3v2 version and it's 3 for example.

Workaround:
Setting --id3v2-version=4.

Stop using ANSI escape codes with Windows

While it is true that certain Windows 10 versions do support this:

http://wikipedia.org/wiki/ANSI_escape_code#Windows_and_DOS

No other Windows version supports this, including the popular Windows 7. So you
end up with this:

$ tageditor --help
[1mTag Editor, version 2.2.5-330.df6c923
[0mLinked against: C++ Utilities: 4.10.0-392.784f3d9,
  Tag Parser: 6.5.0-332.d717913

[0mAvailable arguments:
[1m--qt-widgets-gui [0m
  shows a Qt widgets based graphical user interface (the application has not
  been built with Qt widgets support)
    [1m--file, -f [0m [path]
      specifies the path of the file to be opened
    [1m--renaming-utility [0m
      launches the renaming utility instead of the main GUI

Can't Figure Out How to Use on Kubuntu 18.04?

I can't figure out how to use this on Kubuntu 18.04.

I'm really interested in using this library to add thumbnails to .opus files, but can't for the life of me figur e out how to get this program running on my machine. There is no repository for it, and using the typical ./configure -> make -> sudo make install, scheme doesn't appear to work.

Is there any way I can get the CLI version of tageditor working on my system? Can you tell me exactly how to do so if this is the case?

com.apple.iTunes tags mislabeled

I download this file:

youtube-dl --format m4a oXQXpQCpbkY

then run the file through Picard. Now using other programs, I can read tags
as expected. AtomicParsley:

$ AtomicParsley 'Kind Of... Sometimes... Maybe-oXQXpQCpbkY.m4a' -t
Atom "©nam" contains: Kind Of... Sometimes... Maybe
Atom "©ART" contains: Jessie Ware
Atom "©alb" contains: Tough Love
Atom "©day" contains: 2014-10-06
Atom "----" [com.apple.iTunes;LABEL] contains: PMR Records

Bento4:

$ mp4tag 'Kind Of... Sometimes... Maybe-oXQXpQCpbkY.m4a'
Name:[S] Kind Of... Sometimes... Maybe
Artist:[S] Jessie Ware
Album:[S] Tough Love
Date:[S] 2014-10-06
com.apple.iTunes/LABEL:[S] PMR Records

ExifTool:

$ exiftool 'Kind Of... Sometimes... Maybe-oXQXpQCpbkY.m4a'
Title                           : Kind Of... Sometimes... Maybe
Artist                          : Jessie Ware
Album                           : Tough Love
Content Create Date             : 2014:10:06
LABEL                           : PMR Records

FFmpeg:

$ ffprobe 'Kind Of... Sometimes... Maybe-oXQXpQCpbkY.m4a'
title           : Kind Of... Sometimes... Maybe
artist          : Jessie Ware
album           : Tough Love
date            : 2014-10-06
LABEL           : PMR Records

but TagEditor is showing "LABEL" as "Encoder settings":

$ tageditor -g -f 'Kind Of... Sometimes... Maybe-oXQXpQCpbkY.m4a'
Title             Kind Of... Sometimes... Maybe
Album             Tough Love
Artist            Jessie Ware
Year              2014-10-06
Encoder settings  PMR Records

This is not correct. Please resolve, thank you.

Truncated output when writing non-ASCII characters

With this file (regionsAllowed=DE,US):

youtube-dl --add-metadata --format m4a 2Y6Nne8RvaA

I am getting this output with TagEditor master:

$ tageditor -gf 'Kungs vs Cookin’ on 3 Burners - This Girl-2Y6Nne8RvaA.m4a'
Tag information for "Kungs vs Cookin� on 3 Burners - This Girl-2Y6Nne8RvaA.m4a":
MP4/iTunes tag
 Title             Kungs vs Cookin’ on 3 Burners - This Gir

Notice that output is truncated, also notice that TagEditor chokes on the 1st
typographic quote, but not the 2nd. Proper FFprobe output:

$ ffprobe 'Kungs vs Cookin’ on 3 Burners - This Girl-2Y6Nne8RvaA.m4a'
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
'Kungs vs Cookin’ on 3 Burners - This Girl-2Y6Nne8RvaA.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 512
    compatible_brands: isomiso2
    title           : Kungs vs Cookin’ on 3 Burners - This Girl
    artist          : Kungs Listen ad-free with YouTube Red
    date            : 20160324
    encoder         : Lavf57.58.101
    comment         : Kungs vs Cookin’ on 3 Burners - This Girl.

Truncated info output

With this file (regionsAllowed=DE,US):

youtube-dl -f m4a -o liberation.m4a Aio_UkAJtoI

I am getting this correct output with TagEditor v2.2.3:

$ ./tageditor-release-2.2.3 -h | head -2
Tag Editor, version 2.2.3-298.98f3485
Linked against: C++ Utilities: 4.8.0-302.2625f82, Qt Utilities:
5.7.1-168.37dc2f7, Tag Parser: 6.3.0-256.b88672e

$ ./tageditor-release-2.2.3 -if liberation.m4a
Technical information for "liberation.m4a":
  Container format: MPEG-4 Part 14
    Document type                 isom
    Version                       512
    Duration                      5 min 4 s 65 ms
    Creation time                 1904-01-01 00:00:00
    Modification time             1904-01-01 00:00:00
    Tag position                  after data
    Index position                after data
    Padding                       8 bytes
  Tracks:
    ID                            1
    Name                          SoundHandler
    Type                          Audio
    Format                        Advanced Audio Coding Low Complexity Profile
    Abbreviation                  MPEG-4 AAC-LC
    Raw format ID                 mp4a
    Size                          4.55 MiB (4773379 byte)
    Duration                      5 min 4 s 65 ms
    Channel config                2 channels: front-left, front-right
    Bitrate                       125.588 kbit/s
    Bits per sample               16
    Sampling frequency            44100 Hz
    Sample count                  13095
    Creation time                 1904-01-01 00:00:00
    Modification time             1904-01-01 00:00:00

and this errant output starting with v2.2.5:

$ ./tageditor-release-2.2.5 -h | head -2
Tag Editor, version 2.2.5-324.5c5db15
Linked against: C++ Utilities: 4.10.0-373.05605a1, Qt Utilities:
5.8.0-188.0e4f410, Tag Parser: 6.4.1-322.31cf3b5

$ ./tageditor-release-2.2.5 -if liberation.m4a
Technical information for "liberation.m4a":
  Container format: MPEG-4 Part 14
    Document type                 isom
    Version                       512
    Duration                      5 min 4 s 65 ms 999 µs 900 ns

Interestingly, if I pipe to cat I get all of it:

$ ./tageditor-release-2.2.5 -if liberation.m4a | cat
Technical information for "liberation.m4a":
  Container format: MPEG-4 Part 14
    Document type                 isom
    Version                       512
    Duration                      5 min 4 s 65 ms 999 µs 900 ns
    Creation time                 1904-01-01 00:00:00
    Modification time             1904-01-01 00:00:00
    Tag position                  after data
    Index position                after data
    Padding                       8 bytes
  Tracks:
    ID                            1
    Name                          SoundHandler
    Type                          Audio
    Format                        Advanced Audio Coding Low Complexity Profile
    Abbreviation                  MPEG-4 AAC-LC
    Raw format ID                 mp4a
    Size                          4.55 MiB (4773379 byte)
    Duration                      5 min 4 s 65 ms 306 µs 100 ns
    Channel config                2 channels: front-left, front-right
    Bitrate                       125.588 kbit/s
    Bits per sample               16
    Sampling frequency            44100 Hz
    Sample count                  13095
    Creation time                 1904-01-01 00:00:00
    Modification time             1904-01-01 00:00:00

faststart

TagEditor seems to have no way to set or even detect faststart (moov before mdat). Please resolve, thank you.

Throws error on file with unicode characters in filename

Windows 8.1 x64.
"tageditor-devel-2-static-x86_64-w64-mingw32.tar.xz"

Nice application, but there's a problem when trying to edit an mp3 file with unicode characters in filename (for example, Glóandi.mp3).
I get "The file could not be opened because an IO error occured."

Proper version info with builds

All builds should list the proper version. Currently the last 4 devel builds are
showing the same version:

devel-5
Tag Editor, version 2.1.0

devel-4
Tag Editor, version 2.1.0

devel-3
Tag Editor, version 2.1.0

devel-2
Tag Editor, version 2.1.0

this makes troubleshooting harder than it needs to be. You can disambiguate
versions by using Git or similar:

$ git describe --tags
v2.0.0-15-g4cacaff

Static build

I am getting this error when trying to build static TagEditor:

[100%] Linking CXX executable tageditor.exe
/usr/lib/gcc/x86_64-w64-mingw32/5.4.0/../../../../x86_64-w64-mingw32/bin/ld:
  cannot find -lc++utilities_static
/usr/lib/gcc/x86_64-w64-mingw32/5.4.0/../../../../x86_64-w64-mingw32/bin/ld:
  cannot find -ltagparser_static
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/tageditor.dir/build.make:165: tageditor.exe] Error 1
make[3]: Leaving directory '/tmp/tageditor'
make[2]: *** [CMakeFiles/Makefile2:132: CMakeFiles/tageditor.dir/all] Error 2
make[2]: Leaving directory '/tmp/tageditor'
make[1]: *** [Makefile:117: all] Error 2
make[1]: Leaving directory '/tmp/tageditor'
make: *** [makefile:5: tageditor] Error 2

I think the problem is that for some reason TagEditor is looking for
libtagparser_static.a when what I have is libtagparser.a. Here are my build
scripts if that helps

Can't Read Flac Tags

I can't find anything in the help files related specifically to editing FLAC files so I'm not sure if I'm missing an option I should use for FLAC containers. I'm trying to read and write seemingly normal FLAC files.

- Container format: raw Free Lossless Audio Codec frames
 - Tracks: FLAC-2ch
    ID                            0
    Type                          Audio
    Format                        Free Lossless Audio Codec
    Abbreviation                  FLAC
    Duration                      4 min 49 s 45 µs 300 ns
    Channel count                 2
    Bits per sample               16
    Sampling frequency            44100 Hz
    Sample count                  12744902

When I run 'tageditor -i -v -f ./*.flac' I get the following diagnostic messages:

Diagnostic messages:
    Information  05:11:46   parsing chapters: Parsing chapters is not implemented for the container format of the file.
    Information  05:11:46   parsing attachments: Parsing attachments is not implemented for the container format of the file.

When I try to set with the verbose option, I don't get any messages reported to me.

Setting tag information for "./09 Adapting to Life in a Tiny Pea Chute.flac" ...
 - [100%] Updating ID3v2 tags ...
 - [100%] Preparing streams for rewriting ...
 - [100%] Writing frames ...
 - Changes have been applied.
 - Diagnostic messages:
    Information  05:24:53   making file: Changes are about to be applied.

Getting tags info just gives me:

- File has no (supported) tag information.

Cheers

Cannot write id3 tags under windows.

These are my attempted commands
tageditor tag=id3v1 set title="%title%" -f %work%%mpd%%mtrack%)
tageditor set id3v1:title="%title%" -f %work%%mpd%%mtrack%)
tageditor set id3v1:title=%title% -f %work%%mpd%%mtrack%)
tageditor set title="%title%" -f %work%%mpd%%mtrack%)

And this is the output

←[1;31mError: ←[0m←[1mUnable to parse arguments: ←[0mThe argument "set" can not be combined with "qt-widgets-gui".
See --help for available commands.

←[1;31mError: ←[0m←[1mThe field denotation "id3v1:title" could not be parsed: generic field name is unknown←[0m

←[1;31mError: ←[0m←[1mThe field denotation "id3v1:title" could not be parsed: generic field name is unknown←[0m

←[1mSetting tag information for "R:_Test_\Test_Artist-Test_Album-VLS\01-artist-track.mp3)" ...←[0m

  • ←[1;31mError: ←[0m←[1mAn IO failure occured when reading/writing the file "R:_Test_\Test_Artist-Test_Album-VLS\01-artist-track.mp3)".←[0m

The file isnt currently loaded, so I don't understand the read/write error also the --help does not work under windows and you can not redirect it to a text file to read. "tageditor --help>>help.txt" just sends the output to the shell not help.txt :(

File names with non ASCII characters

With this file (regionsAllowed=DE,US):

youtube-dl --add-metadata --format m4a --output Ω.m4a wMeyeS_7YXU

I am getting this output with TagEditor master:

$ tageditor -gf Ω.m4a
Error: An IO failure occured when reading the file "��.m4a".

Proper FFprobe output:

$ ffprobe Ω.m4a
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Ω.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 512
    compatible_brands: isomiso2
    title           : Aphex Twin - Stone In Focus
    artist          : Diego Acosta
    date            : 20160503
    encoder         : Lavf57.76.100      

Error: ‘make_unique’ was not declared in this scope when make install

Im sorry, I got some problem when build tageditor,

Scanning dependencies of target c++utilities
[  1%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/argumentparser.cpp.o
[  2%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/commandlineutils.cpp.o
[  3%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/failure.cpp.o
[  4%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/fakeqtconfigarguments.cpp.o
[  5%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/datetime.cpp.o
[  6%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/period.cpp.o
[  7%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/timespan.cpp.o
[  8%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/conversion/conversionexception.cpp.o
[ 10%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/conversion/stringconversion.cpp.o
/usr/local/src/s_files/c++utilities/conversion/stringconversion.cpp: In function ‘std::pair<std::unique_ptr<unsigned char []>, unsigned int> ConversionUtilities::decodeBase64(const char*, uint32)’:
/usr/local/src/s_files/c++utilities/conversion/stringconversion.cpp:328:19: error: ‘make_unique’ was not declared in this scope
     auto buffer = make_unique<byte[]>(decodedSize);
                   ^
/usr/local/src/s_files/c++utilities/conversion/stringconversion.cpp:328:35: error: expected primary-expression before ‘[’ token
     auto buffer = make_unique<byte[]>(decodedSize);
                                   ^
/usr/local/src/s_files/c++utilities/conversion/stringconversion.cpp:328:36: error: expected primary-expression before ‘]’ token
     auto buffer = make_unique<byte[]>(decodedSize);
                                    ^
make[2]: *** [c++utilities/CMakeFiles/c++utilities.dir/conversion/stringconversion.cpp.o] Error 1
make[1]: *** [c++utilities/CMakeFiles/c++utilities.dir/all] Error 2
make: *** [all] Error 2

And the following is my system environments

[root@ip-172-31-12-113 s_files]# make -v
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@ip-172-31-12-113 s_files]# 
[root@ip-172-31-12-113 s_files]# cmake --version
cmake version 3.10.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
[root@ip-172-31-12-113 s_files]# 

And my build config

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/usr/bin/" -DWIDGETS_GUI=OFF -DQUICK_GUI=OFF subdirs/tageditor

Im waiting is somebody could give me some advice.

few question about images changing

Does this Application Support windows platform ?
can i change song image to a custom image ?
for example windows 10 have is own media player and the microsoft windows media player
they support in the software changes?

Many Matroska tags are unsupported

When trying to edit some of the lesser used Matroska tags into my videos, I encounter the error message programmed here.

From the looks of it, the majority of tags listed under the official tag specification don't work with tageditor.

The Matroska specification also allows (though warns against) custom key value pairs as tags.

Stop making backup file

When I run:

tageditor -s artist=Jessie -f alfa.m4a

The file alfa.m4a.bak is also created. This could be a problem if the original
file is large. How do I stop this?

Unable to build without GUI on Linux

I managed to build tageditor on Ubuntu 19.10 cleanly with the defaults, I was curious how many fewer dependencies there may be if it was built without the GUI, as is there are 147 libraries it is linked against with full GUI. It runs fine from the command line(though so far have only viewed the help haven't actually tried to use it yet)

According to the instructions to build w/o GUI I should use "-DWIDGETS_GUI=OFF -DQUICK_GUI=OFF" with cmake, so I ran this:
cmake -DCMAKE_BUILD_TYPE=Release -DWIDGETS_GUI=OFF -DQUICK_GUI=OFF -DCMAKE_INSTALL_PREFIX="/usr/local/tageditor"
(same command line I used before just with the two new options added)

then when I ran make I get this error:

[ 14%] Building CXX object CMakeFiles/tageditor.dir/application/main.cpp.o
/home/me/build/tageditor/tageditor-3.3.5/application/main.cpp:25:17: error: ‘QtUtilities’ is not a namespace-name
25 | using namespace QtUtilities;
| ^~~~~~~~~~~
make[2]: *** [CMakeFiles/tageditor.dir/build.make:63: CMakeFiles/tageditor.dir/application/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/tageditor.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
(not sure how to get the above formatting right, this is my first time creating an issue in github)

I would not expect it to make any calls to Qt stuff if the GUI is disabled?

Not a big deal, just curious.

thanks

ffmpeg warning "stream 0, timescale not set" appears after adding cover art to. mp4/.m4a

Hi,

After adding cover art to .mp4/.m4a file, the following warning appears (when opening).

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55a51db589a0] stream 0, timescale not set

If not adding cover, this doesn't appear.
There seems to be no problem to play by this message, though :)

Version: 2.0.0
OS: ArchLinux (x86_64)
Packages from your binary repository

result of ffmpeg -i of the file before adding cover:

ffmpeg -i 01\ -\ Signs\ Of\ Spring.m4a.bak
ffmpeg version 3.1.4 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 6.2.1 (GCC) 20160830
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-netcdf --enable-shared --enable-version3 --enable-x11grab
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 47.100 / 6. 47.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '01 - Signs Of Spring.m4a.bak':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: M4A mp42isom
creation_time : 2013-04-25 02:25:25
iTunSMPB : 00000000 00000A40 000003D8 0000000000B2D9E8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
track : 1
artist : UNCHAIN
album : rapture
date : 2008
genre : JPop
title : Signs Of Spring
encoder : Nero AAC codec / 1.5.4.0
Duration: 00:04:25.87, start: 0.059501, bitrate: 232 kb/s
Chapter #0:0: start 0.059501, end 265.927979
Metadata:
title :
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 230 kb/s (default)
Metadata:
creation_time : 2013-04-25 02:25:25
handler_name : Sound Media Handler
At least one output file must be specified

And after adding cover:

ffmpeg -i 01\ -\ Signs\ Of\ Spring.m4a
ffmpeg version 3.1.4 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 6.2.1 (GCC) 20160830
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-avresample --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-netcdf --enable-shared --enable-version3 --enable-x11grab
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 47.100 / 6. 47.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x564acd8939a0] stream 0, timescale not set
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '01 - Signs Of Spring.m4a':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: M4A mp42isom
creation_time : 2013-04-25 02:25:25
iTunSMPB : 00000000 00000A40 000003D8 0000000000B2D9E8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
track : 1
artist : UNCHAIN
album : rapture
date : 2008
genre : JPop
title : Signs Of Spring
encoder : Nero AAC codec / 1.5.4.0
Duration: 00:04:25.87, start: 0.059500, bitrate: 234 kb/s
Chapter #0:0: start 0.059501, end 265.927978
Metadata:
title :
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 230 kb/s (default)
Metadata:
creation_time : 2013-04-25 02:25:25
handler_name : Sound Media Handler
Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 500x500 [SAR 1:1 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
At least one output file must be specified

Thank you for useful software and providing binary repo.

Best regards

Bulk adding thumbs?

image

Is there any way to run it on an entire library? The above shows my naming convention - thanks!

Would be great if there was a .bat file or something I could run to quickly apply them all.

Errant wrapping if output is redirected

If you do something like this:

tageditor --help > help.txt

or this:

tageditor --help | head

you end up with weird wrapping:

Tag Editor, version 2.2.5-337.b1b071a
Linked against: C++ Utilities: 4.11.0-398.4011040, Tag Parser: 6.5.0-336.f65b908

Available arguments:
--qt-widgets-gui
  shows a Qt widgets based graphic
  al user interface (the applicati
  on has not been built with Qt wi
  dgets support)
  --file, -f [path]

stdlib.h: No such file or directory

This is currently a TagParser issue, but I bet it bubbles up to TagEditor - I posted this here thinking it was GCC issue, but it seems some *.cmake files here might need to be reworked:

[  7%] Building CXX object CMakeFiles/tagparser_static.dir/mp4/mp4tagfield.cpp.o
In file included from
/usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/ext/string_conversions.h:41:0,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/basic_string.h:5402,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/string:52,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/stdexcept:39,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/array:39,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/tuple:39,
from /usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/functional:55,
from /usr/x86_64-w64-mingw32/sys-root/mingw/include/c++utilities/chrono/timespan.h:7,
from /usr/x86_64-w64-mingw32/sys-root/mingw/include/c++utilities/chrono/datetime.h:4,
from /var/cache/glade/tagparser/notification.h:6,
from /var/cache/glade/tagparser/statusprovider.h:4,
from /var/cache/glade/tagparser/abstracttrack.h:4,
from /var/cache/glade/tagparser/mp4/mp4track.h:4,
from /var/cache/glade/tagparser/mp4/mp4atom.cpp:1:
/usr/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/cstdlib:75:25: fatal error:
stdlib.h: No such file or directory
#include_next <stdlib.h>

http://cygwin.com/ml/cygwin/2017-08/msg00192.html

Here is possible fix:

http://github.com/opencv/opencv/pull/7390/files

saving image to m4b removes chapter marks

M4b with chapter marks in it has them removed when using tageditor to save cover art to it. I don't know if the warning I get has anything to do with it but I get this

  • [100%] Calculating atom sizes and padding ...
  • [100%] Preparing streams ...
  • [100%] Writing header and tags ...
  • [100%] Reparsing output file ...
  • Changes have been applied.
  • Diagnostic messages:
    Warning 02:49:59 making mdhd atom: Assigned language "" is of an invalid format and will be ignored.

If I resort to adding the artwork via iTunes it works fine and chapters are retained.

TagScanner recognizes FLAC with embedded cover (in Tag Editor) as corrupted data.

Windows 8.1 x64
"tageditor-devel-3-static-x86_64-w64-mingw32.tar.xz"

Cover art embedded in MP3 using Tag Editor isn't recognized in Clementine. TagScanner recognizes it just fine though.

Cover art embedded in FLAC using Tag Editor isn't recognized in Clementine. TagScanner says "Corrupted data or unknown format".

When embedded using TagScanner the cover shows up in Clementine.

No console output under Windows

Readme says to use

CLI
Usage

tageditor <operation> [options]

Checkout the available operations and options with --help.

Well, at least on windows --help does nothing

C:\Temp>tageditor --help

C:\Temp>

So using the CLI is a bit of a guessing game.

AppImage still having 'track' option conflicts

From the changes i see the issue of setting tracknumber using the track option has been has been fixed.

But the latest AppImage i downloaded few minutes ago still face this problem.

Can i get a link to an AppImage without the issue?

Thanks.

Don't know how to change video thumbnail

Hi. Trying to change the mkv thumbnail with below command, but Windows 10 do not show it.
I can change the title, but not the thumbnail.
Can you, please, tell me what I'm doing wrong? Thank you.

tageditor-3.3.2-x86_64-w64-mingw32.exe -s --add-attachment path=Clipboard01.jpg name=thumb desc=thumb mime=image/jpg -f video.mkv

Cannot set arbitrary (unsupported) tags in Vorbis Comment?

tageditor can properly list all the fields in Vorbis Comment when given the -u switch. I am not seeing an equivalent for set, where we should be able to set any key / field name whether tageditor undesstands its purpose or not. Maybe implementing the same -u switch for set and avoiding the "generic field name is unknown" error.

I think this has merit on its own, but in particular, I am interested in setting "ALBUMARTIST" field which is used by many players to represent a single artist for a whole compilation disk, like a DJ's name for a set etc. This is similar to but probably not the same as "grouping". See this link https://wiki.hydrogenaud.io/index.php?title=Tag_Mapping

Perhaps you are also interested in supporting this field specifically too.

Thanks for writing this useful program!

Building under macOS – unsupported compiler

I'm trying to build this under macOS 10.13. I know you don't work under macOS or officially support it, but I'm trying to figure out what the issue is and why the project won't build.

I have:

➜ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

➜ clang --version
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

When building without QT GUI, I get:

➜ cmake \
 -DCMAKE_BUILD_TYPE=Release \
 -DWIDGETS_GUI=OFF -DQUICK_GUI=OFF \
 -DCMAKE_INSTALL_PREFIX="/install/prefix" \
 $SOURCES/subdirs/tageditor
make install -j$(nproc)
-- Linking c++utilities dynamically against external library iconv (/usr/lib/libiconv.dylib).
-- Adding dynamic external library iconv (/usr/lib/libiconv.dylib) to dependencies of static c++utilities.
-- Using std::fstream for NativeFileStream
-- Configuring project c++utilities
-- Using default CXX11 ABI (not forcing old CX11 ABI).
-- For the check target to work, it is required to call enable_testing() on the source directory root.
-- Using template for global.h from own (c++utilities) source directory.
-- c++utilities: BUILD_SHARED_LIBS=ON
-- Using template for Config.cmake from own (c++utilities) source directory.
-- Using template for SharedConfig.cmake from own (c++utilities) source directory.
-- Using template for template.pc from own (c++utilities) source directory.
-- Checking for one of the modules 'cppunit>=1.13.0'
CMake Warning at /Users/werner/Documents/Software/martchus/c++utilities/cmake/modules/TestTarget.cmake:37 (message):
  Unable to add test target because cppunit could not be located.
Call Stack (most recent call first):
  /Users/werner/Documents/Software/martchus/c++utilities/CMakeLists.txt:210 (include)


-- Using template for doxygen from own (c++utilities) source directory.
CMake Warning at /Users/werner/Documents/Software/martchus/c++utilities/cmake/modules/Doxygen.cmake:31 (message):
  Doxygen not found, unable to add target for generating API documentation
  for c++utilities
Call Stack (most recent call first):
  /Users/werner/Documents/Software/martchus/c++utilities/CMakeLists.txt:211 (include)


-- Using template for config.h from own (c++utilities) source directory.
-- Linking tagparser dynamically against external library CPP_UTILITIES (c++utilities).
-- Adding dynamic external library CPP_UTILITIES (c++utilities) to dependencies of static tagparser.
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11")
-- Linking tagparser dynamically against external library z (/usr/lib/libz.dylib).
-- Adding dynamic external library z (/usr/lib/libz.dylib) to dependencies of static tagparser.
-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
-- Linking tagparser dynamically against external library crypto (/usr/lib/libcrypto.dylib).
-- Adding dynamic external library crypto (/usr/lib/libcrypto.dylib) to dependencies of static tagparser.
-- Configuring project tagparser
-- Using default CXX11 ABI (not forcing old CX11 ABI).
-- For the check target to work, it is required to call enable_testing() on the source directory root.
-- Using template for global.h from CPP_UTILITIES source directory.
-- tagparser: BUILD_SHARED_LIBS=ON
-- Using template for Config.cmake from CPP_UTILITIES source directory.
-- Using template for SharedConfig.cmake from CPP_UTILITIES source directory.
-- Using template for template.pc from CPP_UTILITIES source directory.
-- Checking for one of the modules 'cppunit>=1.14.0'
CMake Warning at /Users/werner/Documents/Software/martchus/c++utilities/cmake/modules/TestTarget.cmake:37 (message):
  Unable to add test target because cppunit could not be located.
Call Stack (most recent call first):
  /Users/werner/Documents/Software/martchus/tagparser/CMakeLists.txt:225 (include)


-- Using template for doxygen from CPP_UTILITIES source directory.
CMake Warning at /Users/werner/Documents/Software/martchus/c++utilities/cmake/modules/Doxygen.cmake:31 (message):
  Doxygen not found, unable to add target for generating API documentation
  for tagparser
Call Stack (most recent call first):
  /Users/werner/Documents/Software/martchus/tagparser/CMakeLists.txt:226 (include)


-- Using template for config.h from CPP_UTILITIES source directory.
-- Linking tageditor dynamically against external library CPP_UTILITIES (c++utilities).
-- Adding dynamic external library CPP_UTILITIES (c++utilities) to dependencies of static tageditor.
-- Configuring project tageditor
-- Using default CXX11 ABI (not forcing old CX11 ABI).
-- For the check target to work, it is required to call enable_testing() on the source directory root.
-- Linking tageditor dynamically against external library TAG_PARSER (tagparser).
-- Adding dynamic external library TAG_PARSER (tagparser) to dependencies of static tageditor.
-- Checking for one of the modules 'cppunit>=1.13.0'
CMake Warning at /Users/werner/Documents/Software/martchus/c++utilities/cmake/modules/TestTarget.cmake:37 (message):
  Unable to add test target because cppunit could not be located.
Call Stack (most recent call first):
  /Users/werner/Documents/Software/martchus/tageditor/CMakeLists.txt:260 (include)


-- Using template for desktop from CPP_UTILITIES source directory.
-- Using template for appdata.xml from CPP_UTILITIES source directory.
-- Using template for bash-completion.sh from CPP_UTILITIES source directory.
-- Generating files for bash completion.
-- Using template for config.h from CPP_UTILITIES source directory.
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/werner/Documents/Software/martchus/build
Scanning dependencies of target c++utilities
[  2%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/commandlineutils.cpp.o
[  2%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/argumentparser.cpp.o
[  4%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/fakeqtconfigarguments.cpp.o
[  4%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/application/failure.cpp.o
[  6%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/period.cpp.o
[  6%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/datetime.cpp.o
[  8%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/chrono/timespan.cpp.o
[  8%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/conversion/conversionexception.cpp.o
[  9%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/conversion/stringconversion.cpp.o
[ 10%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/io/ansiescapecodes.cpp.o
[ 11%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/io/binaryreader.cpp.o
[ 12%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/io/binarywriter.cpp.o
[ 13%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/io/bitreader.cpp.o
In file included from /Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:4:
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:188:6: error: Unsupported compiler
#    error Unsupported compiler
     ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:151:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Double> descriptor("UTF-8", "UTF-16LE");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:160:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Half> descriptor("UTF-16LE", "UTF-8");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:169:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Double> descriptor("UTF-8", "UTF-16BE");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:178:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Half> descriptor("UTF-16BE", "UTF-8");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:187:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Keep> descriptor("ISO-8859-1", "UTF-8");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
/Users/werner/Documents/Software/martchus/c++utilities/conversion/stringconversion.cpp:196:5: error: '__thread' variables must have global storage
    CPP_UTILITIES_THREAD_LOCAL ConversionDescriptor<Keep> descriptor("UTF-8", "ISO-8859-1");
    ^
/Users/werner/Documents/Software/martchus/build/c++utilities/resources/features.h:194:40: note: expanded from macro 'CPP_UTILITIES_THREAD_LOCAL'
#    define CPP_UTILITIES_THREAD_LOCAL __thread
                                       ^
[ 14%] Building CXX object c++utilities/CMakeFiles/c++utilities.dir/io/inifile.cpp.o
7 errors generated.
make[2]: *** [c++utilities/CMakeFiles/c++utilities.dir/conversion/stringconversion.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [c++utilities/CMakeFiles/c++utilities.dir/all] Error 2
make: *** [all] Error 2

If you have any suggestions, that'd be much appreciated.

Mass copying tags in CLI?

I would like to copy all tags from an MP4 to FLAC and MP3 of the same name. Can this be done via the command-line interface?

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.