- 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
170 lines
4 KiB
Python
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())
|