mirror of https://github.com/ErsatzTV/ErsatzTV.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.9 KiB
86 lines
2.9 KiB
using ErsatzTV.Core.Domain.Scheduling; |
|
|
|
namespace ErsatzTV.Core.Scheduling; |
|
|
|
public static class PlayoutTemplateSelector |
|
{ |
|
public static Option<PlayoutTemplate> GetPlayoutTemplateFor( |
|
IEnumerable<PlayoutTemplate> templates, |
|
DateTimeOffset date) |
|
{ |
|
foreach (PlayoutTemplate template in templates.OrderBy(x => x.Index)) |
|
{ |
|
if (template.LimitToDateRange) |
|
{ |
|
bool reverse = template.StartMonth * 100 + template.StartDay > |
|
template.EndMonth * 100 + template.EndDay; |
|
|
|
int year = date.LocalDateTime.Year; |
|
DateTime start; |
|
DateTime end; |
|
|
|
try |
|
{ |
|
start = new DateTime(year, template.StartMonth, template.StartDay, 0, 0, 0, DateTimeKind.Local); |
|
} |
|
catch (ArgumentOutOfRangeException) |
|
{ |
|
// this should only happen with days that are greater than the actual days in the month, |
|
// so roll over to the 1st of the next month |
|
start = new DateTime(year, template.StartMonth + 1, 1, 0, 0, 0, DateTimeKind.Local); |
|
} |
|
|
|
try |
|
{ |
|
end = new DateTime(year, template.EndMonth, template.EndDay, 0, 0, 0, DateTimeKind.Local); |
|
} |
|
catch (ArgumentOutOfRangeException) |
|
{ |
|
// this should only happen with days that are greater than the actual days in the month, |
|
// so reduce to the max days in the month |
|
end = new DateTime( |
|
year, |
|
template.EndMonth, |
|
DateTime.DaysInMonth(year, template.EndMonth), |
|
0, |
|
0, |
|
0, |
|
DateTimeKind.Local); |
|
} |
|
|
|
if (reverse) |
|
{ |
|
(start, end) = (end, start); |
|
if (date.Date > start.Date && date.Date < end.Date) |
|
{ |
|
continue; |
|
} |
|
} |
|
else if (date.Date < start.Date || date.Date > end.Date) |
|
{ |
|
continue; |
|
} |
|
} |
|
|
|
bool daysOfWeek = template.DaysOfWeek.Contains(date.DayOfWeek); |
|
if (!daysOfWeek) |
|
{ |
|
continue; |
|
} |
|
|
|
bool daysOfMonth = template.DaysOfMonth.Contains(date.Day); |
|
if (!daysOfMonth) |
|
{ |
|
continue; |
|
} |
|
|
|
bool monthOfYear = template.MonthsOfYear.Contains(date.Month); |
|
if (monthOfYear) |
|
{ |
|
return template; |
|
} |
|
} |
|
|
|
return Option<PlayoutTemplate>.None; |
|
} |
|
}
|
|
|