From 464e6fa6cca920ab2f27d9e95f3587e738e2851f Mon Sep 17 00:00:00 2001 From: elskewe <19361925+elskewe@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:06:58 +0200 Subject: [PATCH 1/2] Add progress bar --- lyrics2mp3/api.py | 40 ++++++++++++++++++++++++++-------------- requirements.txt | 1 + 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/lyrics2mp3/api.py b/lyrics2mp3/api.py index f2927ef..1bef053 100644 --- a/lyrics2mp3/api.py +++ b/lyrics2mp3/api.py @@ -1,4 +1,5 @@ import taglib +from rich.progress import Progress import os @@ -132,13 +133,19 @@ def get_lyrics_from_dir(self, dir, ignore_artist=False, simulate=False): if not (dir is None or os.path.isdir(dir)): raise LookupError(f'Directory "{dir}" not found.') - for dir_path, _, files in os.walk(dir): - for file in files: - self.file_lyrics( - os.path.join(dir_path, file), - ignore_artist=ignore_artist, - simulate=simulate, - ) + total_files = sum(len(files) for _, _, files in os.walk(dir)) + + with Progress() as progress: + task = progress.add_task("Processing files", total=total_files) + + for dir_path, _, files in os.walk(dir): + for file in files: + self.file_lyrics( + os.path.join(dir_path, file), + ignore_artist=ignore_artist, + simulate=simulate, + ) + progress.update(task, advance=1) def get_lyrics_from_m3u(self, m3u, ignore_artist=False, simulate=False): if not os.path.isfile(m3u): @@ -147,15 +154,20 @@ def get_lyrics_from_m3u(self, m3u, ignore_artist=False, simulate=False): if not m3u.endswith(".m3u"): raise SyntaxError(f'Playlist "{m3u}" is not M3U format.') - with open(m3u) as m: - for line in m: - line = line.strip() - if line.upper().startswith("#EXT"): - continue + with Progress() as progress: + with open(m3u) as m: + total_lines = sum(1 for line in m if not line.upper().startswith("#EXT")) + m.seek(0) + task = progress.add_task("Processing files", total=total_lines) - self.file_lyrics(line, ignore_artist=ignore_artist, simulate=simulate) + for line in m: + line = line.strip() + if line.upper().startswith("#EXT"): + continue + self.file_lyrics(line, ignore_artist=ignore_artist, simulate=simulate) + progress.update(task, advance=1) - def file_lyrics(self, file_path, ignore_artist=False, simulate=False): + def file_lyrics(self, file_path, ignore_artist=False, simulate=False, progress=None, task=None): self.parse_file(file_path, ignore_artist=ignore_artist, simulate=simulate) if not self.verbose: self.report_progress(inline=True) diff --git a/requirements.txt b/requirements.txt index 77dcabe..d955a66 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ beautifulsoup4 requests>=2 pytaglib +rich lyricsgenius>=3.0.1,<4.0 From 1de06941160db65e365ec4e8695795c515f7a3f4 Mon Sep 17 00:00:00 2001 From: elskewe <19361925+elskewe@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:08:15 +0200 Subject: [PATCH 2/2] Print details about processed files as description of the progress bar --- lyrics2mp3/api.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lyrics2mp3/api.py b/lyrics2mp3/api.py index 1bef053..9589abf 100644 --- a/lyrics2mp3/api.py +++ b/lyrics2mp3/api.py @@ -144,6 +144,8 @@ def get_lyrics_from_dir(self, dir, ignore_artist=False, simulate=False): os.path.join(dir_path, file), ignore_artist=ignore_artist, simulate=simulate, + progress=progress, + task=task, ) progress.update(task, advance=1) @@ -164,23 +166,24 @@ def get_lyrics_from_m3u(self, m3u, ignore_artist=False, simulate=False): line = line.strip() if line.upper().startswith("#EXT"): continue - self.file_lyrics(line, ignore_artist=ignore_artist, simulate=simulate) + self.file_lyrics(line, ignore_artist=ignore_artist, simulate=simulate, + progress=progress, task=task) progress.update(task, advance=1) def file_lyrics(self, file_path, ignore_artist=False, simulate=False, progress=None, task=None): self.parse_file(file_path, ignore_artist=ignore_artist, simulate=simulate) if not self.verbose: - self.report_progress(inline=True) + self.report_progress(progress=progress, task=task) - def report_progress(self, inline=False): + def report_progress(self, progress=None, task=None): l_sum = self.have_lyrics + self.added_lyrics + self.no_lyrics_found + self.err txt = f"{self.added_lyrics} added, {self.no_lyrics_found} not found, {self.err} errored." if not self.overwrite: txt = f"{self.have_lyrics} existing, {txt}" txt = f"{l_sum} processed: {txt}" - if inline: - print(f"\r{txt}", end="") + if progress: + progress.update(task, description=txt) else: print(txt)