From 2237f8515cc2cfdca0e8ab5ea8e110b56e8b5ebe Mon Sep 17 00:00:00 2001 From: sHa Date: Sun, 28 Dec 2025 10:09:26 +0000 Subject: [PATCH] feat: Bump version to 0.4.4, add logging for file renaming operations, and update test filenames --- dist/renamer-0.4.4-py3-none-any.whl | Bin 0 -> 38028 bytes pyproject.toml | 2 +- renamer/app.py | 32 ++++++++++++++---- renamer/screens.py | 5 +++ ...ron. Boy Genius (2002) [480p,ukr,eng].mkv} | 0 ...tron: Boy Genius (2002).[480p,ukr,eng].mkv | 0 ... (2002) [1080i,ukr,eng] [tmdbid-25913].mkv | 0 ...s (2001) [480p,ukr,eng] [tmdbid-12589].mkv | 0 uv.lock | 2 +- 9 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 dist/renamer-0.4.4-py3-none-any.whl rename renamer/test/filenames/{[02] Balto Wolf Quest (2002) [1080i,ukr,eng].mkv => The Adventures of Jimmy Neutron. Boy Genius (2002) [480p,ukr,eng].mkv} (100%) create mode 100644 renamer/test/filenames/The Adventures of Jimmy Neutron: Boy Genius (2002).[480p,ukr,eng].mkv create mode 100644 renamer/test/filenames/[02] Balto: Wolf Quest (2002) [1080i,ukr,eng] [tmdbid-25913].mkv create mode 100644 renamer/test/filenames/wJimmy Neutron: Boy Genius (2001) [480p,ukr,eng] [tmdbid-12589].mkv diff --git a/dist/renamer-0.4.4-py3-none-any.whl b/dist/renamer-0.4.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..f53d6279c447a4e4d0797f7f05993cecfcced3fa GIT binary patch literal 38028 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 P#0{>!^sK!(Y99RsU0%Z@ literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 550ae2b..313b4e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "renamer" -version = "0.4.3" +version = "0.4.4" description = "Terminal-based media file renamer and metadata viewer" readme = "README.md" requires-python = ">=3.11" diff --git a/renamer/app.py b/renamer/app.py index 85601eb..7793119 100644 --- a/renamer/app.py +++ b/renamer/app.py @@ -71,6 +71,7 @@ class RenamerApp(App): self.scan_files() def scan_files(self): + logging.info("scan_files called") if not self.scan_dir or not self.scan_dir.exists() or not self.scan_dir.is_dir(): details = self.query_one("#details", Static) details.update("Error: Directory does not exist or is not a directory") @@ -213,8 +214,12 @@ class RenamerApp(App): def update_renamed_file(self, old_path: Path, new_path: Path): """Update the tree node for a renamed file.""" - tree = self.query_one("#file_tree", Tree) + logging.info(f"update_renamed_file called with old_path={old_path}, new_path={new_path}") + tree = self.query_one("#file_tree", Tree) + logging.info(f"Before update: cursor_node.data = {tree.cursor_node.data if tree.cursor_node else None}") + + # Update only the specific node def find_node(node): if node.data == old_path: return node @@ -226,14 +231,27 @@ class RenamerApp(App): node = find_node(tree.root) if node: + logging.info(f"Found node for {old_path}, updating to {new_path.name}") node.label = escape(new_path.name) node.data = new_path - # If this node is currently selected, refresh the details - if tree.cursor_node == node: - self._start_loading_animation() - threading.Thread( - target=self._extract_and_show_details, args=(new_path,) - ).start() + logging.info(f"After update: node.data = {node.data}, node.label = {node.label}") + # Ensure cursor stays on the renamed file + tree.select_node(node) + logging.info(f"Selected node: {tree.cursor_node.data if tree.cursor_node else None}") + else: + logging.info(f"No node found for {old_path}") + + logging.info(f"After update: cursor_node.data = {tree.cursor_node.data if tree.cursor_node else None}") + + # Refresh the details if the node is currently selected + if tree.cursor_node and tree.cursor_node.data == new_path: + logging.info("Refreshing details for renamed file") + self._start_loading_animation() + threading.Thread( + target=self._extract_and_show_details, args=(new_path,) + ).start() + else: + logging.info("Not refreshing details, cursor not on renamed file") def on_key(self, event): if event.key == "right": diff --git a/renamer/screens.py b/renamer/screens.py index 277d536..2819fec 100644 --- a/renamer/screens.py +++ b/renamer/screens.py @@ -3,6 +3,7 @@ from textual.widgets import Input, Button, Static from textual.containers import Vertical, Horizontal, Center, Container from textual.markup import escape from pathlib import Path +import logging class OpenScreen(Screen): @@ -128,6 +129,7 @@ class RenameConfirmScreen(Screen): self.old_path = old_path self.new_name = new_name self.new_path = old_path.parent / new_name + self.was_edited = False def compose(self): from .formatters.text_formatter import TextFormatter @@ -165,6 +167,7 @@ Do you want to proceed with renaming? if event.input.id == "new_name_input": self.new_name = event.input.value self.new_path = self.old_path.parent / self.new_name + self.was_edited = True # Update the display from .formatters.text_formatter import TextFormatter display = self.query_one("#new_name_display", Static) @@ -173,6 +176,7 @@ Do you want to proceed with renaming? def on_button_pressed(self, event): if event.button.id == "rename": try: + logging.info(f"Renaming {self.old_path} to {self.new_path}") self.old_path.rename(self.new_path) # Update the tree node self.app.update_renamed_file(self.old_path, self.new_path) # type: ignore @@ -222,6 +226,7 @@ Do you want to proceed with renaming? if event.key == "y": # Trigger rename try: + logging.info(f"Hotkey renaming {self.old_path} to {self.new_path}") self.old_path.rename(self.new_path) # Update the tree node self.app.update_renamed_file(self.old_path, self.new_path) # type: ignore diff --git a/renamer/test/filenames/[02] Balto Wolf Quest (2002) [1080i,ukr,eng].mkv b/renamer/test/filenames/The Adventures of Jimmy Neutron. Boy Genius (2002) [480p,ukr,eng].mkv similarity index 100% rename from renamer/test/filenames/[02] Balto Wolf Quest (2002) [1080i,ukr,eng].mkv rename to renamer/test/filenames/The Adventures of Jimmy Neutron. Boy Genius (2002) [480p,ukr,eng].mkv diff --git a/renamer/test/filenames/The Adventures of Jimmy Neutron: Boy Genius (2002).[480p,ukr,eng].mkv b/renamer/test/filenames/The Adventures of Jimmy Neutron: Boy Genius (2002).[480p,ukr,eng].mkv new file mode 100644 index 0000000..e69de29 diff --git a/renamer/test/filenames/[02] Balto: Wolf Quest (2002) [1080i,ukr,eng] [tmdbid-25913].mkv b/renamer/test/filenames/[02] Balto: Wolf Quest (2002) [1080i,ukr,eng] [tmdbid-25913].mkv new file mode 100644 index 0000000..e69de29 diff --git a/renamer/test/filenames/wJimmy Neutron: Boy Genius (2001) [480p,ukr,eng] [tmdbid-12589].mkv b/renamer/test/filenames/wJimmy Neutron: Boy Genius (2001) [480p,ukr,eng] [tmdbid-12589].mkv new file mode 100644 index 0000000..e69de29 diff --git a/uv.lock b/uv.lock index 38b49ec..7c0a68e 100644 --- a/uv.lock +++ b/uv.lock @@ -255,7 +255,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.4.3" +version = "0.4.4" source = { editable = "." } dependencies = [ { name = "langcodes" },