Skip to content

Instantly share code, notes, and snippets.

@blha303
Created September 13, 2016 07:09
Show Gist options
  • Save blha303/dddcfee27edff547f5843187500c7ff7 to your computer and use it in GitHub Desktop.
Save blha303/dddcfee27edff547f5843187500c7ff7 to your computer and use it in GitHub Desktop.
Because MP3Tag is a bit overkill for this task
#!/usr/bin/env python3
from mutagen.easyid3 import EasyID3 # pypi mutagen
from parse import parse # pypi parse
from argparse import ArgumentParser
from glob import glob
from sys import exit
def write_tags(filename, newinfo):
audio = EasyID3(filename)
audio.update(newinfo)
audio.save()
return "{}: {}".format(filename, str(audio))
def main():
parser = ArgumentParser()
parser.add_argument("format", help="String format for input files e.g '{tracknumber} {title}.mp3'. Use '\"\" \"\" --print-keys' for valid keys")
parser.add_argument("files", nargs="+", help="Filenames to process. Accepts shell wildcard expansion")
parser.add_argument("--artist", help="Artist name to add to track tags, overriding filename")
parser.add_argument("--album", help="Album name to add to track tags, overriding filename")
parser.add_argument("--print-keys", help="Prints valid keys for string format via mutagen. You'll need to add \"\" \"\" to satisfy the missing format/files parameters.", action="store_true")
argv = parser.parse_args()
if argv.print_keys:
print(EasyID3.valid_keys.keys())
return 0
if len(argv.files) == 1:
argv.files = glob(argv.files[0])
for f in argv.files:
newinfo = parse(argv.format, f)
if not newinfo:
print("Error parsing {}: Format does not match filename".format(f))
continue
newinfo = newinfo.named
if argv.artist: newinfo["artist"] = argv.artist
if argv.album: newinfo["album"] = argv.album
print(write_tags(f, newinfo))
return 0
if __name__ == "__main__":
try:
exit(main())
except KeyboardInterrupt:
exit(130)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment