"""Tag-schema value transforms for miniDLNA folder names. Applied when building a folder name from a tag value — the tag keeps its exact value (e.g. rating 87 → tag "Hodnocení/87"), while the folder groups it (→ "…/80–89 %"). Config-driven and extensible via ``TAG_TRANSFORMS``. """ import re from typing import Optional def rating_band(rating: int) -> str: """Bucket a 0–100 rating into a ten-point band label (e.g. "80–89 %"). The top bucket spans 90–100 % so a perfect 100 still lands in a band. """ low = min((rating // 10) * 10, 90) high = 100 if low == 90 else low + 9 return f"{low}–{high} %" def _decade_band(value) -> str: """``decade_band`` transform: pull the leading integer and bucket it.""" match = re.search(r"\d+", str(value)) return rating_band(int(match.group())) if match else str(value) # Named value transforms usable from the tag schema (config-driven, extensible). TAG_TRANSFORMS = { None: str, "identity": str, "decade_band": _decade_band, } def apply_transform(value: str, transform: Optional[str]) -> str: """Apply a named tag-schema transform to a value, returning a string.""" fn = TAG_TRANSFORMS.get(transform, str) try: return str(fn(value)) except (ValueError, TypeError, AttributeError): return str(value)