creative-x-ferrero/utils/file_handler.py
DJP 72e9b54ff6 Initial commit: CreativeX API integration for Ferrero assets
- Ferrero filename parser with NEW format support
- CreativeX API client with retry logic
- State persistence with resume capability
- Upload and status checking scripts
- Comprehensive documentation
- Virtual environment support
2026-01-09 14:33:00 -05:00

170 lines
4 KiB
Python

"""
File handling utilities for CreativeX API Integration
"""
import mimetypes
import os
from pathlib import Path
from typing import Optional
class FileHandler:
"""Utilities for file operations and validation"""
# Supported file formats
SUPPORTED_VIDEO_FORMATS = ['.mp4', '.mov']
SUPPORTED_IMAGE_FORMATS = ['.jpg', '.jpeg', '.png']
@staticmethod
def get_file_extension(file_path: str) -> str:
"""
Get file extension in lowercase including dot
Args:
file_path: Path to file
Returns:
str: Lowercase extension including dot (e.g., '.mp4')
"""
return Path(file_path).suffix.lower()
@staticmethod
def get_file_size_mb(file_path: str) -> float:
"""
Get file size in megabytes
Args:
file_path: Path to file
Returns:
float: File size in MB
"""
size_bytes = os.path.getsize(file_path)
return size_bytes / (1024 * 1024)
@staticmethod
def is_video_file(file_path: str) -> bool:
"""
Check if file is a supported video format
Args:
file_path: Path to file
Returns:
bool: True if video file
"""
ext = FileHandler.get_file_extension(file_path)
return ext in FileHandler.SUPPORTED_VIDEO_FORMATS
@staticmethod
def is_image_file(file_path: str) -> bool:
"""
Check if file is a supported image format
Args:
file_path: Path to file
Returns:
bool: True if image file
"""
ext = FileHandler.get_file_extension(file_path)
return ext in FileHandler.SUPPORTED_IMAGE_FORMATS
@staticmethod
def is_supported_format(file_path: str) -> bool:
"""
Check if file format is supported
Args:
file_path: Path to file
Returns:
bool: True if supported format
"""
return (FileHandler.is_video_file(file_path) or
FileHandler.is_image_file(file_path))
@staticmethod
def get_content_type(file_path: str) -> Optional[str]:
"""
Get MIME content type for file
Args:
file_path: Path to file
Returns:
str: MIME type (e.g., 'video/mp4', 'image/jpeg')
None: If type cannot be determined
"""
# Try to guess from extension
content_type, _ = mimetypes.guess_type(file_path)
if content_type:
return content_type
# Fallback based on extension
ext = FileHandler.get_file_extension(file_path)
content_type_map = {
'.mp4': 'video/mp4',
'.mov': 'video/quicktime',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
}
return content_type_map.get(ext, 'application/octet-stream')
@staticmethod
def file_exists(file_path: str) -> bool:
"""
Check if file exists
Args:
file_path: Path to file
Returns:
bool: True if file exists
"""
return Path(file_path).exists()
@staticmethod
def is_readable(file_path: str) -> bool:
"""
Check if file is readable
Args:
file_path: Path to file
Returns:
bool: True if file is readable
"""
try:
return os.access(file_path, os.R_OK)
except Exception:
return False
@staticmethod
def get_filename(file_path: str) -> str:
"""
Get filename from path (with extension)
Args:
file_path: Path to file
Returns:
str: Filename with extension
"""
return Path(file_path).name
@staticmethod
def get_absolute_path(file_path: str) -> str:
"""
Get absolute path of file
Args:
file_path: Path to file
Returns:
str: Absolute path
"""
return str(Path(file_path).absolute())