Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mutagen updates ID3v1 tags but does not save ID3v2 tags #583

Closed
unikitty37 opened this issue Nov 22, 2022 · 4 comments
Closed

Mutagen updates ID3v1 tags but does not save ID3v2 tags #583

unikitty37 opened this issue Nov 22, 2022 · 4 comments
Labels

Comments

@unikitty37
Copy link

unikitty37 commented Nov 22, 2022

I'm trying to reorganise the tags in some old radio programmes that I ripped years ago, and am trying to change artist, title, and album based on the filename. I'm also removing some comments that the ripping software auto-added.

(Please excuse any poor-quality Python — I'm a Ruby developer who's had to learn a little Python to do this as there are no up-to-date and working Ruby libraries that I can find to do this :)

#!/usr/bin/env python3

from sys import argv
import re
from mutagen.id3 import ID3, ID3v1SaveOptions, TIT2, TALB, TPE1, TPE2

pattern = re.compile(r'(?P<programme>[^/]+) - S(?P<series>\d+) - E(?P<episode>\d+) - (?P<title>.*)\.mp3$')

filenames = argv[1:]
for filename in filenames:
  matches = pattern.search(filename)
  if matches == None:
    break

  audio = ID3(filename)
  audio.update_to_v24()
  audio.delall('COMM')
  audio.add(TIT2(text=f'{matches.group("episode")} - {matches.group("title")}'))
  audio.add(TALB(text=f'{matches.group("programme")} - Series {matches.group("series")}'))
  audio.add(TPE1(text=f'{matches.group("programme")}'))
  audio.add(TPE2(text=f'{matches.group("programme")}'))
  audio.save(v1 = ID3v1SaveOptions.CREATE)

…but when I run it, it changes the ID3v1 tags but doesn't seem to save the ID3v2 tags, despite the documentation for save() saying "The lack of a way to update only an ID3v1 tag is intentional."

I'm not sure whether this is me doing something wrong (extremely likely!) or a Mutagen bug. Could somebody please point me in the right direction?

(BTW, shouldn't that v2 parameter in the list be v2_version? :)

Here's the before and after, with some light redaction (the id3v2 command is from https://id3v2.sourceforge.io/):

╰─▷ id3v2 -l "/tmp/Programme Name - S01 - E01 - Episode Title.mp3"
id3v1 tag info for /tmp/Programme Name - S01 - E01 - Episode Title.mp3:
Title  : Programme Name                   Artist: Programme Name
Album  : Programme Name - Series 01       Year: 1922, Genre: Comedy (57)
Comment: This is a comment                Track: 1
id3v2 tag info for /tmp/Programme Name - S01 - E01 - Episode Title.mp3:
TIT2 (Title/songname/content description): Programme Name
TPE1 (Lead performer(s)/Soloist(s)): Programme Name
TCON (Content type): Comedy (57)
TPE2 (Band/orchestra/accompaniment): Programme Name
TALB (Album/Movie/Show title): Programme Name - Series 01
COMM (Comments): ()[eng]: This is a comment
TYER (Year): 1922
TRCK (Track number/Position in set): 1

╰─▷ retag.py "/tmp/Programme Name - S01 - E01 - Episode Title.mp3"

╰─▷ id3v2 -l "/tmp/Programme Name - S01 - E01 - Episode Title.mp3"
id3v1 tag info for /tmp/Programme Name - S01 - E01 - Episode Title.mp3:
Title  : 01 - Episode Title           Artist: Programme Name
Album  : Programme Name - Series 01       Year: 1922, Genre: Comedy (57)
Comment:                                 Track: 1
/tmp/Programme Name - S01 - E01 - Episode Title.mp3: No ID3v2 tag

System info:

macOS 12.6 (21G115)

╰─▷ pip3 show mutagen
Name: mutagen
Version: 1.46.0
Summary: read and write audio tags for many formats
Home-page: https://github.com/quodlibet/mutagen
Author: Christoph Reiter
Author-email: reiter.christoph@gmail.com
License: GPL-2.0-or-later
Location: /opt/homebrew/lib/python3.10/site-packages
Requires:
Required-by:

╰─▷ python3 --version
Python 3.10.7
@phw
Copy link
Collaborator

phw commented Nov 22, 2022

If there are no ID3v2.x tags yet mutagen does not automatically add them. You need to do some check like:

if audio.tags is None:
    audio.add_tags()

@unikitty37
Copy link
Author

Thanks, but the file already has ID3v2 tags (as shown in the example output). Adding a print(mutagen.File(filename).tags.pprint()) just before audio = ID3(filename) produces this:

COMM==eng=This is a comment
COMM=ID3v1 Comment=eng=This is a comment
TALB=Programme Name - Series 01
TCON=Comedy
TDRC=1922
TIT2=Programme Name
TPE1=Programme Name
TPE2=Programme Name
TRCK=1

In any case, audio.tags doesn't seem to be the right thing:

Traceback (most recent call last):
  File "/Users/me/bin/retag.py", line 18, in <module>
    if audio.tags is None:
AttributeError: 'ID3' object has no attribute 'tags'

@phw
Copy link
Collaborator

phw commented Feb 14, 2023

@unikitty37 The issue seems to be not writing the file, but the verification with the id3v2 utility, which does not support ID3v2.4. Either verify with e.g. mutagen-inspect or another tool actually supporting v2.4 tags, or save v2.3 tags by passing v2_version=3 to the save call.

@phw phw added the invalid label Feb 14, 2023
@phw
Copy link
Collaborator

phw commented Feb 14, 2023

I am closing this. I tried your script directly and it does save the ID3v2.4 tags. The old id3v2 utility does not support that. Saving with v2_version=3 makes it visible in that utility as well.

(BTW, shouldn't that v2 parameter in the list be v2_version? :)

Docs are fixed with 3cbcc1b

@phw phw closed this as completed Feb 14, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants