rework television media (#26)

* rework television media

* refactor poster saving

* television and movie views are working again

* remove dead code

* use paper styling for all cards

* add show poster, plot to seasons page

* remove missing shows; cleanup interfaces

* fix split show display (same show in different folders/sources)

* add placeholder "add to schedule" button

* no more duplicate television shows, even with the same show split across sources

* stop releasing CLI for now

* use season number as season placeholder

* add television shows to collections

* add television seasons to collections

* add television episodes to collections

* add movies to collections

* remove movies, shows, seasons, episodes from collections

* fix page width and menus

* fix buffer size defaults

* fix chronological episode ordering

* allow deleting media collections

* don't get stuck building a playout with an empty collection

* schedule editing and playouts work again

* minor cleanup

* remove dead code

* fix bugs with viewing movies as they are loading

* add scanner tests; support nested movie folders

* update collections docs

* rearrange order of schedule items

* add show and season to schedule

* delete schedules that use legacy collections, reset all posters

* move cleanup to new migration

* load fallback metadata when nfo fails; don't require metadata in ui

* update readme and screenshots
This commit is contained in:
Jason Dove
2021-02-22 00:54:41 +00:00
committed by GitHub
parent 98cf922b3c
commit 871a031467
259 changed files with 13493 additions and 4771 deletions
@@ -20,7 +20,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
{
MediaItem = new MediaItem
{
Metadata = new MediaMetadata()
Statistics = new MediaItemStatistics()
}
};
@@ -175,9 +175,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -198,9 +198,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -221,9 +221,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -245,9 +245,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -269,9 +269,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.HttpLiveStreaming,
@@ -295,9 +295,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -323,10 +323,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "mpeg2video";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "mpeg2video";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -352,10 +352,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "mpeg2video";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "mpeg2video";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.HttpLiveStreaming,
@@ -380,10 +380,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "libx264";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "libx264";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -409,10 +409,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "mpeg2video";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "mpeg2video";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -437,9 +437,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -464,10 +464,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "mpeg2video";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "mpeg2video";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -492,9 +492,9 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1918;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.Width = 1918;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -520,10 +520,10 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.Width = 1920;
playoutItem.MediaItem.Metadata.Height = 1080;
playoutItem.MediaItem.Metadata.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Metadata.VideoCodec = "mpeg2video";
playoutItem.MediaItem.Statistics.Width = 1920;
playoutItem.MediaItem.Statistics.Height = 1080;
playoutItem.MediaItem.Statistics.SampleAspectRatio = "1:1"; // not anamorphic
playoutItem.MediaItem.Statistics.VideoCodec = "mpeg2video";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -546,7 +546,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "aac";
playoutItem.MediaItem.Statistics.AudioCodec = "aac";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -567,7 +567,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -588,7 +588,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -609,7 +609,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.HttpLiveStreaming,
@@ -630,7 +630,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -651,7 +651,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -674,7 +674,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -697,7 +697,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -719,7 +719,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -741,7 +741,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg
};
PlayoutItem playoutItem = EmptyPlayoutItem();
playoutItem.MediaItem.Metadata.AudioCodec = "ac3";
playoutItem.MediaItem.Statistics.AudioCodec = "ac3";
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,