CI's Formatting job failed: 19 touched files carried a BOM, which .editorconfig forbids (charset=utf-8). Pure encoding change — one byte per file, no semantic diff (verified: every hunk is `-namespace` -> `+namespace`). Self-inflicted. The patches that edited these legacy files wrote them back as utf-8-sig to "preserve the existing style", but the #311 fix-as-you-touch gate requires a file to be normalized when you touch it — that is the whole point of scoping the gate to changed files instead of reformatting the ~2500 legacy BOM files at once. dotnet format leaves the EF-generated Designer/snapshot files alone as generated code, and its verify skips them the same way, so they stay as ef emitted them. Two corrections to what I believed going in: - `dotnet format --include` does NOT no-op here. It reported `error CHARSET` for each file and exit 2, reproducing CI exactly, and fixed them in place. The note claiming otherwise is wrong for this invocation. - My first BOM check reported all files clean. The od pattern was wrong; reading the first three bytes directly found 19. A detector that can only say "ok" is worse than no detector. Core.Tests 565, ErsatzTV.Tests 1673, Architecture.Tests 5 — all passed. API artifacts still in sync. Refs #70 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
129 lines
6.1 KiB
C#
129 lines
6.1 KiB
C#
using ErsatzTV.Application.Tree;
|
|
using ErsatzTV.Core.Api.SmartCollections;
|
|
using ErsatzTV.Core.Domain;
|
|
|
|
namespace ErsatzTV.Application.MediaCollections;
|
|
|
|
internal static class Mapper
|
|
{
|
|
internal static MediaCollectionViewModel ProjectToViewModel(Collection collection) =>
|
|
new(
|
|
CollectionType.Collection,
|
|
collection.Id,
|
|
collection.Name,
|
|
collection.UseCustomPlaybackOrder,
|
|
MediaItemState.Normal,
|
|
collection.Version);
|
|
|
|
internal static MultiCollectionViewModel ProjectToViewModel(MultiCollection multiCollection) =>
|
|
new(
|
|
multiCollection.Id,
|
|
multiCollection.Name,
|
|
Optional(multiCollection.MultiCollectionItems).Flatten().Map(ProjectToViewModel).ToList(),
|
|
Optional(multiCollection.MultiCollectionSmartItems).Flatten().Map(ProjectToViewModel).ToList(),
|
|
multiCollection.Version);
|
|
|
|
internal static SmartCollectionViewModel ProjectToViewModel(SmartCollection collection) =>
|
|
new(collection.Id, collection.Name, collection.Query);
|
|
|
|
internal static SmartCollectionResponseModel ProjectToResponseModel(SmartCollection collection) =>
|
|
new(collection.Id, collection.Name, collection.Query);
|
|
|
|
internal static RerunCollectionViewModel ProjectToViewModel(RerunCollection collection) =>
|
|
new(
|
|
collection.Id,
|
|
collection.Name,
|
|
collection.CollectionType,
|
|
collection.Collection is not null ? ProjectToViewModel(collection.Collection) : null,
|
|
collection.MultiCollection is not null ? ProjectToViewModel(collection.MultiCollection) : null,
|
|
collection.SmartCollection is not null ? ProjectToViewModel(collection.SmartCollection) : null,
|
|
collection.MediaItem switch
|
|
{
|
|
Show show => MediaItems.Mapper.ProjectToViewModel(show),
|
|
Season season => MediaItems.Mapper.ProjectToViewModel(season),
|
|
Artist artist => MediaItems.Mapper.ProjectToViewModel(artist),
|
|
Movie movie => MediaItems.Mapper.ProjectToViewModel(movie),
|
|
Episode episode => MediaItems.Mapper.ProjectToViewModel(episode),
|
|
MusicVideo musicVideo => MediaItems.Mapper.ProjectToViewModel(musicVideo),
|
|
OtherVideo otherVideo => MediaItems.Mapper.ProjectToViewModel(otherVideo),
|
|
Song song => MediaItems.Mapper.ProjectToViewModel(song),
|
|
Image image => MediaItems.Mapper.ProjectToViewModel(image),
|
|
_ => null
|
|
},
|
|
collection.FirstRunPlaybackOrder,
|
|
collection.RerunPlaybackOrder,
|
|
collection.Version);
|
|
|
|
internal static TraktListViewModel ProjectToViewModel(TraktList traktList) =>
|
|
new(
|
|
traktList.Id,
|
|
traktList.TraktId,
|
|
$"{traktList.User}/{traktList.List}",
|
|
traktList.Name,
|
|
traktList.ItemCount,
|
|
traktList.Items.Count(i => i.MediaItemId.HasValue),
|
|
traktList.AutoRefresh,
|
|
traktList.GeneratePlaylist);
|
|
|
|
private static MultiCollectionItemViewModel ProjectToViewModel(MultiCollectionItem multiCollectionItem) =>
|
|
new(
|
|
multiCollectionItem.MultiCollectionId,
|
|
ProjectToViewModel(multiCollectionItem.Collection),
|
|
multiCollectionItem.ScheduleAsGroup,
|
|
multiCollectionItem.PlaybackOrder,
|
|
multiCollectionItem.Weight);
|
|
|
|
private static MultiCollectionSmartItemViewModel ProjectToViewModel(
|
|
MultiCollectionSmartItem multiCollectionSmartItem) =>
|
|
new(
|
|
multiCollectionSmartItem.MultiCollectionId,
|
|
ProjectToViewModel(multiCollectionSmartItem.SmartCollection),
|
|
multiCollectionSmartItem.ScheduleAsGroup,
|
|
multiCollectionSmartItem.PlaybackOrder,
|
|
multiCollectionSmartItem.Weight);
|
|
|
|
internal static TreeViewModel ProjectToViewModel(List<PlaylistGroup> playlistGroups) =>
|
|
new(
|
|
playlistGroups.Map(bg => new TreeGroupViewModel(
|
|
bg.Id,
|
|
bg.Name,
|
|
bg.Playlists.Map(b => new TreeItemViewModel(b.Id, b.Name, b.IsSystem)).ToList(),
|
|
bg.IsSystem)).ToList());
|
|
|
|
internal static PlaylistGroupViewModel ProjectToViewModel(PlaylistGroup playlistGroup) =>
|
|
new(playlistGroup.Id, playlistGroup.Name, playlistGroup.Playlists.Count, playlistGroup.IsSystem);
|
|
|
|
internal static PlaylistViewModel ProjectToViewModel(Playlist playlist) =>
|
|
new(playlist.Id, playlist.PlaylistGroupId, playlist.Name, playlist.IsSystem, playlist.Version);
|
|
|
|
internal static PlaylistItemViewModel ProjectToViewModel(PlaylistItem playlistItem) =>
|
|
new(
|
|
playlistItem.Id,
|
|
playlistItem.Index,
|
|
playlistItem.CollectionType,
|
|
playlistItem.Collection is not null ? ProjectToViewModel(playlistItem.Collection) : null,
|
|
playlistItem.MultiCollection is not null
|
|
? ProjectToViewModel(playlistItem.MultiCollection)
|
|
: null,
|
|
playlistItem.SmartCollection is not null
|
|
? ProjectToViewModel(playlistItem.SmartCollection)
|
|
: null,
|
|
playlistItem.MediaItem switch
|
|
{
|
|
Show show => MediaItems.Mapper.ProjectToViewModel(show),
|
|
Season season => MediaItems.Mapper.ProjectToViewModel(season),
|
|
Artist artist => MediaItems.Mapper.ProjectToViewModel(artist),
|
|
Movie movie => MediaItems.Mapper.ProjectToViewModel(movie),
|
|
Episode episode => MediaItems.Mapper.ProjectToViewModel(episode),
|
|
MusicVideo musicVideo => MediaItems.Mapper.ProjectToViewModel(musicVideo),
|
|
OtherVideo otherVideo => MediaItems.Mapper.ProjectToViewModel(otherVideo),
|
|
Song song => MediaItems.Mapper.ProjectToViewModel(song),
|
|
Image image => MediaItems.Mapper.ProjectToViewModel(image),
|
|
_ => null
|
|
},
|
|
playlistItem.PlaybackOrder,
|
|
playlistItem.Count,
|
|
playlistItem.PlayAll,
|
|
playlistItem.IncludeInProgramGuide);
|
|
}
|