diff --git a/dist/renamer-0.8.3-py3-none-any.whl b/dist/renamer-0.8.3-py3-none-any.whl new file mode 100644 index 0000000..3f97918 Binary files /dev/null and b/dist/renamer-0.8.3-py3-none-any.whl differ diff --git a/pyproject.toml b/pyproject.toml index 0043dfe..26f656e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "renamer" -version = "0.8.2" +version = "0.8.3" description = "Terminal-based media file renamer and metadata viewer" readme = "README.md" requires-python = ">=3.11" diff --git a/renamer/formatters/size_formatter.py b/renamer/formatters/size_formatter.py index eff272e..e364821 100644 --- a/renamer/formatters/size_formatter.py +++ b/renamer/formatters/size_formatter.py @@ -1,6 +1,6 @@ class SizeFormatter: """Class for formatting file sizes""" - + @staticmethod def format_size(bytes_size: int) -> str: """Format bytes to human readable with unit""" @@ -9,9 +9,14 @@ class SizeFormatter: return f"{bytes_size:.1f} {unit}" bytes_size /= 1024 return f"{bytes_size:.1f} TB" - + @staticmethod def format_size_full(bytes_size: int) -> str: """Format size with both human readable and bytes""" size_formatted = SizeFormatter.format_size(bytes_size) - return f"{size_formatted} ({bytes_size:,} bytes)" \ No newline at end of file + return f"{size_formatted} ({bytes_size:,} bytes)" + + @staticmethod + def format_size_short(bytes_size: int) -> str: + """Format size with only human readable""" + return SizeFormatter.format_size(bytes_size) diff --git a/renamer/formatters/text_decorators.py b/renamer/formatters/text_decorators.py index 9106e4a..cec2c9e 100644 --- a/renamer/formatters/text_decorators.py +++ b/renamer/formatters/text_decorators.py @@ -42,106 +42,15 @@ class TextDecorators: return decorator @staticmethod - def green() -> Callable: - """Decorator to color text green.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if result == "": - return "" - return TextFormatter.green(str(result)) - return wrapper - return decorator - - @staticmethod - def yellow() -> Callable: - """Decorator to color text yellow.""" + def colour(name) -> Callable: + """Decorator to colour text.""" def decorator(func: Callable) -> Callable: @wraps(func) def wrapper(*args, **kwargs) -> str: result = func(*args, **kwargs) if not result: return "" - return TextFormatter.yellow(str(result)) - return wrapper - return decorator - - @staticmethod - def cyan() -> Callable: - """Decorator to color text cyan.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.cyan(str(result)) - return wrapper - return decorator - - @staticmethod - def magenta() -> Callable: - """Decorator to color text magenta.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.magenta(str(result)) - return wrapper - return decorator - - @staticmethod - def red() -> Callable: - """Decorator to color text red.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.red(str(result)) - return wrapper - return decorator - - @staticmethod - def orange() -> Callable: - """Decorator to color text orange.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.orange(str(result)) - return wrapper - return decorator - - @staticmethod - def blue() -> Callable: - """Decorator to color text blue.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.blue(str(result)) - return wrapper - return decorator - - @staticmethod - def grey() -> Callable: - """Decorator to color text grey.""" - def decorator(func: Callable) -> Callable: - @wraps(func) - def wrapper(*args, **kwargs) -> str: - result = func(*args, **kwargs) - if not result: - return "" - return TextFormatter.grey(str(result)) + return TextFormatter.colour(name, str(result)) return wrapper return decorator diff --git a/renamer/formatters/text_formatter.py b/renamer/formatters/text_formatter.py index d9b8ec5..85229c6 100644 --- a/renamer/formatters/text_formatter.py +++ b/renamer/formatters/text_formatter.py @@ -27,84 +27,45 @@ class TextFormatter: return ''.join(word.capitalize() for word in text.split()) @staticmethod - def bold_green(text: str) -> str: - """Deprecated: Use [TextFormatter.bold, TextFormatter.green] instead""" - import warnings - warnings.warn( - "TextFormatter.bold_green is deprecated. Use [TextFormatter.bold, TextFormatter.green] instead.", - DeprecationWarning, - stacklevel=2 - ) - return f"[bold green]{text}[/bold green]" - - @staticmethod - def bold_cyan(text: str) -> str: - """Deprecated: Use [TextFormatter.bold, TextFormatter.cyan] instead""" - import warnings - warnings.warn( - "TextFormatter.bold_cyan is deprecated. Use [TextFormatter.bold, TextFormatter.cyan] instead.", - DeprecationWarning, - stacklevel=2 - ) - return f"[bold cyan]{text}[/bold cyan]" - - @staticmethod - def bold_magenta(text: str) -> str: - """Deprecated: Use [TextFormatter.bold, TextFormatter.magenta] instead""" - import warnings - warnings.warn( - "TextFormatter.bold_magenta is deprecated. Use [TextFormatter.bold, TextFormatter.magenta] instead.", - DeprecationWarning, - stacklevel=2 - ) - return f"[bold magenta]{text}[/bold magenta]" - - @staticmethod - def bold_yellow(text: str) -> str: - """Deprecated: Use [TextFormatter.bold, TextFormatter.yellow] instead""" - import warnings - warnings.warn( - "TextFormatter.bold_yellow is deprecated. Use [TextFormatter.bold, TextFormatter.yellow] instead.", - DeprecationWarning, - stacklevel=2 - ) - return f"[bold yellow]{text}[/bold yellow]" + def colour(colour_name: str, text: str) -> str: + """Generic method to color text with given colour name.""" + return f"[{colour_name}]{text}[/{colour_name}]" @staticmethod def green(text: str) -> str: - return f"[green]{text}[/green]" + return TextFormatter.colour("green", text) @staticmethod def yellow(text: str) -> str: - return f"[yellow]{text}[/yellow]" + return TextFormatter.colour("yellow", text) @staticmethod def orange(text: str) -> str: - return f"[orange]{text}[/orange]" + return TextFormatter.colour("orange", text) @staticmethod def magenta(text: str) -> str: - return f"[magenta]{text}[/magenta]" + return TextFormatter.colour("magenta", text) @staticmethod def cyan(text: str) -> str: - return f"[cyan]{text}[/cyan]" + return TextFormatter.colour("cyan", text) @staticmethod def red(text: str) -> str: - return f"[red]{text}[/red]" - + return TextFormatter.colour("red", text) + @staticmethod def blue(text: str) -> str: - return f"[blue]{text}[/blue]" + return TextFormatter.colour("blue", text) @staticmethod def grey(text: str) -> str: - return f"[grey]{text}[/grey]" + return TextFormatter.colour("grey", text) @staticmethod def dim(text: str) -> str: - return f"[dim]{text}[/dim]" + return TextFormatter.colour("dimgray", text) @staticmethod def link(url: str, text: str | None = None) -> str: @@ -119,4 +80,4 @@ class TextFormatter: if url and url != "" and url.startswith("http"): # Use OSC 8 hyperlink escape sequence for clickable links return f"\x1b]8;;{url}\x1b\\Open in TMDB\x1b]8;;\x1b\\" - return url \ No newline at end of file + return url diff --git a/renamer/test/test_decorators.py b/renamer/test/test_decorators.py index fff92fb..2f0bd5f 100644 --- a/renamer/test/test_decorators.py +++ b/renamer/test/test_decorators.py @@ -78,9 +78,9 @@ class TestTextDecorators: assert obj.get_text() == "[bold]Hello[/bold]" def test_green_decorator(self): - """Test @text_decorators.green() decorator.""" + """Test @text_decorators.colour(name="green") decorator.""" class TestClass: - @text_decorators.green() + @text_decorators.colour(name="green") def get_text(self): return "Success" diff --git a/renamer/test/test_formatters.py b/renamer/test/test_formatters.py index 816bbcc..34b9496 100644 --- a/renamer/test/test_formatters.py +++ b/renamer/test/test_formatters.py @@ -78,12 +78,6 @@ class TestTextFormatter: result = TextFormatter.red("test") assert result == "[red]test[/red]" - def test_bold_green_deprecated(self): - """Test deprecated bold_green method.""" - with pytest.warns(DeprecationWarning): - result = TextFormatter.bold_green("test") - assert "[bold green]" in result - class TestDurationFormatter: """Test DurationFormatter functionality.""" diff --git a/renamer/views/media_panel.py b/renamer/views/media_panel.py index bc45284..c5d25f4 100644 --- a/renamer/views/media_panel.py +++ b/renamer/views/media_panel.py @@ -32,17 +32,16 @@ class MediaPanelView: """Return formatted selected data""" return "\n".join( [ - self._props.title("Media Info Summary"), self._props.media_title, self._props.media_year, - self._props.media_genres, + self._props.tmdb_genres, self._props.media_duration, self._props.media_file_size, self._props.media_file_extension, self._props.selected_frame_class, self._props.selected_source, self._props.selected_audio_langs, - self._props.selected_database_info, + self._props.tmdb_database_info, self._props.selected_order, ] ) @@ -52,7 +51,7 @@ class MediaPanelView: """Return formatted file info""" return "\n".join( [ - self._props.title("File Info"), + self._props.file_info_title, self._props.file_path, self._props.file_size, self._props.file_name, @@ -66,7 +65,6 @@ class MediaPanelView: """Return formatted TMDB data""" return "\n".join( [ - self._props.title("TMDB Data"), self._props.tmdb_id, self._props.tmdb_title, self._props.tmdb_original_title, diff --git a/renamer/views/media_panel_properties.py b/renamer/views/media_panel_properties.py index 23c9eef..295a405 100644 --- a/renamer/views/media_panel_properties.py +++ b/renamer/views/media_panel_properties.py @@ -44,40 +44,48 @@ class MediaPanelProperties: # ============================================================ @property - @conditional_decorators.wrap("Path: ") - @text_decorators.blue() + @conditional_decorators.wrap(left="󰷊 ", right="") + @text_decorators.uppercase() + @text_decorators.bold() + def file_info_title(self) -> str: + """Get file info title formatted with label.""" + return "File Info" + + @property + @conditional_decorators.wrap("├ 󰙅 : ") + @text_decorators.colour(name="blue") @text_decorators.escape() def file_path(self) -> str: """Get file path formatted with label.""" return self._extractor.get("file_path") @property - @conditional_decorators.wrap("Size: ") - @text_decorators.green() + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @size_decorators.size_full() def file_size(self) -> str: """Get file size formatted with label.""" return self._extractor.get("file_size") @property - @conditional_decorators.wrap("Name: ") - @text_decorators.cyan() + @conditional_decorators.wrap(left="├ 󰈙 : ") + @text_decorators.colour(name="bisque") @text_decorators.escape() def file_name(self) -> str: """Get file name formatted with label.""" return self._extractor.get("file_name") @property - @conditional_decorators.wrap("Modified: ") - @text_decorators.magenta() + @conditional_decorators.wrap(left="├ 󱋡 : ") + @text_decorators.colour("bisque") @date_decorators.modification_date() def modification_time(self) -> str: """Get modification time formatted with label.""" return self._extractor.get("modification_time") @property - @conditional_decorators.wrap("Extension: ") - @text_decorators.green() + @conditional_decorators.wrap(left="└  : ") + @text_decorators.colour(name="bisque") @extension_decorators.extension_info() def extension_fileinfo(self) -> str: """Get extension from FileInfo formatted with label.""" @@ -88,63 +96,62 @@ class MediaPanelProperties: # ============================================================ @property - @text_decorators.blue() - @conditional_decorators.wrap("ID: ") - @text_decorators.yellow() + @conditional_decorators.wrap("󰈚 TMDB : ") + @text_decorators.colour(name="yellow") @conditional_decorators.default("") def tmdb_id(self) -> str: """Get TMDB ID formatted with label.""" return self._extractor.get("tmdb_id", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Title: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰗴 : ") + @text_decorators.colour(name="yellow") @conditional_decorators.default("") def tmdb_title(self) -> str: """Get TMDB title formatted with label.""" return self._extractor.get("title", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Original Title: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰗴 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def tmdb_original_title(self) -> str: """Get TMDB original title formatted with label.""" return self._extractor.get("original_title", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Year: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def tmdb_year(self) -> str: """Get TMDB year formatted with label.""" return self._extractor.get("year", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Countries: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def tmdb_countries(self) -> str: """Get TMDB production countries formatted with label.""" return self._extractor.get("production_countries", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Genres: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰴂 : ") + @text_decorators.colour(name="cyan") @conditional_decorators.default("") def tmdb_genres(self) -> str: """Get TMDB genres formatted with label.""" return self._extractor.get("genres", "TMDB") @property - @text_decorators.blue() - @conditional_decorators.wrap("Database Info: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰻾 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") @special_info_decorators.database_info() def tmdb_database_info(self) -> str: @@ -152,8 +159,9 @@ class MediaPanelProperties: return self._extractor.get("movie_db", "TMDB") @property - # @text_decorators.blue() - @conditional_decorators.default("") + # @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="└ ") + @conditional_decorators.default(default_value="") @text_decorators.url() def tmdb_url(self) -> str: """Get TMDB URL formatted with label.""" @@ -165,7 +173,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Title: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def metadata_title(self) -> str: """Get metadata title formatted with label.""" @@ -173,7 +181,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Duration: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") @duration_decorators.duration_full() def metadata_duration(self) -> str: @@ -182,7 +190,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Artist: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def metadata_artist(self) -> str: """Get metadata artist formatted with label.""" @@ -194,7 +202,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Duration: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") @duration_decorators.duration_full() def mediainfo_duration(self) -> str: @@ -203,7 +211,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Frame Class: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_frame_class(self) -> str: """Get MediaInfo frame class formatted with label.""" @@ -211,7 +219,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Resolution: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") @resolution_decorators.resolution_dimensions() def mediainfo_resolution(self) -> str: @@ -220,7 +228,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Aspect Ratio: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_aspect_ratio(self) -> str: """Get MediaInfo aspect ratio formatted with label.""" @@ -228,7 +236,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("HDR: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_hdr(self) -> str: """Get MediaInfo HDR formatted with label.""" @@ -236,7 +244,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Audio Languages: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_audio_langs(self) -> str: """Get MediaInfo audio languages formatted with label.""" @@ -244,7 +252,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Anamorphic: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_anamorphic(self) -> str: """Get MediaInfo anamorphic formatted with label.""" @@ -252,7 +260,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Extension: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") @extension_decorators.extension_info() def mediainfo_extension(self) -> str: @@ -261,7 +269,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("3D Layout: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def mediainfo_3d_layout(self) -> str: """Get MediaInfo 3D layout formatted with label.""" @@ -273,7 +281,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Order: ") - @text_decorators.yellow() + @text_decorators.colour(name="yellow") @conditional_decorators.default("Not extracted") def filename_order(self) -> str: """Get filename order formatted with label.""" @@ -281,15 +289,15 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Movie title: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("") def filename_title(self) -> str: """Get filename title formatted with label.""" return self._extractor.get("title", "Filename") @property - @conditional_decorators.wrap("Year: ") - @text_decorators.grey() + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def filename_year(self) -> str: """Get filename year formatted with label.""" @@ -297,7 +305,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Video source: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def filename_source(self) -> str: """Get filename source formatted with label.""" @@ -305,7 +313,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Frame class: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def filename_frame_class(self) -> str: """Get filename frame class formatted with label.""" @@ -313,7 +321,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("HDR: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def filename_hdr(self) -> str: """Get filename HDR formatted with label.""" @@ -321,7 +329,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Audio langs: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def filename_audio_langs(self) -> str: """Get filename audio languages formatted with label.""" @@ -329,9 +337,9 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Special info: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") - @text_decorators.blue() + @text_decorators.colour(name="blue") @special_info_decorators.special_info() def filename_special_info(self) -> str: """Get filename special info formatted with label.""" @@ -339,7 +347,7 @@ class MediaPanelProperties: @property @conditional_decorators.wrap("Movie DB: ") - @text_decorators.grey() + @text_decorators.colour(name="grey") @conditional_decorators.default("Not extracted") def filename_movie_db(self) -> str: """Get filename movie DB formatted with label.""" @@ -350,72 +358,63 @@ class MediaPanelProperties: # ============================================================ @property - @text_decorators.blue() - @conditional_decorators.wrap("Duration: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰔚 : ") + @text_decorators.colour(name="bisque") @duration_decorators.duration_full() def media_duration(self) -> str: """Get media duration from best available source.""" return self._extractor.get("duration") @property - @text_decorators.blue() - @conditional_decorators.wrap("Order: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="└ 󰒾 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def selected_order(self) -> str: """Get selected order formatted with label.""" return self._extractor.get("order") @property - @text_decorators.blue() - @conditional_decorators.wrap(left="󰿎 ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="󰿎 MOVIE : ") + @text_decorators.colour(name="yellow") @conditional_decorators.default("") def media_title(self) -> str: """Get selected title formatted with label.""" return self._extractor.get("title") @property - @text_decorators.blue() - @conditional_decorators.wrap("Year: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def media_year(self) -> str: """Get selected year formatted with label.""" return self._extractor.get("year") @property - @text_decorators.blue() - @conditional_decorators.wrap("Genres: ") - @text_decorators.cyan() - @conditional_decorators.default("") - def media_genres(self) -> str: - """Get TMDB genres formatted with label.""" - return self._extractor.get("genres") - - @property - @text_decorators.blue() - @conditional_decorators.wrap("File size: ") - @text_decorators.green() - @size_decorators.size_full() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="green") + @size_decorators.size_short() def media_file_size(self) -> str: """Get media file size formatted with label.""" return self._extractor.get("file_size") @property - @text_decorators.blue() - @conditional_decorators.wrap("Extension: ") - @text_decorators.green() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @extension_decorators.extension_info() def media_file_extension(self) -> str: """Get media file extension formatted with label.""" return self._extractor.get("extension") @property - @text_decorators.blue() + @text_decorators.colour(name="blue") @conditional_decorators.wrap("Special info: ") - @text_decorators.yellow() + @text_decorators.colour(name="yellow") @conditional_decorators.default("") @special_info_decorators.special_info() def selected_special_info(self) -> str: @@ -423,58 +422,48 @@ class MediaPanelProperties: return self._extractor.get("special_info") @property - @text_decorators.blue() - @conditional_decorators.wrap("Source: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├  : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def selected_source(self) -> str: """Get selected source formatted with label.""" return self._extractor.get("source") @property - @text_decorators.blue() - @conditional_decorators.wrap("Frame class: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󱣴 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def selected_frame_class(self) -> str: """Get selected frame class formatted with label.""" return self._extractor.get("frame_class") @property - @text_decorators.blue() - @conditional_decorators.wrap("HDR: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰵽 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def selected_hdr(self) -> str: """Get selected HDR formatted with label.""" return self._extractor.get("hdr") @property - @text_decorators.blue() - @conditional_decorators.wrap("Audio langs: ") - @text_decorators.yellow() + @text_decorators.colour(name="blue") + @conditional_decorators.wrap(left="├ 󰗊 : ") + @text_decorators.colour(name="bisque") @conditional_decorators.default("") def selected_audio_langs(self) -> str: """Get selected audio languages formatted with label.""" return self._extractor.get("audio_langs") - @property - @text_decorators.blue() - @conditional_decorators.wrap("Database Info: ") - @text_decorators.yellow() - @conditional_decorators.default("") - @special_info_decorators.database_info() - def selected_database_info(self) -> str: - """Get selected database info formatted with label.""" - return self._extractor.get("movie_db") - @property def video_tracks(self) -> list[str]: """Return formatted video track data""" tracks = self._extractor.get("video_tracks", "MediaInfo") or [] return [self.video_track(track, i) for i, track in enumerate(tracks, start=1)] - @text_decorators.green() + @text_decorators.colour(name="green") @conditional_decorators.wrap("Video Track {index}: ") @track_decorators.video_track() def video_track(self, track, index) -> str: @@ -487,7 +476,7 @@ class MediaPanelProperties: tracks = self._extractor.get("audio_tracks", "MediaInfo") or [] return [self.audio_track(track, i) for i, track in enumerate(tracks, start=1)] - @text_decorators.yellow() + @text_decorators.colour(name="yellow") @conditional_decorators.wrap("Audio Track {index}: ") @track_decorators.audio_track() def audio_track(self, track, index) -> str: @@ -502,7 +491,7 @@ class MediaPanelProperties: self.subtitle_track(track, i) for i, track in enumerate(tracks, start=1) ] - @text_decorators.magenta() + @text_decorators.colour(name="magenta") @conditional_decorators.wrap("Subtitle Track {index}: ") @track_decorators.subtitle_track() def subtitle_track(self, track, index) -> str: diff --git a/renamer/views/proposed_filename.py b/renamer/views/proposed_filename.py index 912bac1..8f2fa96 100644 --- a/renamer/views/proposed_filename.py +++ b/renamer/views/proposed_filename.py @@ -92,14 +92,14 @@ class ProposedFilenameView: @property @conditional_decorators.wrap(">> ", " <<") - @text_decorators.green() + @text_decorators.colour(name="green") def rename_line_similar(self) -> str: """Generate a simplified proposed filename for similarity checks.""" return escape(str(self)) @property - @conditional_decorators.wrap(">> ", " <<") - @text_decorators.orange() + @conditional_decorators.wrap(left=">> ", right=" <<") + @text_decorators.colour(name="orange") def rename_line_different(self) -> str: """Generate a detailed proposed filename for difference checks.""" - return escape(str(self)) \ No newline at end of file + return escape(str(self)) diff --git a/uv.lock b/uv.lock index 71c2de1..aa5db26 100644 --- a/uv.lock +++ b/uv.lock @@ -462,7 +462,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.8.2" +version = "0.8.3" source = { editable = "." } dependencies = [ { name = "langcodes" },