Browse Source

remove missing shows; cleanup interfaces

pull/26/head
Jason Dove 6 years ago
parent
commit
b640873f16
  1. 5
      ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs
  2. 4
      ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs
  3. 6
      ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs
  4. 4
      ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs
  5. 2
      ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs
  6. 8
      ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs
  7. 10
      ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs
  8. 4
      ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs
  9. 12
      ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs
  10. 14
      ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs
  11. 10
      ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs
  12. 10
      ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs
  13. 2
      ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs
  14. 32
      ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs
  15. 21
      ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs
  16. 18
      ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs
  17. 8
      ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs
  18. 18
      ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs
  19. 14
      ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs
  20. 4
      ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs
  21. 29
      ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs
  22. 4
      ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs
  23. 4
      ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs
  24. 11
      ErsatzTV.Core/Metadata/LocalFolderScanner.cs
  25. 4
      ErsatzTV.Core/Metadata/LocalMetadataProvider.cs
  26. 20
      ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs
  27. 38
      ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
  28. 2
      ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
  29. 13
      ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs
  30. 36
      ErsatzTV/Pages/TelevisionSeasons.razor
  31. 5
      ErsatzTV/Shared/MediaCard.razor

5
ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs

@ -14,10 +14,7 @@ namespace ErsatzTV.Application.MediaCards.Queries @@ -14,10 +14,7 @@ namespace ErsatzTV.Application.MediaCards.Queries
{
private readonly IMovieRepository _movieRepository;
public GetMovieCardsHandler(IMovieRepository movieRepository)
{
_movieRepository = movieRepository;
}
public GetMovieCardsHandler(IMovieRepository movieRepository) => _movieRepository = movieRepository;
public async Task<MovieCardResultsViewModel> Handle(
GetMovieCards request,

4
ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs

@ -11,10 +11,8 @@ namespace ErsatzTV.Application.Television.Queries @@ -11,10 +11,8 @@ namespace ErsatzTV.Application.Television.Queries
{
private readonly ITelevisionRepository _televisionRepository;
public GetTelevisionShowByIdHandler(ITelevisionRepository televisionRepository)
{
public GetTelevisionShowByIdHandler(ITelevisionRepository televisionRepository) =>
_televisionRepository = televisionRepository;
}
public Task<Option<TelevisionShowViewModel>> Handle(
GetTelevisionShowById request,

6
ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs

@ -4,8 +4,8 @@ namespace ErsatzTV.Core.Interfaces.Domain @@ -4,8 +4,8 @@ namespace ErsatzTV.Core.Interfaces.Domain
{
public interface IHasAPoster
{
public string Path { get; set; }
public string Poster { get; set; }
public DateTime? PosterLastWriteTime { get; set; }
string Path { get; set; }
string Poster { get; set; }
DateTime? PosterLastWriteTime { get; set; }
}
}

4
ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
{
public interface IDisplaySize
{
public int Width { get; }
public int Height { get; }
int Width { get; }
int Height { get; }
}
}

2
ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs

@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.FFmpeg @@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.FFmpeg
{
public interface IFFmpegLocator
{
public Task<Option<string>> ValidatePath(string executableBase, ConfigElementKey key);
Task<Option<string>> ValidatePath(string executableBase, ConfigElementKey key);
}
}

8
ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs

@ -4,9 +4,9 @@ namespace ErsatzTV.Core.Interfaces.Locking @@ -4,9 +4,9 @@ namespace ErsatzTV.Core.Interfaces.Locking
{
public interface IEntityLocker
{
public event EventHandler OnMediaSourceChanged;
public bool LockMediaSource(int mediaSourceId);
public bool UnlockMediaSource(int mediaSourceId);
public bool IsMediaSourceLocked(int mediaSourceId);
event EventHandler OnMediaSourceChanged;
bool LockMediaSource(int mediaSourceId);
bool UnlockMediaSource(int mediaSourceId);
bool IsMediaSourceLocked(int mediaSourceId);
}
}

10
ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs

@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Metadata @@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Metadata
{
public interface ILocalFileSystem
{
public DateTime GetLastWriteTime(string path);
public bool IsMediaSourceAccessible(LocalMediaSource localMediaSource);
public IEnumerable<string> ListSubdirectories(string folder);
public IEnumerable<string> ListFiles(string folder);
public bool FileExists(string path);
DateTime GetLastWriteTime(string path);
bool IsMediaSourceAccessible(LocalMediaSource localMediaSource);
IEnumerable<string> ListSubdirectories(string folder);
IEnumerable<string> ListFiles(string folder);
bool FileExists(string path);
}
}

4
ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs

@ -5,7 +5,7 @@ namespace ErsatzTV.Core.Interfaces.Metadata @@ -5,7 +5,7 @@ namespace ErsatzTV.Core.Interfaces.Metadata
{
public interface ILocalPosterProvider
{
public Task RefreshPoster(MediaItem mediaItem);
public Task SavePosterToDisk(MediaItem mediaItem, string posterPath);
Task RefreshPoster(MediaItem mediaItem);
Task SavePosterToDisk(MediaItem mediaItem, string posterPath);
}
}

12
ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs

@ -7,11 +7,11 @@ namespace ErsatzTV.Core.Interfaces.Plex @@ -7,11 +7,11 @@ namespace ErsatzTV.Core.Interfaces.Plex
{
public interface IPlexSecretStore
{
public Task<string> GetClientIdentifier();
public Task<List<PlexUserAuthToken>> GetUserAuthTokens();
public Task<Unit> UpsertUserAuthToken(PlexUserAuthToken userAuthToken);
public Task<List<PlexServerAuthToken>> GetServerAuthTokens();
public Task<Option<PlexServerAuthToken>> GetServerAuthToken(string clientIdentifier);
public Task<Unit> UpsertServerAuthToken(PlexServerAuthToken serverAuthToken);
Task<string> GetClientIdentifier();
Task<List<PlexUserAuthToken>> GetUserAuthTokens();
Task<Unit> UpsertUserAuthToken(PlexUserAuthToken userAuthToken);
Task<List<PlexServerAuthToken>> GetServerAuthTokens();
Task<Option<PlexServerAuthToken>> GetServerAuthToken(string clientIdentifier);
Task<Unit> UpsertServerAuthToken(PlexServerAuthToken serverAuthToken);
}
}

14
ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs

@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IChannelRepository
{
public Task<Channel> Add(Channel channel);
public Task<Option<Channel>> Get(int id);
public Task<Option<Channel>> GetByNumber(int number);
public Task<List<Channel>> GetAll();
public Task<List<Channel>> GetAllForGuide();
public Task Update(Channel channel);
public Task Delete(int channelId);
Task<Channel> Add(Channel channel);
Task<Option<Channel>> Get(int id);
Task<Option<Channel>> GetByNumber(int number);
Task<List<Channel>> GetAll();
Task<List<Channel>> GetAllForGuide();
Task Update(Channel channel);
Task Delete(int channelId);
}
}

10
ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs

@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IConfigElementRepository
{
public Task<ConfigElement> Add(ConfigElement configElement);
public Task<Option<ConfigElement>> Get(ConfigElementKey key);
public Task<Option<T>> GetValue<T>(ConfigElementKey key);
public Task Update(ConfigElement configElement);
public Task Delete(ConfigElement configElement);
Task<ConfigElement> Add(ConfigElement configElement);
Task<Option<ConfigElement>> Get(ConfigElementKey key);
Task<Option<T>> GetValue<T>(ConfigElementKey key);
Task Update(ConfigElement configElement);
Task Delete(ConfigElement configElement);
}
}

10
ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs

@ -7,10 +7,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,10 +7,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IFFmpegProfileRepository
{
public Task<FFmpegProfile> Add(FFmpegProfile ffmpegProfile);
public Task<Option<FFmpegProfile>> Get(int id);
public Task<List<FFmpegProfile>> GetAll();
public Task Update(FFmpegProfile ffmpegProfile);
public Task Delete(int ffmpegProfileId);
Task<FFmpegProfile> Add(FFmpegProfile ffmpegProfile);
Task<Option<FFmpegProfile>> Get(int id);
Task<List<FFmpegProfile>> GetAll();
Task Update(FFmpegProfile ffmpegProfile);
Task Delete(int ffmpegProfileId);
}
}

2
ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs

@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface ILogRepository
{
public Task<List<LogEntry>> GetRecentLogEntries();
Task<List<LogEntry>> GetRecentLogEntries();
}
}

