using DeepDrftModels.DTOs; using DeepDrftPublic.Client.Services; namespace DeepDrftPublic.Client.ViewModels; /// /// Resolves the ordered track list for a release embed (FramePlayer?ReleaseEntryKey=...). Mirrors /// 's release-to-tracks resolution exactly (GetByEntryKey -> release.Id /// -> releaseId-filtered track page sorted by TrackNumber) so an embedded release queues the same /// ordered list the Cut detail page plays. Owns no playback or staging — the page stages the first /// track and arms the queue; this VM only fetches. Scoped; is reset per /// so a reused instance never bleeds across embeds. /// public class FramePlayerViewModel { private readonly IReleaseDataService _releaseData; private readonly ITrackDataService _trackData; // One page covers the whole release; the API caps PageSize at 100 regardless. Matches CutDetailViewModel. private const int ReleasePageSize = 100; public IReadOnlyList Tracks { get; private set; } = []; public FramePlayerViewModel(IReleaseDataService releaseData, ITrackDataService trackData) { _releaseData = releaseData; _trackData = trackData; } /// /// Resolves to its ordered tracks. Leaves /// empty when the release is not found or has no streamable tracks — the caller leaves the bar idle. /// public async Task Load(string releaseEntryKey) { Tracks = []; var releaseResult = await _releaseData.GetByEntryKey(releaseEntryKey); if (releaseResult is not { Success: true, Value: { } release }) return; // The release's tracks via the releaseId-filtered page — the exact join the Cut page uses // (internal int FK, not a title string), sorted by the explicit TrackNumber ordinal so the // queue advances in saved order. var trackResult = await _trackData.GetPage( pageNumber: 1, pageSize: ReleasePageSize, sortColumn: "TrackNumber", releaseId: release.Id); if (trackResult is { Success: true, Value: { Items: { } items } }) Tracks = items.ToList(); } }