45 lines
1.9 KiB
C#
45 lines
1.9 KiB
C#
using ErsatzTV.Core.Domain;
|
|
|
|
namespace ErsatzTV.Application.Channels;
|
|
|
|
public static class AutoTuneAxisMap
|
|
{
|
|
// Server-owned Lucene smart-collection query for an axis value.
|
|
public static string GenerateQuery(AutoTuneAxis axis, string value)
|
|
{
|
|
string escaped = EscapeLuceneValue(value);
|
|
return axis switch
|
|
{
|
|
AutoTuneAxis.TvShow => $"type:episode AND show_title:\"{escaped}\"",
|
|
AutoTuneAxis.TvGenre => $"type:episode AND genre:\"{escaped}\"",
|
|
AutoTuneAxis.MovieGenre => $"type:movie AND genre:\"{escaped}\"",
|
|
_ => throw new ArgumentOutOfRangeException(nameof(axis), axis, null)
|
|
};
|
|
}
|
|
|
|
// Human-facing channel name. Movie-genre channels are suffixed so a genre that exists for
|
|
// both TV and movies ("Comedy" vs "Comedy Movies") does not produce two identically-named channels.
|
|
public static string GenerateName(AutoTuneAxis axis, string value) =>
|
|
axis switch
|
|
{
|
|
AutoTuneAxis.TvShow => value,
|
|
AutoTuneAxis.TvGenre => value,
|
|
AutoTuneAxis.MovieGenre => $"{value} Movies",
|
|
_ => throw new ArgumentOutOfRangeException(nameof(axis), axis, null)
|
|
};
|
|
|
|
// PseudoTV per-type defaults: single-show channels play in episode order; genre channels shuffle.
|
|
public static PlaybackOrder PlaybackOrderFor(AutoTuneAxis axis) =>
|
|
axis switch
|
|
{
|
|
AutoTuneAxis.TvShow => PlaybackOrder.SeasonEpisode,
|
|
AutoTuneAxis.TvGenre => PlaybackOrder.Shuffle,
|
|
AutoTuneAxis.MovieGenre => PlaybackOrder.Shuffle,
|
|
_ => throw new ArgumentOutOfRangeException(nameof(axis), axis, null)
|
|
};
|
|
|
|
// Escape a value for a Lucene double-quoted phrase: backslash first, then double-quote.
|
|
public static string EscapeLuceneValue(string value) =>
|
|
(value ?? string.Empty).Replace("\\", "\\\\").Replace("\"", "\\\"");
|
|
}
|