32
ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs

@ -8,21 +8,21 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -8,21 +8,21 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IMediaCollectionRepository
{
public Task<SimpleMediaCollection> Add(SimpleMediaCollection collection);
public Task<Option<MediaCollection>> Get(int id);
public Task<Option<SimpleMediaCollection>> GetSimpleMediaCollection(int id);
public Task<Option<SimpleMediaCollection>> GetSimpleMediaCollectionWithItems(int id);
public Task<Option<TelevisionMediaCollection>> GetTelevisionMediaCollection(int id);
public Task<List<SimpleMediaCollection>> GetSimpleMediaCollections();
public Task<List<MediaCollection>> GetAll();
public Task<List<MediaCollectionSummary>> GetSummaries(string searchString);
public Task<Option<List<MediaItem>>> GetItems(int id);
public Task<Option<List<MediaItem>>> GetSimpleMediaCollectionItems(int id);
public Task<Option<List<MediaItem>>> GetTelevisionMediaCollectionItems(int id);
public Task Update(SimpleMediaCollection collection);
public Task<bool> InsertOrIgnore(TelevisionMediaCollection collection);
public Task<Unit> ReplaceItems(int collectionId, List<MediaItem> mediaItems);
public Task Delete(int mediaCollectionId);
public Task DeleteEmptyTelevisionCollections();
Task<SimpleMediaCollection> Add(SimpleMediaCollection collection);
Task<Option<MediaCollection>> Get(int id);
Task<Option<SimpleMediaCollection>> GetSimpleMediaCollection(int id);
Task<Option<SimpleMediaCollection>> GetSimpleMediaCollectionWithItems(int id);
Task<Option<TelevisionMediaCollection>> GetTelevisionMediaCollection(int id);
Task<List<SimpleMediaCollection>> GetSimpleMediaCollections();
Task<List<MediaCollection>> GetAll();
Task<List<MediaCollectionSummary>> GetSummaries(string searchString);
Task<Option<List<MediaItem>>> GetItems(int id);
Task<Option<List<MediaItem>>> GetSimpleMediaCollectionItems(int id);
Task<Option<List<MediaItem>>> GetTelevisionMediaCollectionItems(int id);
Task Update(SimpleMediaCollection collection);
Task<bool> InsertOrIgnore(TelevisionMediaCollection collection);
Task<Unit> ReplaceItems(int collectionId, List<MediaItem> mediaItems);
Task Delete(int mediaCollectionId);
Task DeleteEmptyTelevisionCollections();
}
}

