mirror of
https://github.com/shadoll/moma.git
synced 2026-08-28 03:27:34 +00:00
feat: add frame class extraction and formatting for media files
This commit is contained in:
@@ -9,34 +9,72 @@ from ..utils import detect_file_type
|
||||
class MediaFormatter:
|
||||
"""Class to format media data for display"""
|
||||
|
||||
def format_file_info(self, file_path: Path, rename_data: dict) -> str:
|
||||
"""Format complete file information for display"""
|
||||
def format_file_info_panel(self, file_path: Path, rename_data: dict) -> str:
|
||||
"""Format file information for the file info panel"""
|
||||
output = []
|
||||
|
||||
# Panel title
|
||||
output.append("[bold blue]FILE INFO[/bold blue]")
|
||||
output.append("") # Empty line for spacing
|
||||
|
||||
# Get file stats
|
||||
size_full = SizeFormatter.format_size_full(file_path.stat().st_size)
|
||||
date_formatted = DateFormatter.format_modification_date(file_path.stat().st_mtime)
|
||||
|
||||
|
||||
# Get extension info
|
||||
ext_name = ExtensionExtractor.get_extension_name(file_path)
|
||||
ext_desc = ExtensionExtractor.get_extension_description(ext_name)
|
||||
meta_type, meta_desc = detect_file_type(file_path)
|
||||
match = ExtensionFormatter.check_extension_match(ext_name, meta_type)
|
||||
ext_info = ExtensionFormatter.format_extension_info(ext_name, ext_desc, meta_type, meta_desc, match)
|
||||
|
||||
|
||||
file_name = file_path.name
|
||||
|
||||
# Build basic info
|
||||
full_info = f"[bold blue]Path:[/bold blue] {str(file_path)}\n\n"
|
||||
full_info += f"[bold green]Size:[/bold green] {size_full}\n"
|
||||
full_info += f"[bold cyan]File:[/bold cyan] {file_name}\n"
|
||||
full_info += f"{ext_info}\n"
|
||||
full_info += f"[bold magenta]Modified:[/bold magenta] {date_formatted}"
|
||||
|
||||
# Extra metadata
|
||||
extra_text = self._format_extra_metadata(rename_data['metadata'])
|
||||
if extra_text:
|
||||
full_info += f"\n\n{extra_text}"
|
||||
|
||||
return full_info
|
||||
|
||||
output.append(f"[bold blue]Path:[/bold blue] {str(file_path)}")
|
||||
output.append(f"[bold green]Size:[/bold green] {size_full}")
|
||||
output.append(f"[bold cyan]File:[/bold cyan] {file_name}")
|
||||
output.append(f"[bold magenta]Modified:[/bold magenta] {date_formatted}")
|
||||
output.append(f"{ext_info}")
|
||||
|
||||
return "\n".join(output)
|
||||
|
||||
def format_filename_extraction_panel(self, rename_data: dict) -> str:
|
||||
"""Format filename extraction data for the filename panel"""
|
||||
output = []
|
||||
output.append("[bold yellow]FILENAME EXTRACTION[/bold yellow]")
|
||||
output.append("") # Empty line for spacing
|
||||
output.append(f"[yellow]Title:[/yellow] {rename_data.get('title', 'Not found')}")
|
||||
output.append(f"[yellow]Year:[/yellow] {rename_data.get('year', 'Not found')}")
|
||||
output.append(f"[yellow]Source:[/yellow] {rename_data.get('source', 'Not found')}")
|
||||
output.append(f"[yellow]Frame Class:[/yellow] {rename_data.get('frame_class', 'Not found')}")
|
||||
return "\n".join(output)
|
||||
|
||||
def format_metadata_extraction_panel(self, rename_data: dict) -> str:
|
||||
"""Format metadata extraction data for the metadata panel"""
|
||||
output = []
|
||||
output.append("[bold cyan]METADATA EXTRACTION[/bold cyan]")
|
||||
output.append("") # Empty line for spacing
|
||||
metadata = rename_data.get('metadata', {})
|
||||
if metadata.get('duration'):
|
||||
output.append(f"[cyan]Duration:[/cyan] {metadata['duration']:.1f} seconds")
|
||||
if metadata.get('title'):
|
||||
output.append(f"[cyan]Title:[/cyan] {metadata['title']}")
|
||||
if metadata.get('artist'):
|
||||
output.append(f"[cyan]Artist:[/cyan] {metadata['artist']}")
|
||||
if not any(key in metadata for key in ['duration', 'title', 'artist']):
|
||||
output.append("[dim]No metadata found[/dim]")
|
||||
return "\n".join(output) if output else "[dim]No metadata found[/dim]"
|
||||
|
||||
def format_mediainfo_extraction_panel(self, rename_data: dict) -> str:
|
||||
"""Format media info extraction data for the mediainfo panel"""
|
||||
output = []
|
||||
output.append("[bold green]MEDIA INFO EXTRACTION[/bold green]")
|
||||
output.append("") # Empty line for spacing
|
||||
output.append(f"[green]Resolution:[/green] {rename_data.get('resolution', 'Not found')}")
|
||||
output.append(f"[green]Aspect Ratio:[/green] {rename_data.get('aspect_ratio', 'Not found')}")
|
||||
output.append(f"[green]HDR:[/green] {rename_data.get('hdr', 'Not found')}")
|
||||
output.append(f"[green]Audio Languages:[/green] {rename_data.get('audio_langs', 'Not found')}")
|
||||
return "\n".join(output)
|
||||
|
||||
def format_proposed_name(self, rename_data: dict, ext_name: str) -> str:
|
||||
"""Format the proposed filename"""
|
||||
@@ -49,8 +87,8 @@ class MediaFormatter:
|
||||
proposed_parts.append(rename_data['source'])
|
||||
|
||||
tags = []
|
||||
if rename_data['resolution']:
|
||||
tags.append(rename_data['resolution'])
|
||||
if rename_data['frame_class'] and rename_data['frame_class'] != 'Unclassified':
|
||||
tags.append(rename_data['frame_class'])
|
||||
if rename_data['hdr']:
|
||||
tags.append(rename_data['hdr'])
|
||||
if rename_data['audio_langs']:
|
||||
@@ -66,7 +104,9 @@ class MediaFormatter:
|
||||
lines.append(f"Movie title: {rename_data['title'] or 'Unknown'}")
|
||||
lines.append(f"Year: {rename_data['year'] or 'Unknown'}")
|
||||
lines.append(f"Video source: {rename_data['source'] or 'Unknown'}")
|
||||
lines.append(f"Frame class: {rename_data['frame_class'] or 'Unknown'}")
|
||||
lines.append(f"Resolution: {rename_data['resolution'] or 'Unknown'}")
|
||||
lines.append(f"Aspect ratio: {rename_data['aspect_ratio'] or 'Unknown'}")
|
||||
lines.append(f"HDR: {rename_data['hdr'] or 'No'}")
|
||||
lines.append(f"Audio langs: {rename_data['audio_langs'] or 'None'}")
|
||||
lines.append(f"Proposed filename: {proposed_name}")
|
||||
|
||||
@@ -1,6 +1,44 @@
|
||||
class ResolutionFormatter:
|
||||
"""Class for formatting video resolutions"""
|
||||
|
||||
"""Class for formatting video resolutions and frame classes"""
|
||||
|
||||
@staticmethod
|
||||
def get_frame_class_from_resolution(resolution: str) -> str:
|
||||
"""Convert resolution string (WIDTHxHEIGHT) to frame class (480p, 720p, etc.)"""
|
||||
if not resolution:
|
||||
return 'Unclassified'
|
||||
|
||||
try:
|
||||
# Extract height from WIDTHxHEIGHT format
|
||||
if 'x' in resolution:
|
||||
height = int(resolution.split('x')[1])
|
||||
else:
|
||||
# Try to extract number directly
|
||||
import re
|
||||
match = re.search(r'(\d{3,4})', resolution)
|
||||
if match:
|
||||
height = int(match.group(1))
|
||||
else:
|
||||
return 'Unclassified'
|
||||
|
||||
if height == 4320:
|
||||
return '4320p'
|
||||
elif height >= 2160:
|
||||
return '2160p'
|
||||
elif height >= 1440:
|
||||
return '1440p'
|
||||
elif height >= 1080:
|
||||
return '1080p'
|
||||
elif height >= 720:
|
||||
return '720p'
|
||||
elif height >= 576:
|
||||
return '576p'
|
||||
elif height >= 480:
|
||||
return '480p'
|
||||
else:
|
||||
return 'Unclassified'
|
||||
except (ValueError, IndexError):
|
||||
return 'Unclassified'
|
||||
|
||||
@staticmethod
|
||||
def format_resolution_p(height: int) -> str:
|
||||
"""Format resolution as 2160p, 1080p, etc."""
|
||||
@@ -14,7 +52,7 @@ class ResolutionFormatter:
|
||||
return '480p'
|
||||
else:
|
||||
return f'{height}p'
|
||||
|
||||
|
||||
@staticmethod
|
||||
def format_resolution_dimensions(width: int, height: int) -> str:
|
||||
"""Format resolution as WIDTHxHEIGHT"""
|
||||
|
||||
Reference in New Issue
Block a user