42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""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)
|