1 changed files with 71 additions and 0 deletions
@ -0,0 +1,71 @@ |
|||
#!/usr/bin/env python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
from fuzzywuzzy import fuzz, process |
|||
from mutagen.easyid3 import EasyID3 |
|||
from mutagen.id3 import ID3NoHeaderError |
|||
import os |
|||
from os.path import basename, normpath, splitext |
|||
import sys |
|||
|
|||
|
|||
def eprint(*args, **kwargs): |
|||
print(*args, file=sys.stderr, **kwargs) |
|||
|
|||
|
|||
def filename(f): |
|||
return splitext(normpath(basename(f)))[0] |
|||
|
|||
|
|||
dirs = [] |
|||
for d in sys.argv[1:]: |
|||
if not os.path.isdir(d): |
|||
eprint("Error: Cannot open {}: not a directory".format(d)) |
|||
sys.exit(1) |
|||
dirs += [d] |
|||
|
|||
for d in dirs: |
|||
# Get first level file list |
|||
(root, _, files) = next(os.walk(d)) |
|||
dir_artist = filename(d) |
|||
|
|||
for f in files: |
|||
f = os.path.join(root, f) |
|||
name = filename(f) |
|||
name_parts = name.split(" - ") |
|||
file_artist = name_parts[0] |
|||
fuzzy_artist = process.extractOne(dir_artist, name_parts, scorer=fuzz.token_sort_ratio) |
|||
|
|||
if len(name_parts) < 2: |
|||
eprint("Error: No title found for {}".format(f)) |
|||
continue |
|||
|
|||
file_title = name_parts[1] |
|||
|
|||
if dir_artist != file_artist: |
|||
eprint("""Error: Artist name mismatch between folder and file: {} |
|||
Fuzzy score = {:3d}, artist = {}""".format(f, fuzzy_artist[1], fuzzy_artist[0])) |
|||
# Test for common artist name patterns |
|||
if fuzzy_artist[1] < 90: |
|||
r = fuzz.ratio(dir_artist, "the " + fuzzy_artist[0]) |
|||
if True: # r >= 95: |
|||
eprint(" Fuzzy match r={} for: {}".format( |
|||
r, |
|||
"the " + fuzzy_artist[0])) |
|||
continue |
|||
|
|||
try: |
|||
id3 = EasyID3(f) |
|||
except ID3NoHeaderError: |
|||
id3 = EasyID3() |
|||
if id3 is None: |
|||
eprint("Error: cannot open {} for tagging".format(f)) |
|||
continue |
|||
|
|||
if "artist" not in id3.keys(): |
|||
id3["artist"] = file_artist |
|||
print("Artist set to {}".format(file_artist)) |
|||
if "title" not in id3.keys(): |
|||
id3["title"] = file_title |
|||
print("Title set to {}".format(file_title)) |
|||
# id3.save(f) |
|||
Loading…
Reference in new issue