Bug 506771 - Please consider adding support for detecting and optionally removing Lyrics3v2 tags from MP3 files.
Summary: Please consider adding support for detecting and optionally removing Lyrics3v...
Status: RESOLVED FIXED
Alias: None
Product: kid3
Classification: Applications
Component: general (other bugs)
Version First Reported In: unspecified
Platform: Manjaro Linux
: NOR wishlist
Target Milestone: ---
Assignee: Urs Fleisch
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-07-08 18:45 UTC by homomisanthropus
Modified: 2025-07-24 16:40 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments
attachment-4045091-0.html (5.07 KB, text/html)
2025-07-09 20:41 UTC, homomisanthropus
Details

Note You need to log in before you can comment on or make changes to this bug.
Description homomisanthropus 2025-07-08 18:45:40 UTC
***
Some older MP3 files contain Lyrics3v2 tags, which can cause issues with some audio players or tagging tools. These tags are no longer widely used and are often unwanted.

Currently, Kid3 does not appear to detect or remove Lyrics3v2 tags. Other tools like rmlyrics3 exist, but integrating this capability directly into Kid3 would streamline workflows and improve tag management.

✅ Proposed Feature
Detect Lyrics3v2 presence (optional visual indicator).
Provide an option to remove Lyrics3v2 (via UI or a context menu).
Preferably no need to install external tools — handled via Mutagen or internal logic.

ADDITIONAL INFORMATION
Removing obsolete or conflicting tags helps maintain clean metadata and reduces compatibility issues. Users seeking a GUI-based solution would benefit from not having to rely on CLI tools for this purpose.
Comment 1 Urs Fleisch 2025-07-09 16:27:12 UTC
Thanks for the suggestion. Kid3 itself does not parse or render tags, it uses 3rd party libraries to do that. For MP3 files, there are two options: id3lib (using the Id3libMetadata plugin) and TagLib (using the TaglibMetadata plugin). id3lib has support for parsing Lyrics3v2. I have not used it because it offers little control. As I can see from the source code, it would convert the Lyrics3v2 data to COMM, USLT and SYLT ID3v2 frames. But it does not have a function to remove such tags. Besides this, id3lib is no longer maintained since many years, so it is disabled by default, and TagLib is used, because it has more features, supports also ID3v2.4.0 (and many other formats) and is still actively maintained. However, it does not support Lyrics3v2. Therefore, it is not possible to nicely integrate Lyrics3v2 support into Kid3's UI using the existing metadata plugins with the requested features, namely removing such tags.

What would be possible is to add a user action which calls an external tool such as the mentioned rmlyrics3 (https://github.com/Moonbase59/rmlyrics3). Another idea would be using the QML API, it has script.readFile() and script.writeFile(). However, there is probably no way to strip the Lyrics3v2 data (bytes between LYRICSBEGIN and the ID3v1 tag) using QML. At least I could not see a way to access the returned QByteArray as a JavaScript ArrayBuffer.
Comment 2 homomisanthropus 2025-07-09 20:41:40 UTC
Created attachment 183100 [details]
attachment-4045091-0.html

Thank you very much for the quick response. I must confess that I am a 
little disappointed by the difficulty of the task. In any case, adding a 
user action that calls an external tool like rmyrics3 or other might be 
a good idea. Perhaps you could implement it in the near future? Even if 
this is not the case, I reiterate my gratitude for your time and your 
response.

Best regards.

El 9/7/25 a las 18:27, Urs Fleisch escribió:
> https://bugs.kde.org/show_bug.cgi?id=506771
>
> --- Comment #1 from Urs Fleisch<ufleisch@users.sourceforge.net> ---
> Thanks for the suggestion. Kid3 itself does not parse or render tags, it uses
> 3rd party libraries to do that. For MP3 files, there are two options: id3lib
> (using the Id3libMetadata plugin) and TagLib (using the TaglibMetadata plugin).
> id3lib has support for parsing Lyrics3v2. I have not used it because it offers
> little control. As I can see from the source code, it would convert the
> Lyrics3v2 data to COMM, USLT and SYLT ID3v2 frames. But it does not have a
> function to remove such tags. Besides this, id3lib is no longer maintained
> since many years, so it is disabled by default, and TagLib is used, because it
> has more features, supports also ID3v2.4.0 (and many other formats) and is
> still actively maintained. However, it does not support Lyrics3v2. Therefore,
> it is not possible to nicely integrate Lyrics3v2 support into Kid3's UI using
> the existing metadata plugins with the requested features, namely removing such
> tags.
>
> What would be possible is to add a user action which calls an external tool
> such as the mentioned rmlyrics3 (https://github.com/Moonbase59/rmlyrics3).
> Another idea would be using the QML API, it has script.readFile() and
> script.writeFile(). However, there is probably no way to strip the Lyrics3v2
> data (bytes between LYRICSBEGIN and the ID3v1 tag) using QML. At least I could
> not see a way to access the returned QByteArray as a JavaScript ArrayBuffer.
>
Comment 3 Urs Fleisch 2025-07-12 15:10:56 UTC
Please add the following file somewhere in your file system, e.g. as RemoveLyrics3.qml (text between the dashed lines):

----
import Kid3 1.1

Kid3Script {
  onRun: {
    function doWork() {
      console.log("Processing %1".arg(app.selectionInfo.fileName));
      const [rc, stdout, stderr] = script.system("rmlyrics3", [app.selectionInfo.filePath]);
      if (rc === undefined) {
        console.error("Please download\n" +
                      "https://raw.githubusercontent.com/Moonbase59/rmlyrics3/refs/heads/master/rmlyrics3\n" +
                      "to folder in PATH and make it executable!")
        Qt.quit();
        return;
      }

      if (rc != 0) {
        console.error("Returned %1".arg(rc));
      }
      if (stdout) {
        console.log(stdout.trim());
      }
      if (stderr) {
        console.error(stderr.trim());
      }
      if (!nextFile()) {
        Qt.quit();
      } else {
        setTimeout(doWork, 1);
      }
    }

    app.saveDirectory();
    firstFile();
    doWork();
  }
}
----

Then add a new user action ("User Actions" in the preferences) with Ouput=x, Name=Remove Lyrics3, Command=@qml /path/to/your/script/RemoveLyrics3.qml

If this is OK for you, I could add it to the scripts provided with Kid3.
Comment 4 homomisanthropus 2025-07-14 17:53:05 UTC
Hello, maybe I have done something wrong, but it has not worked for me. It returns the following message: file:///home/misanthropus/.local/bin/RemoveLyrics3.qml:35:1: Syntax error. 
Thank you for the time you are taking. 
Best regards.
Comment 5 homomisanthropus 2025-07-14 18:04:42 UTC
Hi again. However, having the rmlyrics3 script, with the rmlyrics3 %f command it works for a song. 
I don't know if this helps. 
Best regards.
Comment 6 Urs Fleisch 2025-07-14 19:00:28 UTC
Strange that the script does not work for you, I tested it both with Qt 5 and Qt 6.
But your are right, using a QML script is not needed, you can just use "rmlyrics3 %f " as the command of a user action, or event better "rmlyrics3 %F", this will work with multiple files.
Comment 7 homomisanthropus 2025-07-14 19:24:28 UTC
So it is almost certain that this is my mistake. I am sorry. I'll try to find out what I've done wrong. You can therefore add it to the scripts provided with kid3 if you see fit. 
Thanks again. 
Best regards.
Comment 8 Urs Fleisch 2025-07-14 19:48:46 UTC
As you noticed correclty, using "rmlyrics3 %F" is enough, a QML script seems to be overkill.
Comment 9 homomisanthropus 2025-07-14 20:13:43 UTC
As you see fit. Anyway, I found the error. It was simply a hidden line break. My apologies. 
Best regards