Commit 9afa33f0 authored by david's avatar david
Browse files

Merge branch 'lars-documentation' into 'master'

Grammar and other documentation issues

See merge request aura/engine!7
parents cc39a7e0 a449c907
......@@ -4,7 +4,7 @@
<img src="https://gitlab.servus.at/autoradio/meta/-/raw/master/assets/images/aura-engine.png" width="250" align="right" />
Aura Engine is a scheduling and play-out engine as part of [Aura Radio Software Suite](#About), specifically build for
Aura Engine is a scheduling and play-out engine as part of [Aura Radio Software Suite](#About), specifically built for
the requirements of community radio stations.
<!-- TOC -->
......@@ -27,7 +27,7 @@ the requirements of community radio stations.
In conjunction with other AURA components Engine provides several features:
- **Scheduler** to automatically broadcast your radio programme (see [AURA Dashboard](https://gitlab.servus.at/aura/dashboard) for an user interface to do scheduling)
- **Scheduler** to automatically broadcast your radio programme (see [AURA Dashboard](https://gitlab.servus.at/aura/dashboard) for a user interface to do scheduling)
- **Analog input and outputs** provided by [Engine Core](https://gitlab.servus.at/aura/engine-core)
- **Streaming to an [Icecast](https://icecast.org/) Server including [Icy Metadata](https://cast.readme.io/docs/icy)** provided by [Engine Core](https://gitlab.servus.at/aura/engine-core)
- **Autonomous playout** by caching the schedule information pulled from [Steering](https://gitlab.servus.at/aura/steering) in a local database. This allows Engine be keep running, independently from any network or service outages. This enables the application of (*High Availability* infrastructure scenarios)[https://gitlab.servus.at/aura/meta/-/blob/master/docs/administration/installation-guide.md#high-availability].
......@@ -41,7 +41,7 @@ In conjunction with other AURA components Engine provides several features:
Engine provide a scheduling functionality by polling external API endpoints frequently. Those API endpoints are provided by [Steering](https://gitlab.servus.at/aura/steering) to retrieve schedule information and [Tank](https://gitlab.servus.at/aura/tank) to retrieve playlist information. To define your schedule you'll also need [AURA Dashboard](https://gitlab.servus.at/aura/dashboard) which is an elegent web user interface to manage your shows, playlists and schedules.
Ideally any audio is scheduled some time before the actual, planned playout to avoid timing issues with buffering and preloading. Nonetheless, playlists can also be scheduled after a given calendar timeslot has started already. In such case the playout starts as soon it's preloaded.
Ideally any audio is scheduled some time before the actual, planned playout to avoid timing issues with buffering and preloading. Nonetheless, playlists can also be scheduled after a given calendar timeslot has started already. In such case the playout starts as soon it is preloaded.
If for some reason the playout is corrupted, stopped or too silent to make any sense, then this <u>triggers a fallback using the silence detector</u> (see chapter below).
......@@ -49,7 +49,7 @@ If for some reason the playout is corrupted, stopped or too silent to make any s
#### Versatile playlists
It's possible to schedules playlists with music or pre-recorded shows stored on the **file system**, via external **streams** or live from an **analog input** in the studio. All types of sources can be mixed in a single playlist.
It is possible to schedules playlists with music or pre-recorded shows stored on the **file system**, via external **streams** or live from an **analog input** in the studio. All types of sources can be mixed in a single playlist.
The switching between types of audio source is handled automatically, with configured fadings applied.
......@@ -57,7 +57,7 @@ The switching between types of audio source is handled automatically, with confi
#### Default playlists
While a timeslot can have a specific playlist assigned, it's also possible to define default playlists
While a timeslot can have a specific playlist assigned, it is also possible to define default playlists
for schedules and shows:
- **Default Schedule Playlist**: This playlist is defined on the level of some recurrence rules (*Schedule*).
......
......@@ -93,7 +93,7 @@ scheduling_window_end=60
preload_offset=15
# Sometimes it might take longer to get a stream connected. Here you can define a viable length.
# But note, that this may affect the preloading time (see `preload_offset`), hence affecting the
# overall playout, it's delays and possible fallbacks
# overall playout, its delays and possible fallbacks
input_stream_retry_delay=1
input_stream_max_retries=10
input_stream_buffer=3.0
......
......@@ -93,7 +93,7 @@ scheduling_window_end=60
preload_offset=15
# Sometimes it might take longer to get a stream connected. Here you can define a viable length.
# But note, that this may affect the preloading time (see `preload_offset`), hence affecting the
# overall playout, it's delays and possible fallbacks
# overall playout, its delays and possible fallbacks
input_stream_retry_delay=1
input_stream_max_retries=10
input_stream_buffer=3.0
......
......@@ -93,7 +93,7 @@ scheduling_window_end=60
preload_offset=15
# Sometimes it might take longer to get a stream connected. Here you can define a viable length.
# But note, that this may affect the preloading time (see `preload_offset`), hence affecting the
# overall playout, it's delays and possible fallbacks
# overall playout, its delays and possible fallbacks
input_stream_retry_delay=1
input_stream_max_retries=10
input_stream_buffer=3.0
......
......@@ -33,7 +33,7 @@ For example:
If you need to test and develop against the Engine's API you'll also need to get the `engine-api` project running.
For a start it's recommended to create a general `aura` project folder. In there you start cloning all the sub-projects. After having all the sub-projects configured, and verified that they are working, take a look at the AURA `meta` project.
For a start it is recommended to create a general `aura` project folder. In there you start cloning all the sub-projects. After having all the sub-projects configured, and verified that they are working, take a look at the AURA `meta` project.
There's a convenience script to start all of the three main dependencies (Steering, Dashboard, Tank) all at once:
......@@ -120,7 +120,7 @@ point in time and the involved phase before:
check for updated timeslots and related playlists. Also, any changes to playlists and
its entries are respected within that window (see `fetching_frequency` in `engine.ini`).
> Important: It's vital that the the scheduling window is wider than the fetching frequency.
> Important: It is vital that the the scheduling window is wider than the fetching frequency.
Otherwise one fetch might never hit a scheduling window, hence not being able to schedule stuff.
> Note: If you delete any existing timeslot in Dashboard/Steering this is only reflected in Engine until the start
......@@ -142,7 +142,7 @@ point in time and the involved phase before:
or due to some severe connectivity issues to some external stream.
- **Play-out**: Finally the actual play-out is happening. The faders of the virtual mixers are pushed
all the way up, as soon it's "time to play" for one of the pre-loaded entries.
all the way up, as soon it is "time to play" for one of the pre-loaded entries.
Transitions between playlist entries with different types of sources (file, stream and analog
inputs) are performed automatically. At the end of each timeslot the channel is faded-out,
no matter if the total length of the playlist entries would require a longer timeslot.
......
......@@ -237,7 +237,7 @@ class EngineExecutor(Timer):
is_stored = self.update_store()
if not is_stored:
self.logger.info(SU.yellow(f"Timer '{self.timer_id}' omitted because it's already existing but dead"))
self.logger.info(SU.yellow(f"Timer '{self.timer_id}' omitted because it already exists but is dead"))
self.is_aborted = True
else:
if diff < 0:
......@@ -269,7 +269,7 @@ class EngineExecutor(Timer):
"""
@private
Immediate execution within a thread. It's not stored in the timer store.
Immediate execution within a thread. It is not stored in the timer store.
It also assigns the `timer_id` as the thread name.
"""
......
......@@ -450,7 +450,7 @@ class Player:
def stream_load(self, channel, url):
"""
Preloads the stream URL on the given channel. Note this method is blocking
some serious amount of time; hence it's worth being called asynchronously.
some serious amount of time; hence it is worth being called asynchronously.
Args:
channel (Channel): The stream channel
......
......@@ -382,7 +382,7 @@ class Mixer():
def fade_out(self, channel, volume=None):
"""
Performs a fade-out for the given channel starting at it's current volume.
Performs a fade-out for the given channel starting at its current volume.
Args:
channel (Channel): The channel to fade
......
......@@ -254,7 +254,7 @@ class AuraMonitor:
def heartbeat(self):
"""
Every `heartbeat_frequency` seconds the current vitality status is checked. If it's okay,
Every `heartbeat_frequency` seconds the current vitality status is checked. If it is okay,
a heartbeat is sent to the configured server.
"""
if self.has_valid_status(True):
......@@ -366,4 +366,4 @@ class AuraMonitor:
return s.getsockname()[0]
except:
self.logger.critical(SU.red("Error while accessing network via <broadcast>!"))
return "<UNKNOWN NETWORK>"
\ No newline at end of file
return "<UNKNOWN NETWORK>"
......@@ -152,7 +152,7 @@ class ResourceUtil(Enum):
absolute path to the file, appending the extension as provided
in "source_extension".
If the path starts with an "/" it indicates that it's already an
If the path starts with an "/", it indicates that it is already an
absolute path including a valid extension.
Args:
......@@ -199,4 +199,4 @@ class ResourceUtil(Enum):
"""
if cue_in > 0.0:
uri = "annotate:liq_cue_in=\"%s\":%s" % (str(cue_in), uri)
return uri
\ No newline at end of file
return uri
......@@ -65,7 +65,7 @@ class ProgrammeService():
# Fetch programme from API endpoints
self.logger.debug("Trying to fetch new programme from API endpoints...")
# Create a fetching thread and wait until it's done
# Create a fetching thread and wait until it is done
self.api_fetcher = ApiFetcher(self.config)
self.api_fetcher.start()
response = self.api_fetcher.get_fetched_data()
......
......@@ -145,11 +145,11 @@ class TestEngineExecutor(unittest.TestCase):
time.sleep(0.2)
self.assertEqual("none", global_state[0])
# After 0.4 seconds max there isn't a setting from the child yet, because it's waiting for the parent
# After 0.4 seconds max there isn't a setting from the child yet, because it is waiting for the parent
time.sleep(0.2)
self.assertNotEqual("hello world from child", global_state[0])
# But the parent didn't set anything either, because it's scheduled for later
# But the parent didn't set anything either, because it is scheduled for later
self.assertNotEqual("hello world from parent", global_state[0])
self.assertEqual("none", global_state[0])
......@@ -261,4 +261,4 @@ class TestEngineExecutor(unittest.TestCase):
if __name__ == '__main__':
unittest.main()
\ No newline at end of file
unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment