Browse Source

fix plex import memory use; quick add seasons/shows

pull/34/head
Jason Dove 5 years ago
parent
commit
07c68dc8bb
  1. 14
      ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
  2. 29
      ErsatzTV/Pages/TelevisionSeasonList.razor
  3. 34
      ErsatzTV/Pages/TelevisionShowList.razor

14
ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs

@ -58,7 +58,9 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -58,7 +58,9 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public async Task<Either<BaseError, PlexMovie>> GetOrAdd(PlexLibrary library, PlexMovie item)
{
Option<PlexMovie> maybeExisting = await _dbContext.PlexMovies
await using TvContext context = _dbContextFactory.CreateDbContext();
Option<PlexMovie> maybeExisting = await context.PlexMovies
.AsNoTracking()
.Include(i => i.MovieMetadata)
.Include(i => i.MediaVersions)
.ThenInclude(mv => mv.MediaFiles)
@ -67,7 +69,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -67,7 +69,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
return await maybeExisting.Match(
plexMovie => Right<BaseError, PlexMovie>(plexMovie).AsTask(),
async () => await AddPlexMovie(library, item));
async () => await AddPlexMovie(context, library, item));
}
public async Task<bool> Update(Movie movie)
@ -120,15 +122,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -120,15 +122,15 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
}
}
private async Task<Either<BaseError, PlexMovie>> AddPlexMovie(PlexLibrary library, PlexMovie item)
private async Task<Either<BaseError, PlexMovie>> AddPlexMovie(TvContext context, PlexLibrary library, PlexMovie item)
{
try
{
item.LibraryPathId = library.Paths.Head().Id;
await _dbContext.PlexMovies.AddAsync(item);
await _dbContext.SaveChangesAsync();
await _dbContext.Entry(item).Reference(i => i.LibraryPath).LoadAsync();
await context.PlexMovies.AddAsync(item);
await context.SaveChangesAsync();
await context.Entry(item).Reference(i => i.LibraryPath).LoadAsync();
return item;
}
catch (Exception ex)

29
ErsatzTV/Pages/TelevisionSeasonList.razor

@ -7,7 +7,10 @@ @@ -7,7 +7,10 @@
@using ErsatzTV.Application.MediaCollections.Commands
@using ErsatzTV.Application.ProgramSchedules
@using ErsatzTV.Application.ProgramSchedules.Commands
@using Unit=LanguageExt.Unit;
@inject IMediator Mediator
@inject ILogger<TelevisionSeasonList> Logger
@inject ISnackbar Snackbar
@inject IDialogService Dialog
@inject NavigationManager NavigationManager
@ -52,7 +55,7 @@ @@ -52,7 +55,7 @@
{
<MediaCard Data="@card" Placeholder="@card.Placeholder"
Link="@($"/media/tv/seasons/{card.TelevisionSeasonId}")"
DataRefreshed="@(() => RefreshData())"/>
AddToCollectionClicked="@AddSeasonToCollection"/>
}
</MudContainer>
@ -113,5 +116,29 @@ @@ -113,5 +116,29 @@
NavigationManager.NavigateTo($"/schedules/{schedule.Id}/items");
}
}
private async Task AddSeasonToCollection(MediaCardViewModel card)
{
if (card is TelevisionSeasonCardViewModel season)
{
var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", season.Title } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = Dialog.Show<AddToCollectionDialog>("Add To Collection", parameters, options);
DialogResult result = await dialog.Result;
if (!result.Cancelled && result.Data is MediaCollectionViewModel collection)
{
var request = new AddSeasonToCollection(collection.Id, season.TelevisionSeasonId);
Either<BaseError, Unit> addResult = await Mediator.Send(request);
addResult.Match(
Left: error =>
{
Snackbar.Add($"Unexpected error adding season to collection: {error.Value}");
Logger.LogError("Unexpected error adding season to collection: {Error}", error.Value);
},
Right: _ => Snackbar.Add($"Added {season.Title} to collection {collection.Name}", Severity.Success));
}
}
}
}

34
ErsatzTV/Pages/TelevisionShowList.razor

@ -1,7 +1,13 @@ @@ -1,7 +1,13 @@
@page "/media/tv/shows"
@using ErsatzTV.Application.MediaCards
@using ErsatzTV.Application.MediaCards.Queries
@using ErsatzTV.Application.MediaCollections
@using ErsatzTV.Application.MediaCollections.Commands
@using Unit = LanguageExt.Unit
@inject ILogger<TelevisionShowList> Logger
@inject ISnackbar Snackbar
@inject IMediator Mediator
@inject IDialogService Dialog
<MudContainer MaxWidth="MaxWidth.Small" Class="mb-6" Style="max-width: 300px">
<MudPaper Style="align-items: center; display: flex; justify-content: center;">
@ -22,7 +28,9 @@ @@ -22,7 +28,9 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
@foreach (TelevisionShowCardViewModel card in _data.Cards)
{
<MediaCard Data="@card" Link="@($"/media/tv/shows/{card.TelevisionShowId}")" DataRefreshed="@(() => RefreshData())"/>
<MediaCard Data="@card"
Link="@($"/media/tv/shows/{card.TelevisionShowId}")"
AddToCollectionClicked="@AddToCollection"/>
}
</MudContainer>
@ -49,4 +57,28 @@ @@ -49,4 +57,28 @@
await RefreshData();
}
private async Task AddToCollection(MediaCardViewModel card)
{
if (card is TelevisionShowCardViewModel show)
{
var parameters = new DialogParameters { { "EntityType", "show" }, { "EntityName", show.Title } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = Dialog.Show<AddToCollectionDialog>("Add To Collection", parameters, options);
DialogResult result = await dialog.Result;
if (!result.Cancelled && result.Data is MediaCollectionViewModel collection)
{
var request = new AddShowToCollection(collection.Id, show.TelevisionShowId);
Either<BaseError, Unit> addResult = await Mediator.Send(request);
addResult.Match(
Left: error =>
{
Snackbar.Add($"Unexpected error adding show to collection: {error.Value}");
Logger.LogError("Unexpected error adding show to collection: {Error}", error.Value);
},
Right: _ => Snackbar.Add($"Added {show.Title} to collection {collection.Name}", Severity.Success));
}
}
}
}
Loading…
Cancel
Save