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.
36 lines
1.1 KiB
36 lines
1.1 KiB
using ErsatzTV.Core.Interfaces.Scheduling; |
|
using NCalc; |
|
|
|
namespace ErsatzTV.Core.Scheduling; |
|
|
|
public static class CountExpression |
|
{ |
|
public static int Evaluate( |
|
string countExpression, |
|
IMediaCollectionEnumerator enumerator, |
|
Random random, |
|
CancellationToken cancellationToken) |
|
{ |
|
int enumeratorCount = enumerator is PlaylistEnumerator playlistEnumerator |
|
? playlistEnumerator.CountForRandom |
|
: enumerator.Count; |
|
var expression = new Expression(countExpression); |
|
expression.EvaluateParameter += (name, e) => |
|
{ |
|
e.Result = name switch |
|
{ |
|
"count" => enumeratorCount, |
|
"random" => enumeratorCount > 0 ? random.Next() % enumeratorCount : 0, |
|
_ => e.Result |
|
}; |
|
}; |
|
|
|
object expressionResult = expression.Evaluate(cancellationToken); |
|
return expressionResult switch |
|
{ |
|
double doubleResult => (int)Math.Floor(doubleResult), |
|
int intResult => intResult, |
|
_ => 0 |
|
}; |
|
} |
|
}
|
|
|