mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-09 22:43:11 +02:00
195 lines
6.6 KiB
XML
195 lines
6.6 KiB
XML
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="chapter.pad">
|
|
<title>Program Associated Data</title>
|
|
<sect1 xml:id="sect.pad.overview">
|
|
<title>Overview</title>
|
|
<para>
|
|
Rivendell includes full support for the origination and transmission
|
|
of program associated data (PAD) in realtime, including a Python
|
|
module (PyPAD)
|
|
that can be used to create scripts for interfacing Rivendell's PAD
|
|
feed to most any arbitrary external system.
|
|
</para>
|
|
<sect2 xml:id="sect.pad.the_json_interface">
|
|
<title>The JSON Interface</title>
|
|
<para>
|
|
All Rivendell PAD updates are emitted as
|
|
<link xlink:href="https://www.json.org/">JSON documents</link> of
|
|
type <code>padUpdate</code> via TCP port 34289. A typical update
|
|
looks like:
|
|
<programlisting>
|
|
<![CDATA[
|
|
{
|
|
"padUpdate": {
|
|
"dateTime": "2019-03-28T15:09:01-04:00",
|
|
"hostName": "elastigirl",
|
|
"shortHostName": "elastigirl",
|
|
"machine": 1,
|
|
"onairFlag": false,
|
|
"mode": "Automatic",
|
|
"service": {
|
|
"name": "Production",
|
|
"description": "Production Log"
|
|
"programCode": ""
|
|
},
|
|
"log": {
|
|
"name": "Example"
|
|
},
|
|
"now": {
|
|
"startDateTime": "2019-03-28T15:09:01-04:00",
|
|
"lineNumber": 0,
|
|
"lineId": 0,
|
|
"cartNumber": 10477,
|
|
"cartType": "Audio",
|
|
"cutNumber": 1,
|
|
"length": 225500,
|
|
"year": null,
|
|
"groupName": "MUSIC",
|
|
"title": "Allentown",
|
|
"artist": "Billy Joel",
|
|
"publisher": "",
|
|
"composer": "",
|
|
"album": "The Complete Hits Collection 1973-1997",
|
|
"label": "",
|
|
"client": "",
|
|
"agency": "",
|
|
"conductor": "",
|
|
"userDefined": "",
|
|
"songId": "",
|
|
"outcue": "",
|
|
"description": "Cut 001",
|
|
"isrc": "",
|
|
"isci": "",
|
|
"externalEventId": "",
|
|
"externalData": "",
|
|
"externalAnncType": ""
|
|
},
|
|
"next": {
|
|
"startDateTime": "2019-03-28T15:12:46-04:00",
|
|
"lineNumber": 1,
|
|
"lineId": 1,
|
|
"cartNumber": 10153,
|
|
"cartType": "Audio",
|
|
"cutNumber": 1,
|
|
"length": 168700,
|
|
"year": null,
|
|
"groupName": "MUSIC",
|
|
"title": "Me & You & A Dog Named Boo",
|
|
"artist": "Lobo",
|
|
"publisher": "",
|
|
"composer": "",
|
|
"album": "'70s Radio Hits",
|
|
"label": "",
|
|
"client": "",
|
|
"agency": "",
|
|
"conductor": "",
|
|
"userDefined": "",
|
|
"songId": "",
|
|
"outcue": "",
|
|
"description": "Cut 001",
|
|
"isrc": "",
|
|
"isci": "",
|
|
"externalEventId": "",
|
|
"externalData": "",
|
|
"externalAnncType": ""
|
|
}
|
|
}
|
|
}]]>
|
|
</programlisting>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 xml:id="sect.pad.pypad">
|
|
<title>PyPAD</title>
|
|
<para>
|
|
Rivendell ships with a Python 3 module called "pypad" that
|
|
automates away most of the work involved in reading, parsing and
|
|
processing the raw JSON data feed described above. A copiously
|
|
commented example script can be found in the Rivendell source
|
|
tree at <userinput>apis/pypad/tests/now_and_next.py</userinput>.
|
|
</para>
|
|
<sect3 xml:id="sect.pad.pypad.starting_scripts_sutomatically_with_the_rivendell_service">
|
|
<title>Starting Scripts Automatically with the "rivendell" Service</title>
|
|
<para>
|
|
Rivendell can be configured to start one or more PyPAD scripts
|
|
automatically whenever the "rivendell" systemd service
|
|
is (re)started. In order to support this, a PyPAD script must
|
|
meet the following requirements:
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
Accept exactly three command-line arguments as follows:
|
|
</para>
|
|
<para>
|
|
<userinput>script <replaceable>host-name</replaceable>
|
|
<replaceable>port-num</replaceable>
|
|
<replaceable>config</replaceable></userinput>
|
|
</para>
|
|
<para>
|
|
The <replaceable>config</replaceable> value should be
|
|
passed to the <code>pypad.Receiver.setConfigFile()</code> method,
|
|
and <replaceable>host-name</replaceable> and
|
|
<replaceable>port-num</replaceable> values should be
|
|
passed to the
|
|
<code>pypad.Receiver().start()</code> method.
|
|
See any of the production PyPAD scripts in the Rivendell
|
|
sources in <userinput>apis/pypad/scripts/</userinput> for
|
|
an example.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
If the script is configurable via a configuration file,
|
|
provide a sample copy of the configuration file, using
|
|
wherever possible sane
|
|
default values along with comments documenting
|
|
what the various parameters do. The file should have the
|
|
the same base name as that of the script, but have an
|
|
<userinput>.exemplar</userinput> extension.
|
|
</para>
|
|
<para>
|
|
For example, if the script is called
|
|
<userinput>myscript.py</userinput>,
|
|
the sample configuration file would be called
|
|
<userinput>myscript.exemplar</userinput>.
|
|
</para>
|
|
</listitem>
|
|
<listitem>
|
|
<para>
|
|
Install a copy of the script, along with a copy of the
|
|
sample configuration file (if needed) in the Rivendell
|
|
PyPAD script directory
|
|
<userinput><replaceable>$(libdir)</replaceable>/rivendell/pypad/</userinput>.
|
|
</para>
|
|
<note>
|
|
In the RHEL/CentOS reference installation, this directory
|
|
is <userinput>/usr/lib64/rivendell/pypad/</userinput>.
|
|
</note>
|
|
<note>
|
|
The <userinput><replaceable>$(libdir)</replaceable></userinput>
|
|
path component evaluates to
|
|
the value used for the <userinput>--libdir</userinput>
|
|
switch that was passed to the "configure" script
|
|
when Rivendell was built [default value:
|
|
<userinput>/usr/local/lib</userinput>].
|
|
</note>
|
|
</listitem>
|
|
</itemizedlist>
|
|
<para>
|
|
All PyPAD scripts started in this manner will be run under the
|
|
user/group specified by the <userinput>PypadOwner=</userinput>
|
|
and <userinput>PypadGroup=</userinput> directives in the
|
|
<userinput>[Identity]</userinput> section of the
|
|
<command>rd.conf</command><manvolnum>5</manvolnum> configuration
|
|
file.
|
|
</para>
|
|
<para>
|
|
See <xref linkend="sect.rdadmin.managing_pypad_instances" />
|
|
for instructions on enabling a script that has been
|
|
prepared in this manner.
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|