Ontime importer¶
Ontime is a free, open-source rundown and timer app for live events. A show in Ontime is a rundown: a list of events, each with a clock start, an end and a duration, gathered into groups, with milestones between them. The Ontime importer turns a rundown into a Rhylthyme run of show you can share, play live, and check for clashes.
It reads a rundown in either of the forms Ontime uses:
- the project file Ontime saves (
.json, from Download project, version 4 or 3); - the rundown as a table: Ontime's
.xlsxexport or import template, a Google Sheet, or the same table as CSV, TSV or Markdown. The columns are Ontime's:time start,time end,duration,cue,title,note,link start,skip,timer type. Case does not matter, andstart,end,nameandnoteswork too. Any other column, such aspresenter, is kept as a custom field.
A small example¶
A product launch evening, as a table in Ontime's column layout (download it):
cue,title,time start,time end,duration,link start,timer type,note,presenter
,Doors,,,,,group,,
1,Doors open,18:00:00,18:30:00,00:30:00,,,House music; bar open,
,,,,,,group-end,,
,Keynote,,,,,group,,
2,Welcome,18:30:00,18:35:00,00:05:00,,,Walk-in music fades,Host
3,Product demo,18:35:00,19:05:00,00:30:00,x,,Two clickers on stage,CEO
,Mics live in the house,,,,,milestone,,
4,Audience Q&A,19:05:00,19:20:00,00:15:00,x,,Two roaming mics,Host
,,,,,,group-end,,
5,Reception,19:30:00,21:00:00,01:30:00,,,Canapés in the foyer,
The rows with group and group-end in the timer type column mark out the sections, as in Ontime's spreadsheet. The x under link start means "start when the previous event ends".
Imported, it becomes a program called Product launch with three tracks:
| Track | Step | Time | Starts |
|---|---|---|---|
| Doors | Doors open | 18:00–18:30 | at the start of the show |
| Keynote | Welcome | 18:30–18:35 | after Doors open |
| Keynote | Product demo | 18:35–19:05 | after Welcome |
| Keynote | Audience Q&A | 19:05–19:20 | after Product demo, with an alert "Mics live in the house" |
| Rundown | Reception | 19:30–21:00 | 1 h 30 min into the show, leaving the ten-minute gap |
Each step keeps what Ontime knew about the event in metadata.ontime:
{
"stepId": "4-audience-q-a",
"name": "Audience Q&A",
"description": "Two roaming mics",
"startTrigger": { "type": "afterStep", "stepId": "3-product-demo" },
"duration": { "type": "fixed", "seconds": 900 },
"alerts": [{ "event": "start", "message": "Mics live in the house" }],
"metadata": {
"ontime": {
"cue": "4",
"timeStart": "19:05:00",
"timeEnd": "19:20:00",
"custom": { "presenter": "Host" },
"markers": [{ "kind": "milestone", "title": "Mics live in the house" }]
}
}
}
Importing¶
Web app¶
On events.rhylthyme.com, open Upload Program and drop the file: an .xlsx or .csv rundown, or the .json project file Ontime saved. An Ontime project is told apart from a Rhylthyme program by its contents, so either kind of .json can be uploaded. The timeline opens straight away.
Claude and other MCP clients¶
Ask for it in words ("import this Ontime rundown") and paste the table or the project JSON, or give a link. The assistant calls import_from_source with source: "ontime" and action: "import", and either:
text: the project JSON, or the table as CSV, TSV or Markdown;query: a public URL to the JSON or CSV, or a Google Sheet's share link. The sheet must be shared as anyone with the link can view; it is read as its CSV export.
Imports need a signed-in Rhylthyme account, as every import does.
Command line and Python¶
from rhylthyme_importers import OntimeImporter
result = OntimeImporter(allow_local_files=True).import_from_url("show.json")
result = OntimeImporter().import_from_source(csv_text, title="Product launch")
program = result.program
How a rundown becomes a program¶
| In Ontime | In the program |
|---|---|
| Rundown | The program. A project's title and the rundown's title name it. |
| Group | A track. Events outside any group go on a track called Rundown. |
| Event | A step with a fixed duration. The title is the step name and the note is its description. |
Linked event (link start) | Starts after the step before it. |
| Event at its own clock time | Starts that long after the first event (programStartOffset), so gaps stay gaps. One that starts just as the previous event ends follows it instead. |
| Two events at once | The later one goes on a track of its own (… (overlap)), since steps in one track never overlap. |
| Milestone | An alert on the next step's start, or at the end of the last step. |
| Event with no length | The same as a milestone. |
| Skipped event | Left out, and listed in metadata.ontime.skippedEvents. |
| Delay | Ignored, as in Ontime's own spreadsheet export. A delay adjusts a running show, not the plan. |
| Cue, clock times, end action, timer type, colour, custom fields | metadata.ontime on the step. |
Times are read as Ontime reads them:
09:30,0930and9:30 amare all half past nine;7pis 7 pm.- A bare
15is fifteen minutes.1h30is an hour and a half. - In a yes/no column such as
link startorskip, anything butfalsemeans yes. - Days roll over as they do in Ontime. An event whose clock time is not after the previous event's is on the next day, and so is one that follows an event running past midnight.
A project with more than one rundown imports the first one that has events. From Python, pass rundown= with the rundown's id or title to choose another.
Where it differs from Ontime's spreadsheet import¶
- Without a
link startcolumn, the gaps are kept. Ontime links every row of such a table to the one before it, which closes up the gaps. The importer links only the rows that have no start time. - A table needs a time column. It must have
time start,time endorduration, and one more of Ontime's columns, to be recognised as a rundown.
The program does not set a start date, because Ontime does not store one. The show's first clock time is in metadata.ontime.showStart. Give a date when you analyse or play the program (startAt in analyze_schedule) to put it on the wall clock.