from __future__ import annotations
import asyncio
-import json
import logging
import os
import shutil
from music_assistant.helpers.compare import compare_strings, compare_version, create_safe_string
from music_assistant.helpers.database import DatabaseConnection
from music_assistant.helpers.datetime import utc_timestamp
-from music_assistant.helpers.json import json_loads, serialize_to_json
+from music_assistant.helpers.json import json_dumps, json_loads, serialize_to_json
+from music_assistant.helpers.smart_fades import SMART_CROSSFADE_DURATION
from music_assistant.helpers.tags import split_artists
from music_assistant.helpers.uri import parse_uri
from music_assistant.helpers.util import TaskManager, parse_title_and_version
"""Store Smart Fades BPM analysis for a track in db."""
if not (provider := self.mass.get_provider(provider_instance_id_or_domain)):
return
- if analysis.bpm <= 0 or analysis.confidence < 0:
- # skip invalid values
+ if (
+ analysis.duration <= 0.75 * SMART_CROSSFADE_DURATION
+ or analysis.bpm <= 0
+ or analysis.confidence < 0
+ ):
+ # skip invalid values, we skip analysis that were performed on
+ # a short amount of audio as those are often unreliable
return
+ beats_json = await asyncio.to_thread(lambda: json_dumps(analysis.beats.tolist()))
+ downbeats_json = await asyncio.to_thread(lambda: json_dumps(analysis.downbeats.tolist()))
values = {
"fragment": analysis.fragment.value,
"item_id": item_id,
"provider": provider.lookup_key,
"bpm": analysis.bpm,
- "beats": json.dumps(analysis.beats.tolist()),
- "downbeats": json.dumps(analysis.downbeats.tolist()),
+ "beats": beats_json,
+ "downbeats": downbeats_json,
"confidence": analysis.confidence,
"duration": analysis.duration,
}
},
)
if db_row and db_row["bpm"] > 0:
+ beats = await asyncio.to_thread(lambda: np.array(json_loads(db_row["beats"])))
+ downbeats = await asyncio.to_thread(lambda: np.array(json_loads(db_row["downbeats"])))
return SmartFadesAnalysis(
fragment=SmartFadesAnalysisFragment(db_row["fragment"]),
bpm=float(db_row["bpm"]),
- beats=np.array(json.loads(db_row["beats"])),
- downbeats=np.array(json.loads(db_row["downbeats"])),
+ beats=beats,
+ downbeats=downbeats,
confidence=float(db_row["confidence"]),
duration=float(db_row["duration"]),
)