Giter Club home page Giter Club logo

music-tag's People

Contributors

kristoformaynard avatar liupold 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

music-tag's Issues

Year not saved with id3v1

To reproduce:

mp3 = music_tag.load_file(mp3_path)

mp3['title'] = 'Title'
mp3['artist'] = 'Artist'
mp3['album'] = 'Album Name'
mp3['tracknumber'] = 2
mp3['genre'] = 'Pop'
mp3['year'] = 2021

# https://mutagen.readthedocs.io/en/latest/user/id3.html v1=2 tells mutagen to enable v1 tags
mp3.save(v1=2)

Then the output of eyeD3 </path/to/file> -v1 is:

ID3 v1.1:
title: Title
artist: Artist
album: Album Name
track: 2		genre: Pop (id 13)

So it is perfect except it is missing the year.

Artwork not updating

Hello Music-tag,

I've tried to update the artwork of the mp3 file but it's not reflecting. Below is my code

import music_tag

f = music_tag.load_file("1617027815286.mp3")

print('track title:', f['title'])

f['title'] = 'title'
f['artist'] = 'artist'
f['album'] = 'album'
f['comment'] = 'comment'
f['genre'] = 'genre'
f['composer'] = 'composer'
f['lyrics'] = 'lyrics'

img_in = open("images/testimage.jpg", "rb")

f['artwork'] = img_in.read()
img_in.close()

f.save()

print('track title:', f['title'] , ">>>" , f['artwork'])

Output:

track title: title >>> image/jpeg 320x320 f82f576dbf84f66d27626b12b7436210

Custom tags

Is it possible to add custom tags like SERIES?
Is m4b supported? (i think its the almost the same as m4a)
i was thinking about audiobooks.

Setting Album Art Image from the CLI

No matter how I try to add an image using the ZSH shell, it continually throws a type error, expecting 'bytes'

It would be great if there was a CLI example showing how to do this as it does not work the same as all the other tags.

Anyone have an example of this, or is it even possible?

method like keys() or items() to iterate through tags?

