convert.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import logging
  2. import re
  3. import zlib
  4. import base64
  5. logger = logging.getLogger(__name__)
  6. def safe_float(value, default=0.0):
  7. return safe_convert(value, float, default=default)
  8. def safe_int(value, default=0):
  9. return safe_convert(value, int, default=default)
  10. def safe_convert(value, target_type, default):
  11. """
  12. Safely converts a value to the specified target type.
  13. If conversion fails, returns the default value.
  14. """
  15. try:
  16. return target_type(value)
  17. except Exception:
  18. return default
  19. def parse_duration(duration_str: str, default: int = 0) -> int:
  20. duration_str = duration_str.strip()
  21. if not re.fullmatch(r'^(\d+[hms])+$', duration_str):
  22. logger.warning(
  23. f"Invalid duration format: {duration_str}. Using default value: {default}"
  24. )
  25. return default
  26. try:
  27. matches = re.findall(r'(\d+)([hms])', duration_str)
  28. time_units = {'h': 3600, 'm': 60, 's': 1}
  29. total_seconds = 0
  30. for value, unit in matches:
  31. total_seconds += int(value) * time_units[unit]
  32. return total_seconds
  33. except Exception as e:
  34. logger.error(f"Error parsing duration: {e}")
  35. return default
  36. def safe_b64decode(data):
  37. # Remove illegal characters and add equal signs
  38. cleaned = re.sub(r'[^A-Za-z0-9+/=]', '', data)
  39. padding = '=' * (-len(cleaned) % 4)
  40. return base64.b64decode(cleaned + padding)
  41. def inflate_data(compressed):
  42. return zlib.decompress(compressed, -15)