Skip to content

Commit

Permalink
fix: handle library tracker not available exceptions
Browse files Browse the repository at this point in the history
  • Loading branch information
huynhsontung committed Jun 11, 2024
1 parent 14fb544 commit 6b59e2a
Showing 1 changed file with 76 additions and 39 deletions.
115 changes: 76 additions & 39 deletions Screenbox.Core/Services/LibraryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public sealed class LibraryService : ILibraryService
private List<MediaViewModel> _videos;
private CancellationTokenSource? _musicFetchCts;
private CancellationTokenSource? _videosFetchCts;
private bool _musicChangeTrackerAvailable;
private bool _videosChangeTrackerAvailable;

private const string SongsCacheFileName = "songs.bin";
private const string VideoCacheFileName = "videos.bin";
Expand Down Expand Up @@ -82,15 +84,33 @@ public async Task<StorageLibrary> InitializeMusicLibraryAsync()
{
// No need to add handler for StorageLibrary.DefinitionChanged
MusicLibrary ??= await StorageLibrary.GetLibraryAsync(KnownLibraryId.Music);
MusicLibrary.ChangeTracker.Enable();
try
{
MusicLibrary.ChangeTracker.Enable();
_musicChangeTrackerAvailable = true;
}
catch (Exception)
{
// pass
}

return MusicLibrary;
}

public async Task<StorageLibrary> InitializeVideosLibraryAsync()
{
// No need to add handler for StorageLibrary.DefinitionChanged
VideosLibrary ??= await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
VideosLibrary.ChangeTracker.Enable();
try
{
VideosLibrary.ChangeTracker.Enable();
_videosChangeTrackerAvailable = true;
}
catch (Exception)
{
// pass
}

return VideosLibrary;
}

Expand Down Expand Up @@ -273,14 +293,12 @@ private async Task FetchMusicCancelableAsync(bool useCache, CancellationToken ca
{
if (MusicLibrary == null) return;
IsLoadingMusic = true;

useCache = useCache && !SystemInformation.IsXbox; // Don't use cache on Xbox
bool hasCache = false;
var libraryChangeTracker = MusicLibrary.ChangeTracker;
libraryChangeTracker.Enable();
var changeReader = libraryChangeTracker.GetChangeReader();
StorageLibraryChangeTracker? libraryChangeTracker = null;
StorageLibraryChangeReader? changeReader = null;
try
{
useCache = useCache && !SystemInformation.IsXbox; // Don't use cache on Xbox
bool hasCache = false;
await KnownFolders.RequestAccessAsync(KnownFolderId.MusicLibrary);
var libraryQuery = GetMusicLibraryQuery();
List<MediaViewModel> songs = new();
Expand All @@ -293,9 +311,19 @@ private async Task FetchMusicCancelableAsync(bool useCache, CancellationToken ca
hasCache = !AreLibraryPathsChanged(libraryCache.FolderPaths, MusicLibrary);

// Update cache with changes from library tracker. Invalidate cache if needed.
if (hasCache)
if (hasCache && _musicChangeTrackerAvailable)
{
hasCache = await TryResolveLibraryChangeAsync(songs, changeReader);
try
{
libraryChangeTracker = MusicLibrary.ChangeTracker;
libraryChangeTracker.Enable();
changeReader = libraryChangeTracker.GetChangeReader();
hasCache = await TryResolveLibraryChangeAsync(songs, changeReader);
}
catch (Exception e)
{
LogService.Log($"Failed to resolve change from library tracker\n{e}");
}
}
}
}
Expand Down Expand Up @@ -349,6 +377,17 @@ private async Task FetchMusicCancelableAsync(bool useCache, CancellationToken ca
}

_songs = songs;

MusicLibraryContentChanged?.Invoke(this, EventArgs.Empty);
await CacheSongsAsync(cancellationToken);
if (hasCache && _musicChangeTrackerAvailable)
{
await changeReader?.AcceptChangesAsync();
}
else
{
libraryChangeTracker?.Reset();
}
}
finally
{
Expand All @@ -357,31 +396,19 @@ private async Task FetchMusicCancelableAsync(bool useCache, CancellationToken ca
IsLoadingMusic = false;
}
}

MusicLibraryContentChanged?.Invoke(this, EventArgs.Empty);
await CacheSongsAsync(cancellationToken);
if (hasCache)
{
await changeReader.AcceptChangesAsync();
}
else
{
libraryChangeTracker.Reset();
}
}

private async Task FetchVideosCancelableAsync(bool useCache, CancellationToken cancellationToken)
{
if (VideosLibrary == null) return;
IsLoadingVideos = true;
StorageLibraryChangeTracker? libraryChangeTracker = null;
StorageLibraryChangeReader? changeReader = null;

useCache = useCache && !SystemInformation.IsXbox; // Don't use cache on Xbox
bool hasCache = false;
var libraryChangeTracker = VideosLibrary.ChangeTracker;
libraryChangeTracker.Enable();
var changeReader = libraryChangeTracker.GetChangeReader();
try
{
useCache = useCache && !SystemInformation.IsXbox; // Don't use cache on Xbox
bool hasCache = false;
await KnownFolders.RequestAccessAsync(KnownFolderId.VideosLibrary);
StorageFileQueryResult libraryQuery = GetVideosLibraryQuery();
List<MediaViewModel> videos = new();
Expand All @@ -394,9 +421,19 @@ private async Task FetchVideosCancelableAsync(bool useCache, CancellationToken c
hasCache = !AreLibraryPathsChanged(libraryCache.FolderPaths, VideosLibrary);

// Update cache with changes from library tracker. Invalidate cache if needed.
if (hasCache)
if (hasCache && _videosChangeTrackerAvailable)
{
hasCache = await TryResolveLibraryChangeAsync(videos, changeReader);
try
{
libraryChangeTracker = VideosLibrary.ChangeTracker;
libraryChangeTracker.Enable();
changeReader = libraryChangeTracker.GetChangeReader();
hasCache = await TryResolveLibraryChangeAsync(videos, changeReader);
}
catch (Exception e)
{
LogService.Log($"Failed to resolve change from library tracker\n{e}");
}
}
}
}
Expand Down Expand Up @@ -432,6 +469,17 @@ private async Task FetchVideosCancelableAsync(bool useCache, CancellationToken c
}

_videos = videos;

VideosLibraryContentChanged?.Invoke(this, EventArgs.Empty);
await CacheVideosAsync(cancellationToken);
if (hasCache)
{
await changeReader?.AcceptChangesAsync();
}
else
{
libraryChangeTracker?.Reset();
}
}
finally
{
Expand All @@ -440,17 +488,6 @@ private async Task FetchVideosCancelableAsync(bool useCache, CancellationToken c
IsLoadingVideos = false;
}
}

VideosLibraryContentChanged?.Invoke(this, EventArgs.Empty);
await CacheVideosAsync(cancellationToken);
if (hasCache)
{
await changeReader.AcceptChangesAsync();
}
else
{
libraryChangeTracker.Reset();
}
}

private async Task BatchFetchMediaAsync(StorageFileQueryResult queryResult, List<MediaViewModel> target, CancellationToken cancellationToken)
Expand Down

0 comments on commit 6b59e2a

Please sign in to comment.