I found out the hard way that the interface to the tags is only dict-like. :-(

I'm doing my first project with music-tag, and trying to debug a problem with setting tags. I tried doing an f.keys() to find out what keys were set, and a ValueError exception 'cuz it only kinda looks like a dict.

Is there a definitive list of all the possible tag keys somewhere that I could use to simulate keys() and/or items()? Would you be interested in getting a method that you could incorporate into music-tag?

The reason I'm messing with tags is that, for a while, I used a ripper that stored tags for oggs with lowercase names, so lots of apps don't see them. Do you happen to know, offhand, of a library for python, perl or c that would make it easy to access and replace the non-standard tags? I was hoping they'd show up in the "extras" in tinytags, but no luck.

Thanks,

Ran

Artwork not showing up in iTunes

I'm using a mac, and i've saved my artwork from url. It shows up fine in like the finder folder, as in it shows the artwork in the preview but when i open it in iTunes the artwork doesn't display. idk if this is something wrong w iTunes or something but i was just curious if anyone else had this issue and how they solved it.

Add duration tag

Hi,
Was wondering if there's any plans for adding a duration tag. I think that would be nice

handling of Raw-Tracknumber not consistent

I'm on the newest Version of the Lib and Python 3.9.

  • handling flac seems fine, only mp3 are showing this
  • reading from .raw["tracknumber"].values brings me the full field (e.g. "01-0")
  • my sanitizing-routine makes that to "01"
  • writing file_audio.raw["tracknumber"] = value_sani results in "01/0" (read with mp3tag-program)
  • reading again raw only brings me the "01"

do you have a tip how to avoid that and access the real underlying tagfield? i thought raw was exactly for that. i don't want the antiquated totaltracks mangled in :(

Removing custom tags

Some files may contain custom tags, which are not hardcoded in the library. For example I encountered a file with "album artist" instead of "albumartist". Or I can just insert "abc" tag in a program like Picard or mp3tag to test a completely random tag name.

Removing them with f.remove_tag(tag_name) doesn't work. For "album artist", the tag is still in the file after saving. For "abc", a KeyError is raised during lookup in AudioFile.tag_map, which does not contain "abc" entry, even though there is a tag named like that in the audio file.

I found a workaround based on #28: del f.mfile.tags[tag_name] However, it doesn't look like the expected usage of the API.

Artwork MIME type causing problems

In a some cases, when adding cover art to file, the type doesn't get recognized and the mime is set to type/None.
This causes some problems when working with audio file readers that rely on this to show the artwork.

Maybe it would be better if it could raise an exception so that users can know whats wrong at least.

Consider adding additional Details - BPM? [Enhancement]

I'm writing a script that is analyzing libraries of music, estimating tempo (BPM). I want it to write the BPM tag back into the metadata I'm working in Windows at the moment - and note that in windows, and most music tagging software - BPM (or Beats-per-minute) is available as an editable data item. I'm primarily editing .wav and .mp3 files' information.

Your library is one of the easiest to use in my opinion, but doesn't have the BPM in your dict of the editable items. I did take a quick peek at Mutagen and your music-tag code, but I couldn't find the specific place to suggest an edit...

I do think I figured out the the ID3 Frame is 'TBPM' but I'm not 100% that's how it works for all formats etc.

Would you consider adding BPM to your dict?

is a command line interface within scope?

I looked around for audio file cli tagging utils that wrap mutagen to allow explicit naming via cli. I found small snippets and complete library management suites, but no yet a straightforward mutagen based util.

You explain in #1 (comment) the initial scope of your lib to be a opinionated tag cleaner/sanitizer. Do you see a cli interface to set tags explicitly within the scope of your library or is the opinionated aspect a hinderance and/or you'd rather see music-tag as a dependency of a cli wrapper?

M4a artist being empty despite fact value is not empty

Hi,

def get_details(path):
    audiofile = music_tag.load_file(path)
    title = audiofile['title']
    artist = audiofile['artist']
    print(artist.values)
    if str(artist) == "":
        artist = str(audiofile['albumartist']) + " [Album Artist]"
    return title, artist

This returns an empty value for the artist section despite the fact itunes definitely has a value there. Happens for all M4a files not sure why. But album artist works fine.

RFE: Allow users to choose year sanitization

I was surprised that almost half of the recent forks were there solely to circumvent or alter how year sanitization works (just before repeating the same thing myself). If it can be presented as a module setting, like:

import music_tag

music_tag.YEAR_SANITIZE = True(default) | False(disable) | Callable

Then all those forks as well as a bunch of open issues don't need to exist (= less headache). What do you think?

Please add support for Audiobooks (.m4b)

This tool is amazing. Reading and writing tags is a breeze!
It should add support for audiobooks too (.m4b). Usually it is very cumbersome to manage those, but this tool can finally solve this issue!
Please, add support for audiobooks specific metadata, like:

Audiobooks Metadata

Name Tag Name FFmetadata MP4 atom Mp3tag ID3v2
Book title Title title ©nam TITLE TIT2
Book title (multi-file) Album album ©alb ALBUM TALB
Chapter title (multi-file) Title title ©nam TITLE TIT2
Book sort-title Sort-title sort_name (title-sort) sonm TITLESORT TSOT
Book sort-title (multi-file) Sort-album sort_album (album-sort) soal ALBUMSORT TSOA
Chapter number (multi-file) Track number track trkn TRACK TRCK
Author Artist artist ©ART ARTIST TPE1
Author (optional override) Album artist album_artist aART ALBUMARTIST TPE2
Narrator Composer composer ©wrt COMPOSER TCOM
Genre Genre genre ©gen GENRE TCON
Release date * Date date ©day YEAR TDRC/TYER
Description Description description (MP4)
TIT3 (MP3)
desc SUBTITLE TIT3

* When being as precise as possible the ISO 8601 format of the string is yyyy-MM-ddTHH:mm:ss (in UTC), but the precision may be reduced by removing as many time indicators as wanted.
Hence valid timestamps are yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm and yyyy-MM-ddTHH:mm:ss.

ADDITIONAL SPECIFICATIONS

There is a dedicated Narrator tag that Audible uses (©nrt) but since not all audiobooks come from Audible, most of the audiobook community uses the composer tag instead for tagging.

Artist/Performer is used for the author because it's the most prominent tag for a person associated with the media, with Composer being the second most commonly viewed tag.

If you want to cover your bases (i.e. have accurate metadata, but also use the community standard metadata working on popular apps) you must do it this way:

Author(s)(iTunes / ID3 -- I will try to include options for both 2.4 and 2.3)
Artist:
©ART / TPE1 (standard)
©aut or auth / TIPL: Author or IPLS: Author (OCD-version)

First Author (for multi-author books, or editor of an anthology. Whoever you want to be most recognized/searchable for this book)
aART / TPE2 (standard)

Narrator(s)
©com or ©wrt / TCOM (standard)
©nrt or perf / TMCL: Narrator or IPLS: Narrator (custom)

Publisher
There are 2-3 different tags that can be used for this. ©pub/TPUB are both the most common and the most accurate, but some apps won't recognize this. If they don't, they're probably looking for ©lab (label -- not sure if there is an ID3 equivalent) or possibly even the studio tag, which I can't remember off the top of my head.

Series
Ideally individual books in a series should be tagged in the way discs in a multi-disc album are tagged. So "Album" would be the series title, and then "Title" would be the book title, and you'd use the "disc#" tag for the series index. However there are any number of ways to do this, and none of them are going to be universal. Here are a couple, however:

Audible uses series and series-part for this purpose (I don't remember off the top of my head what the MP4 code is for these, but I think it's one that Audible created and not part of the standard library).
I think that tag probably gets lost when converting to ID3 though, so you could create TXXX: Series and TXXX: Series Index tags for this. That's one option.

Some people use the Grouping or Content Group tags for this:
©grp / TIT1 - Series title

A more precise way to go is to use the movement/movement index tags:
©mvn / MNVN - Series title
©mvi and MVIN - Series index
That seems to be the second-most popular option, probably because those tags already exist in both MP4/Quicktime tagging and ID3 tagging.

If you have books that are in a multi-series universe (eg. Terry Brooks' Shannara universe), you could also use the "Work" tags in addition to the "Movement" tags:
©wrk / TIT1 - Universe title

If you use .m4b files rather than .mp3, you can also use the tags available for TV Shows:
tvsh - series title
tven - book title
tves - series index
tvnn - Universe title
tvsn - Universe index (i.e. where the sub-series falls within the universe as a whole, so you know which subseries to read in which order.)

There's no real advantage either way. Some apps don't look for series data but they look for the subtitle so they can display "Series Title, Book Index".

Thanks in advance!

NotImplementedError: Mutagen type <class 'mutagen.wave.WAVE'> not implemented

Hi,
Don't know how far along you are in testing different formats, but I'm getting this error when trying to open a file I wrote with python wave.

File "main.py", line 48, in chainRecord
    songFile = music_tag.load_file(filePath)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/music_tag/__init__.py", line 61, in load_file
    "".format(type(mfile)))
NotImplementedError: Mutagen type <class 'mutagen.wave.WAVE'> not implemented

Years tag

Hello,
I'm working on a python script which downloads an album with youtube-dl and tags the files. It gets track names and release years from youtube's metadata and the user provides the artist's name and album title.
Everything ends up in the MP3 file, except the year.
This is where the year is set in the source code.

Can you help me with this ?

music_tag.load_file() can alter path-name and lead to exception

input file example: "10. Time = $$$.opus"

music_tag.load_file() has os.path.expand###() in the first line:
filename = os.path.expanduser(os.path.expandvars(filename))

unfortunately os.path.expandvars() changes the file-name to "10. Time = $$.opus". This one clearly doesn't match and causes the exception.

i added an additional argument "path_expand:bool=True" to the function (in my fork), so the function behaves as before, but can be changed if you already work with absolute paths / os.path-Lib.

Another solution would be to check if the file exists or python can see it and don't expand as a result.

ERRROR: partially initialized module `music_tag` has no attribute `load_file`

I faced the issue when using your module.

The step procedure is following:

  1. Install music-tag
~/work/script/music_tag pip3 install music-tag --upgrade
Requirement already up-to-date: music-tag in /home/quyleanh/.local/lib/python3.8/site-packages (0.4.2)
Requirement already satisfied, skipping upgrade: mutagen in /usr/local/lib/python3.8/dist-packages/mutagen-1.45.1-py3.8.egg (from music-tag) (1.45.1)
  1. Run python script
~/work/script/music_tag python3 music_tag.py
Traceback (most recent call last):
  File "music_tag.py", line 1, in <module>
    import music_tag
  File "/home/quyleanh/work/script/music_tag/music_tag.py", line 4, in <module>
    f = music_tag.load_file("test.flac")
AttributeError: partially initialized module 'music_tag' has no attribute 'load_file' (most likely due to a circular import)

My music_tag.py content is following:

import music_tag

f = music_tag.load_file("test.flac")
print(f['title'])

Could you please take a look at this?

Can't remove a tag

This is what f.mfile loads:
{'copyright': ['2023 Viper Recordings'], 'comment': [''], 'compilation': ['1'], 'title': ['Rituals VIP'], 'album': ['Viper Presents: Annual 2023'], 'disctotal': ['01'], 'date': ['2023'], 'discnumber': ['1'], 'tracktotal': ['26'], 'albumartist': ['VA'], 'tracknumber': ['2'], 'year': ['2023'], 'genre': ['Drum & Bass'], 'artist': ['Millbrook']}

I want to remove 'date': ['2023']

I am doing
del f['date']
f.remove_tag('date')
f.save()

Error I'm getting:
Traceback (most recent call last):
File ".\test.py", line 6, in <module>
del f['date']
File "C:\Python39\lib\site-packages\music_tag\file.py", line 609, in __delitem__
self.remove_tag(norm_key)
File "C:\Python39\lib\site-packages\music_tag\file.py", line 555, in remove_tag
tmap = self.tag_map[norm_key]
KeyError: 'date'

can't get comment field values...

for the first, accept my thank for your lib! it's the best

only one thing is upsetting..
maybe I do something wrong, but my program can't get info from comment fields

it returns empty line
so that I need to use another lib (TinyTag) and it's not really professional

I compared tag mapping for comment and it matched

I tested on the same files
and TinyTag lib gets comment value, music_tag doesn't

please, can you help with that.... ?

here is the link for 5 files (as an example)
https://yadi.sk/d/dONCP2vSD-nT4g
please, check them for confirm the problem....

Add ISRC tag

Hi,
Thanks a lot for this tool which is really amazingly simple and useful.
My only suggestion would be to add the ISRC tag, because it is really useful to keep good ID recognization of songs.
If I got the time, I will try to do a PR, but not sure of being able to do this!

Tagging a wave file not working§

Hello!

I have just tried using your library and tried to add ID3 tags to a wave file and it does not seem to be working, I am wondering if I am using it correctly for wavs? Is there anything special that needs to be done in order to get this to work with wave files?

EDIT: On further investigation and looking through your test code, I managed to print out the tags on the file. They are there however Rekordbox does not read them in as it should do. What version of ID3 does the library use?

Really good idea with the library, epic initiative :)

