diff --git a/app/library/music_tags.py b/app/library/music_tags.py index a9d7f38..f89433c 100644 --- a/app/library/music_tags.py +++ b/app/library/music_tags.py @@ -10,13 +10,15 @@ no Number """ # taken from https://imslp.org/wiki/IMSLP:Abbreviations_for_MusicTags -# Abbreviations at the top will take precidence in reverse lookups +# Include any aliases at the top INSTRUMENTS = """ score Score -cb Double bass -mall Mallet percussion +cb Double Bass +mall Mallet Percussion +vln Violin +vla Viola acc Accordion afl Alto flute @@ -229,6 +231,35 @@ class MusicTag(namedtuple('MusicTag', ('name', 'variant'), defaults=[None])): return f"{self.name} {self.variant}" return self.name +import re +PATTERNS = [re.compile('([A-Za-z]+)[_\- ]*(\d+)'), re.compile('([A-Za-z]+)()')] + +def auto_tag(filename): + ''' + + >>> auto_tag('Ode to Joy - Violin 1.pdf') + MusicTag(name='Violin', variant=1) + >>> auto_tag('Ode to Joy_Cello.pdf') + MusicTag(name='Cello', variant=None) + >>> auto_tag('Ode to Joy violin - 1.pdf') + MusicTag(name='Violin', variant=1) + >>> auto_tag('Ode to Joy - vla.pdf') + MusicTag(name='Viola', variant=None) + >>> auto_tag('Ode to Joy - fl-2 (piccolo).pdf') + MusicTag(name='Flute', variant=2) + ''' + + for pattern in PATTERNS: + for inst, ordinal in pattern.findall(filename): + inst = inst.lower() + ordinal = int(ordinal) if ordinal else None + if inst in MUSIC_TAG_BY_NAME: + return MusicTag(inst.title(), ordinal) + if inst in MUSIC_NAME_BY_TAG: + return MusicTag(MUSIC_NAME_BY_TAG[inst], ordinal) + + + if __name__ == "__main__": import doctest print(doctest.testmod()) \ No newline at end of file diff --git a/app/library/templates/library/project_menu.html b/app/library/templates/library/project_menu.html index 4789d20..6f44fed 100644 --- a/app/library/templates/library/project_menu.html +++ b/app/library/templates/library/project_menu.html @@ -2,6 +2,9 @@