Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions Screenbox.Core/ViewModels/HomePageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,25 @@ private void MoveOrInsert(StorageFile file, string token, int desiredIndex)
}

[RelayCommand]
private void Play(MediaViewModel media)
private async Task Play(MediaViewModel media)
{
if (media.IsMediaActive)
{
Messenger.Send(new TogglePlayPauseMessage(false));
}
else
{
Messenger.Send(new PlayMediaMessage(media, false));
// If the recent item is a StorageFile, use PlayFilesMessage so the playlist can be
// populated with neighboring files (based on settings) and Next/Previous can work.
if (media.Source is StorageFile file)
{
var query = await _filesService.GetNeighboringFilesQueryAsync(file);
Messenger.Send(new PlayFilesMessage(new IStorageItem[] { file }, query));
}
else
{
Messenger.Send(new PlayMediaMessage(media, false));
}
}
}

Expand Down
31 changes: 21 additions & 10 deletions Screenbox.Core/ViewModels/MediaListViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,19 +181,29 @@ private void OnPlaybackStateChanged(IMediaPlayer sender, object args)
public async void Receive(PlayFilesMessage message)
{
IReadOnlyList<IStorageItem> files = message.Value;
_neighboringFilesQuery = message.NeighboringFilesQuery;
_neighboringFilesQuery = message.NeighboringFilesQuery ?? _neighboringFilesQuery;
if (files.Count == 1 && files[0] is StorageFile file)
{
var media = _mediaFactory.GetSingleton(file);
// The current play queue may already have the file already. Just play the file in this case.
// If the file already exists in the queue, just play it, but ensure neighboring query is ready
if (Items.Contains(media))
{
if (_neighboringFilesQuery == null)
{
_neighboringFilesQuery = await _filesService.GetNeighboringFilesQueryAsync(file);
}

PlaySingle(media);
return;
}

// If there is only 1 file, play it immediately
// Avoid waiting to get all the neighboring files then play, which may cause delay
// Prepare neighboring files query before starting playback so Next is enabled immediately
if (_neighboringFilesQuery == null)
{
_neighboringFilesQuery = await _filesService.GetNeighboringFilesQueryAsync(file);
}

// If there is only 1 file, play it immediately to avoid delay
ClearPlaylist();
if (_mediaPlayer == null)
{
Expand All @@ -207,8 +217,7 @@ public async void Receive(PlayFilesMessage message)
// If there are more than one item in the queue, file is already a playlist, no need to check for neighboring files
if (Items.Count > 1) return;

_neighboringFilesQuery ??= await _filesService.GetNeighboringFilesQueryAsync(file);
// Populate the play queue with neighboring media if needed
// Populate the play queue with neighboring media if needed (non-blocking for initial play)
if (!_settingsService.EnqueueAllFilesInFolder || _neighboringFilesQuery == null) return;
_playFilesCts?.Cancel();
using CancellationTokenSource cts = new();
Expand Down Expand Up @@ -809,14 +818,16 @@ private void OnEndReached(IMediaPlayer sender, object? args)
{
switch (RepeatMode)
{
case MediaPlaybackAutoRepeatMode.List when CurrentIndex == Items.Count - 1:
PlaySingle(Items[0]);
break;
case MediaPlaybackAutoRepeatMode.Track:
sender.Position = TimeSpan.Zero;
break;
case MediaPlaybackAutoRepeatMode.List when CurrentIndex == Items.Count - 1 && Items.Count > 0:
PlaySingle(Items[0]);
break;
default:
if (Items.Count > 1) _ = NextAsync();
// Always attempt next. If only one item and a neighboring files query is available,
// NextAsync will move to the next file in the same folder.
_ = NextAsync();
break;
}
});
Expand Down