27 lines
905 B
Python
27 lines
905 B
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
FORMAT_SCORE = {"flac": 100, "alac": 100, "wav": 100, "m4a": 60, "aac": 60, "ogg": 50, "opus": 50, "mp3": 40}
|
|
|
|
def score(row) -> int:
|
|
value = FORMAT_SCORE.get((row["format"] or "").lower(), 0)
|
|
value += int((row["bitrate"] or 0) * 0.1)
|
|
if row["sample_rate"]:
|
|
value += min(int(row["sample_rate"] / 1000), 20)
|
|
if row["bit_depth"]:
|
|
value += min(int(row["bit_depth"]), 32)
|
|
return value
|
|
|
|
def is_version_conflict(a, b) -> bool:
|
|
af = set((a["version_flags"] or "").split(","))
|
|
bf = set((b["version_flags"] or "").split(","))
|
|
return bool(af.symmetric_difference(bf))
|
|
|
|
def choose_winner(rows):
|
|
def key(r):
|
|
path = str(r["file_path"])
|
|
admin = "/admin/" in path or path.endswith("/admin")
|
|
return (-score(r), 0 if admin else 1, r["created_at"], path)
|
|
return min(rows, key=key)
|