#!/usr/bin/env python3 """ Script to fix code quality issues in the karaoke downloader codebase. This script addresses: 1. Unused imports (F401) 2. F-string missing placeholders (F541) 3. Unused variables (F841) 4. Missing type annotations """ import re import subprocess from pathlib import Path from typing import List, Set def fix_unused_imports(file_path: Path) -> None: """Remove unused imports from a file.""" content = file_path.read_text(encoding='utf-8') lines = content.split('\n') # Track which imports are actually used used_imports: Set[str] = set() # Find all import statements import_pattern = re.compile(r'^from\s+(\S+)\s+import\s+(.+)$') import_simple_pattern = re.compile(r'^import\s+(.+)$') for line in lines: # Check for from ... import statements match = import_pattern.match(line.strip()) if match: module = match.group(1) imports = match.group(2) # Parse individual imports for imp in imports.split(','): imp = imp.strip() if ' as ' in imp: imp = imp.split(' as ')[0].strip() used_imports.add(imp) # Check for simple import statements match = import_simple_pattern.match(line.strip()) if match: module = match.group(1) if ' as ' in module: module = module.split(' as ')[1].strip() used_imports.add(module) # Check which imports are actually used in the code code_content = '\n'.join(lines) actually_used: Set[str] = set() for imp in used_imports: if imp in code_content: actually_used.add(imp) print(f"Used imports in {file_path.name}: {actually_used}") def fix_f_string_placeholders(file_path: Path) -> None: """Fix f-strings that are missing placeholders.""" content = file_path.read_text(encoding='utf-8') lines = content.split('\n') f_string_pattern = re.compile(r'f"([^"]*)"') for i, line in enumerate(lines): matches = f_string_pattern.findall(line) for match in matches: if not re.search(r'\{[^}]*\}', match): print(f"F541: Line {i+1} in {file_path.name}: f-string missing placeholders") print(f" {line.strip()}") def fix_unused_variables(file_path: Path) -> None: """Find unused variables.""" content = file_path.read_text(encoding='utf-8') lines = content.split('\n') # Pattern to find variable assignments var_pattern = re.compile(r'^\s*(\w+)\s*=\s*') for i, line in enumerate(lines): match = var_pattern.match(line) if match: var_name = match.group(1) # Check if variable is used later in the file remaining_content = '\n'.join(lines[i+1:]) if var_name not in remaining_content: print(f"F841: Line {i+1} in {file_path.name}: unused variable '{var_name}'") def main(): """Main function to fix code quality issues.""" karaoke_dir = Path("karaoke_downloader") if not karaoke_dir.exists(): print("Error: karaoke_downloader directory not found") return python_files = list(karaoke_dir.glob("*.py")) print("šŸ” Analyzing code quality issues...") print("=" * 50) for file_path in python_files: print(f"\nšŸ“ {file_path.name}:") fix_unused_imports(file_path) fix_f_string_placeholders(file_path) fix_unused_variables(file_path) print("\n" + "=" * 50) print("āœ… Analysis complete!") if __name__ == "__main__": main()