from musicutil.types import File
from musicutil.utils.load_tag_information import load_tag_information
from musicutil.utils.scan_for_music import scan_for_music
from html import escape as escape_html
class GenHTMLArgs():
src: str
dest: str
title: str
description: str
by_folder: bool
def add_genhtml_command(subparsers):
genhtml_parser = subparsers.add_parser('genhtml')
genhtml_parser.add_argument(
'src',
type=str,
help='src base music directory')
genhtml_parser.add_argument(
'dest',
type=str,
help='dest html file')
genhtml_parser.add_argument(
'title',
type=str,
help='title')
genhtml_parser.add_argument(
'description',
type=str,
help='description')
genhtml_parser.add_argument(
'--by-folder',
action='store_true')
def get_genhtml_args(args) -> GenHTMLArgs:
command_args = GenHTMLArgs()
command_args.src = args.src
command_args.dest = args.dest
command_args.title = args.title
command_args.description = args.description
command_args.by_folder = args.by_folder
return command_args
def make_table_for_files(files: list[File], by_folder: bool = False) -> str:
html_content = ""
path_head = "
Path | " if not by_folder else ""
html_content += f"""
{path_head}
Title |
Artist |
Format |
"""
isOdd = True
print(files)
for file in files:
tdClass = "pure-table-odd" if isOdd else "pure-table-even"
data_path = escape_html(file.path_from_src)
data_title = escape_html(file.tags.title)
data_artist = escape_html(file.tags.artist)
data_extension = escape_html(file.extension)
path_data = f"{data_path} | " if not by_folder else ""
html_content += f"""
{path_data}
{data_title} |
{data_artist} |
{data_extension} |
"""
isOdd = not isOdd
html_content += """
"""
return html_content
class GenHTMLCommand():
def __init__(self, args: GenHTMLArgs):
self.args = args
def run(self):
print("Generating HTML...")
print("Scanning For Music...")
files = scan_for_music(self.args.src)
print("Loading Tag Information")
for file in files:
tags = load_tag_information(file)
file.tags = tags
files.sort(key=lambda file: file.tags.artist)
files.sort(key=lambda file: file.tags.title)
files.sort(key=lambda file: file.path_from_src)
html_content = ""
html_content += f"""
{self.args.title}
"""
if self.args.by_folder:
files_per_folder: dict[str, list[File]] = {}
for file in files:
if not file.path_from_src in files_per_folder.keys():
files_per_folder[file.path_from_src] = []
files_per_folder[file.path_from_src].append(file)
for folder in files_per_folder.keys():
folder_name = folder
folder_files = files_per_folder[folder_name]
html_content += f"{folder_name}
"
html_content += make_table_for_files(folder_files, True)
else:
html_content += make_table_for_files(files)
html_content += """
"""
print("Writing HTML...")
with open(self.args.dest, "w+") as html_file:
html_file.write(html_content)