From bd9f6c552aaa179985f6f1d010a45b0263936f60 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 4 Jul 2026 15:58:01 +0200 Subject: [PATCH] init --- README | 7 ++++++ folder-to-genre.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 README create mode 100644 folder-to-genre.py diff --git a/README b/README new file mode 100644 index 0000000..51d5b5c --- /dev/null +++ b/README @@ -0,0 +1,7 @@ +# music-scripts + +The name should be self-explainatory + +## Scripts + +``folder-to-genre.py``: Recurses through a given folder and adds the parent folder as genre to all found .flac files \ No newline at end of file diff --git a/folder-to-genre.py b/folder-to-genre.py new file mode 100644 index 0000000..a60c55c --- /dev/null +++ b/folder-to-genre.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import sys +from pathlib import Path +from mutagen.flac import FLAC + + +def seek_and_tag(root_dir, replace=False, dry_run=False): + root = Path(root_dir).expanduser().resolve() + + if not root.is_dir(): + print(f"Error: not a directory: {root}") + sys.exit(1) + + for file in root.rglob("*.flac"): + folder = file.parent.name.strip() + if not folder: + print(f"{file}: no parent folder name found, skipping...") + continue + try: + audio = FLAC(file) + + old_genres = list(audio.get("genre", [])) + + if folder in old_genres: + print(f"{file}: folder ({folder}) already in genres, skipping...") + continue + new_genres = [folder] if replace else [*old_genres, folder] + + print(f"{file}:") + print(f" Old: {old_genres}") + print(f" New: {new_genres}") + if not dry_run: + audio["genre"] = new_genres + audio.save() + + except Exception as e: + print(f"{file}: Failed: {e}") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print( + f"Usage: python {sys.argv[0]} [--replace] [--dry-run] /path/to/music", + file=sys.stderr, + ) + print("", file=sys.stderr) + print("\t--dry-run: don't modify files", file=sys.stderr) + print("\t--replace: remove original genres", file=sys.stderr) + sys.exit(1) + + replace = "--replace" in sys.argv + dry_run = "--dry-run" in sys.argv + root_dir = sys.argv[-1] + + seek_and_tag(root_dir, replace=replace, dry_run=dry_run)