def test_tag():
    p = '/Users/benhearn/Music/test_folder/renaming_cells/Harry Wills - Slink .wav'
    import music_tag
    wav = music_tag.load_file(p)
    wav['title'] = 'Slink'
    wav['artist'] = 'Harry Wills'
    wav.save()
    print('done')

KeyError when setting PNG artwork of mode LA

With Pillow installed, I'm trying to set an artwork with this PNG image: https://1drv.ms/i/s!Aq1PMiDnHe9tk6FFfAZPq36aBZwRIQ?e=ayRcrb

Here is my code:

import music_tag

media_path = "/path/to/media"
image_path = "/path/to/image"
tags = music_tag.load_file(media_path)
with open(image_path, 'rb') as img:
    tags["artwork"] = img.read()

I'm getting this error:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[9], line 2
      1 with open(f'data/artists/media/{artist_id}/artwork.png', 'rb') as img:
----> 2     tags["artwork"] = img.read()

File ~/Workspace/media-downloader/.venv/lib/python3.11/site-packages/music_tag/file.py:603, in AudioFile.__setitem__(self, norm_key, val)
    602 def __setitem__(self, norm_key, val):
--> 603     self.set(norm_key, val)

File ~/Workspace/media-downloader/.venv/lib/python3.11/site-packages/music_tag/file.py:500, in AudioFile.set(self, norm_key, val, typeless)
    497 md_sanitizer = None if typeless else tmap.sanitizer
    499 if not isinstance(val, MetadataItem):
--> 500     val = MetadataItem(md_type, md_sanitizer, val)
    502 if hasattr(tmap.setter, '__call__'):
    503     tmap.setter(self, norm_key, val)

File ~/Workspace/media-downloader/.venv/lib/python3.11/site-packages/music_tag/file.py:67, in MetadataItem.__init__(self, typ, sanitizer, val)
     65 self.type = typ
     66 self.sanitizer = sanitizer
---> 67 self.values = val

File ~/Workspace/media-downloader/.venv/lib/python3.11/site-packages/music_tag/file.py:92, in MetadataItem.values(self, val)
     90     v = self.sanitizer(v)
     91 if not (self.type is None or v is None or isinstance(v, self.type)):
---> 92     v = self.type(v)
     93 self._values[i] = v

File ~/Workspace/media-downloader/.venv/lib/python3.11/site-packages/music_tag/file.py:187, in Artwork.__init__(self, raw, width, height, fmt, depth, pic_type)
    184     fmt = img.format.lower()
    185     mode2depth = {'1': 1, 'L': 8, 'P': 8, 'RGB': 24, 'RGBA': 32,
    186                   'CMYK': 32, 'YCbCr': 24, 'I': 32, 'F': 32}
--> 187     depth = mode2depth[img.mode]
    188 except ImportError:
    189     width = None

KeyError: 'LA'

Looks like some PNG modes are unsupported.

Several Tag-Fields are int()

First, let me thank you for your lib - it saved me a lot of time!

Second i wanted to ask you why some fields like "tracknumber" and "year" are int-only? I only checked one use-case for Opus / Vorbis Comment and all fields are stored as UTF-8 (https://en.wikipedia.org/wiki/Vorbis_comment).

Yes, converting to int() has some free cleaning-advantages but also makes ie. leading zeros in tracknumbers impossible. I think it would be more helpful to give the control back to the user - he is already brave enough to overwrite the tags :)

What do you think?

Year sanitazer fails with values met in the wild

I've got error: ValueError: Could not extract year from: 2014-11-18 15:05:00
I propose following patch to sanitize_year():

if re.match(r'^[0-9]{4}[-\s][0-9]{2}[-\s][0-9]{2}(?:[T\s][0-9]{2}:[0-9]{2}:[0-9]{2})?$', year):

instead of

if re.match(r'^[0-9]{4}[-\s][0-9]{2}[-\s][0-9]{2}$', year):

Error occured only on Windows

Error occured when adding an artwork to a m4a file on Windows, however, it's success on macOS and Linux.

failed on my project on windows
image
test with code

import music_tag
a = music_tag.load_file(r'E:\Users\Documents\GitHub\ASoulMP3maker\a.m4a')
a['artwork'] = open(r'E:\Users\Documents\GitHub\ASoulMP3maker\j.jpg','rb').read()
a.save()

error info on window

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\17374\AppData\Local\Programs\Python\Python39\lib\site-packages\music_tag\file.py", line 603, in __setitem__
    self.set(norm_key, val)
  File "C:\Users\17374\AppData\Local\Programs\Python\Python39\lib\site-packages\music_tag\file.py", line 503, in set
    tmap.setter(self, norm_key, val)
  File "C:\Users\17374\AppData\Local\Programs\Python\Python39\lib\site-packages\music_tag\mp4.py", line 99, in set_artwork
    raise TypeError('mp4 artwork should be either jpeg or png')
TypeError: mp4 artwork should be either jpeg or png

success on linux
image

Here is the m4a file i wanna edit.

musicfile.zip

cli --print / --to-csv breaks when year malformed