21
ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using ErsatzTV.Core.AggregateModels;
using ErsatzTV.Core.Domain;
using LanguageExt;
@ -8,14 +7,16 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -8,14 +7,16 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IMediaItemRepository
{
public Task<int> Add(MediaItem mediaItem);
public Task<Option<MediaItem>> Get(int id);
public Task<List<MediaItem>> GetAll();
public Task<List<MediaItem>> Search(string searchString);
// public Task<List<MediaItemSummary>> GetPageByType(AggregateMediaItemType itemType, int pageNumber, int pageSize);
// public Task<int> GetCountByType(AggregateMediaItemType itemType);
public Task<List<MediaItem>> GetAllByMediaSourceId(int mediaSourceId);
public Task<bool> Update(MediaItem mediaItem);
public Task<Unit> Delete(int mediaItemId);
Task<int> Add(MediaItem mediaItem);
Task<Option<MediaItem>> Get(int id);
Task<List<MediaItem>> GetAll();
Task<List<MediaItem>> Search(string searchString);
// Task<List<MediaItemSummary>> GetPageByType(AggregateMediaItemType itemType, int pageNumber, int pageSize);
// Task<int> GetCountByType(AggregateMediaItemType itemType);
Task<List<MediaItem>> GetAllByMediaSourceId(int mediaSourceId);
Task<bool> Update(MediaItem mediaItem);
Task<Unit> Delete(int mediaItemId);
}
}

18
ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs

@ -7,14 +7,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,14 +7,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IMediaSourceRepository
{
public Task<LocalMediaSource> Add(LocalMediaSource localMediaSource);
public Task<PlexMediaSource> Add(PlexMediaSource plexMediaSource);
public Task<List<MediaSource>> GetAll();
public Task<List<PlexMediaSource>> GetAllPlex();
public Task<Option<MediaSource>> Get(int id);
public Task<Option<PlexMediaSource>> GetPlex(int id);
public Task<int> CountMediaItems(int id);
public Task Update(PlexMediaSource plexMediaSource);
public Task Delete(int id);
Task<LocalMediaSource> Add(LocalMediaSource localMediaSource);
Task<PlexMediaSource> Add(PlexMediaSource plexMediaSource);
Task<List<MediaSource>> GetAll();
Task<List<PlexMediaSource>> GetAllPlex();
Task<Option<MediaSource>> Get(int id);
Task<Option<PlexMediaSource>> GetPlex(int id);
Task<int> CountMediaItems(int id);
Task Update(PlexMediaSource plexMediaSource);
Task Delete(int id);
}
}

8
ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs

@ -7,9 +7,9 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,9 +7,9 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IMovieRepository
{
public Task<Either<BaseError, MovieMediaItem>> GetOrAdd(int mediaSourceId, string path);
public Task<bool> Update(MovieMediaItem movie);
public Task<int> GetMovieCount();
public Task<List<MovieMediaItem>> GetPagedMovies(int pageNumber, int pageSize);
Task<Either<BaseError, MovieMediaItem>> GetOrAdd(int mediaSourceId, string path);
Task<bool> Update(MovieMediaItem movie);
Task<int> GetMovieCount();
Task<List<MovieMediaItem>> GetPagedMovies(int pageNumber, int pageSize);
}
}

18
ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs

@ -8,14 +8,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -8,14 +8,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IPlayoutRepository
{
public Task<Playout> Add(Playout playout);
public Task<Option<Playout>> Get(int id);
public Task<Option<Playout>> GetFull(int id);
public Task<Option<PlayoutItem>> GetPlayoutItem(int channelId, DateTimeOffset now);
public Task<List<PlayoutItem>> GetPlayoutItems(int playoutId);
public Task<List<int>> GetPlayoutIdsForMediaItems(Seq<MediaItem> mediaItems);
public Task<List<Playout>> GetAll();
public Task Update(Playout playout);
public Task Delete(int playoutId);
Task<Playout> Add(Playout playout);
Task<Option<Playout>> Get(int id);
Task<Option<Playout>> GetFull(int id);
Task<Option<PlayoutItem>> GetPlayoutItem(int channelId, DateTimeOffset now);
Task<List<PlayoutItem>> GetPlayoutItems(int playoutId);
Task<List<int>> GetPlayoutIdsForMediaItems(Seq<MediaItem> mediaItems);
Task<List<Playout>> GetAll();
Task Update(Playout playout);
Task Delete(int playoutId);
}
}

14
ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs

@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IProgramScheduleRepository
{
public Task<ProgramSchedule> Add(ProgramSchedule programSchedule);
public Task<Option<ProgramSchedule>> Get(int id);
public Task<Option<ProgramSchedule>> GetWithPlayouts(int id);
public Task<List<ProgramSchedule>> GetAll();
public Task Update(ProgramSchedule programSchedule);
public Task Delete(int programScheduleId);
public Task<Option<List<ProgramScheduleItem>>> GetItems(int programScheduleId);
Task<ProgramSchedule> Add(ProgramSchedule programSchedule);
Task<Option<ProgramSchedule>> Get(int id);
Task<Option<ProgramSchedule>> GetWithPlayouts(int id);
Task<List<ProgramSchedule>> GetAll();
Task Update(ProgramSchedule programSchedule);
Task Delete(int programScheduleId);
Task<Option<List<ProgramScheduleItem>>> GetItems(int programScheduleId);
}
}

4
ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs

@ -7,7 +7,7 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,7 +7,7 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface IResolutionRepository
{
public Task<Option<Resolution>> Get(int id);
public Task<List<Resolution>> GetAll();
Task<Option<Resolution>> Get(int id);
Task<List<Resolution>> GetAll();
}
}

29
ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs

@ -7,23 +7,28 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,23 +7,28 @@ namespace ErsatzTV.Core.Interfaces.Repositories
{
public interface ITelevisionRepository
{
public Task<List<TelevisionShow>> GetAllByMediaSourceId(int mediaSourceId);
public Task<bool> Update(TelevisionShow show);
public Task<bool> Update(TelevisionSeason season);
public Task<bool> Update(TelevisionEpisodeMediaItem episode);
public Task<Option<TelevisionShow>> GetShow(int televisionShowId);
public Task<int> GetShowCount();
public Task<List<TelevisionShow>> GetPagedShows(int pageNumber, int pageSize);
public Task<int> GetSeasonCount(int televisionShowId);
public Task<List<TelevisionSeason>> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize);
public Task<Either<BaseError, TelevisionShow>> GetOrAddShow(int mediaSourceId, string path);
public Task<Either<BaseError, TelevisionSeason>> GetOrAddSeason(
Task<List<TelevisionShow>> GetAllByMediaSourceId(int mediaSourceId);
Task<bool> Update(TelevisionShow show);
Task<bool> Update(TelevisionSeason season);
Task<bool> Update(TelevisionEpisodeMediaItem episode);
Task<Option<TelevisionShow>> GetShow(int televisionShowId);
Task<int> GetShowCount();
Task<List<TelevisionShow>> GetPagedShows(int pageNumber, int pageSize);
Task<int> GetSeasonCount(int televisionShowId);
Task<List<TelevisionSeason>> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize);
Task<Either<BaseError, TelevisionShow>> GetOrAddShow(int mediaSourceId, string path);
Task<Either<BaseError, TelevisionSeason>> GetOrAddSeason(
TelevisionShow show,
string path,
int seasonNumber);
public Task<Either<BaseError, TelevisionEpisodeMediaItem>> GetOrAddEpisode(
Task<Either<BaseError, TelevisionEpisodeMediaItem>> GetOrAddEpisode(
TelevisionSeason season,
int mediaSourceId,
string path);
Task<List<TelevisionShow>> FindRemovedShows(LocalMediaSource localMediaSource, List<string> allShowFolders);
Task<Unit> Delete(TelevisionShow show);
}
}

4
ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs

@ -6,7 +6,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling @@ -6,7 +6,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling
public interface IMediaCollectionEnumerator
{
MediaCollectionEnumeratorState State { get; }
public Option<MediaItem> Current { get; }
public void MoveNext();
Option<MediaItem> Current { get; }
void MoveNext();
}
}

4
ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs

