Browse Source

expose current_time as a python datetime (#2339)

pull/2344/head
Jason Dove 11 months ago committed by GitHub
parent
commit
61a99c250a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 58
      ErsatzTV.Core/Scheduling/ScriptedScheduling/ScriptedPlayoutBuilder.cs

58
ErsatzTV.Core/Scheduling/ScriptedScheduling/ScriptedPlayoutBuilder.cs

@ -8,6 +8,7 @@ using ErsatzTV.Core.Scheduling.ScriptedScheduling.Modules;
using IronPython.Hosting; using IronPython.Hosting;
using IronPython.Runtime; using IronPython.Runtime;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Scripting.Hosting;
namespace ErsatzTV.Core.Scheduling.ScriptedScheduling; namespace ErsatzTV.Core.Scheduling.ScriptedScheduling;
@ -88,14 +89,16 @@ public class ScriptedPlayoutBuilder(
// define content first // define content first
engine.Operations.Invoke(defineContentFunc); engine.Operations.Invoke(defineContentFunc);
var context = new PythonPlayoutContext(schedulingEngine.GetState(), engine);
// reset if applicable // reset if applicable
if (mode is PlayoutBuildMode.Reset && resetPlayoutFunc != null) if (mode is PlayoutBuildMode.Reset && resetPlayoutFunc != null)
{ {
engine.Operations.Invoke(resetPlayoutFunc, new PythonPlayoutContext(schedulingEngine.GetState())); engine.Operations.Invoke(resetPlayoutFunc, context);
} }
// build playout // build playout
engine.Operations.Invoke(buildPlayoutFunc, new PythonPlayoutContext(schedulingEngine.GetState())); engine.Operations.Invoke(buildPlayoutFunc, context);
playout.Anchor = schedulingEngine.GetAnchor(); playout.Anchor = schedulingEngine.GetAnchor();
@ -128,10 +131,53 @@ public class ScriptedPlayoutBuilder(
[SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InconsistentNaming")]
[SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")]
public class PythonPlayoutContext(ISchedulingEngineState state) public class PythonPlayoutContext
{ {
public DateTimeOffset current_time => state.CurrentTime; private readonly ISchedulingEngineState _state;
public DateTimeOffset finish => state.Finish; private readonly ScriptEngine _scriptEngine;
public bool is_done() => current_time >= finish; private readonly dynamic _datetimeModule;
public PythonPlayoutContext(ISchedulingEngineState state, ScriptEngine scriptEngine)
{
_state = state;
_scriptEngine = scriptEngine;
_datetimeModule = _scriptEngine.ImportModule("datetime");
}
public object current_time => ToPythonDateTime(_state.CurrentTime);
//public object finish => ToPythonDateTime(_state.Finish);
public bool is_done() => _state.CurrentTime >= _state.Finish;
private object ToPythonDateTime(DateTimeOffset dto)
{
dynamic dt_constructor = _datetimeModule.datetime;
dynamic timedelta_constructor = _datetimeModule.timedelta;
dynamic timezone_constructor = _datetimeModule.timezone;
var offset = dto.Offset;
dynamic py_offset = _scriptEngine.Operations.Invoke(
timedelta_constructor,
0,
(int)offset.TotalSeconds
);
dynamic py_tzinfo = _scriptEngine.Operations.Invoke(
timezone_constructor,
py_offset
);
return _scriptEngine.Operations.Invoke(
dt_constructor,
dto.Year,
dto.Month,
dto.Day,
dto.Hour,
dto.Minute,
dto.Second,
dto.Millisecond * 1000,
py_tzinfo
);
}
} }
} }

Loading…
Cancel
Save