What about using file.raw to let print / export to csv badformed metadata ?

00:40 $ python3 -m music_tag --to-csv  tags.csv sample
Traceback (most recent call last):
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/util.py", line 26, in sanitize_year
    year = int(year)
ValueError: invalid literal for int() with base 10: '2019-09-26 10'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/natus/.pyenv/versions/3.9.6/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/natus/.pyenv/versions/3.9.6/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/__main__.py", line 175, in <module>
    sys.exit(_main())
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/__main__.py", line 134, in _main
    row = [mt_f[k] for k in tags] + [fname]
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/__main__.py", line 134, in <listcomp>
    row = [mt_f[k] for k in tags] + [fname]
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/file.py", line 600, in __getitem__
    return self.get(norm_key, default=None)
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/file.py", line 443, in get
    ret = None if val is None else MetadataItem(md_type, md_sanitizer,
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/file.py", line 67, in __init__
    self.values = val
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/file.py", line 90, in values
    v = self.sanitizer(v)
  File "/home/natus/git/music/.direnv/python-3.9.6/lib/python3.9/site-packages/music_tag/util.py", line 33, in sanitize_year
    raise ValueError("Could not extract year from: {0}".format(year))
ValueError: Could not extract year from: 2019-09-26 10

problem in save self.mfile.save(**kwargs)

I Don't really understand why this happing. I currently developing a music bash editing software.
Some files in the folder works fine. Others have error like that.

Traceback (most recent call last):
File "/Users/apple/PycharmProjects/Onsei_manager/main.py", line 41, in
editFilesByMatchingPattern(dirct, audioTup1)
File "/Users/apple/PycharmProjects/Onsei_manager/main.py", line 22, in editFilesByMatchingPattern
onsei_tag.EditAudio(os.path.join(parentDir, filenames),
File "/Users/apple/PycharmProjects/Onsei_manager/onsei_tag.py", line 16, in init
self.embed_pic(path, audiofile, imagepath)
File "/Users/apple/PycharmProjects/Onsei_manager/onsei_tag.py", line 32, in embed_pic
audiofile.save()
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/music_tag/file.py", line 374, in save
self.mfile.save(**kwargs)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_util.py", line 156, in wrapper
return func(self, h, *args, **kwargs)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_file.py", line 132, in save
return self.tags.save(filething, **kwargs)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_util.py", line 185, in wrapper
return func(*args, **kwargs)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_util.py", line 156, in wrapper
return func(self, h, *args, **kwargs)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/wave.py", line 129, in save
wave_file.insert_chunk(u'id3')
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/iff.py", line 338, in insert_chunk
return self.root.insert_chunk(id
, data)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_iff.py", line 260, in insert_chunk
insert_bytes(self._fileobj, size, next_offset)
File "/Users/apple/PycharmProjects/Onsei_manager/venv/lib/python3.9/site-packages/mutagen/_util.py", line 788, in insert_bytes
raise ValueError
ValueError

Album Sort Name Support

Im sure this is long dead, judging by the lack of activity, but I'd love to see it support AlbumSortName fields. Currently using it to write audiobook data, and the Album Sort name keeps the 'series' data in it.

Support indexing and freetext on .opus, etc.

Related to: #42

The spec for an index entry is:

CHAPTER000NAME=Intro
CHAPTER001=00:05:40.512
CHAPTER001NAME=The First Chapter
.
.
.

I don't know how you do that on the backend since the keys are CHAPTER{000..999}, CHAPTER{000..999}NAME, but if they're "dictionary" entries, that's cool.

Further, a free-text option/flag would both obviate the need to deal with the 2000 keys for chapter duration and name and offer more versatilitiy and flexibility for those who can make use of it. Locking things to a pre-chosen dictionary inherently limits the usefulness of this library for applications not imagined by the author(s) and opens up the program to applications such as audiobooks, i.e., see the above-mentioned existing issue, № 42.

How to embed lyrics?

I tried
f['lyrics'] = str(lyrics)
and
f.append_tag('lyrics', str(lyrics))
and also tried

f.['lyrics'].value = str(lyrics)

which produced an error

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.