@ -6,9 +6,9 @@ namespace ErsatzTV.Core.Interfaces.Scheduling @@ -6,9 +6,9 @@ namespace ErsatzTV.Core.Interfaces.Scheduling
{
public interface IPlayoutBuilder
{
public Task<Playout> BuildPlayoutItems(Playout playout, bool rebuild = false);
Task<Playout> BuildPlayoutItems(Playout playout, bool rebuild = false);
public Task<Playout> BuildPlayoutItems(
Task<Playout> BuildPlayoutItems(
Playout playout,
DateTimeOffset playoutStart,
DateTimeOffset playoutFinish,

11
ErsatzTV.Core/Metadata/LocalFolderScanner.cs

@ -40,9 +40,10 @@ namespace ErsatzTV.Core.Metadata @@ -40,9 +40,10 @@ namespace ErsatzTV.Core.Metadata
.Map(s => $"{Path.DirectorySeparatorChar}{s}{Path.DirectorySeparatorChar}")
.ToList();
private readonly IImageCache _imageCache;
private readonly ILocalFileSystem _localFileSystem;
private readonly ILocalStatisticsProvider _localStatisticsProvider;
private readonly IImageCache _imageCache;
private readonly ILogger _logger;
protected LocalFolderScanner(
@ -76,8 +77,12 @@ namespace ErsatzTV.Core.Metadata @@ -76,8 +77,12 @@ namespace ErsatzTV.Core.Metadata
return BaseError.New(ex.Message);
}
}
protected async Task SavePosterToDisk<T>(T show, string posterPath, Func<T, Task<bool>> update, int height = 220) where T : IHasAPoster
protected async Task SavePosterToDisk<T>(
T show,
string posterPath,
Func<T, Task<bool>> update,
int height = 220) where T : IHasAPoster
{
byte[] originalBytes = await File.ReadAllBytesAsync(posterPath);
Either<BaseError, string> maybeHash = await _imageCache.ResizeAndSaveImage(originalBytes, height, null);

4
ErsatzTV.Core/Metadata/LocalMetadataProvider.cs

@ -261,14 +261,14 @@ namespace ErsatzTV.Core.Metadata @@ -261,14 +261,14 @@ namespace ErsatzTV.Core.Metadata
return null;
}
private static string GetSortTitle(string title)
{
if (string.IsNullOrWhiteSpace(title))
{
return title;
}
if (title.StartsWith("the ", StringComparison.OrdinalIgnoreCase))
{
return title.Substring(4);

20
ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@ -14,7 +15,6 @@ namespace ErsatzTV.Core.Metadata @@ -14,7 +15,6 @@ namespace ErsatzTV.Core.Metadata
{
public class TelevisionFolderScanner : LocalFolderScanner, ITelevisionFolderScanner
{
private readonly IImageCache _imageCache;
private readonly ILocalFileSystem _localFileSystem;
private readonly ILocalMetadataProvider _localMetadataProvider;
private readonly ILogger<TelevisionFolderScanner> _logger;
@ -35,7 +35,6 @@ namespace ErsatzTV.Core.Metadata @@ -35,7 +35,6 @@ namespace ErsatzTV.Core.Metadata
_localFileSystem = localFileSystem;
_televisionRepository = televisionRepository;
_localMetadataProvider = localMetadataProvider;
_imageCache = imageCache;
_logger = logger;
}
@ -49,8 +48,11 @@ namespace ErsatzTV.Core.Metadata @@ -49,8 +48,11 @@ namespace ErsatzTV.Core.Metadata
return Unit.Default;
}
foreach (string showFolder in _localFileSystem.ListSubdirectories(localMediaSource.Folder)
.Filter(ShouldIncludeFolder))
var allShowFolders = _localFileSystem.ListSubdirectories(localMediaSource.Folder)
.Filter(ShouldIncludeFolder)
.ToList();
foreach (string showFolder in allShowFolders)
{
Either<BaseError, TelevisionShow> maybeShow = await _televisionRepository
.GetOrAddShow(localMediaSource.Id, showFolder)
@ -62,6 +64,14 @@ namespace ErsatzTV.Core.Metadata @@ -62,6 +64,14 @@ namespace ErsatzTV.Core.Metadata
_ => Task.FromResult(Unit.Default));
}
List<TelevisionShow> removedShows =
await _televisionRepository.FindRemovedShows(localMediaSource, allShowFolders);
foreach (TelevisionShow show in removedShows)
{
_logger.LogDebug("Removing missing show at {Folder}", show.Path);
await _televisionRepository.Delete(show);
}
return Unit.Default;
}
@ -193,7 +203,7 @@ namespace ErsatzTV.Core.Metadata @@ -193,7 +203,7 @@ namespace ErsatzTV.Core.Metadata
return BaseError.New(ex.Message);
}
}
private async Task<Either<BaseError, TelevisionSeason>> UpdatePoster(TelevisionSeason season)
{
try

38
ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs

@ -52,6 +52,25 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -52,6 +52,25 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
return episodeData.OfType<MediaItem>().Concat(movieData.OfType<MediaItem>()).ToListAsync();
}
public Task<List<MediaItem>> GetAllByMediaSourceId(int mediaSourceId) =>
_dbContext.MediaItems
.Filter(i => i.MediaSourceId == mediaSourceId)
.ToListAsync();
public async Task<bool> Update(MediaItem mediaItem)
{
_dbContext.MediaItems.Update(mediaItem);
return await _dbContext.SaveChangesAsync() > 0;
}
public Task<Unit> Delete(int mediaItemId) =>
_dbContext.MediaItems.FindAsync(mediaItemId).AsTask().Bind(
mediaItem =>
{
_dbContext.MediaItems.Remove(mediaItem);
return _dbContext.SaveChangesAsync();
}).ToUnit();
public Task<List<MediaItemSummary>> GetPageByType(MediaType mediaType, int pageNumber, int pageSize) =>
mediaType switch
@ -101,24 +120,5 @@ LIMIT {0} OFFSET {1}", @@ -101,24 +120,5 @@ LIMIT {0} OFFSET {1}",
.CountAsync(),
_ => Task.FromResult(0)
};
public Task<List<MediaItem>> GetAllByMediaSourceId(int mediaSourceId) =>
_dbContext.MediaItems
.Filter(i => i.MediaSourceId == mediaSourceId)
.ToListAsync();
public async Task<bool> Update(MediaItem mediaItem)
{
_dbContext.MediaItems.Update(mediaItem);
return await _dbContext.SaveChangesAsync() > 0;
}
public Task<Unit> Delete(int mediaItemId) =>
_dbContext.MediaItems.FindAsync(mediaItemId).AsTask().Bind(
mediaItem =>
{
_dbContext.MediaItems.Remove(mediaItem);
return _dbContext.SaveChangesAsync();
}).ToUnit();
}
}

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

