mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
003b280a77
* feat(enrichment): oximedia BPM/mood facts, mood search, and queue UI Run client-side oximedia analysis after CPU seed and persist BPM, mood JSON, and searchable mood_tag facts. Add product mood groups (joy/sadness/dance/work/ romance) with Advanced Search filter on the local index, queue BPM/mood display, migration 008 mood_tag index, and refreshed licenses for oximedia crates. * fix(enrichment): keep mood_groups module comment in English * feat(search): virtual mood groups, anger filter, and Advanced Search UX Expand mood search via overlapping virtual groups (tag expansion only), add anger/Злость group, skip album/artist shortcuts for track-only filters, and simplify mood search UI (songs-only, hide type tabs). Fix CustomSelect spurious scrollbar on short option lists. * feat(analysis): unified track analysis plan and enqueue path Add TrackAnalysisPlan (waveform, LUFS, enrichment) with a single enqueue_track_analysis entry for all byte-backed triggers. Run enrichment when cache is full but library facts are missing; route playback, cache, and backfill through the planner. Fix browseTextSearch LocalSearchOpts tsc gap and remove obsolete read_seed_bytes_if_needed helper. * fix(analysis): wire playback dispatch, preload enrichment, and UI refresh Route stream, gapless, preload, and local-file playback through analysis_dispatch so BPM/mood enrichment runs when waveform/LUFS are already cached. Fix audio_preload cache-hit and hot-cache paths, emit preload-cancelled for retry, and add analysis:enrichment-updated plus content_cache_coverage key resolution. * fix(audio): preload local files from disk and stop analysis retry loop Seed hot/offline next tracks via LocalFilePlayback (512 MiB) instead of copying into the RAM preload slot. Keep bytePreloadingId set after preload-ready so progress ticks do not re-invoke audio_preload every second. * fix(enrichment): clippy, album bpm filter routing, and queue mood display Clippy-clean analysis_dispatch and engine imports; restrict track-derived album routing to mood_group/mood_tag only so bpm is skipped on album queries. Log enrichment plan errors with retry-all plan; filter queue mood labels to oximedia ids. * fix(enrichment): simplify mood_tag backfill branch in plan_track_enrichment Remove empty if-block; keep same behaviour when backfill fails and moods row exists. * docs: CHANGELOG and credits for track enrichment PR #863 * docs(credits): track enrichment PR #863 contributor line * chore(enrichment): clippy-clean plan branch and trim dead exports Collapse mood_tag backfill if for clippy; remove unused moodGroupById and OXIMEDIA_MOOD_LABELS re-exports; stop poll when server BPM is already known. * fix(enrichment): close R2/S1–S3 limits and Song Info BPM fallback Return TrackEnrichmentOutcome::Failed on oximedia errors so retries are not masked as complete; extract mood Advanced Search SQL, unify top-3 mood tag selection in mood_groups with TS invariant tests, and show measured BPM in Song Info when tag BPM is missing or zero. * fix(enrichment): restore offline coverage and show mood in Song Info Add unit tests for offline download cancel/clear registry after the analysis seed refactor dropped read_seed_bytes coverage; show localized mood labels in Song Info when library enrichment facts exist. * fix(enrichment): soft mood scoring and unblock offline cancel tests Replace oximedia quadrant happy/excited mapping with valence/arousal soft scores across all mood tags for display, storage, and backfill; fix offline cancel unit tests that deadlocked by calling clear while holding the global offline_cancel_flags mutex. * fix(enrichment): dedupe joy cluster and cap mood display at two labels Never show happy and excited together; pick one tag per V/A cluster, tighten oximedia recalibration, and limit queue/Song Info to two moods that pass a relative score floor. * fix(enrichment): disable oximedia mood labels in UI and search tags Oximedia 0.1.7 mood is a spectral energy heuristic, not independent mood weights; valence correlates with loud/bright audio and false-labels metal and lyrical tracks as happy. Hide queue/Song Info mood and stop writing mood_tag facts until a reliable detector lands; keep V/A/moods JSON stored. * fix(enrichment): disable oximedia mood analysis and add BPM advanced search Stop planning, running, and storing oximedia mood facts; purge accumulated mood rows via migration 009. Hide mood filters in Advanced Search, expose BPM range filter with dual-storage resolution, and show a BPM column in song results when that filter is active. * feat(search): analysis BPM priority, source tooltip, and filter UX Prefer analysis track_fact over file tags for BPM resolution; show source in list tooltips. Validate BPM range on blur, add clear button, fix double tooltip. * fix(enrichment): prefer analysis BPM in Song Info and queue tech row Show measured track_fact BPM before file tags until analysis completes; pick the highest-confidence analysis fact when several exist.
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
//! `psysonic-audio` — Symphonia decode, rodio output, HTTP radio/streaming,
|
|
//! gapless, previews. Submodules (`sources`, `decode`, `stream`, `commands`, …)
|
|
//! preserve the historical single `audio.rs` partitioning.
|
|
|
|
// Re-export the logging facade so submodules can keep using
|
|
// `crate::app_eprintln!()` / `crate::app_deprintln!()`.
|
|
pub use psysonic_core::{app_deprintln, app_eprintln, logging};
|
|
|
|
pub mod autoeq_commands;
|
|
mod analysis_dispatch;
|
|
mod codec;
|
|
pub mod commands;
|
|
mod decode;
|
|
mod dev_io;
|
|
pub mod device_commands;
|
|
pub mod mix_commands;
|
|
mod play_input;
|
|
pub mod playback_rate;
|
|
mod preserve_worker;
|
|
pub mod preload_commands;
|
|
pub(crate) mod progress_task;
|
|
pub mod radio_commands;
|
|
pub mod transport_commands;
|
|
mod device_resume;
|
|
mod device_watcher;
|
|
mod engine;
|
|
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
|
mod power_resume;
|
|
#[cfg(target_os = "windows")]
|
|
mod power_notify_win;
|
|
#[cfg(target_os = "linux")]
|
|
mod power_notify_linux;
|
|
mod helpers;
|
|
mod ipc;
|
|
pub mod preview;
|
|
mod sources;
|
|
mod state;
|
|
mod stream;
|
|
|
|
pub use device_commands::{audio_default_output_device_name, audio_list_devices_for_engine};
|
|
pub use device_watcher::start_device_watcher;
|
|
pub use engine::{create_engine, refresh_http_user_agent, AudioEngine};
|
|
pub use helpers::{
|
|
cleanup_orphan_stream_spill_dir, take_stream_completed_for_url,
|
|
take_stream_completed_spill_for_url,
|
|
};
|
|
|
|
/// Register platform-specific listeners so the output stream is reopened after sleep/resume
|
|
/// when the device name may be unchanged (Windows WASAPI, Linux PipeWire, …).
|
|
pub fn register_post_sleep_audio_recovery(app: tauri::AppHandle) {
|
|
#[cfg(target_os = "windows")]
|
|
power_notify_win::register(app);
|
|
#[cfg(target_os = "linux")]
|
|
power_notify_linux::register(app);
|
|
// macOS intentionally falls through for now: we only ship native resume hooks
|
|
// where we have verified regressions (Windows WASAPI, Linux logind/PipeWire).
|
|
// macOS currently relies on the generic device watcher path.
|
|
#[cfg(all(
|
|
not(target_os = "windows"),
|
|
not(target_os = "linux")
|
|
))]
|
|
let _ = app;
|
|
}
|
|
|
|
pub use engine::{analysis_track_id_is_current_playback, ranged_loudness_backfill_should_defer, stop_audio_engine};
|