10 Commits

Author SHA1 Message Date
Jamie Hardt
49055ef881 lint 2025-05-25 11:25:54 -07:00
Jamie Hardt
ecc93640c2 Completed the feature. 2025-05-25 11:23:55 -07:00
Jamie Hardt
538da34a0c lint 2025-05-25 10:55:09 -07:00
Jamie Hardt
2d4ea5a8d8 /John/George 2025-05-25 10:52:59 -07:00
Jamie Hardt
532f67e3a8 Refactored some code 2025-05-25 09:32:59 -07:00
Jamie Hardt
4989832247 autopep (added explicit encoding for from-file) 2025-05-25 08:29:57 -07:00
Jamie Hardt
549f49da31 autopep 2025-05-25 08:28:32 -07:00
Jamie Hardt
ba3b0dbf96 Added implementation 2025-05-25 08:27:11 -07:00
Jamie Hardt
2c135d413e twiddle text 2025-05-24 21:30:14 -07:00
Jamie Hardt
334fa56a2c Update __main__.py 2025-05-24 20:59:53 -07:00

View File

@@ -8,8 +8,9 @@ from subprocess import CalledProcessError, run
import sys import sys
from argparse import ArgumentParser from argparse import ArgumentParser
import shlex import shlex
from typing import Callable from typing import Callable, List, Tuple
import inspect import inspect
from io import StringIO
from tqdm import tqdm from tqdm import tqdm
@@ -29,59 +30,40 @@ def execute_batch_list(batch_list_path: str, dry_run: bool, interactive: bool):
parser.eval(line, line_no, interactive) parser.eval(line, line_no, interactive)
def create_batch_list(command_file: str, recursive=True, sort_mode='path'): def sort_flac_files(file_list, mode):
""" "Sort flac files"
Read all FLAC files in the cwd and create a batchfile that re-creates all if mode == 'path':
of their metadata. return sorted(file_list)
if mode == 'mtime':
return sorted(file_list, key=os.path.getmtime)
if mode == 'ctime':
return sorted(file_list, key=os.path.getctime)
if mode == 'name':
return sorted(file_list, key=os.path.basename)
:param recursive: Recursively enter directories return file_list
:param sort_mode: Order of paths in the batch list. Either 'path',
'mtime', 'ctime', 'name'
"""
with open(command_file, mode='w', encoding='utf-8') as f:
f.write("# mfbatch\n\n")
# f.write("""
# # :set DESCRIPTION ""
# # :set TITLE ""
# # :set VERSION ""
# # :set ALBUM ""
# # :set ARTIST ""
# # :set TRACKNUMBER ""
# # :set COPYRIGHT ""
# # :set LICENSE ""
# # :set CONTACT ""
# # :set ORGAIZATION ""
# # :set LOCATION ""
# # :set MICROPHONE ""
# """)
metadatums = {}
flac_files = glob('./**/*.flac', recursive=recursive)
if sort_mode == 'path':
flac_files = sorted(flac_files)
elif sort_mode == 'mtime':
flac_files = sorted(flac_files, key=os.path.getmtime)
elif sort_mode == 'ctime':
flac_files = sorted(flac_files, key=os.path.getctime)
elif sort_mode == 'name':
flac_files = sorted(flac_files, key=os.path.basename)
for path in tqdm(flac_files, unit='File', desc='Scanning FLAC files'): def write_batchfile_entries_for_file(path, metadatums) -> Tuple[dict, str]:
"Create batchfile entries for `path`"
buffer = StringIO()
try: try:
this_file_metadata = metadata_funcs.read_metadata(path) this_file_metadata = metadata_funcs.read_metadata(path)
except CalledProcessError as e: except CalledProcessError as e:
f.write(f"# !!! METAFLAC ERROR ({e.returncode}) while reading " buffer.write(f"# !!! METAFLAC ERROR ({e.returncode}) while reading "
f"metadata from the file {path}\n\n") f"metadata from the file {path}\n\n")
continue return metadatums, buffer.getvalue()
for this_key, this_value in this_file_metadata.items(): for this_key, this_value in this_file_metadata.items():
if this_key not in metadatums: if this_key not in metadatums:
f.write(f":set {this_key} " buffer.write(f":set {this_key} "
f"{shlex.quote(this_value)}\n") f"{shlex.quote(this_value)}\n")
metadatums[this_key] = this_value metadatums[this_key] = this_value
else: else:
if this_value != metadatums[this_key]: if this_value != metadatums[this_key]:
f.write(f":set {this_key} " buffer.write(f":set {this_key} "
f"{shlex.quote(this_value)}" f"{shlex.quote(this_value)}"
"\n") "\n")
metadatums[this_key] = this_value metadatums[this_key] = this_value
@@ -89,10 +71,42 @@ def create_batch_list(command_file: str, recursive=True, sort_mode='path'):
keys = list(metadatums.keys()) keys = list(metadatums.keys())
for key in keys: for key in keys:
if key not in this_file_metadata: if key not in this_file_metadata:
f.write(f":unset {key}\n") buffer.write(f":unset {key}\n")
del metadatums[key] del metadatums[key]
f.write(path + "\n\n") buffer.write(path + "\n\n")
return metadatums, buffer.getvalue()
def create_batch_list(flac_files: List[str], command_file: str,
sort_mode='path'):
"""
Read all FLAC files in the cwd and create a batchfile that re-creates all
of their metadata.
:param flac_files: Paths of files to create batchfile from
:param command_file: Name of new batchfile
:param sort_mode: Order of paths in the batch list. Either 'path',
'mtime', 'ctime', 'name'
:param input_files: FLAC files to scan
"""
flac_files = sort_flac_files(flac_files, sort_mode)
with open(command_file, mode='w', encoding='utf-8') as f:
metadatums = {}
f.write("# mfbatch\n\n")
for path in tqdm(flac_files, unit='File',
desc='Scanning with metaflac...'):
metadatums, buffer = write_batchfile_entries_for_file(path,
metadatums)
f.write(buffer)
f.write("# mfbatch: create batchlist operation complete\n")
def main(): def main():
@@ -105,6 +119,10 @@ def main():
op.add_argument('-c', '--create', default=False, op.add_argument('-c', '--create', default=False,
action='store_true', action='store_true',
help='create a new list') help='create a new list')
op.add_argument('-F', '--from-file', metavar='FILE_LIST', action='store',
default=None, help="get file paths from FILE_LIST when "
"creating, instead of scanning directory"
"a new list")
op.add_argument('-e', '--edit', action='store_true', op.add_argument('-e', '--edit', action='store_true',
help="open batch file in the default editor", help="open batch file in the default editor",
default=False) default=False)
@@ -152,7 +170,18 @@ def main():
if options.create: if options.create:
mode_given = True mode_given = True
create_batch_list(options.batchfile, sort_mode=options.sort) flac_files: List[str] = []
if options.from_file:
with open(options.from_file, mode='r',
encoding='utf-8') as from_file:
flac_files = [line.strip() for line in from_file.readlines()]
else:
flac_files = glob('./**/*.flac', recursive=True)
# print(flac_files)
create_batch_list(flac_files, options.batchfile,
sort_mode=options.sort)
if options.edit: if options.edit:
mode_given = True mode_given = True