@ -33,7 +33,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -33,7 +33,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
_dbContext.MovieMediaItems.Update(movie);
return await _dbContext.SaveChangesAsync() > 0;
}
public Task<int> GetMovieCount() =>
_dbContext.MovieMediaItems
.AsNoTracking()

13
ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs

@ -120,6 +120,19 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -120,6 +120,19 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
() => AddEpisode(season, mediaSourceId, path));
}
public Task<List<TelevisionShow>> FindRemovedShows(
LocalMediaSource localMediaSource,
List<string> allShowFolders) =>
_dbContext.TelevisionShows
.Filter(s => s.MediaSourceId == localMediaSource.Id)
.Filter(s => !allShowFolders.Contains(s.Path))
.ToListAsync();
public Task<Unit> Delete(TelevisionShow show) =>
_dbContext.TelevisionShows.Remove(show).AsTask()
.Bind(_ => _dbContext.SaveChangesAsync())
.ToUnit();
private async Task<Either<BaseError, TelevisionShow>> AddShow(int mediaSourceId, string path)
{
try

36
ErsatzTV/Pages/TelevisionSeasons.razor

@ -1,25 +1,25 @@ @@ -1,25 +1,25 @@
@page "/media/tv/shows/{ShowId:int}"
@using ErsatzTV.Application.MediaCards
@using ErsatzTV.Application.MediaCards.Queries
@using ErsatzTV.Application.Television
@using ErsatzTV.Application.Television.Queries
@using ErsatzTV.Application.MediaCards
@using ErsatzTV.Application.MediaCards.Queries
@inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.Large">
<MudCard Class="mb-6">
<div style="display: flex; flex-direction: row;">
<MudPaper Style="flex-shrink: 0;">
<MudCardMedia Image="@($"/posters/{_show.Poster}")" Style="height: 440px; width: 304px;"/>
</MudPaper>
<MudCardContent>
<div style="display:flex; flex-direction: column;">
<MudText Typo="Typo.h3">@_show.Title</MudText>
<MudText Typo="Typo.subtitle1" Class="mb-6 mud-text-secondary">@_show.Year</MudText>
<MudText>@_show.Plot</MudText>
</div>
</MudCardContent>
</div>
</MudCard>
<MudCard Class="mb-6">
<div style="display: flex; flex-direction: row;">
<MudPaper Style="flex-shrink: 0;">
<MudCardMedia Image="@($"/posters/{_show.Poster}")" Style="height: 440px; width: 304px;"/>
</MudPaper>
<MudCardContent>
<div style="display: flex; flex-direction: column;">
<MudText Typo="Typo.h3">@_show.Title</MudText>
<MudText Typo="Typo.subtitle1" Class="mb-6 mud-text-secondary">@_show.Year</MudText>
<MudText>@_show.Plot</MudText>
</div>
</MudCardContent>
</div>
</MudCard>
</MudContainer>
<MudContainer MaxWidth="MaxWidth.Large" Class="media-card-grid">
@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
private TelevisionShowViewModel _show;
private int _pageSize => 100;
private int _pageNumber = 1;
private readonly int _pageNumber = 1;
private TelevisionSeasonCardResultsViewModel _data;
@ -47,7 +47,7 @@ @@ -47,7 +47,7 @@
{
await Mediator.Send(new GetTelevisionShowById(ShowId))
.IfSomeAsync(vm => _show = vm);
_data = await Mediator.Send(new GetTelevisionSeasonCards(ShowId, _pageNumber, _pageSize));
}

5
ErsatzTV/Shared/MediaCard.razor

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
@using ErsatzTV.Application.MediaItems
@using ErsatzTV.Application.MediaCards
@using Unit = LanguageExt.Unit
@using ErsatzTV.Application.MediaCards
@inject IMediator Mediator
<div class="media-card-container mx-3 pb-3">
@ -40,7 +39,7 @@ @@ -40,7 +39,7 @@
[Parameter]
public MediaCardViewModel Data { get; set; }
[Parameter]
public string Link { get; set; }

Loading…
Cancel
Save