refactor: Consolidate text color decorators and update related properties

This commit is contained in:
sHa
2026-01-04 20:49:55 +00:00
parent 3f8b158135
commit 336b030a6b
11 changed files with 136 additions and 280 deletions

BIN
dist/renamer-0.8.3-py3-none-any.whl vendored Normal file

Binary file not shown.

View File

@@ -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"

View File

@@ -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)"
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)

View File

@@ -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

View File

@@ -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 != "<None>" 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
return url

View File

@@ -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"

View File

@@ -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."""

View File

@@ -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,

View File

@@ -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("<None>")
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("<None>")
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("<None>")
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("<None>")
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("<None>")
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("<None>")
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("<None>")
@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("<None>")
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("<None>")
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("<None>")
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("<None>")
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("<None>")
@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("<None>")
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("<None>")
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("<None>")
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("<None>")
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("<None>")
@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:

View File

@@ -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))
return escape(str(self))

2
uv.lock generated
View File

@@ -462,7 +462,7 @@ wheels = [
[[package]]
name = "renamer"
version = "0.8.2"
version = "0.8.3"
source = { editable = "." }
dependencies = [
{ name = "langcodes" },