Merge pull request #1101 from zklosko/master

Fixing broken links in Libretime interface + website 2.1
This commit is contained in:
Kyle Robbertze 2020-12-09 18:14:13 +02:00 committed by GitHub
commit fba40ea123
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
1559 changed files with 5310 additions and 69633 deletions

1
.gitignore vendored
View file

@ -19,3 +19,4 @@ airtime_mvc/tests/log/*.log
/docs/_site/*
/docs/.jekyll-cache/*
/docs/.gems/*
Gemfile.lock

View file

@ -19,7 +19,7 @@ define('FAQ_URL' , 'http://libretime.org/faq');
define('WHOS_USING_URL' , 'https://github.com/orgs/LibreTime/people');
define('TERMS_AND_CONDITIONS_URL' , 'https://github.com/LibreTime/libretime/blob/master/README.md');
define('PRIVACY_POLICY_URL' , 'https://github.com/LibreTime/code-of-conduct/blob/master/CODE_OF_CONDUCT.md');
define('USER_MANUAL_URL' , 'http://libretime.org/');
define('USER_MANUAL_URL' , 'http://libretime.org/docs');
define('ABOUT_AIRTIME_URL' , 'http://libretime.org');
define('LIBRETIME_CONTRIBUTE_URL' , 'https://libretime.org/contribute');
define('LIBRETIME_DISCOURSE_URL' , 'https://discourse.libretime.org');

View file

@ -477,7 +477,7 @@ final class LocaleController extends Zend_Controller_Action
"Disabled" => _("Disabled"),
"Cancel upload" => _("Cancel upload"),
"Type" => _("Type"),
"Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>" => _("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"),
"Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>" => _("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"),
"Podcast settings saved" => _("Podcast settings saved"),
"Are you sure you want to delete this user?" => _("Are you sure you want to delete this user?"),
"Can't delete yourself!" => _("Can't delete yourself!"),

View file

@ -76,14 +76,6 @@
<?php echo $this->navigation()->menu(); ?>
</div>
<div class="btn-group">
<a href="<?php echo $this->baseUrl . '/login/logout'; ?>">
<button id="add_media_btn" class="btn btn-small dashboard-btn btn-danger">
<span><?php echo _("Logout") ?></span>
</button>
</a>
</div>
<script>
<?php
$partitions = Application_Model_Systemstatus::GetDiskInfo();

View file

@ -11,7 +11,7 @@
</dd>
<div id="add_show_playlist_dropdown">
<p><?php echo _("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"); ?></p>
<p><?php echo _("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"); ?></p>
<dt id="add_show_autoplaylist_id">
<label for="add_show_autoplaylist_id" class="required">
<?php echo $this->element->getElement('add_show_autoplaylist_id')->getLabel()?>

View file

@ -1 +1 @@
Airtime is down for maintenance. We'll be back soon!
Libretime is down for maintenance. We'll be back soon!

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2538,7 +2538,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2551,7 +2551,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2553,7 +2553,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2538,7 +2538,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2538,7 +2538,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2539,7 +2539,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2538,7 +2538,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2548,8 +2548,8 @@ msgid "Add Autoloading Playlist ?"
msgstr "¿Programar Lista Auto-Cargada?"
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgstr "Se le agrega los contenidos de las listas auto-cargadas a programas una hora antes de que suenen. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>Mas información</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr "Se le agrega los contenidos de las listas auto-cargadas a programas una hora antes de que suenen. <a target='_blank' href='http://libretime.org/docs/playlists'>Mas información</a>"
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25
msgid "Select Playlist"

View file

@ -2568,8 +2568,8 @@ msgid "Add Autoloading Playlist ?"
msgstr "Ajouter une playlist automatique ?"
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgstr "Le contenu des playlists automatiques est ajouté aux émissions une heure avant leur départ. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>Plus d'informations</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr "Le contenu des playlists automatiques est ajouté aux émissions une heure avant leur départ. <a target='_blank' href='http://libretime.org/docs/playlists'>Plus d'informations</a>"
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25
msgid "Select Playlist"

View file

@ -2537,7 +2537,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2700,7 +2700,7 @@ msgid "Add Autoloading Playlist ?"
msgstr "Lejátszási lista automatikus ütemezése?"
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2531,7 +2531,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2539,7 +2539,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2537,7 +2537,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2532,7 +2532,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2535,7 +2535,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2535,7 +2535,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2541,7 +2541,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2538,7 +2538,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2539,7 +2539,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2563,8 +2563,8 @@ msgid "Add Autoloading Playlist ?"
msgstr "Добавить?"
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgstr "Содержимое автозагружаемого Плейлиста добавляется в Программу за один час до ее выхода в эфир. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>Больше информации</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr "Содержимое автозагружаемого Плейлиста добавляется в Программу за один час до ее выхода в эфир. <a target='_blank' href='http://libretime.org/docs/playlists'>Больше информации</a>"
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25
msgid "Select Playlist"

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2537,7 +2537,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2537,7 +2537,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2534,7 +2534,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2535,7 +2535,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -2537,7 +2537,7 @@ msgid "Add Autoloading Playlist ?"
msgstr ""
#: airtime_mvc/application/views/scripts/form/add-show-autoplaylist.phtml:14
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>"
msgid "Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>"
msgstr ""
#: airtime_mvc/application/forms/AddShowAutoPlaylist.php:25

View file

@ -104,35 +104,35 @@ var AIRTIME = (function(AIRTIME) {
"media": "tracks",
"icon": "icon-music",
"subtext": "Click 'Upload' to add some now.",
"href": "http://libretime.org/manual/tracks/"
"href": "http://libretime.org/docs/dashboard/"
};
case mod.MediaTypeIntegerEnum.PLAYLIST:
return {
"media": "playlists",
"icon": "icon-list",
"subtext": "Click 'New' to create one now.",
"href": "http://libretime.org/manual/playlist/"
"href": "http://libretime.org/docs/playlists/"
};
case mod.MediaTypeIntegerEnum.BLOCK:
return {
"media": "smart blocks",
"icon": "icon-time",
"subtext": "Click 'New' to create one now.",
"href": "http://libretime.org/manual/smartblocks/"
"href": "http://libretime.org/docs/playlists/"
};
case mod.MediaTypeIntegerEnum.WEBSTREAM:
return {
"media": "webstreams",
"icon": "icon-random",
"subtext": "Click 'New' to create one now.",
"href": "http://libretime.org/manual/webstreams/"
"href": "http://libretime.org/docs/webstreams/"
};
case mod.MediaTypeIntegerEnum.PODCAST:
return {
"media": "podcasts",
"icon": "icon-headphones",
"subtext": "Click 'Add' to create one now.",
"href": "http://libretime.org/manual/podcasts"
"href": "http://libretime.org/docs/podcasts"
};
default:
break;

View file

@ -483,7 +483,7 @@ function setAddShowEvents(form) {
form.find(".show_autoplaylist_help_icon").qtip({
content: {
text: $.i18n._("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/manual/calendar/#autoloading-playlist'>More information</a>")
text: $.i18n._("Autoloading playlists' contents are added to shows one hour before the show airs. <a target='_blank' href='http://libretime.org/docs/playlists'>More information</a>")
},
hide: {
delay: 500,

20
cloud-init.yml Normal file
View file

@ -0,0 +1,20 @@
# Maintainer: Zachary Klosko (kloskoz@vcu.edu)
hostname: libretimeTest
timezone: America/New York # change as needed
ntp:
pools: ['north-america.pool.ntp.org']
servers: ['0.north-america.pool.ntp.org', '0.pool.ntp.org']
password: hackme
chpasswd: { expire: False }
packages:
- git
apt_update: true
apt_upgrade: true
# Clone repo on init (Change repo url if needed)
# If you need to clone a branch, use git clone --branch branchname repourl
runcmd:
- git clone https://github.com/LibreTime/libretime.git

View file

@ -1,4 +0,0 @@
---
permalink: /404.html
layout: 404
---

11
docs/404.md Normal file
View file

@ -0,0 +1,11 @@
---
layout: 404
linkto: /search
linktext: Search
img: /img/car-radio-unsplash.jpg
photocredit: Top photo by <a href="https://unsplash.com/@shotaspot?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Frank Albrecht</a> on <a href="https://unsplash.com/s/photos/radio?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>
---
# DEAD AIR
Sorry... there's nothing there.

33
docs/README Normal file
View file

@ -0,0 +1,33 @@
# Contributing to the docs
**Note:** External components for the website (Bootstrap, jQuery, Font Awesome etc.) are
now being served from CDNs instead of from the repo itself. You must be connected to the internet in order to test the site.
## Running Jekyll
Follow [these instructions](https://jekyllrb.com/docs/installation/) to install Ruby, then:
```
# Install Jekyll and Bundler gems
gem install jekyll bundler
# Install Jekyll dependencies
cd docs #must run in docs folder
bundler install
# Run Jekyll server
jekyll serve
```
## Where to find things
```
/docs -> main folder
|-- /_docs -> actual documentation lives here in markdown files
|-- /_includes -> the equilivant of components, can be inserted into HTML files
|-- /_layouts -> the HTML styling templates that make up each page
|-- /css -> CSS files live here
|-- /img -> all images, screenshots live here
|-- _config.yml -> main settings file for Jekyll
|-- Gemfile -> dependencies file for Jekyll
```

View file

@ -1,22 +1,21 @@
title: LibreTime
description: An open source radio automation server made for (and by) low-power FM stations and the rest of us.
logo: 144px.png
baseurl: "/" # The subpath of your site, e.g. /blog
baseurl: "" # The subpath of your site, e.g. /blog
url: "https://libretime.org" # The base hostname & protocol for your site, e.g. http://example.com
layouts_dir: _layouts
data_dir: _data
includes_dir: _includes
favicon: favicon.ico
# For splash page layout only
headimage: img/header.jpg
headtext: Open Source Radio Automation
headsubtext: Everything you need to get your terrestrial / on-line radio station up and broadcasting like a pro - without breaking the bank!
# items below - only for first front page link
headbuttonurl: index#get-started
headbuttontext: Get LibreTime
exclude: ['README']
# Collections Settings
collections:
docs:
output: true
permalink: /docs/:name
# Build settings
plugins:

View file

@ -1,50 +0,0 @@
# Navigation for Docs page (guides.md)
djguides:
- page: Broadcasting Live
url: live-broadcast
- page: Using the Library (Playlists, Smartblocks, Webstreams, Podcasts)
url: library
- page: Preparing Media
url: preparing-media
- page: Scheduling Shows
url: scheduling-shows
managerguides:
- page: Playout History & Auditing
url: analytics
- page: Rights and Royalties
url: rights-royalties
- page: User Management
url: users
adminguides:
- page: API Usage
url: api
- page: Backing up LibreTime
url: backing-up-the-server
- page: Built-in Microsite
url: microsite
- page: Configuring Icecast/Shoutcast
url: icecast-shoutcast
- page: FreeIPA Configuration
url: freeipa
- page: HD Audio Modules Reference
url: hd-audio-modules
- page: Installing Libretime
url: install
- page: Interface Customization
url: interface-customization
- page: Settings
url: settings
- page: Troubleshooting/Uninstall
url: troubleshooting
- page: Upgrading LibreTime
url: upgrading
devguides:
- page: Contributing to Libretime
url: contribute
- page: Developing with Vagrant
url: vagrant
- page: Translate Libretime
url: interface-localization

View file

@ -1,7 +1,7 @@
---
layout: default
layout: article
title: LibreTime API Usage
git: api.md
category: dev
---
The LibreTime API enables many types of information about the broadcast schedule and configuration to be retrieved from the LibreTime server. Other than the live-info and week-info data fetched by website widgets (see the chapter *Exporting the schedule*), all API requests must be authenticated using the secret API key stored in the file */etc/airtime/api\_client.cfg* on the LibreTime server. This key is autogenerated during LibreTime installation and should be unique for each server.

View file

@ -0,0 +1,66 @@
---
layout: article
title: Backing Up Libretime
category: admin
---
> At the moment, there is not a way to automatically restore a Libretime backup.
> To restore a failed Libretime instance, install a fresh copy, go through the
> standard setup process, and reupload the backed-up media files. A *Watched Folders*
> feature is [currently in development](https://github.com/LibreTime/libretime/issues/70).
A backup script is supplied for your convenience in the *utils/* folder of the Libretime repo.
Run it using:
```
sudo bash libretime-backup.sh # backs up to user's home folder
# or
sudo bash libretime-backup.sh /backupdir/
```
The backup process can be automated with Cron. Simply add the following to the root user's
crontab with `sudo crontab -e`:
```
0 0 1 * * /locationoflibretimerepo/libretime/backup.sh
```
> For more information on how Cron works, check out [this Redhat guide](https://www.redhat.com/sysadmin/automate-linux-tasks-cron).
If you wish to deploy your own backup solution, the following files and folders need to
be backed up.
```
/srv
/airtime
/stor
/imported - Sucessfully imported media
/organize - A temporary holding place for uploaded media as the importer works
/etc
/airtime
airtime.conf - The main Libretime configuration
icecast_pass - Holds the password for the Icecast server
liquidsoap.cfg - The main configuration file for Liquidsoap
```
In addition, you should keep a copy of the database current to the backup. The below code
can be used to export the Libretime database to a file.
```
sudo -u postgres pg_dumpall filename
# or to a zipped archive
sudo -u postgres pg_dumpall | gzip -c > archivename.gz
```
It is recommended to use an incremental backup technique to synchronize
the your LibreTime track library with a backup server regularly. (If
the backup server also contains an LibreTime installation, it should be possible
to switch playout to this second machine relatively quickly, in case of a
hardware failure or other emergency on the production server.)
Two notible backup tools are [rsync](http://rsync.samba.org/) (without version control) and
[rdiff-backup](http://www.nongnu.org/rdiff-backup/) (with version control). *rsync* comes
preinstalled with Ubuntu Server.
> **Note:** Standard *rsync* backups, which are used by the backup script, cannot restore files deleted in the backup itself

57
docs/_docs/calendar.md Normal file
View file

@ -0,0 +1,57 @@
---
layout: article
title: Show Calendar
category: interface
---
The Calendar page of the LibreTime administration interface has three views: **day**, **week** and **month**, which can be switched using the grey buttons in the top right corner. By default, the **month** view is shown, with today's date highlighted by a pale grey background.
![](/img/Screenshot451-Calendar.png)
In the top left corner of the page, you can go back or forward through the **Calendar** by clicking on the buttons which have a small grey triangle in a white circle. Click the **today** button to jump to today's date in the current view. (The **today** button will be greyed out if you are already viewing that date). In the **day** or **week** views, there is also a drop-down menu which allows you to set the resolution displayed for the calendar, ranging from one minute per row to sixty minutes per row.
![](/img/Screenshot452-Calendar_resolution.png)
### Editing a show
Show configuration and metadata can be changed at any time, except for **Date/Time Start** and **Record from Line In?** options, which are fixed after broadcast of that show commences. Click the show in the Calendar, and select **Edit Show** from the pop-up context menu. This opens the **Update Show** box, which is almost exactly the same as the **Add this Show** box. Click the **+ Update show** button at the top or bottom of the box when you are done.
![](/img/Screenshot459-Update_show.png)
Episodes of repeating shows also have an **Instance Description** field in which you can add details for that particular episode. Click the episode in the Calendar, click **Edit** on the pop-up menu, then click **Edit this instance**. After entering an Instance Description, click the **+ Update show** button.
![](/img/Screenshot583-Show_instance_description_vC9ooiT.png)
Alternatively, individual shows can be clicked on and dragged to new days and times in the calendar. However, LibreTime will not allow you to drag a future show into the past, or drag and drop instances of a repeated show. In the **Day** and **Week** views, show length can be adjusted by clicking on the lower edge of the show box, and dragging the edge of the box upwards or downwards. The new show length is calculated automatically.
### Adding content to a show
To add content to a show, click the show in any view on the Calendar, and select **Schedule Tracks** from the pop-up menu. Shows that do not yet contain any scheduled content are marked with a red exclamation mark icon, to the right of the show start and end times in the top bar. Shows partially filled with content have a yellow exclamation mark icon. During playout of the show, a green play icon will also be shown in the top bar.
![](/img/Screenshot488-Add_remove_content.png)
The **Schedule Tracks** action opens a window with the name of the show. Like when using the **Now Playing** page, you can search for content items and add them to the show schedule on the right side of the page. Refer to the *Now Playing* chapter for details.
When your show has all the required content, click the **OK** button in the bottom right corner to close the window. Back in the **Calendar**, click the show and select **View** from the pop-up menu to view a list of content now included in the show.
![](/img/Screenshot489-Show_Content.png)
The **Contents of Show** window is a read-only interface featuring an orange bar which indicates how much media has been added to the show. Click the **OK** button in the bottom right corner, or the white **x** icon in the top right corner, to close the window.
![](/img/Screenshot353-Contents_of_show.png)
### Removing content from a show
To remove an individual item from a show, click on the show in the **Calendar**, and select **Schedule Tracks** from the pop-up menu. In the window which opens, click any item you wish to remove from the show, then click **Delete** on the pop-up menu, or check the box in the item's row then click the **Remove** icon at the top of the table. To remove all files and playlists from a show, click on the show in the **Calendar**, and select **Clear Show** from the pop-up menu. 
### Deleting an upcoming show
To delete an upcoming instance of a repeating show, click on the show in the **Calendar**, and select **Delete**, then **Delete Instance** from the pop-up menu. If you wish to delete all future instances of a repeating show, select **Delete Instance and All Following** from the pop-up menu.
![](/img/Screenshot490-Delete_this_instance.png)
You cannot delete or remove content from shows that have already played out. These shows have only one option on the pop-up menu, which is **View**.
### Cancelling playout
If you wish to cancel playout of a show while it is running, click on the show in the **Calendar** and select **Cancel Show** from the pop-up menu. This action cannot be undone.

View file

@ -1,10 +1,11 @@
---
layout: default
title: Contributing to LibreTime
git: contribute.md
title: Contribute to Libretime
layout: article
category: dev
permalink: /contribute
---
> LibreTime is a fork of AirTime due to stalled development of the FLOSS version. For background on this,
> LibreTime is a fork of AirTime due to stalled development of the open source version. For background on this,
see this [open letter to the Airtime community](https://gist.github.com/hairmare/8c03b69c9accc90cfe31fd7e77c3b07d).
## Bug reporting
@ -16,43 +17,44 @@ improvements and new features for LibreTime on that site.
## Feature requests
Have an idea that would make LibreTime even better than it is right now? Start a **Feature request** on our
Have an idea that would make Libretime even better than it is right now? Start a **Feature request** on our
[Github issues page](https://github.com/LibreTime/libretime/issues/new/choose).
## Help translate LibreTime
## Translation
LibreTime can run in over 15 different languages due to the gracious help of our volunteers. Is your language not
supported? Follow [this guide](interface-localization) to add your language to LibreTime!
supported? Follow [this guide](/docs/interface-localization) to add your language to LibreTime!
## Help write documentation for LibreTime
## Write documentation
Our site is now run by Jekyll. After cloning our repo locally, enter the `/docs` directory and run
Our site is now built by Jekyll, which has an installation guide [here](https://jekyllrb.com/docs/installation/) to help get you started.
After cloning our repo locally, enter the `docs/` directory and run
```
bundle install
jekyll serve
```
## Help write code for LibreTime
## Code
Are you familar with coding in PHP? Have you made projects in Liquidsoap and some of the other services we use?
Take a look at the bugs and feature requests [here](https://github.com/LibreTime/libretime/issues), and then
Take a look at the [list of bugs and feature requests](https://github.com/LibreTime/libretime/issues), and then
fork our repo and have a go! Just use the **Fork** button at the top of our **Code** page, clone the forked repo to
your desktop, open up a favorite editor and make some changes, and then commit, push, and open a pull request.
Knowledge on how to use [Github](https://guides.github.com/activities/hello-world/) and [Git](https://git-scm.com/docs/gittutorial)
will suit you well, use the links for a quick 101.
### Testing LibreTime in Vagrant
## Testing and CI/CD
Before submitting code to the project, it's a good idea to test it first. To do this, it's easiest to install
LibreTime in a virtural machine on your local system or in a cloud VM. Instructions on how to set up a virtural
instance of LibreTime with Vagrant are located [here](vagrant).
LibreTime in a virtural machine on your local system or in a cloud VM. We have instructions for setting up a virtural
instance of LibreTime with [Vagrant](/docs/vagrant) and [Multipass](/docs/multipass).
If you would like to try LibreTime in a Docker image,
Odclive has instructions [here](https://github.com/kessibi/libretime-docker) for setting up a test image
and a more persistant install.
### Modifying the Database
## Modifying the Database
LibreTime is designed to work with a [PostgreSQL](https://www.postgresql.org/) database server running locally.
LibreTime uses [PropelORM](http://propelorm.org) to interact with the ZendPHP components and create the database.

123
docs/_docs/dashboard.md Normal file
View file

@ -0,0 +1,123 @@
---
layout: article
title: Dashboard
category: interface
---
> Want to listen to Libretime's output stream? Click **Listen** below the **On Air** light.
The Dashboard is divided into two sections a Library section divided between
Tracks, Playlists, Smart Blocks, Webstreams, and Podcasts, with the **Scheduled
Shows** dialog on the right. This page provides an overview of the right-hand
interface. Check the links to see information about the other sections which
provide the content that can be scheduled.
The **Scheduled Shows** page provides a view of the content your station is will
playout, or has already played out, which defaults to showing the 3 hours
ahead. This page also enables you to make last-minute changes to running shows.
If you've only just installed LibreTime, there might not be any content shown
yet. Click the calendar and clock icons above the table to change the date and
time range, then click the **Find Shows** button (with the magnifying glass
icon) to the right.
![](/img/now-playing.png)
To display the content of a particular show, click **Filter by Show** and select
the name of the show from the drop-down menu which will appear.
![](/img/filter.png)
On the left side of the page, the **Start** and **End** times, **Duration**
and **Title** of each content item are shown. On the right, **Creator**,
**Album**, **Cue** or **Fade** times and **Mime** type (file format) can also be
shown. This information can help you to prepare voice tracks for insertion into
the show, including time checks if you wish. Putting current time information i
to voice tracks describing specific content can, of course, limit the
re-usability of those voice tracks, unless you always broadcast a particular
item at the same time of day.
Click the **Show/hide columns** button on the right to configure the metadata
displayed, by checking the boxes in the pop-up window.
![](/img/columns.png)
The row for the currently playing item is displayed with a bright green
background. Any underbooked shows (shows with insufficient content to fill the
time allowed) are displayed with a row indicating the length of the underbooking
in minutes and seconds. These rows contain a red exclamation mark in the first
column, and have a pink background.
![](/img/end-gap.png)
### Removing content from a running show
If a show is overbooked, which means the total playout duration is longer than
the time allowed for the show, a brown row indicates that the item will be faded
out when the show ends. A red row indicates that the item will not be played at
all. The length of the overbooking is shown in minutes and seconds in the last
row of the show. To remove the extra items from the end of an overbooked show,
click the **Scissors** button at the top left of the table.
Alternatively, check the boxes for items which have not yet completed playout,
and click the **Trashcan** button, to the right of the Scissors, to remove them
from the schedule. If you remove the currently playing item, playout will skip
to the next item in the show automatically, so you should make sure you have
enough items remaining in the show to avoid dead air.
![](/img/delete-extra.png)
If you have a long schedule displayed, and you wish to skip to the currently
playing item, click the button with the end arrow icon, to the right of the
**Trashcan**.
To cancel the current show completely, click the red button to the right again.
A pop-up window will ask you to confirm the cancellation, as this action cannot
be undone.
Items which are no longer available have an exclamation mark icon in the second
column. This may happen for media files which were part of previous shows, and
were removed from LibreTime's library (main storage or watched folders)
subsequently. Items which are included in forthcoming shows cannot be removed
from the Library via the LibreTime interface.
### Adding content to a running show
After you have found the items that you want using the search tools, you can
then drag and drop them from the library table on the left side of the page into
the shows on the right side, including the current playing show.
If the current show has nothing playing out at the time, the new item will begin
playing immediately. This manual triggering of playout can be used as a live
assist technique, in which the LibreTime server's soundcard output is mixed with
other sources such as microphones or telephone hybrids on its way to a
transmitter, or a separate stream encoder. For instance, a live show's host may
not wish to cut off a studio discussion in order to play music at a fixed time.
![](/img/drag-and-drop.png)
You can also select multiple items using the **Select** menu button, just
beneath the simple search field, which has the options to **Select this page**
of search results, **Deselect this page** and **Deselect all**. Alternatively,
use the checkboxes on the left side of the library table to select specific
items. Then drag one of the items into the show to add all of the selected
items, or click the **Add to selected show** button, which has a plus icon. If
you wish, you can also use the **Trashcan** button to permanently remove items
from LibreTime's library. Only *admin* users have permission to delete all
items.
To insert checkbox selected items at a specific time in the show schedule, click
one of the songs in the schedule table. Then click the **Add to selected show**
button in the library table. This will insert the library songs after the
selected scheduled song.
To add a single item at the insertion point, double-click on it in the library.
There is no need to select or drag the item first.
Right-clicking on a song in the schedule table will show a pop-up. This pop-up
menu also enables you to audition the entire show in advance of playout, or
remove the item that was clicked on from the show.
Multiple insertion points can be enabled, so that the same item is inserted into
the schedule at different times. For example, you may wish to play a news report
every hour, or a station ident after every five music files.

View file

@ -0,0 +1,71 @@
---
title: How To Change Default Passwords
layout: article
category: admin
---
### Libretime
To change the password of the current user:
1. Log in to Libretime
2. Click on the username in the upper right corner (next to Log Out)
3. Enter the new password twice and click **Save**
To change the password for a different user (requires *Administrator* privileges):
1. Log in to Libretime
2. Go to **Settings** > **Manage Users**
3. Select the user, enter the new password twice, and click **Save**
### PostgreSQL
Two of the most important passwords that should be changed *immediately* after installation
are the passwords used by the PostgreSQL database.
It is strongly recommended that you do this before exposing your server to the internet beyond your internal network.
1. Login to PostgreSQL with `sudo -u postgres psql`. The PostgreSQL shell - `postgres=#` - means that you have logged in successfully.
2. Change the admin password with `ALTER USER postgres PASSWORD 'myPassword';`, where `myPassword` is the new password.
Make sure to include the semicolon at the end! A response of `ALTER ROLE` means that the command ran successfully.
3. Change the password for the *airtime* user with `ALTER USER airtime WITH PASSWORD 'new_password';`
A response of `ALTER ROLE` means that the command ran successfully.
4. If all is successful, logout of PostgreSQL with `\q`, go back to */etc/airtime/airtime.conf* to edit the password
in the config file, and restart all services mentioned in the previous section.
### Icecast
Random passwords are generated for Icecast during the installation. To look up and change the passwords, look in the file below.
`/etc/icecast2/icecast.xml`
Replace the admin and *changeme* fields below.
```
<authentication>
<!-- Sources log in with username 'source' -->
<source-password>changeme</source-password>
<!-- Relays log in with username 'relay' -->
<relay-password>changeme</relay-password>
<!-- Admin logs in with the username given below -->
<admin-user>admin</admin-user>
<admin-password>changeme</admin-password>
</authentication>
```
Then, restart your icecast2 service.
```
sudo systemctl restart icecast2
```
> Note: If you change the source password, you may need to manually configure Libretime to use the new password: go to **Settings** > **Streams**, set the streaming server to **Custom** and fill out the **Additional Options** below Stream 1.
### Rabbitmq
To change the default password for Rabbitmq, run the following command
```
sudo rabbitmqctl change_password airtime newpassword
```
and then update the `/etc/airtime/airtime.conf` file with the new password.

View file

@ -1,6 +1,7 @@
---
layout: default
layout: article
title: FreeIPA Configuration
category: install
---
You can configure LibreTime to delegate all authentication to a FreeIPA server.

View file

@ -1,7 +1,8 @@
---
layout: default
layout: article
title: HD Audio Modules
git: hd-audio-modules.md
category: admin
---
This listing is provided to help ensure that the correct model parameter is passed to the ALSA kernel module for an Intel HDA soundcard, if one is fitted to your LibreTime server. See the chapter *Preparing the server* in this book for more details.

View file

@ -0,0 +1,201 @@
---
title: Host Configuration
layout: article
category: install
---
The streaming host configuration for LibreTime is shown in the file */etc/airtime/liquidsoap.cfg* which is automatically generated by the **Streams** page, found on the **System** menu of the LibreTime administration interface. For this reason, you would not normally edit the streaming configuration manually, as any changes are likely to be overwritten by the administration interface.
## Database and RabbitMQ hosts {#database}
Optionally, you may wish to edit the file */etc/airtime/airtime.conf* to set the PostgreSQL database host, and the username and password to connect to the database with:
sudo nano /etc/airtime/airtime.conf
You can also set options for RabbitMQ messaging, the LibreTime server and SoundCloud uploads in this file, although you should not normally need to adjust the defaults unless you are running a large LibreTime system distributed across multiple servers. To run the LibreTime server in demo mode, which changes the greeting on the login page and prevents user accounts from being created or modified, set the value of *demo* to 1.
[database]
host = localhost
dbname = airtime
dbuser = airtime
dbpass = airtime
[rabbitmq]
host = 127.0.0.1
port = 5672
user = airtime
password = XXXXXXXXXXXXXXXXXXXX
vhost = /airtime
[general]
api_key = XXXXXXXXXXXXXXXXXXXXX
web_server_user = www-data
airtime_dir = /usr/share/airtime
base_url = libretime.example.com
base_port = 80
base_dir = /
cache_ahead_hours = 1
[monit]
monit_user = guest
monit_password = airtime
[soundcloud]
connection_retries = 3
time_between_retries = 60
[demo]
demo = 0
Save and close the file with **Ctrl+O** and **Ctrl+X**. In order to update the configuration
used by the various components of LibreTime, run the following commands
sudo systemctl restart libretime-liquidsoap
sudo systemctl restart libretime-playout
sudo systemctl restart libretime-celery
sudo systemctl restart libretime-analyzer
## API client configuration {#api}
The LibreTime API enables many types of information about the broadcast schedule and configuration to be retrieved from the LibreTime server. Other than the live-info and week-info data fetched by website widgets (see the chapter *Exporting the schedule*), all API requests must be authenticated using the secret API key stored in the file */etc/airtime/api\_client.cfg* on the LibreTime server. This key is autogenerated during LibreTime installation and should be unique for each server.
If you intend to use the LibreTime API across a public network, for security reasons it is highly recommended that all API requests are sent over encrypted https: and that the web server is configured to accept requests to the api/ directory from specific host names or IP addresses only.
If you have changed the *base\_url*, *base\_port* or *base\_dir* setting in */etc/airtime/airtime.conf* from the defaults, you will probably also have to update the *Hostname* settings in the file */etc/airtime/api\_client.cfg* accordingly.**
bin_dir = /usr/lib/airtime/api_clients
api_key = 'XXXXXXXXXXXXXXXXXXXX'
api_base = api
host = libretime.example.com
base_port = 80
base_dir = /
## Apache max file size configuration {#apache}
By default, the maximum upload file size is 40 MB, which may not be large enough for some stations, especially if they are uploading prerecorded shows. The setting for this is located in */etc/apache2/sites-available/airtime.config*. Search for and update the following in megabytes:
```
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
```
For quick reference, 1024 MB = 1 GB and 2048 MB = 2 GB, but most will be okay with rounding to the nearest thousand. After updating the config file, restart Apache.
```
sudo systemctl restart apache2
```
## Playout settings {#playout}
Settings for pypo, the playout engine used by LibreTime, are found in the file */etc/airtime/airtime.conf*. After making changes to this file, you will have to issue the command:
sudo systemctl restart libretime-playout
for the changes to take effect.
############################################
# pypo - configuration #
############################################
# Set the type of client you are using.
# Currently supported types:
# 1) "obp" = Open Broadcast Platform
# 2) "airtime"
#
api_client = airtime
############################################
# Cache Directories #
# *include* trailing slash !! #
############################################
cache_dir = /var/tmp/airtime/pypo/cache/
file_dir = /var/tmp/airtime/pypo/files/
tmp_dir = /var/tmp/airtime/pypo/tmp/
############################################
# Setup Directories #
# Do *not* include trailing slash !! #
############################################
cache_base_dir = /var/tmp/airtime/pypo
bin_dir = /usr/lib/airtime/pypo
log_base_dir = /var/log/airtime
pypo_log_dir = /var/log/airtime/pypo
liquidsoap_log_dir = /var/log/airtime/pypo-liquidsoap
############################################
# Liquidsoap settings #
############################################
ls_host = 127.0.0.1
ls_port = 1234
############################################
# RabbitMQ settings #
############################################
rabbitmq_host = localhost
rabbitmq_user = airtime
rabbitmq_password = XXXXXXXXXXXXXXXXXXXX
rabbitmq_vhost = /airtime
############################################
# pypo preferences #
############################################
# Poll interval in seconds.
#
# This will rarely need to be changed because any schedule changes are
# automatically sent to pypo immediately.
#
# This is how often the poll script downloads new schedules and files from the
# server in the event that no changes are made to the schedule.
#
poll_interval = 3600# in seconds.
# Push interval in seconds.
#
# This is how often the push script checks whether it has something new to
# push to liquidsoap.
#
# It's hard to imagine a situation where this should be more than 1 second.
#
push_interval = 1# in seconds
# 'pre' or 'otf'. 'pre' cues while playlist preparation
# while 'otf' (on the fly) cues while loading into ls
# (needs the post_processor patch)
cue_style = pre
## RabbitMQ hostname changes
If the Airtime logs indicate failures to connect to the RabbitMQ server, such as:
```
2013-10-31 08:21:11,255 ERROR - [pypomessagehandler.py : main() : line
99] - Error connecting to RabbitMQ Server. Trying again in few seconds
2013-10-31 08:21:11,255 ERROR - \[pypomessagehandler.py : main() : line 99\] - Error connecting to RabbitMQ Server. Trying again in few seconds - See more at: http://forum.sourcefabric.org/discussion/16050/\#sthash.W8OJrNFm.dpuf
```
but the RabbitMQ server is running normally, this error might be due to a change in the server's hostname since Libretime installation. Directory names under */var/lib/rabbitmq/mnesia/* indicate that RabbitMQ's database files are organised according to the hostname of the server (ex. `rabbit@airtime`) where the hostname is *airtime.example.com*. If the hostname has changed, it may be necessary to reconfigure RabbitMQ manually, as follows:
1. Delete the files in */var/lib/rabbitmq/mnesia/*
```
sudo rm -r /var/lib/rabbitmq/mnesia/*
```
2. Restart RabbitMQ:
```
sudo systemctl restart rabbitmq-server
```
3. Enter the following commands to set up authentication and grant permissions. The *rabbitmqctl add\_user* command requires the RabbitMQ password from the /etc/airtime/airtime.conf file as an argument. The *rabbitmqctl set\_permissions* command should be entered on one line, with the list of Airtime services repeated three times:
```
rabbitmqctl add_vhost /airtime
rabbitmqctl add_user airtime XXXXXXXXXXXXXXXXXXXX
rabbitmqctl set_permissions -p /airtime airtime
"airtime-pypo|pypo-fetch|airtime-analyzer|media-monitor"
  "airtime-pypo|pypo-fetch|airtime-analyzer|media-monitor"
 "airtime-pypo|pypo-fetch|airtime-analyzer|media-monitor"
```

View file

@ -1,7 +1,7 @@
---
layout: default
title: Icecast and Shoutcast Stream Configuration
git: icecast-shoutcast.md
layout: article
title: Icecast Configuration
category: admin
---
## Background
@ -20,7 +20,7 @@ Conversely, you may have a music station which wants to stream at 160kbps or 192
When sending metadata about your stream to an Icecast server in non-Latin alphabets, you may find that Icecast does not display the characters correctly for an MP3 stream, even though they are displayed correctly for an Ogg Vorbis stream. In the following screenshot, Russian characters are being displayed incorrectly in the *Current Song* field for the MP3 stream:
![](img/Screenshot223-Icecast_UTF-8_metadata.png)
![](/img/Screenshot223-Icecast_UTF-8_metadata.png)
The solution is to specify that the metadata for the MP3 mount point you are using should be interpreted using UTF-8 encoding. You can do this by adding the following stanza to the */etc/icecast2/icecast.xml* file, where *libretime.mp3* is the name of your mount point:
@ -79,7 +79,7 @@ Connect the other source to the Icecast server with the same parameters defined
To configure **Mixxx** for streaming to Icecast, click *Options*, *Preferences*, then *Live Broadcasting*. For server *Type*, select the default of *Icecast 2* when streaming to Debian or Ubuntu servers, as this is the current version of Icecast supplied with those GNU/Linux distributions.
![](img/Screenshot123-Mixxx_Preferences.png) 
![](/img/Screenshot123-Mixxx_Preferences.png) 
By default, Icecast streams are buffered to guard against network problems, which causes latency for remote listeners. When monitoring the stream from a remote location, you may have to begin the live stream a few seconds before the previous stream ends to enable a smooth transition.
@ -119,4 +119,4 @@ Another stream directory service is provided by the Liquidsoap Flows! site <http
streams=[("ogg/128k","http://streaming.example.com/libretime_128")],
ourstation)
For the time being, a stream can be registered on the Liquidsoap Flows! site with any username and password. Authenticated services may be offered in future.
> **Note:** For the time being, a stream can be registered on the Liquidsoap Flows! site with any username and password. Authenticated services may be offered in future.

109
docs/_docs/install.md Normal file
View file

@ -0,0 +1,109 @@
---
title: Install
layout: article
category: install
permalink: /install
---
> Note: this guide is assuming you are using Ubuntu 18.04 LTS for installation, which comes with `ufw` and `netplan`.
## Minimum System Requirements
- One of the following Linux distributions
- Ubuntu 16.04 LTS, 18.04 LTS
- Debian 9, 10
- Raspberry Pi OS 9, 10 (formerly Raspbian)
- 1 Ghz Processor
- 2 GB RAM recommended (1 GB required)
- Wired internet connection and static IP address for on-prem install
[DigitalOcean](https://www.digitalocean.com/pricing/#Compute) and [Linode](https://www.linode.com/pricing/#row--compute)
have similar plans that meet Cloud Install requirements. Both plans cost $10/month.
## Preparing the server
Configure the server to have a static IP address by modifying the Netplan configuration.
If you're using a cloud VM, you likely already have a static IP address. Check with your provider to confirm this.
```
cd /etc/netplan && ls # find the netplan filename
sudo nano ##-netcfg.yaml
```
If the Netplan configuration is empty, fill in the file with the example below. Otherwise,
input the IP address reserved for the server in `xxx.xxx.xxx.xxx/yy` format, the gateway (the IP address
of your router), and the DNS nameserver. If you don't have a nameserver on your network,
feel free to use Cloudflare's: `1.1.1.1` and `1.0.0.1`.
```
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses: [192.168.88.8/24]
gateway4: 192.168.88.1
nameservers:
addresses: 192.168.88.1
```
After the netplan file has been saved, run `sudo netplan apply` to apply changes.
Next, configure Ubuntu's firewall by running:
```
sudo ufw enable
sudo ufw allow 22,80,8000/tcp
```
Unblock ports 8001 and 8002 if you plan to use LibreTime's Icecast server to broadcast livestreams without an external Icecast server acting as a repeater.
```
sudo ufw allow 8001,8002/tcp
```
> If needed, instructions for setting up a reverse proxy can be found [here](/docs/reverse-proxy).
## Installing LibreTime
<iframe width="560" height="315" src="https://www.youtube.com/embed/Djo_55LgjXE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Installing LibreTime consists of running the following commands in the terminal:
```
git clone https://github.com/LibreTime/libretime.git
cd libretime
sudo bash install -fiap
```
After the install is completed, head to the IP address of the server LibreTime was just installed on
to complete the welcome wizard. While not strictly necessary, it is recommended that you change the passwords prompted in the welcome wizard if you intend on accessing the server from the Internet. The welcome wizard will
walk you through the rest of the installation process.
## Services
Once all of the services needed to run LibreTime are installed and configured,
it is important that the server starts them during the boot process, to cut down on downtime, especially in live enviornments.
Ubuntu 18.04 uses the `systemctl` command to manage services, so run the following commands to enable all
LibreTime-needed services to run at boot:
```
sudo systemctl enable libretime-liquidsoap
sudo systemctl enable libretime-playout
sudo systemctl enable libretime-celery
sudo systemctl enable libretime-analyzer
sudo systemctl enable apache2
sudo systemctl enable rabbitmq-server
```
> If an error is returned, try adding `.service` to the end of each command.
## User Permissions
If you plan to have LibreTime output analog audio directly to a mixing console or transmitter,
the `www-data` user needs to be added to the `audio` user group using the command below:
```
sudo adduser www-data audio
```

View file

@ -1,11 +1,12 @@
---
layout: default
layout: article
title: Modifying the LibreTime interface
git: interface-customization.md
category: admin
---
The LibreTime administration interface, as a web application, is fully customizable using the same methods that you might use to modify a website. For instance, you may wish to increase certain font sizes or change the colours in the LibreTime interface to better suit staff users with impaired vision. To do this, open one of the CSS files in the */public/css/* directory under the LibreTime *DocumentRoot* directory in an editor such as **nano**:
The LibreTime administration interface, as a web application, is fully customizable using the same methods that you might use to modify a website. For instance, you may wish to increase certain font sizes or change the colours in the LibreTime interface to better suit staff users with impaired vision. To do so, open one of the CSS files in the */public/css/* directory under the LibreTime *DocumentRoot* directory in an editor such as **nano**:
sudo nano /usr/share/airtime/public/css/styles.css
@ -19,7 +20,7 @@ To change the background colour of the administration interface from dark gray t
padding: 0;
}
Save the file with **Ctrl+O**, then refresh your browser to see the change to the interface background colour.
Save the file with **Ctrl+S**, then refresh your browser to see the change to the interface background colour.
Any custom changes that you make to the administration interface should be backed up before upgrading LibreTime to a newer version, otherwise they could be overwritten. If you have made improvements that you think might be useful to other LibreTime users, please contact LibreTime and tell us about them.
@ -35,4 +36,4 @@ Modifying the *status.xsl* page is a good place to start, because this is the de
After saving the file with Ctrl+O, refresh your web browser, and the new look should now be visible.
![](img/Screenshot177-Icecast_rocks.png)
![](/img/Screenshot177-Icecast_rocks.png)

View file

@ -1,12 +1,12 @@
---
layout: default
layout: article
title: Interface Localization
git: interface-localization.md
category: admin
---
The LibreTime administration interface can be localized using the standard GNU **gettext** method. Using GitHub for this task means you don't have to tackle the whole of a localization yourself; just as much as you can manage.
![](img/Screenshot464-Korean_stream_setting.png)
![](/img/Screenshot464-Korean_stream_setting.png)
First, you should check if a localization is already under way for your locale of choice. The best way to do this is to take a look at the 'master' branch in the GitHub repository for LibreTime at <https://github.com/LibreTime/libretime>. You can also ask in the LibreTime development forum at <https://discourse.libretime.org/>, where you might find community members who can help you with the translation.

View file

@ -0,0 +1,15 @@
---
title: Listener Statistics
layout: article
category: manager
---
The Listener Stats page on the Analytics menu shows graphs of listener connections to the configured streaming servers for the selected date and time range.  On the right side, a green **Status** indicator shows **OK** if the connection to the streaming server is active.
![](/img/portfolio/stream-stats.jpg)
If the status indicator is red, check that the **Admin User** and **Admin Password** settings are correct under **Additional Options** for the named mount point, such as *libretime\_128*, on the **Streams** page of the **Settings** menu.
To choose which particular streams should have statistics displayed, click the check boxes for the individual colour-coded mount points, just below the graph.
By default, statistics for the last 24 hours of streaming are shown. To change this date and time range, click the calendar and clock icons in the lower left corner of the page, then click the magnifying glass icon.

View file

@ -1,7 +1,8 @@
---
layout: default
layout: article
title: Broadcasting live with MIXXX or B.U.T.T.
git: live-broadcast.md
category: dj
---
## Live shows with MIXXX {#mixxx}
@ -21,7 +22,7 @@ Mixxx 1.9.0 or later includes a live streaming client which, like LibreTime, is
and **SHOUTcast** media servers. This feature can also be used to stream from Mixxx directly into LibreTime,
using either the **Show Source** or **Master Source**.
![](img/Screenshot369-Mixxx_streaming_preferences.png)
![](/img/Screenshot369-Mixxx_streaming_preferences.png)
To configure **Mixxx** for streaming into LibreTime, click **Options**, **Preferences**, then
**Live Broadcasting** on the main Mixxx menu. For server **Type**, select the default of **Icecast 2**.
@ -29,19 +30,19 @@ For **Host**, **Mount**, **Port**, **Login** and **Password**, use the **Input S
configured in the LibreTime **Streams** page, on LibreTime's **System** menu. See [stream settings](stream-settings)
for remote input connection details.
## Live shows with B.U.T.T. (Broadcast Using This Tool) {#butt}
## Live shows with B.U.T.T. (Broadcast Using This Tool)
<html>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/4GLsU9hPTtM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>
### Set Up
**Setup**
1. Download and install butt from <https://danielnoethen.de/> for your OS.
1. Download and install [BUTT](https://danielnoethen.de/) for your OS.
*Note: be sure you have butt version 0.1.17 or newer installed*
2. Open up butt
2. Open up BUTT
3. Click **settings**
4. Under **Main** under **Server **click **ADD**
4. Under **Main** > **Server** click **ADD**
* Type LibreTime (or your station) under Name
* Click the radio button next to **IceCast** under Type
* Type your stations URL (webpage address) under **Address**:
@ -55,7 +56,7 @@ for remote input connection details.
to use it but that is OS specific and outside of this tutorial. We are assuming
you have a mic and mixer or a USB mixer hooked up to or as an external soundcard*
### Show Time
**Show Time**
1. When its almost your show time go to your LibreTime page and look at the time
in the top right when your show starts go to Butt.

View file

@ -1,17 +1,14 @@
---
layout: default
layout: article
title: Built-in Microsite
git: microsite.md
category: admin
---
## Overview
![](/img/radio-page.png)
![](img/radio-page.png)
LibreTime includes a mini-site, which can be accessed at _serverIP_ (for local installations), or
_libretime.yourdomain.com_ or _cloudvmIP_ (for installations to a server on a domain). The site includes your
LibreTime includes a microsite, which can be accessed at _serverIP_ or a domain you've set up for your server. The site includes your
logo and station description (set under Settings > General), the login button to the LibreTime interface, the schedule for the next seven days,
podcast tabs, and a live feed of your station with the currently playing artist and track displayed.
podcast tabs, and a live feed of your station with information on the the currently playing artist and track.
## Modifying the LibreTime Radio Page
@ -28,4 +25,4 @@ html {
}
```
Place the new background image in the */usr/share/airtime/public/css/radio-page/img/* folder and change the `background:` entry's URL to point to the new image. The new image should be at least 1280 x 720 in pixel size to avoid being blurry.
Place the new background image in the `/usr/share/airtime/public/css/radio-page/img/` folder and change the `background:` entry's URL to point to the new image. The new image should be at least 1280 x 720 in pixel size to avoid being blurry.

45
docs/_docs/multipass.md Normal file
View file

@ -0,0 +1,45 @@
---
title: Multipass
layout: article
category: dev
---
[Multipass](https://multipass.run) is a tool for easily setting up Ubuntu VMs on Windows, Mac, and Linux.
Similar to Docker, Multipass works through a CLI. To use, clone this repo and then create a new Multipass VM.
```
git clone https://github.com/libretime/libretime.git
cd libretime
multipass launch bionic -n ltTEST --cloud-init cloud-init.yaml
multipass shell ltTEST
```
Multipass isn't currently able to do an automated install from the cloud-init script.
After you enter the shell for the first time, you will still need to run the install script for LibreTime.
```
cd /libretime
sudo bash install -fiap
```
The IP address of your new VM can be found by running `multipass list`. Copy and paste it into your web browser to access the LibreTime interface and complete the setup wizard.
You can stop the VM with `multipass stop ltTEST` and restart with `multipass start ltTEST`.
If you want to delete the image and start again, run `multipass delete ltTEST && multipass purge`.
### Cloud-init options in cloud-init.yaml
You may wish to change the below fields as per your location.
```
timezone: America/New York # change as needed
ntp:
pools: ['north-america.pool.ntp.org']
servers: ['0.north-america.pool.ntp.org', '0.pool.ntp.org']
```
If you are running your forked repo of LibreTime for testing purposes,
modify the URL on this line:
```
- cd / && git clone https://github.com/LibreTime/libretime.git
```

68
docs/_docs/playlists.md Normal file
View file

@ -0,0 +1,68 @@
---
layout: article
title: Playlists and Smartblocks
category: interface
---
> **About Autoloading Playlists**
>
> Libretime will schedule tracks from a selected playlist an hour before a show is
> scheduled to air. This is a great way to automatically schedule weekly shows which are received
> via. podcasts.
### Creating a new playlist
You can create a new playlist on the toolbar of the **Playlists** page.
![](/img/Playlist-Editor.png)
Enter a **Name** and **Description** for the playlist, then click the **Save** button. Setting good quality metadata here will help you find the playlist using the search box later, so you should be as descriptive as possible.
### Adding content to a playlist
With a playlist open, drag and drop items from the search results on the left into the playlist on the right. Jingles and voice tracks can be added before, after or between music items.
After adding files to the playlist, the total playlist time is displayed in the top right corner. The duration of an individual file is shown in each row of the playlist in a white font, and beneath this figure the time since the beginning of the playlist is displayed in a smaller light grey font. This elapsed time figure can be used as a time check for voice tracks, although this option may limit the re-usability of the voice track.
To audition a playlist file in your web browser, click the white triangle button on the left side of its row. (If the format of the file is not supported by your browser, the triangle in this button will be greyed out). If audition of the file format is supported, a pop-up window will open, with the playlist starting at the file you clicked.
Click the small white **x** icon on the right hand side of each row to remove a file from the playlist. You can also drag and drop files to re-order them, or click the **Shuffle** button to re-order files automatically.
When your playlist is complete, click the **New** button in the top left corner to create another playlist, click the close icon (a white cross in a black circle) in the top right corner, or browse to another page of the LibreTime interface.
If you want to edit the playlist content or metadata later, you can find it by **Title**, **Creator**, **Last Modified** date, **Length**, **Owner** or **Year** using one of the search tools on the Library page. Click the playlist in the search results list, and then click **Edit** from the pop-up menu. You can also **Preview** the entire playlist in a pop-up audition window, **Duplicate** or **Delete** one of your playlists from this menu.
### Creating a Smartblock
![](/img/Smartblock-options.png)
Smart blocks are automatically filled with media files from the LibreTime library, according to the criteria that you specify. This feature is intended to save staff time, compared to selecting items for a playlist manually, and can be used to schedule shows that operate in a consistent format.
To create a smart block, click the **Smartblocks** button on the left sidebar, and select **New** from the toolbar. Like a playlist, smart blocks can have a title and description, which you can edit. This helps you find relevant smart blocks in searches.
Fill out the smart block's **Name**, **Search Criteria**, and **Limit to** sections. The search criteria can be any one of LibreTime's metadata categories, such as **Title**, **Creator** or **Genre**. The modifier depends on whether the metadata in question contains letters or numbers. For example, **Title** has modifiers including *contains* and *starts with*, whereas the modifiers for **BPM** include *is greater than* and *is in the range*.
If you have a large number of files which meet the criteria that you specify, you may wish to limit the duration of the smart block using the **Limit to** field, so that it fits within the show you have in mind. Select **hours**, **minutes** or **items** from the drop-down menu, and click the **Generate** button again, if it is a static smart block. Then click the **Save** button.
> **Note:** Smart Blocks by default will not overflow the length of a scheduled show.
> This is to prevent tracks from being cut-off because they exceed the time limit of a show.
> If you want a smartblock to schedule tracks until it is longer than the Time Limit you can check **"Allow last track to exceed time limit"**
> (helpful for avoiding dead air on autoscheduled shows).
![](/img/Smartblock-advanced.png)
You can also set the **smart block type**. A **Static** smart block will save the criteria and generate the block content immediately. This enables you to edit the contents of the block in the **Library** page before adding it to a show. A **Dynamic** smart block will only save the criteria, and the specific content will be generated at the time the block is added to a show. After that, the content of the show can be changed or re-ordered in the **Now Playing** page. 
Click the **plus button** on the left to add OR criteria, such as **Creator** containing *beck* OR *jimi*. To add AND criteria, such as **Creator** containing *jimi* AND BPM in the range *120* to *130*, click the **plus button** on the right. (The criteria are not case sensitive). Click **Preview** to see the results.
> If you see the message **0 files meet the criteria**, it might mean that the files in the Library have not been tagged with the correct metadata. See the chapter [Preparing media](/docs/preparing-media) for tips on tagging content.
![](/img/Smartblock-content.png)
If you don't like the ordering which is generated, click the **Shuffle** button, or drag and drop the smart block contents into the order that you prefer. You can also remove items or add new items manually from the Library. Changes to static smart block contents are saved automatically when you add items, remove or re-order them, or click the **Generate** button. Click the **Save** button in the upper right corner to save any changes to smart block criteria.
By default, a smart block will not contain repeated items, which will limit the duration of the block if you do not have sufficient items meeting the specified criteria in your **Library**. To override the default behaviour, check the **Allow Repeat Tracks** box. The **Sort tracks by** menu offers the options of **random**, **newest** or **oldest** items first.
Smart blocks can be added to shows in the same way as a manually created playlist is added. Smart blocks can also be added to one or more playlists. In the case of a playlist containing a static smart block, click **Expand Static Block** to view the contents. For a dynamic smart block, you can review the criteria and duration limit by clicking **Expand Dynamic Block**.
Once created, smart blocks can be found under the Smartblocks tab and refined at any time. They can be re-opened by right-clicking on the smart block and selecting **Edit** from the pop-up menu.

View file

@ -1,19 +1,16 @@
---
layout: default
title: Analytics
git: analytics.md
layout: article
title: Playout History
category: manager
---
## History {#history}
On the History menu, the **Playout History** page enables you to view a list of files played within a specific date and time range. This page is designed to help your station prepare reports for music royalty collection societies and regulatory agencies.
Search results can be copied to the clipboard using the **Copy** button, exported as data in **CSV** format (comma separated values), exported as a document in **PDF** format, or displayed in a printer-friendly format using the **Print** button. (Your web browser must have an Adobe Flash plugin installed for these buttons to appear). Press the **Esc** key to return to the LibreTime interface once the print job is complete.
This page has three tabs: **Log Sheet**, **File Summary** and **Show Summary**. On any of these tabs, you can select a date and time range by clicking the calendar and clock icons in the upper left corner of the page. Then click the search button, which has a magnifying glass icon, to the right. A list of files played during that date and time range will appear further down the page.
![](img/log-sheet.png)
![](/img/log-sheet.png)
In the **Log Sheet** tab, the playout history is sorted by **Start Time** and **End Time** by default.
@ -29,11 +26,11 @@ Log entries can also be manually deleted, using the button with the trashcan ico
## History Templates
![](img/history-templates.png)
![](/img/history-templates.png)
The **History Templates** page on the History menu enables you to prepare reports with the exact content required by regulatory agencies in the territories that you are broadcasting to. You can begin creating a custom template by clicking the button **New Log Sheet Template** or the button **New File Summary Template**.
![](img/new-hist-temp.png)
![](/img/new-hist-temp.png)
Either of these actions opens a page in which you can name the new template, and add or remove elements from the list on the left. To add a new element from the list on the right, click the plus icon for the item you require. If the element you require is not listed, you can use the **Add New Field** box at the lower end of the right side column. Select *string*, *boolean*, *integer*, or *float*, depending on the type of data that you wish to log, and then click the **+ Add** button.
@ -288,17 +285,3 @@ Replace host, user and password values with appropriate values for your external
Then make the new script executable and create a cron job to launch it every minute, as in step 8 above. Steps 3 to 7 above should be carried out on the external web server so that it can convert the two temporary files uploaded via FTP into public schedule data.
If you have secure shell access (SSH) to the remote web server, you could write a script to use the secure copy command (scp) instead of ftp.
---
## Streaming Listener Statistics
The Listener Stats page on the Analytics menu shows graphs of listener connections to the configured streaming servers for the selected date and time range.  On the right side, a green **Status** indicator shows **OK** if the connection to the streaming server is active.
![](img/portfolio/stream-stats.jpg)
If the status indicator is red, check that the **Admin User** and **Admin Password** settings are correct under **Additional Options** for the named mount point, such as *libretime\_128*, on the **Streams** page of the **Settings** menu.
By default, statistics for the last 24 hours of streaming are shown. To change this date and time range, click the calendar and clock icons in the lower left corner of the page, then click the magnifying glass icon.
> To choose which particular streams should have statistics displayed, click the check boxes for the individual colour-coded mount points, just below the graph.

36
docs/_docs/podcasts.md Normal file
View file

@ -0,0 +1,36 @@
---
title: Podcasts
layout: article
category: interface
---
The Podcasts page allows you add subscriptions to podcasts which are often used to syndicated audio files using a URL called a RSS feed. This allows your LibreTime instance to automatically download new shows from the web.
In order to add a podcast you need to get the RSS feed. All podcasts available on iTunes have a RSS feed but it is sometimes hidden. See this issue on our github page [#510](https://github.com/LibreTime/libretime/issues/510) for more information. RSS feeds that do not end in *.xml* may be accepted by LibreTime but might fail to download episodes; in that case, download the episode using a podcast client such as [gpodder](https://gpodder.github.io/) and then manually upload and schedule the episode. Podcast feeds coming from Anchor.fm have been known to have this issue.
The podcast interfaces provides you with the ability to generate [Smartblocks](/docs/playlists) that can be used in conjunction with autoloading playlists to schedule the newest episode of a podcast without human intervention.
<html>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/g-4UcD8qvR8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>
### Podcasts Dashboard
![](/img/Podcasts_Dashboard.png)
The podcasts dashboard is similar to the tracks view, allowing you to add, edit, and remove
podcasts by the toolbar, in addition to sorting by columns.
To add a podcast, click on the **+ Add** button on the toolbar and provide the podcast's RSS feed, which usually ends in *.xml*.
Once the podcast's feed is recognized, the editor pane opens for the podcast.
### Editor
![](/img/Podcasts_Editor.png)
In the podcasts editor, you can rename the podcast, update settings for the podcast, and manage episodes.
A search box is available to search for episodes within the feed.
- To import an episode directly into LibreTime, double-click on an episode or select it and click **+ Import**. The podcast will appear under tracks with the Podcast Name as the Album.
- To delete an episode from LibreTime, select the episode and click on the red trash can on the toolbar.
- If you would like LibreTime to automatically download the latest episodes of a podcast, make sure *Download latest episodes* is checked. This can be used in conjunction with Smartblocks and Playlists to automate downloading and scheduling shows that are received via podcast feed.

View file

@ -1,7 +1,7 @@
---
layout: default
title: Preparing Media for LibreTime
git: preparing-media.md
layout: article
title: Preparing Media for Upload
category: interface
---
Before uploading media to an LibreTime server, there are a number of factors which should be considered. Getting your ingest workflow right will save you a lot of time later.
@ -12,14 +12,14 @@ LibreTime automatically imports any metadata that is in the files' ID3 tags. If
There are a number of programs available which can be used to correct mistakes or incomplete information in ID3 tags. You can use a music library manager (like Apple Music, Rhythmbox, or Windows Media Player) to edit ID3 tags as well, but you may be required to import the files into your library, which may not always be convenient.
| Windows | macOS | Linux |
|---------|-------|-------|
| [Mp3tag](https://www.mp3tag.de/en/index.html) | [MusicBrainz Picard](https://picard.musicbrainz.org/) | [Ex Falso](http://code.google.com/p/quodlibet/) |
| [TagScanner](https://www.xdlab.ru/en/) | | |
- [TagScanner](https://www.xdlab.ru/en/) (Windows)
- [Mp3tag](https://www.mp3tag.de/en/index.html) (Windows)
- [MusicBrainz Picard](https://picard.musicbrainz.org/) (Mac, Windows, Linux)
- [Ex Falso](http://code.google.com/p/quodlibet/) (Linux)
The *Tags From Path* feature of Ex Falso is a particularly useful time saver if you have a large archive of untagged files. Sometimes there is useful creator or title information in the file name or directory path structure, which can be converted into an ID3 tag automatically.
![](img/Screenshot175-Ex_Falso.png)
![](/img/Screenshot175-Ex_Falso.png)
## Metadata in legacy character sets
@ -93,4 +93,4 @@ Before importing media, it is good practice to check for any silent sections in
Quiet introductions or extended fades can also lead to apparent gaps in your broadcast playout. This is more common when playing back audio from ripped CDs or dubbed from tape or vinyl; this issue is not as common with digitally-purchased music. For best results, long periods of silence should be removed from files before uploading to Libretime.
![](img/Screenshot126-Debra_silence.png)
![](/img/Screenshot126-Debra_silence.png)

127
docs/_docs/reverse-proxy.md Normal file
View file

@ -0,0 +1,127 @@
---
title: Reverse Proxy
layout: article
category: install
---
In some deployments, the LibreTime server is deployed behind a reverse proxy,
for example in containerization use-cases such as Docker and LXC. LibreTime
makes extensive use of its API for some site functionality, which causes
[Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
to occur. By default, CORS requests are blocked by your browser and the origins
need to be added to the **Allowed CORS URLs** block in
[**General Settings**](/docs/settings). These origins should include any
domains that will be used externally to connect to your reverse proxy that you
want handled by LibreTime. These URLS can also be set during the first run configuration
that is displayed when you first install LibreTime
### Reverse Proxy Basics
A reverse proxy allows the LibreTime server to not be connected to the open internet. In
this configuration, it is rather behind another server that proxies traffic to it from
users. This provides some advantages in the containerization space, as this means that
the containers can be on their own internal network, protected from outside access.
A reverse proxy also allows SSL to be terminated in a single location for multiple sites.
This means that all your traffic to the proxy from clients is encrypted, but the reverse
proxy's traffic to the containers on the internal network is not. All the SSL certificates
live on the reverse proxy and can be renewed there instead of on the individual
containers.
### Setup
There are known bugs when using LibreTime behind a reverse proxy ([#957](https://github.com/LibreTime/libretime/issues/957)
tracks the issue and contains a temporary workaround). For SSL redirection to work, you
need two domains: one for LibreTime and one for Icecast. Here, these will be
`libretime.example.com` and `icecast.example.com`.
You will also require two VMs, servers or containers. Alternatively the reverse proxy can
be located on the server, proxying connections to containers also on the host. Setting up
a containerization environment is beyond the scope of this guide. It assumes that you have
Nginx set up on `proxy` and LibreTime will be installed on `libretime`. You will need root
access on both. `libretime` also needs to be able to be accessed from `proxy`
(`ping libretime` on `proxy`).
On `libretime`, install LibreTime as described in the [install guide](/install). In short
this means run the following commands:
```
git clone https://github.com/LibreTime/libretime.git
cd libretime
sudo ./install -fiap
```
Once it has installed, replace `<hostname>localhost</hostname>` in
`/etc/icecast2/icecast.xml` with the following:
```
<hostname>icecast.example.com</hostname>
```
This is the hostname that people listening to your stream will connect to and what
LibreTime will use to stream out to them. You will then need to restart Icecast:
```
sudo systemctl restart icecast2
```
On `proxy`, run the following:
```
cat << EOF | sudo tee /etc/nginx/sites-available/libretime.conf
server {
listen 80;
server_name libretime.example.com;
location / {
rewrite ^ https://$server_name$request_uri? permanent;
}
}
server {
listen 443 ssl;
server_name libretime.example.com;
ssl_certificate /etc/letsencrypt/live/libretime.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/libretime.example.com/privkey.pem;
add_header Strict-Transport-Security "max-age=15552000;";
add_header X-Frame-Options "SAMEORIGIN";
client_max_body_size 512M;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://libretime/;
}
}
EOF
```
This Nginx configuration ensures that all traffic uses SSL to the reverse proxy, and
traffic is proxied to `libretime`.
Next, the SSL certificate needs to be generated and the site activated.
```
sudo apt install certbot
sudo systemctl stop nginx
sudo certbot certonly -d libretime.example.com -a standalone
sudo systemctl start nginx
```
You can now go to *https://libretime.example.com* and go
through the installer. On `General Settings`, you need to change the Webserver Port to
`443` and add the following CORS URLs:
```
https://libretime.example.com
http://libretime.example.com
https://localhost
http://localhost
```
Finally, the configuration file needs updating. Under `[general]`, `force_ssl`
needs to be set to true:
```
[general]
...
force_ssl = true
```

View file

@ -1,7 +1,7 @@
---
layout: default
layout: article
title: Rights and Royalties
git: rights-royalties.md
category: manager
---
If you're new to broadcasting, or have not streamed your station online before,

View file

@ -0,0 +1,83 @@
---
layout: article
title: Scheduling Shows
category: interface
---
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/TJtWUzAlP08" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Log in using your username and password using the link in the upper right corner. (If you just installed
LibreTime, your username/password is admin/admin.)
The main workflow in LibreTime is **Upload** media -> create a show on the **Calendar** -> **Schedule Tracks**.
Once you log in, click on the big blue button on the left navigation that says **Upload**.
![](/img/Select_files.png)
Select the type of media you are uploading (Music, Station IDs, etc.) by using the dropdown box
at the top of the pane. After that, either drag and drop media into the area below or click the
dashed rectangle to open a file browser.
Once your files have uploaded and have been successfully imported (as shown in the pane on the right),
click on **Calendar** on the left navigation.
![](/img/Screenshot558-Add_Show.png)
Click on the blue **+ New Show** button to add a new show.
![](/img/Screenshot560-Show_when.png)
At the very minimum, fill out the show's name and when the show will take place. If the show will repeat regularly,
check the **Repeats?** box and fill out the repeat information. A description of all fields of the New Show box
are in the table below. Finially, click on the grey **+ Add this show** button at the top
of the pane to add your show to the calendar.
| Field | Description |
|-------|-------|
| _What_ | |
| Name (Required) | The name of your show |
| URL | The URL of your show. Not used on the public page. |
| Genre | The genre of your show. Not used on the public page. |
| Description | Description of your show. Not used on the public page. |
| _When_ | |
| Start Time (Required) | The time and date the show starts. Note that the time element is in 24 hour time. If the **Now** option is selected, the show will be created to immediately start. |
| End Time (Required) | The time and date the show ends. Defaults to a time one hour after the start time, which can be seen in the **Duration** field, which is uneditable. |
| Repeats? | If checked, allows for options to schedule a repeated show. Shows can repeat weekly up to monthly in increments of one week and can be scheduled on multiple days of the same week. An end date can be set, otherwise the show can be deleted by clicking on its entry in the calendar and clicking Delete > Future Occurances. If **Linked ?** is checked, the playlist scheduled for the next show will also play for all future shows. |
| _Autoloading Playlist_ | |
| Add Autoloading Playlist? | If checked, allows for the following options |
| Select Playlist | Select the playlist the show will autofill from (shows autofill exactly one hour before air). If you wish to use a smartblock you must add it to a playlist and then select that playlist. This can be used to auto-schedule new podcast episodes to air. |
| Repeat Playlist Until Show Is Full | If checked, the playlist will be added to the show multiple times until the slot is full. Useful for applying a one-hour music playlist made up of smartblocks to a two-hour show. |
| _Live Stream Input_ | |
| Use LibreTime/Custom Authentication | |
| Show Source | |
| _Who_ | |
| Search Users, DJs | Program Managers and Admins may assign DJs to a show, giving DJs access to schedule tracks for said show. DJs cannot create shows on their own. |
| _Style_ | |
| Background/Text Color | Set the color of the background and text of entries on the calendar. If not set, LibreTime will select contrasting colors for easy readability. |
| Show Logo | If desired, you can upload a show logo here. The logo does not appear on the public page. |
Once your show is created, click on it to open its context menu. Select **Schedule Tracks** to open the track scheduler.
![](/img/Screenshot561-Add_show_content.png)
The track scheduler behaves similar to iTunes or Windows Media Player: media browser on the left, playlist on the right.
Find the tracks that you'd like to schedule by using the search box or sorting columns and then drag them
into the playlist.
![](/img/Screenshot562-Drag_show_content.png)
The bar at the end of the show's playlist will show the amount of time the show is underscheduled or overscheduled.
Shows that are underscheduled will have dead air at the end and shows that are overscheduled
will fade out exactly when the show is over (the orange colored entry), meaning tracks scheduled to start
after this point will not play (dark red colored entries). Click the **Ok** button in the bottom right to save.
Show playback will start and end as per each show's start and end times, allowing you to rely completely on
LibreTime for running your station or using LibreTime as a part of your live setup to cover when DJs are not present.
When media is playing, the **On Air** indicator at the top will turn red.
![](/img/on-air-status.png)
You can listen to your stream by going to `yourserverIP:8000` or by clicking the **Listen** button under the On Air
indicator.

View file

@ -0,0 +1,73 @@
---
title: Setting the Server Time
layout: article
category: install
---
Accurate time keeping on your server is vital for LibreTime performance. You can confirm that the date and time of your server are set correctly with the `date` command.
The server should respond with the date, time, time zone and year in a format similar to the following example:
Tue Jul 2 15:08:57 BST 2013
If the time on your server is wrong, it is strongly recommended that you take LibreTime off-air until the problem is fixed.
### Configuring NTP
Although it is possible to set the date and time of the server manually, this is not recommended because the server clock can drift over time, compromising the accuracy of your broadcast schedule. If your LibreTime server is permanently connected to the Internet, you can synchronize your server to a time server with the **ntp** program. If **ntp** is not yet installed, you can enter the following command on Debian or Ubuntu:
sudo apt-get install ntp
Optionally, open the **ntp** configuration file in the **nano** editor to add further time server names:
sudo nano /etc/ntp.conf
On Ubuntu GNU/Linux, the default time server is *ntp.ubuntu.com*, but there are many other time servers available on the public Internet, including the group of servers listed at <http://www.pool.ntp.org/> for each country. Using a variety of NTP servers located closely to your LibreTime server should produce the most accurate results. For example, for a server in the United Kingdom you could use the following list:
# You do need to talk to an NTP server or two (or three).
server ntp.ubuntu.com
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
server 2.uk.pool.ntp.org
server 3.uk.pool.ntp.org
Enter the server names you require, press **Ctrl+O** to write out the */etc/ntp.conf* file, then **Ctrl+X** to exit **nano**. Restart the **ntp** service with:
sudo invoke-rc.d ntp restart
The server should respond:
* Stopping NTP server ntpd                                 [ OK ]
* Starting NTP server ntpd                                 [ OK ]
Then use the **ntpq -p** command to confirm that **ntp** is working. This command should produce output similar to the following:
ntpq -p
remote      refid    st t when poll reach delay offset jitter
==================================================================
europium. 193.79.237.14  2 u   28   64    3 39.571  12.600  3.590
norb.v4.c 46.227.200.72  3 u   28   64    3 47.856  -6.908 10.028
82.113.15 193.62.22.82   2 u   29   64    3 11.458  -0.513  2.629
ntppub.le 158.43.192.66  2 u   91   64    2 122.781  44.864  0.001
dns0.rmpl 195.66.241.3   2 u   27   64    3  22.171   1.464  4.242
### Adjusting the server time zone
The data centre which hosts your LibreTime server could be located anywhere in the world. Some servers are set to *Coordinated Universal Time* or UTC (similar to *Greenwich Mean Time* or GMT), regardless of their location. LibreTime uses UTC time in its database for scheduling purposes, independent of the server time zone.
If the server time zone is not appropriate for integration with your station's other systems, on a Debian or Ubuntu server you can reconfigure the **tzdata** (time zone data) package with the command:
sudo dpkg-reconfigure tzdata
This command opens a menu in which you can select the continent that you require, by pressing the Enter key.
![](/img/Screenshot15-Configuring_tzdata.png)
The next step is to select your nearest city, again by pressing the Enter key. The appropriate time zone is selected according to the information that you have entered.
![](/img/Screenshot16-Configure_city.png)
The console output from the **dpkg-reconfigure tzdata** command will confirm the new setting:
Current default time zone: 'Europe/London'
Local time is now: Tue Jul 2 15:18:01 BST 2013.
Universal Time is now: Tue Jul 2 14:18:01 UTC 2013.

View file

@ -1,20 +1,20 @@
---
layout: default
layout: article
title: Settings
git: settings.md
category: admin
---
## General Settings
![](img/station-info-settings.png)
![](/img/station-info-settings.png)
On the **Settings** menu, click **General** to set your **Station Name**. This
text is shown in your web browser's title bar when your station staff are logged
into LibreTime, and optionally in stream metadata. You can also set a **Station
Description** and **Station Logo** here.
![](img/general-playback-settings.png)
![](/img/general-playback-settings.png)
The **Default Interface Language** drop-down menu sets the default localization
for your LibreTime instance, and the **Station Timezone** drop-down menu can be
@ -50,12 +50,12 @@ podcast to LibreTime. This can also be done manually by the generate smartblock
and playlist button under a podcasts settings which is why it is disabled by
default.
![](img/api-settings.png)
![](/img/api-settings.png)
You can enable live, read-only access to the LibreTime schedule calendar for
your station's public website with the **Public LibreTime API** option, if you
wish. (There is more about this feature in the
[*Exporting the schedule*](exporting-the-schedule) chapter, in the
[*Exporting the schedule*](/docs/playout-history) chapter, in the
*Advanced Configuration* section of this book).
The **Allowed CORS URLs** is intended to deal with situations where you want a
@ -71,7 +71,7 @@ The **Tune-In Settings** section is intended for stations that have partnered
with TuneIn to automatically push their now playing metadata to TuneIn. This
hasn't been tested and also requires special credentials from TuneIn.
![](img/dangerous-options.png)
![](/img/dangerous-options.png)
The **Dangerous Options** section provides an administrator the ability to erase
the entire LibreTime library.
@ -79,14 +79,12 @@ the entire LibreTime library.
When you are done remember click the **Save** button at the top or bottom of the
form.
![](img/save-button.png)
![](/img/save-button.png)
Individual LibreTime users can choose another interface localization when they
log in, or set personal preferences for localization and time zone by clicking
their username on the right side of the menu bar.
![](img/Screenshot475-Edit_own_user_account.png)
----
## Track Types {#types}
@ -104,11 +102,9 @@ their username on the right side of the menu bar.
----
## Stream Settings {#stream}
## Stream Settings
<html>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/QPNo52Fc0ck" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>
### Global settings
@ -120,8 +116,6 @@ The second checkbox under Global Settings enables the sending of **Icecast Vorbi
The **Stream Label** radio button allows you to set the metadata that will be sent with direct streams; *Artist* and *Title*, *Show*, *Artist* and *Title*, or *Station name* and *Show name*.
![](img/Screenshot481-Global_stream_settings.png)
The **Off Air Metadata** field configures the text that will be sent to any configured streaming servers, and from there on to media players, when Airtime is not streaming any output.
Below this is the **Enable Replay Gain** checkbox which, if checked, automatically adjusts Airtime's output level to an average of -14dBFS, based on prior analysis of the level of individual files in the **Library**. This feature helps guard against unwanted changes in Airtime's output level caused by the typical variation in average level of recordings made in different studios at different times. The correction value for each file can be viewed by enabling the ReplayGain column in the **Library**.
@ -144,19 +138,17 @@ Input streams must have a **Port** for the remote broadcaster to connect to, whi
To avoid further confusion, it is also recommended that you set a different **Mount Point** (the specific filename for broadcasters and listeners to connect to) from that used on your public Icecast or SHOUTcast server.
![](img/Screenshot401-Input_stream_settings.png)
If your Airtime server is behind a firewall, and you wish remote broadcasters to connect input streams to it across the public Internet, you may need to click the **Override** link to set a **Connection URL** which is available from outside your local area network. This URL might be based on the domain name assigned to the router which forwards the appropriate port to your Airtime server. Then click **OK** to save the new connection URL.
### Switching input streams
In the Master Panel, available input source streams are shown with an orange line connecting the source to the switch, which you could think of like a patch cable connecting a source to a broadcast mixer. When that switch is active, another orange line connects the switch to the On Air indicator, like a patch cable connecting a mixer to a transmitter.
![](img/libretime-master-source-stream.png)
![](/img/libretime-master-source-stream.png)
If you have checked the **Auto Switch On** box in the Stream Settings page, the **Master Source** switch will move automatically to the active position, on the left, when an authenticated master source connects to Airtime. Otherwise, you can activate the switches manually by clicking the left side of each switch, or deactivate them by clicking the right side. The switches do not have to be dragged with the mouse, in the way that a switch on a hardware mixer would be pushed sideways. **Show Source** live input streams can also be manually activated or deactivated in the same way. If neither the show source or master source is active then LibreTime will default to what is scheduled to play in the Calendar.
![](img/libretime-show-source-stream.png)
![](/img/libretime-show-source-stream.png)
If you have the **Auto Switch Off** box checked LibreTime will resume scheduled playback whenever a stream disconnects. Otherwise you will need to slide to disable a source after a DJ stops streaming.
@ -170,37 +162,11 @@ On the right side of the page, you can configure up to three independent output
To configure another stream, click the bar with the stream number to expand its box, and make sure **Enabled** is checked. Enter at least the streaming **Server** IP address or domain name, and **Port** details. The default port for Icecast and SHOUTcast servers is 8000.
![](img/Screenshot402-Output_stream_settings.png)
Click **Additional Options** to expand a box in which you can enter the usernames, passwords and metadata to send to the streaming server. The default **Username** for Icecast servers is *source*, and if this the name in use on your streaming server, you can leave this field empty. The **Admin User** and **Admin Password** settings are optional, and are used to query the streaming server for audience numbers by the **Listener Stats** page on the **System** menu.
You can also set the specific **Mount Point** that listeners will connect to here. Then click one of the **Save** buttons in the upper or lower right corner of the page to update the Airtime server's settings.
![](img/Screenshot482-Additional_options.png)
Airtime supports output to Icecast in Ogg Vorbis, Ogg Opus, MP3 and AAC formats. When selecting a SHOUTcast server from the **Service Type** drop-down menu, you are restricted to using MP3 or AAC formats only, so the choice of Ogg Vorbis and Opus formats is greyed out in the **Stream Type** drop-down menu. The SHOUTcast username for stream sources is fixed, so you do not need to enter this value under **Additional Options**, but you will usually have to enter a password.
![](img/Screenshot404-Shoutcast_output_stream.png)
Any connection problems between Liquidsoap and Icecast or SHOUTcast are shown on the Stream Settings page. For example, if you enter the wrong password, you will see an *Authentication Required* error message. To fix this, enter the correct password in the **Additional Options** box, and click the **Save** button. If the streaming server is down for any reason, or you have entered an incorrect **Server** name or **Port** number, you will see the message *Can not connect to the streaming server*.
![](img/Screenshot405-Connection_timeout.png)
------
## The Status page {#status}
On the **Settings** menu, the **Status** page provides an overview of the health and resource usage of the various
services that make up a LibreTime system. If all is well, you will only see green check mark icons in the
**Status** column. This page also shows how much **Disk Space** you have used on the disk partition containing the media storage folder.
![](img/Screenshot521-System_status_240.png)
If any of the check mark icons in the **Status** column have changed to a red warning sign, contact your system
administrator for assistance. (The chapter [Troubleshooting](troubleshooting) contains some tips). LibreTime will
do its best to restart any failing services, but sometimes manual intervention may be required; for example, in the case of hardware failure.
If you have run out of storage space, a LibreTime user with *admin* privileges could log in and delete media files
that are no longer required from the **Library**. Alternatively, you could ask your system administrator to install additional storage capacity.

140
docs/_docs/ssl.md Normal file
View file

@ -0,0 +1,140 @@
---
title: SSL Configuration
layout: article
category: install
---
To increase the security of your server, you can enable encrypted access to the LibreTime administration interface, and direct your users towards this more secure login page. The main advantage of using this encryption is that your remote users' login names and passwords are not sent in plain text across the public Internet or untrusted local networks, such as shared Wi-Fi access points.
### Deploying a certificate with Certbot
One of the fastest, easiest, and cheapest ways to get an SSL certificate is through [Certbot](https://certbot.eff.org/), as created by the
Electronic Frontier Foundation. There are some requirements for this process:
- you have an HTTP website (already installed and configured by default by the LibreTime installer) and
- this website is open to the public internet (likely via. port forwarding if your computer is behind a firewall) and
- the server is accessible to the public via. port 80
If you aren't able to verify all three requirements, you may want to try a self-signed certificate (see next section).
These instructions come from Certbot's website and assume that you are using an Apache web server
running on Ubuntu 18.04 LTS (the Apache web server is installed with LibreTime by default).
Instructions for other Debian-based OSes are similar, but check with Certbot for clarification.
Note: all instructions require you to have sudo priveledges
First, add Certbot's PPA using:
```
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
```
Next, install Certbot and install the SSL certificate using the below commands:
```
sudo apt-get install certbot python3-certbot-apache
sudo certbot --apache # get and install the certificate
sudo certbot certonly --apache # to only get the certificate, not install it using Certbot
```
You can test certificate renewal by running `sudo certbot renew --dry-run`.
Head to your server's IP address to check to see that the installation worked.
### Deploying a self-signed certificate
The Debian/Ubuntu package *ssl-cert* creates a *snakeoil* certificate and key based on your server's hostname. This gratis certificate and key pair created under the */etc/ssl/certs*/ and */etc/ssl/private/* directories will not be recognised by users' browsers without manual intervention. You can install the *ssl-cert* package with the command:
sudo apt-get install ssl-cert
If the hostname of your server does not match the domain name you intend to use with the LibreTime virtual host, the user's browser will present an additional security warning. You can set the domain name of the certificate by editing the file */usr/share/ssl-cert/ssleay.cnf* to replace the *@HostName@* variable:
commonName = @HostName@
with the domain name used by LibreTime:
commonName = airtime.example.com
Then save the file and regenerate the certificate with the command:
sudo make-ssl-cert generate-default-snakeoil --force-overwrite
You should enable additional Apache modules for page redirections, custom headers and secure access:
sudo a2enmod alias headers ssl
Next, edit the virtual host configuration for your LibreTime server to include a stanza for the https:// interface on port 443 and a redirect for logins from port 80:
sudo nano /etc/apache2/sites-available/airtime-vhost.conf
Using the following configuration for Apache 2.2 as a guide, replace *airtime.example.com* with the name of your server and *admin@example.com* with your email address. The older SSLv2 and SSLv3 protocols and SSL compression should be disabled, as they are generally believed to be insecure. You may wish to create a *ServerAlias* for users to access the administration interface over https:// if required.
On port 80, Apache's *alias* module is used to set a *Redirect permanent* for the login page. Optionally, access could be denied to all sites except *localhost* and any other LibreTime servers on your network, so that unencrypted communication between LibreTime components can continue.
```
<VirtualHost *:443>
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLCompression off
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
Header always set Strict-Transport-Security "max-age=31536000"
ServerName airtime.example.com
#ServerAlias www.example.com
ServerAdmin admin@example.com
DocumentRoot /usr/share/airtime/php/airtime_mvc/public
DirectoryIndex index.php
<Directory /usr/share/airtime/php/airtime_mvc/public>
Options -Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName airtime.example.com
ServerAdmin admin@example.com
DocumentRoot /usr/share/airtime/php/airtime_mvc/public
Redirect permanent /login https://airtime.example.com/login
SetEnv APPLICATION_ENV "production"
<Directory /usr/share/airtime/php/airtime_mvc/public>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
```
Save the file with **Ctrl+O** and exit the **nano** editor with **Ctrl+X**. Then restart Apache with the command:
sudo service apache restart
When attempting to log into your server via http:// in future, you should be redirected to https:// automatically.
### Importing a self-signed certificate into the browser
The first time you access an LibreTime server with a self-signed certificate over https:// your browser will block the login page and display a security warning. In **Mozilla Firefox**, you can click **Technical Details** to confirm that the warning is due to the certificate being self-signed before clicking the **Add Exception** button. In **Google Chrome**, the button to click on the security warning page is **Proceed Anyway**.
![](/img/Screenshot547-connection_untrusted.png)
On the next page in Firefox, click the **Get Certificate** button to inspect the details of the self-signed certificate. If all is well, click the **Confirm Security Exception** button. You should now be able to proceed to the https:// login page.  
![](/img/Screenshot548-confirm_exception.png)
If the users of your LibreTime server wish to avoid going through these steps, or they do not trust the remote LibreTime server to be what it claims to be, it is also possible to import a trusted local copy of a certificate file into the browser. For example, in Firefox version 30 preferences, you can go into the **Advanced** section, click the **Certificates** tab, then click the **View Certificates** button. On the **Servers** tab of the **Certificate Manager**, there is an **Import** button which enables you to load a certificate file from the local computer.
### Mixed encrypted and unencrypted content
Whether your certificate is self-signed or not, you will see browser security warnings whenever a https:// page is delivering unencrypted content, such as the stream from an Icecast server. In Firefox, an exclamation mark icon is displayed in the address bar of the **Listen** pop-up.

18
docs/_docs/status.md Normal file
View file

@ -0,0 +1,18 @@
---
layout: article
title: System Status
category: admin
---
On the **Settings** menu, the **Status** page provides an overview of the health and resource usage of the various
services that make up a LibreTime system. If all is well, you will only see green check mark icons in the
**Status** column. This page also shows how much **Disk Space** you have used on the disk partition containing the media storage folder.
![](/img/Screenshot521-System_status_240.png)
If any of the check mark icons in the **Status** column have changed to a red warning sign, contact your system
administrator for assistance. (The chapter [Troubleshooting](/docs/troubleshooting) contains some tips). LibreTime will
do its best to restart any failing services, but sometimes manual intervention may be required; for example, in the case of hardware failure.
If you have run out of storage space, a LibreTime user with *admin* privileges could log in and delete media files
that are no longer required from the **Library**. Alternatively, you could ask your system administrator to install additional storage capacity.

View file

@ -0,0 +1,58 @@
---
layout: article
title: Troubleshooting
category: admin
---
Is something not working for your Libretime installation? Here's a quick guide to help you
troubleshoot most issues you'll run into.
## 1. Let's check the basics
Is your server on? (We hate to ask.) Is it connected to the internet? Is it connected to your
broadcast console or mixer if being used for soundcard output? If you're using a cloud host,
does your cloud provider's status page indicate any system outages?
Once you know your physical (or virtual) system is functional, was a show scheduled for the
current time with tracks or an autoplaylist scheduled?
## 2. Are all services working?
If you can log in to Libretime, go to **Settings** > **Status** to see the service indicators.
A fully working server should have green checkmarks next to all services.
![](/img/Screenshot521-System_status_240.png)
If one of the services isn't working, text will display with a terminal command to restart the service
or get status information for a particular service. For example (for Ubuntu 18.04), the following
commands would restart or check the status of Libretime's Liquidsoap instance, respectively.
```
sudo systemctl restart libretime-liquidsoap
sudo systemctl status libretime-liquidsoap
```
If the service isn't wanting to restart, look at its status for clues as to why it stopped working.
> If you find yourself constantly needing to restart a service, there's a chance it was never set to autostart on system boot. Use `sudo systemctl enable servicename` to fix this problem.
## 3. Basic troubleshooting
If you have one of these issues, please try to resolve it with the instructions below before moving on in the
troubleshooting checklist.
- **File not importing successfully?** Libretime has been known to work with MP3 and WAV files, encoded using 41,100 Hz. Variable Bit Rate (VBR) files are currently hit or miss with the importer. Please convert your file to an MP3 or WAV at 41,100 Hz. and try uploading again.
- **Podcast hosted by Anchor.fm not importing?** There is no known work-around at this time. Ask your producers to provide their show files manually or check with the show's distributer.
- **Tracks won't publish?** We know the Publish screen is broken and we're working on it. A potential work-around is to use an external podcast host like [Anchor.fm](https://www.anchor.fm) or [Blubrry](https://blubrry.com/).
- **Can't hear any sound coming from your soundcard (for analog audio output)?** If you are using ALSA as your audio driver, use `alsamixer` to see the current volume your system is set to. If stil nothing, go to **Settings** > **Streams** and make sure **Hardware Audio Output** is checked. If you need to play a tone to help you troubleshoot, you can use `speaker-test` (does not come installed with Libretime).
## 4. Read the docs
Our main documentation listing is [here](/docs) and can be searched [here](/search).
## 5. Reach out to the developers
Libretime is still in active development, meaning bugs and issues are expected to pop up every so often.
See if an issue is still open by looking at our [Issues page](https://github.com/LibreTime/libretime/issues).
If you don't get the help you need, please [open an issue](https://github.com/LibreTime/libretime/issues/new/choose)
so we can take a look at it.

View file

@ -1,7 +1,7 @@
---
layout: default
title: Upgrading LibreTime
git: upgrading.md
layout: article
title: Upgrading Libretime
category: admin
---
## LibreTime versioning
@ -32,9 +32,9 @@ Before upgrading a production LibreTime server, you should back up both the Post
database and the storage server used by LibreTime. This is especially important if you have not already
set up a regular back up routine. This extra back up is a safety measure in case of accidental data loss
during the upgrade, for example due to the wrong command being entered when moving files. See
[Backing up the server](backing-up-the-server) in this manual for details of how to perform these back ups.
[Backing up the server](/docs/backing-up-the-server) in this manual for details of how to perform these back ups.
The LibreTime [installation script](install) will detect an existing LibreTime or Airtime deployment and back up any configuration files that it finds. We recommend taking your own manual backups of the configuration yourself nevertheless. The install script also tries to restart the needed services during an upgrade. In any case you should monitor if this happened and also take a quick look at the logs files to be sure everything is still fine. Now might be the time to reboot the system or virtual machine LibreTime is running on since regular reboots are part of a healthy system anyway.
The LibreTime [installation script](/install) will detect an existing LibreTime or Airtime deployment and back up any configuration files that it finds. We recommend taking your own manual backups of the configuration yourself nevertheless. The install script also tries to restart the needed services during an upgrade. In any case you should monitor if this happened and also take a quick look at the logs files to be sure everything is still fine. Now might be the time to reboot the system or virtual machine LibreTime is running on since regular reboots are part of a healthy system anyway.
After the upgrade has completed, you may need to clear your web browser's cache before logging into the new version of the LibreTime administration interface. If the playout engine starts up and detects that a show should be playing at the current time, it will skip to the correct point in the current item and start playing.
@ -44,8 +44,4 @@ Airtime 2.5.x versions support upgrading from version 2.3.0 and above. If you ar
running a production server with a version of Airtime prior to 2.3.0, you should
upgrade it to version 2.3.0 before continuing. 
In Airtime 1.9.0 onwards, the concept of *linked files* was replaced with the
concept of *watched folders*. If you are upgrading from a version of Airtime
earlier than 1.9.0 and you have previously linked files, the folders they are
in will not be watched until you add them to your watched folder list. See
[Media Folders](folders) for more details.
> **Note:** Airtime's *linked files* and *watched folders* features currently do not work in Libretime.

61
docs/_docs/users.md Normal file
View file

@ -0,0 +1,61 @@
---
layout: article
title: Managing Users
category: interface
---
> Note: if your Libretime server is accessible from the public Internet (ex. being hosted in a cloud VM)
it is strongly recommended to create a second administrator account with a secure password and then
delete the `admin` account.
## User Account Types
To add further user accounts to the system, one for each of your station staff that need access to Airtime, click the **New User** button with the plus icon. Enter a user name, password and contact details, and then select the **User Type** from the drop down menu, which can be *Admin*, *Program Manager*, *DJ*, or *Guest*. The difference between these user types is:
**Guests**
- Can view shows and the playout log on the Calendar and Dashboard, respectively
- Listen to the output stream without leaving the interface
**DJs**
- Everything Guests can do, plus
- Upload media (music, PSAs, underwriting, shows, etc.) to their own library (DJs cannot view other libraries)
- Edit metadata, delete, and schedule media in their own library to shows they are assigned to
- Preview uploaded media _without_ affecting the live playout
- Create Playlists, Smart Blocks, and connect Podcasts and Webstreams to LibreTime
**Program Managers**
- Everything DJs can do, plus
- Manage other users' libraries in addition to their own
- Create, edit, and delete color-coded shows on the Calender and assign them to DJs (if needed)
- Shows can be scheduled to repeat, with the option of linking content between the shows (helpful if a DJ livestreams in each week)
- View listener statistics
- Export playout logs for analysis or reporting for music royalties
**Administrators**
- Everything Program Managers can do, plus
- Manage all user accounts, including the ability to reset passwords
- Configure Track Types for easy sorting of uploaded content
- Change system settings
## Editing or deleting user accounts
![](/img/user-list.png)
New user accounts that you add will be shown in the table on the left side of the **Users** page. If you have a
large number of users on the system, you can use the search tool above the table (which has a magnifying glass icon)
to identify specific user accounts. Click the white chevrons in the table headings to sort the search results
by **Username**, **First Name**, **Last Name** or **User Type**.
![](/img/user-edit.png)
To edit a user account, click on that user's row in the table, change the user's details in the box on the
right side, and then click the **Save** button. To remove a user account, click the small **x** icon to the right
side of its row in the table. You cannot delete your own user account, and usernames cannot be changed once created.
Users can update their own password, and their contact, language and time zone details, by clicking their username on the
right side of the main menu bar, next to the **Logout** link.

View file

@ -1,7 +1,7 @@
---
layout: default
title: Using Vagrant and Virtualbox for developing LibreTime
git: vagrant.md
layout: article
title: Using Vagrant for local development
category: dev
---
> Prerequisites: git, [Vagrant](https://vagrantup.com), libvirt or VirtualBox
@ -79,9 +79,8 @@ cd libretime
vagrant up ubuntu-xenial
```
If everything works out, you will find LibreTime on [port 8080](http://localhost:8080),
icecast on [port 8000](http://localhost:8000) and the docs on
[port 8888](http://localhost:8888).
If everything works out, you will find LibreTime on [port 8080](http://localhost:8080)
and Icecast on [port 8000](http://localhost:8000).
Once you reach the web setup GUI you can click through it using the default values. To
connect to the vagrant machine you can run `vagrant ssh ubuntu-xenial` in the libretime

21
docs/_docs/webstreams.md Normal file
View file

@ -0,0 +1,21 @@
---
title: Webstreams
layout: article
category: interface
---
<html>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Ha3X6aYdY04" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</html>
### Adding a webstream
A web stream URL and metadata can be added to the LibreTime library, so that a remote stream can be searched for and scheduled to be *pulled* into a show. For example, at the top of the hour your station may pull a news report from journalists working in another studio. This is a different concept from **Master Source** and **Show Source** remote streams which are *pushed* into the LibreTime playout schedule.
To add a web stream, click the **+ New** button on the left side of the Webstreams page. Like a playlist, web streams in the Library can have a title and **Description**, which may help you find them in searches later.
![](/img/webstream.jpg)
The **Stream URL** setting must include the *port number* (such as 8000) and *mount point* (such as remote\_stream) of the remote stream, in addition to the streaming server name. A **Default Length** for the remote stream can also be set. If the stream is added at the end of a show which becomes overbooked as a result, it will be faded out when the show ends.
Note: LibreTime checks the remote webstream's status upon editing stream settings, so an offline stream will result in an error. There are many tools such as [BUTT](https://danielnoethen.de/butt/) and [MIXXX](https://www.mixxx.org) that can be used to send a test stream to LibreTime can save it; read more [here](/docs/live-broadcast).

31
docs/_docs/widgets.md Normal file
View file

@ -0,0 +1,31 @@
---
title: Widgets
category: interface
layout: article
---
Bring your Libretime broadcast to your website with embeddable widgets! Libretime comes with two widgets: a streaming player and a schedule. Both widgets use iframes to display and can be placed wherever embeddable code can on a website.
## Getting Started
Before using the widgets, make sure Libretime's Public API is enabled in **Settings** > **General**.
![](/img/widgets_settings.png)
> **Note:** Your Libretime instance needs to be accessible to the public *without the use of a VPN or SSH tunneling* in order for the widgets to work.
## Streaming Player Widget
The streaming player widget inserts your Libretime stream into your website. One example is from [WRCS Community Radio](http://wcrsfm.org/) in Columbus, Ohio, USA.
<iframe frameborder="0" width="400" height="235" src="http://broadcast.wcrsfm.org/embed/player?stream=auto&title=Now Playing"></iframe>
![](/img/widgets_player.png)
From **Widgets** > **Player**, enter a title for your streaming widget and select what stream you'd like to use. All selectible streams must first be configured in **Settings** > **Streams** (see [Settings](/docs/settings)). **Auto detect** should be fine for most.
## Show Schedule Widget
![](/img/widgets_schedule.png)
The show schedule widget displays the upcoming shows for the next seven days. There are no customizable settings for this widget.

View file

@ -1,31 +0,0 @@
<section class="" id="biggest-fans">
<div class="container text-center">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Our Biggest Fans</h2>
<hr class="my-4">
</div>
</div>
<div class="station-logos">
<div class="station-logos-row">
<a class="station-logos-col" href="https://www.wrir.org" target="_blank">
<img src="img/stations/wrir973.png" alt="WRIR 97.3 FM">
</a>
<a class="station-logos-col" href="http://wcrsfm.org/" target="_blank">
<img src="img/stations/wrcs927.png" alt="WCRS 92.7 FM">
</a>
<a class="station-logos-col" href="https://rabe.ch/" target="_blank">
<img src="img/stations/rabe956.svg" alt="Rabe 95.6">
</a>
<a class="station-logos-col" href="https://campus-clermont.net/" target="_blank">
<img src="img/stations/radiocampus933.png" alt="Radio Campus 93.3">
</a>
</div>
</div>
<hr class="my-4">
"We needed a solution for remote broadcasting <br> during the Coronavirus pandemic without having to <br> use remote desktop at 1 a.m. <br> Saved. Our. Butts."
<br>
<small><b>Zachary Klosko - Operations at <a href="https://www.wrir.org" target="_blank">WRIR</a></b></small>
</div>
</section>

View file

@ -1,8 +1,55 @@
<footer>
<section class="footer-dark text-white">
<div class="text-footer">
<small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/volny">Felix Volny</a>, <a href="https://github.com/ned-kelly">ned-kelly</a> and <a href="https://github.com/zklosko">Zachary Klosko</a> &nbsp; | &nbsp;</small>
<small>Code and docs licensed under GPLv2. More details <a href="http://sourcefabric.booktype.pro/airtime-25-for-broadcasters/about-this-manual/">here</a>. </small>
<footer class="footer-dark text-white font-weight-light text-white-55 pt-11 pb-5 overflow-hidden">
<div class="container ">
<div class="row justify-content-md-between">
<div class="col-md-12 col-lg-4 mb-4 mr-lg-auto">
<img class="mb-3" src="/img/logo.png" alt="Libretime" style="width: 170px;">
<p class="small font-weight-light mb-3">LibreTime is an open source radio automation solution helping communities broadcast with ease.</p>
</div>
<div class="col-sm-4 col-lg-2 mb-4">
<h4 class="h6 text-white mb-3">Contribute</h4>
<!-- Links -->
<ul class="list-unstyled">
<li class="mb-3"><a class="link-white-55" href="/contribute">Develop</a></li>
<li class="mb-3"><a class="link-white-55" href="https://opencollective.com/libretime">Donate</a></li>
</ul>
<!-- End Links -->
</div>
<div class="col-sm-4 col-lg-2 mb-4">
<h4 class="h6 text-white mb-3">Support</h4>
<!-- Links -->
<ul class="list-unstyled">
<li class="mb-3"><a class="link-white-55" href="/docs">Docs</a></li>
<li class="mb-3"><a class="link-white-55" href="/docs/troubleshooting">Troubleshooting</a></li>
</ul>
<!-- End Links -->
</div>
<div class="col-sm-4 col-lg-2 mb-4">
<h4 class="h6 text-white mb-3">Community</h4>
<!-- Links -->
<ul class="list-unstyled">
<li class="mb-3"><a class="link-white-55" href="https://discourse.libretime.org/">Discourse</a></li>
<li class="mb-3"><a class="link-white-55" href="https://chat.libretime.org/">Mattermost</a></li>
</ul>
<!-- End Links -->
</div>
</div>
<hr class="my-5 opacity-10">
<div class="row">
<div class="col-md-7">
<p class="small font-weight-light mb-md-0">Code licensed under AGPLv3; docs licensed under GPLv2. More details <a href="http://sourcefabric.booktype.pro/airtime-25-for-broadcasters/about-this-manual/">here</a>.</p>
{% if page.photocredit %}
<div class="small font-weight-light mb-md-0">{{page.photocredit}}</div>
{% endif %}
</div>
</div>
</div>
</section>
</footer>

View file

@ -5,13 +5,12 @@
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<!-- Custom fonts for this template -->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<!-- Custom fonts, icons for this template -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" rel="stylesheet" type="text/css">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Merriweather:400,300,300italic,400italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
<!-- Plugin CSS -->
<link href="vendor/magnific-popup/magnific-popup.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/creative.min.css" rel="stylesheet">
<link href="/css/creative.min.css" rel="stylesheet">
<title>{{ site.title }} - {{ page.title }}</title>

View file

@ -7,23 +7,17 @@
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="/install">Install</a>
<li class="nav-item ml-lg-4 mb-2 mb-lg-0">
<a class="nav-link px-0" href="/install"> Install</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/guides">Docs</a>
<li class="nav-item ml-lg-4 mb-2 mb-lg-0">
<a class="nav-link px-0" href="/docs">Docs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://www.youtube.com/channel/UC-MA9GzkTb8th1YlDmF0NfA" target="_blank"><i class="fab fa-youtube"></i></a>
<li class="nav-item ml-lg-4 mb-2 mb-lg-0">
<a class="nav-link px-0" href="https://github.com/libretime/libretime" target="_blank"><i class="fab fa-github mr-1"></i> Star on Github</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://github.com/LibreTime/libretime" target="_blank"><i class="fab fa-github"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://discourse.libretime.org/" target="_blank"><i class="fab fa-discourse"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://chat.libretime.org/login" target="_blank"><i class="fas fa-comments"></i></a>
<li class="nav-item ml-lg-4 mb-2 mb-lg-0">
<a class="nav-link px-0" href="/search"><i class="fas fa-search"></i></a>
</li>
</ul>
</div>

View file

@ -41,3 +41,4 @@
scrollToTop();
}
</script>

View file

@ -0,0 +1,71 @@
<script src="/lunr.js"></script>
<script>
{% assign counter = 0 %}
var documents = [{% for page in site.pages %}{% if page.url contains '.xml' or page.url contains 'assets' %}{% else %}{
"id": {{ counter }},
"url": "{{ site.url }}{{ page.url }}",
"title": "{{ page.title }}",
"body": "{{ page.content | markdownify | replace: '.', '. ' | replace: '</h2>', ': ' | replace: '</h3>', ': ' | replace: '</h4>', ': ' | replace: '</p>', ' ' | strip_html | strip_newlines | replace: ' ', ' ' | replace: '"', ' ' }}"{% assign counter = counter | plus: 1 %}
}, {% endif %}{% endfor %}{% for page in site.without-plugin %}{
"id": {{ counter }},
"url": "{{ site.url }}{{ page.url }}",
"title": "{{ page.title }}",
"body": "{{ page.content | markdownify | replace: '.', '. ' | replace: '</h2>', ': ' | replace: '</h3>', ': ' | replace: '</h4>', ': ' | replace: '</p>', ' ' | strip_html | strip_newlines | replace: ' ', ' ' | replace: '"', ' ' }}"{% assign counter = counter | plus: 1 %}
}, {% endfor %}{% for doc in site.docs %}{
"id": {{ counter }},
"url": "{{ site.url }}{{ doc.url }}",
"title": "{{ doc.title }}",
"body": "{{ doc.content | markdownify | replace: '.', '. ' | replace: '</h2>', ': ' | replace: '</h3>', ': ' | replace: '</h4>', ': ' | replace: '</p>', ' ' | strip_html | strip_newlines | replace: ' ', ' ' | replace: '"', ' ' }}"{% assign counter = counter | plus: 1 %}
}{% if forloop.last %}{% else %}, {% endif %}{% endfor %}];
var idx = lunr(function () {
this.ref('id')
this.field('title')
this.field('body')
documents.forEach(function (doc) {
this.add(doc)
}, this)
});
function lunr_search(term) {
document.getElementById('lunrsearchresults').innerHTML = '<ul></ul>';
if(term) {
document.getElementById('lunrsearchresults').innerHTML = "<p>Search results for '" + term + "'</p>" + document.getElementById('lunrsearchresults').innerHTML;
//put results on the screen.
var results = idx.search(term);
if(results.length>0){
//console.log(idx.search(term));
//if results
for (var i = 0; i < results.length; i++) {
// more statements
var ref = results[i]['ref'];
var url = documents[ref]['url'];
var title = documents[ref]['title'];
var body = documents[ref]['body'].substring(0,160)+'...';
document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML = document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML + "<li class='lunrsearchresult mb-2'><a href='" + url + "'><span class='title'>" + title + "</span><br /><span class='body'>"+ body +"</span><br /><span class='url'>"+ url +"</span></a></li>";
}
} else {
document.querySelectorAll('#lunrsearchresults ul')[0].innerHTML = "<li class='lunrsearchresult'>No results found...</li>";
}
}
return false;
}
</script>
<style>
#lunrsearchresults {padding-top: 0.2rem;}
.lunrsearchresult {padding-bottom: 1rem;}
.lunrsearchresult .title {color: #f05f40;}
.lunrsearchresult .url {color: gray;}
.lunrsearchresult a {display: block; color: black;}
.lunrsearchresult a:hover, .lunrsearchresult a:focus {text-decoration: none;}
.lunrsearchresult a:hover .title {text-decoration: underline;}
</style>
<form onSubmit="return lunr_search(document.getElementById('lunrsearch').value);">
<p><input type="text" class="form-control" id="lunrsearch" name="q" maxlength="255" value="" placeholder="Search via Lunr.js" /></p>
</form>
<div id="lunrsearchresults">
<ul class="list-line mb-0"></ul>
</div>

View file

@ -1,112 +0,0 @@
{% capture tocWorkspace %}
{% comment %}
Version 1.0.12
https://github.com/allejo/jekyll-toc
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
Usage:
{% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
Parameters:
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
Optional Parameters:
* sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC
* class (string) : '' - a CSS class assigned to the TOC
* id (string) : '' - an ID to assigned to the TOC
* h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored
* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
* item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
* baseurl (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
* anchor_class (string) : '' - add custom class(es) for each anchor element
* skipNoIDs (bool) : false - skip headers that do not have an `id` attribute
Output:
An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
generate the table of contents and will NOT output the markdown given to it
{% endcomment %}
{% capture my_toc %}{% endcapture %}
{% assign orderedList = include.ordered | default: false %}
{% assign skipNoIDs = include.skipNoIDs | default: false %}
{% assign minHeader = include.h_min | default: 1 %}
{% assign maxHeader = include.h_max | default: 6 %}
{% assign nodes = include.html | split: '<h' %}
{% assign firstHeader = true %}
{% capture listModifier %}{% if orderedList %}1.{% else %}-{% endif %}{% endcapture %}
{% for node in nodes %}
{% if node == "" %}
{% continue %}
{% endif %}
{% if skipNoIDs == true %}
{% unless node contains "id=" %}
{% continue %}
{% endunless %}
{% endif %}
{% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
{% if headerLevel < minHeader or headerLevel > maxHeader %}
{% continue %}
{% endif %}
{% assign _workspace = node | split: '</h' %}
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
{% assign html_id = _idWorkspace[0] %}
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
{% assign html_class = _classWorkspace[0] %}
{% if html_class contains "no_toc" %}
{% continue %}
{% endif %}
{% if firstHeader %}
{% assign firstHeader = false %}
{% assign minHeader = headerLevel %}
{% endif %}
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
{% assign indentAmount = headerLevel | minus: minHeader %}
{% assign space = '' %}
{% for i in (1..indentAmount) %}
{% assign space = space | prepend: ' ' %}
{% endfor %}
{% if include.item_class and include.item_class != blank %}
{% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %}
{% endif %}
{% capture anchor_body %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
{% capture anchor_body %}{{ anchor_body | replace: "|", "\|" }}{% endcapture %}
{% if html_id %}
{% capture list_item %}[{{ anchor_body }}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% endcapture %}
{% else %}
{% capture list_item %}{{ anchor_body }}{% endcapture %}
{% endif %}
{% capture my_toc %}{{ my_toc }}
{{ space }}{{ listModifier }} {{ listItemClass }} {{ list_item }}{% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %}
{% endfor %}
{% if include.class and include.class != blank %}
{% capture my_toc %}{:.{{ include.class }}}
{{ my_toc | lstrip }}{% endcapture %}
{% endif %}
{% if include.id %}
{% capture my_toc %}{: #{{ include.id }}}
{{ my_toc | lstrip }}{% endcapture %}
{% endif %}
{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }}

View file

@ -1,43 +1,29 @@
<!doctype html>
<html lang="en">
<head>
{% include head.html %}
---
layout: default
---
<style type="text/css" media="screen">
h1 {
margin: 30px 0;
font-size: 4em;
line-height: 1;
letter-spacing: -1px;
<style>
header.masthead {
padding-top: 10rem;
padding-bottom: calc(10rem - 56px);
background-image: url("{{ page.img }}");
background-position: center center;
background-size: cover;
}
img {
max-width: 250px;
}
.center-text {
text-align: center;
body{
font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;
padding-top: 0px;
}
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body id="page-top">
<!-- Navigation -->
{% include navbar.html %}
<div class="container-fluid">
<section class="bg-dark text-white center-text">
<img src="img/404.png" alt="404 Tape">
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
<a href="guides"><svg class="bi bi-arrow-left-circle-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-7.646 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L6.207 7.5H11a.5.5 0 0 1 0 1H6.207l2.147 2.146z"/>
</svg> Back to Docs
</a>
</section>
<!-- Splash Image -->
<header class="masthead text-center text-white d-flex">
<div class="container my-auto">
<div class="row">
<div class="col-lg-10 mx-auto">
{{ content }}
<a class="btn btn-primary btn-xl js-scroll-trigger" href="{{ page.linkto }}">{{ page.linktext }}</a>
</div>
{% include footer.html %}
{% include scripts.html %}
</body>
</html>
</div>
</div>
</header>

View file

@ -0,0 +1,76 @@
---
layout: default
---
<!-- Promo Section -->
<section class="bg-primary">
<div class="container">
<div class="d-flex mh-25rem pt-11 py-6">
<div class="align-self-center">
<h1 class="text-white font-weight-light mb-3">{{ page.title }}</h1>
<nav aria-label="breadcrumb">
<ol class="breadcrumb breadcrumb-light">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item"><a href="/docs">Docs</a></li>
<li class="breadcrumb-item active" aria-current="page">{{ page.title }}</li>
</ol>
</nav>
</div>
</div>
</div>
<!-- SVG BG -->
<svg class="position-absolute bottom-0 left-0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1920 323" enable-background="new 0 0 1920 323" xml:space="preserve">
<polygon fill="#ffffff" style="fill-opacity: .05;" points="-0.5,322.5 -0.5,121.5 658.3,212.3 "></polygon>
<polygon fill="#ffffff" style="fill-opacity: .1;" points="-2,323 1920,323 1920,-1 "></polygon>
</svg>
<!-- End SVG BG -->
</section>
<!-- End Promo Section -->
<main>
<p>
<div class="container py-10">
<div class="row">
<div class="col-lg-8 mb-11 mb-lg-4 pr-lg-6">
{{ content }}
</div>
<div class="col-lg-4 mb-4">
<div class="card p-3 border-0 shadow">
<div class="card-header pb-0">
<h4 class="h5 mb-3">In This Section</h4>
</div>
<div class="card-body">
<ul class="list-line mb-0">
{% for doc in site.docs %}
{% if doc.category == page.category %}
<li class="mb-2"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
<br>
<!-- Edit Page -->
<a class="card border-0 bg-primary link-white text-white mb-4" href="https://github.com/Libretime/libretime/edit/master/docs/{{ page.path }}">
<div class="card-body z-index-1">
<div class="d-flex align-items-center">
<i class="fa fa-pencil-alt fa-3x mr-4"></i>
<p class="mb-0">Help improve this page</p>
</div>
</div>
<!-- SVG BG -->
<svg class="position-absolute bottom-0 left-0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1920 323" enable-background="new 0 0 1920 323" xml:space="preserve">
<polygon fill="#ffffff" style="fill-opacity: .05;" points="-0.5,322.5 -0.5,121.5 658.3,212.3 "></polygon>
<polygon fill="#ffffff" style="fill-opacity: .1;" points="-2,323 1920,323 1920,-1 "></polygon>
</svg>
<!-- End SVG BG -->
</a>
</div>
</div>
</div>
</main>

View file

@ -3,10 +3,6 @@
<head>
{% include head.html %}
<style>
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body id="page-top">
@ -21,55 +17,7 @@
<span class="screen-reader-text">Back to top</span>
</a>
<div class="container">
<div class="row bg-dark text-white">
<div class="col">
<br>
<a href="guides"><svg class="bi bi-arrow-left-circle-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-7.646 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L6.207 7.5H11a.5.5 0 0 1 0 1H6.207l2.147 2.146z"/>
</svg> Back
</a>
<br>
<p></p>
</div>
<div class="col white-text center text-footer">
<h5 class="allcaps">{{ page.title }}</h5>
</div>
<div class="col white-text center text-footer">
</div>
</div>
</div>
<div class="container">
<div class="row no-gutters">
<div class="col-9">
<div class="d-block d-sm-none d-sm-block d-md-block d-lg-none">
<hr class="my-4">
<div class="text-footer">
<h5 class="allcaps">Contents</h5>
</div>
<div class="toc" >{% include toc.html html=content class=toc %}</div>
<hr class="my-4">
</div>
<nav class="content">
{{content}}
<p></p>
{% if page.git %}
<a href="https://github.com/LibreTime/libretime/edit/master/docs/{{page.git}}" target="_blank">
<i class="far fa-edit"></i> Edit on Github
</a>
{% endif %}
</nav>
</div>
<div class="col d-none d-sm-none d-md-none d-lg-block">
<hr class="my-4">
<div class="text-footer">
<h5 class="allcaps">Contents</h5>
</div>
<div class="toc" >{% include toc.html html=content class=toc %}</div>
<hr class="my-4">
</div>
</div>
</div>
{% include footer.html %}

View file

@ -1,137 +0,0 @@
<!doctype html>
<html lang="en">
<head>
{% include head.html %}
<style>
header.masthead {
padding-top: 10rem;
padding-bottom: calc(10rem - 56px);
background-image: url("{{ site.headimage }}");
background-position: center center;
background-size: cover;
}
body{
font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;
padding-top: 0px;
}
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body id="page-top">
<!-- Navigation -->
{% include navbar.html %}
<!-- Scroll to Top link -->
<a class="top-link hide" href="" id="js-top">
<svg class="bi bi-arrow-up-circle-fill" width="4em" height="4em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-10.646.354a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 6.207V11a.5.5 0 0 1-1 0V6.207L5.354 8.354z"/>
</svg>
<span class="screen-reader-text">Back to top</span>
</a>
<!-- Splash Image
<header class="masthead text-center text-white d-flex">
<div class="container my-auto">
<div class="row">
<div class="col-lg-10 mx-auto">
<h1 class="text-uppercase">
<strong> {{ site.headtext }} </strong>
</h1>
<hr>
</div>
<div class="col-lg-8 mx-auto">
<p class="text-faded mb-5">
{{ site.headsubtext}}
</p>
<a class="btn btn-primary btn-xl js-scroll-trigger" href="{{ site.headbuttonurl }}">{{ site.headbuttontext }}</a>
</div>
</div>
</div>
</header>
-->
<!-- Orange Container -->
<section class="bg-dark text-white" id="dj">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="section-heading text-white">Docs for DJs</h2>
<hr class="light my-4">
<p class="text-faded mb-4">
Basic guides for broadcasting with Libretime can be found here, perfect for DJs.
</p>
{% for item in site.data.nav.djguides %}
<li>
<a class="" href="{{ item.url }}">{{ item.page }}</a>
</li>
{% endfor %}
</div>
</div>
</div>
</section>
<section class="" id="managers">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="section-heading">Docs for Program Managers</h2>
<hr class="light my-4">
<p class="mb-4">
Program Managers, sometimes known as Program Directors, manage DJs and are responsible for maintaining the station's on-air calendar. All the help Program Managers need is right here. (Note: guides for DJs will also be helpful for programming Libretime)
</p>
{% for item in site.data.nav.managerguides %}
<li>
<a class="" href="{{ item.url }}">{{ item.page }}</a>
</li>
{% endfor %}
</div>
</div>
</div>
</section>
<section class="bg-dark text-white" id="dj">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="section-heading text-white">Docs for System Administrators</h2>
<hr class="light my-4">
<p class="text-faded mb-4">
System administrators can find all of the information they need here to configure and maintain their LibreTime instance.
</p>
{% for item in site.data.nav.adminguides %}
<li>
<a class="" href="{{ item.url }}">{{ item.page }}</a>
</li>
{% endfor %}
</div>
</div>
</div>
</section>
<section class="" id="devs">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="section-heading">Docs for Developers</h2>
<hr class="light my-4">
<p class="mb-4">
Calling all developers! Find the information you need to get started at the links below.
</p>
{% for item in site.data.nav.devguides %}
<li>
<a class="" href="{{ item.url }}">{{ item.page }}</a>
</li>
{% endfor %}
</div>
</div>
</div>
</section>
{% include footer.html %}
{% include scripts.html %}
</body>
</html>

203
docs/_layouts/home.html Normal file
View file

@ -0,0 +1,203 @@
---
layout: default
---
<style>
header.masthead {
padding-top: 10rem;
padding-bottom: calc(10rem - 56px);
background-image: url("{{ page.img }}");
background-position: center center;
background-size: cover;
}
body{
font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;
padding-top: 0px;
}
</style>
<!-- Splash Image -->
<header class="masthead text-center text-white d-flex">
<div class="container my-auto">
<div class="row">
<div class="col-lg-10 mx-auto">
{{ content }}
<a class="btn btn-primary btn-xl js-scroll-trigger" href="{{ page.linkto }}">{{ page.linktext }}</a>
</div>
</div>
</div>
</header>
<!-- Features Block -->
<section id="features">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Key features include</h2>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-music text-primary mb-3 sr-icon-1"></i>
<h3 class="mb-3">Library Intelligence</h3>
<p class="text-muted mb-0">From designing intelligent &amp; automated playlists to drag-and-drop visual editing &amp; cuing, managing your library and playlists has never been simpler.</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-th-list text-primary mb-3 sr-icon-2"></i>
<h3 class="mb-3">Programming</h3>
<p class="text-muted mb-0">Schedule your live and pre-programmed shows easily with a drag-and-drop style calendar, additionally all content broadcasted is logged for efficient reporting to media licensing authorities.</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-users text-primary mb-3 sr-icon-3"></i>
<h3 class="mb-3">DJ Management</h3>
<p class="text-muted mb-0">Libretime's user management allows for the simple creation of hierarchical staff who can control their broadcast slots associated with them from anywhere on the planet!</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-broadcast-tower text-primary mb-3 sr-icon-4"></i>
<h3 class="mb-3">AM/FM &amp; Web</h3>
<p class="text-muted mb-0">LibreTime is flexible, allowing you to run your internet radio station entirely from a cloud VM with its built-in Icecast server or plug its analog output into the mixer at your broadcast AM or FM station.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Screenshots gallery -->
<section class="p-0" id="screenshots">
<div class="container-fluid p-0">
<div class="row no-gutters popup-gallery">
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/dashboard">
<img class="img-fluid" src="/img/portfolio/library.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Intelligent Library
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/listener-stats">
<img class="img-fluid" src="/img/portfolio/stream-stats.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Streaming Listener Statistics
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/scheduling-shows">
<img class="img-fluid" src="/img/portfolio/scheduling.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Show Scheduling
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/microsite">
<img class="img-fluid" src="/img/portfolio/builtin-microsite.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Built-in Microsite
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/playout-history">
<img class="img-fluid" src="/img/portfolio/playout-history.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Playout History &amp; Auditing
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="/docs/podcasts">
<img class="img-fluid" src="/img/portfolio/podcasts.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Podcast Automation &amp; Scheduling
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</section>
<!-- "Our Biggest Fans" Section -->
<section class="" id="biggest-fans">
<div class="container text-center">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Our Biggest Fans</h2>
</div>
</div>
<p>
<div class="station-logos">
<div class="station-logos-row">
<a class="station-logos-col" href="https://www.wrir.org" target="_blank">
<img src="img/stations/wrir973.png" alt="WRIR 97.3 FM">
</a>
<a class="station-logos-col" href="http://wcrsfm.org/" target="_blank">
<img src="img/stations/wrcs927.png" alt="WCRS 92.7 FM">
</a>
<a class="station-logos-col" href="https://rabe.ch/" target="_blank">
<img src="img/stations/rabe956.svg" alt="Rabe 95.6">
</a>
<a class="station-logos-col" href="https://campus-clermont.net/" target="_blank">
<img src="img/stations/radiocampus933.png" alt="Radio Campus 93.3">
</a>
</div>
</div>
</div>
</section>
<div class="container">
<section class="" id="get-started">
<div class="col-lg-10 mx-auto text-center">
<h2 class="section-heading">Get started with Libretime <span class="badge badge-secondary">Alpha</span></h2>
<br>
<div class="row">
{% for action in page.actions %}
<div class="col-sm-6">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{action.title}}</h5>
<p class="card-text">{{action.text}}</p>
<a href="{{action.linkto}}" class="btn btn-primary">{{action.linktext}}</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</section>
</div>

View file

@ -1,245 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<!-- Custom fonts for this template -->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Merriweather:400,300,300italic,400italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
<!-- Plugin CSS -->
<link href="vendor/magnific-popup/magnific-popup.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/creative.min.css" rel="stylesheet">
<style>
header.masthead {
padding-top: 10rem;
padding-bottom: calc(10rem - 56px);
background-image: url("{{ site.headimage }}");
background-position: center center;
background-size: cover;
}
body{
font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;
padding-top: 0px;
}
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body id="page-top">
<!-- Navigation -->
{% include navbar.html %}
<!-- Scroll to Top link -->
<a class="top-link hide" href="" id="js-top">
<svg class="bi bi-arrow-up-circle-fill" width="4em" height="4em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-10.646.354a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 6.207V11a.5.5 0 0 1-1 0V6.207L5.354 8.354z"/>
</svg>
<span class="screen-reader-text">Back to top</span>
</a>
<!-- Splash Image -->
<header class="masthead text-center text-white d-flex">
<div class="container my-auto">
<div class="row">
<div class="col-lg-10 mx-auto">
<h1 class="text-uppercase">
<strong> {{ site.headtext }} </strong>
</h1>
<hr>
</div>
<div class="col-lg-8 mx-auto">
<p class="text-faded mb-5">
{{ site.headsubtext}}
</p>
<a class="btn btn-primary btn-xl js-scroll-trigger" href="{{ site.headbuttonurl }}">{{ site.headbuttontext }}</a>
</div>
</div>
</div>
</header>
<!-- Orange Container -->
<section class="bg-primary" id="about">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto text-center">
<h2 class="section-heading text-white">Freedom through Open Source!</h2>
<hr class="light my-4">
<p class="text-faded mb-4">
LibreTime is Free/Libre and Open Source (FLOSS) radio automation and broadcasting solution helping communities both modernize their broadcasting stack, and get up and on-the-air with ease.
</p>
<p class="text-faded mb-4">
The platform consists of several open-source components that can be easily and rapidly deployed on both dedicated hardware, virtual machines, and Cloud native infrastructure - allowing your station to truly underwrite it's own destiny.
</p>
<p class="text-faded mb-4">
The platform is a fork of the older AirTime project which is <b>no longer actively maintained</b>, and the evolution of Open Source broadcasting for both current AirTime and new users looking to continue with the platform on their own infrastructure.
</p>
<a class="btn btn-light btn-xl js-scroll-trigger" href="#features">Key Features</a>
</div>
</div>
</div>
</section>
<!-- Features Block -->
<section id="features">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Key features include</h2>
<hr class="my-4">
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-music text-primary mb-3 sr-icon-1"></i>
<h3 class="mb-3">Library Intelligence</h3>
<p class="text-muted mb-0">From designing intelligent &amp; automated playlists to drag-and-drop visual editing &amp; cuing, managing your library and playlists has never been simpler.</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-th-list text-primary mb-3 sr-icon-2"></i>
<h3 class="mb-3">Programming</h3>
<p class="text-muted mb-0">Schedule your live and pre-programmed shows easily with a drag-and-drop style calendar, additionally all content broadcasted is logged for efficient reporting to media licensing authorities.</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-users text-primary mb-3 sr-icon-3"></i>
<h3 class="mb-3">DJ Management</h3>
<p class="text-muted mb-0">Libretime's user management allows for the simple creation of hierarchical staff who can control their broadcast slots associated with them from anywhere on the planet!</p>
</div>
</div>
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box mt-5 mx-auto">
<i class="fas fa-4x fa-broadcast-tower text-primary mb-3 sr-icon-4"></i>
<h3 class="mb-3">AM/FM &amp; Web</h3>
<p class="text-muted mb-0">LibreTime is flexible, allowing you to run your internet radio station entirely from a cloud VM with its built-in Icecast server or plug its analog output into the mixer at your broadcast AM or FM station.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Screenshots gallery -->
<section class="p-0" id="screenshots">
<div class="container-fluid p-0">
<div class="row no-gutters popup-gallery">
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="library">
<img class="img-fluid" src="img/portfolio/library.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Intelligent Library
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="analytics#streaming-listener-statistics">
<img class="img-fluid" src="img/portfolio/stream-stats.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Streaming Listener Statistics
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="scheduling-shows">
<img class="img-fluid" src="img/portfolio/scheduling.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Show Scheduling
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="microsite">
<img class="img-fluid" src="img/portfolio/builtin-microsite.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Built-in Microsite
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="analytics">
<img class="img-fluid" src="img/portfolio/playout-history.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Playout History &amp; Auditing
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="portfolio-box" href="library#podcasts">
<img class="img-fluid" src="img/portfolio/podcasts.jpg" alt="">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">
<div class="project-category text-faded">
Podcast Automation &amp; Scheduling
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</section>
<!-- Dark "Our Biggest Fans" Section -->
{% include fans.html %}
<section class="bg-dark text-white" id="get-started">
<div class="container">
<div class="row">
<div class="col-lg-10 mx-auto text-center">
<h2 class="section-heading">Get started with LibreTime today</h2>
<hr class="my-4">
<p class="mb-5" style="text-align: center;">
Requires: 1 Ghz processor, 2 GB RAM, wired ethernet connection with static IP address and you. <br> What are you waiting for?
<div class="start-buttons" style="padding: 0px;">
<a class="btn btn-light btn-xl sr-button" href="install">Server Install</a>
<a class="btn btn-light btn-xl sr-button" href="vagrant">Vagrant for Devs</a>
<a class="btn btn-light btn-xl sr-button" target="_blank" href="https://github.com/ned-kelly/docker-multicontainer-libretime/blob/master/README.md">Docker</a>
</div>
</div>
</div>
</div>
</section>
{% include footer.html %}
{% include scripts.html %}
</body>
</html>

View file

@ -1,76 +0,0 @@
---
layout: default
title: Backing Up The Server
git: backing-up-the-server.md
---
## Database Backup
The following shell commands can be used for database backup and restore on a
running *PostgreSQL* server in an LibreTime system.
You can dump the entire database to a zipped file with the combination of the
**pg\_dumpall** command and **gzip**. The **pg\_dumpall** command is executed
as the user *postgres*, by using the **sudo** command and the **-u** switch. It
is separated from the **gzip** command with the pipe symbol.
```bash
sudo -u postgres pg_dumpall | gzip -c > libretime-backup.gz
```
This command can be automated to run on a regular basis using the standard
**cron** tool on your server.
When restoring a production database on a cleanly installed LibreTime system, it
may be necessary to drop the empty database that was created during the new
installation, by using the **dropdb** command. Again, this command is executed
with **sudo** as the user *postgres*: 
```bash
sudo -u postgres dropdb airtime
```
This **dropdb** command above is necessary to avoid 'already exists' errors on
table creation when overwriting an empty LibreTime database in the next step.
These errors might prevent some data from being restored, such as user account
data.
To restore, first unzip the backup file with **gunzip**, then use the **psql**
command as the *postgres* user:
```bash
gunzip libretime-backup.gz
sudo -u postgres psql -f libretime-backup
```
You should now be able to log in to the LibreTime web interface in the usual way.
For safety reasons, your regular database backups should be kept in a directory
which is backed up by your storage backup tool of choice; for example, the
*/srv/airtime/database\_backups* directory. This should ensure that a storage
restore can be made along with a matching and complete version of the LibreTime
database from the day that the storage backup was made. 
## Storage backup
Backing up the LibreTime database with **pg\_dumpall** will not back up the
LibreTime media storage server, which is likely to need a great deal more backup
space. Creating a compressed file from hundreds of gigabytes of storage server
contents is likely to take a very long time, and may have little benefit for the
amount of CPU power used, if the media files are already stored in a highly
compressed format. It is also impractical to copy very large backup files across
the network on a daily basis.
Instead, it is preferable to use an incremental backup technique to synchronize
the production LibreTime server storage with a backup server each day or night. If
the backup server also contains an LibreTime installation, it should be possible
to switch playout to this second machine relatively quickly, in case of a
hardware failure or other emergency on the production server.
A standard incremental backup tool on GNU/Linux servers is [rsync](http://rsync.samba.org/) which can be installed
using the package manager of your GNU/Linux distribution. However, incremental
backup alone cannot help in the scenario where a file which later proves to be
important has been deleted by an administrator. For backups that can be rolled
back to restore from an earlier date than the current backup, the tool
[rdiff-backup](http://www.nongnu.org/rdiff-backup/) can
be deployed.  

View file

@ -13,7 +13,7 @@ body{
}
hr{
max-width:50px;border-width:3px;border-color:#f05f40
max-width:auto;border-width:2px;border-color:#f05f40
}
hr.light{
@ -39,6 +39,10 @@ h1,h2,h3,h4,h5,h6{
font-family:'Open Sans','Helvetica Neue',Arial,sans-serif;
}
h1,h2{
margin-top: 30px; /* adding padding on top of lead headings */
}
/* Correcting overscroll on TOC links */
:target{
padding-top: 57px;
@ -56,9 +60,9 @@ th{
}
tr, td{
padding: 15px;
padding: 5px;
text-align: left;
border-bottom: 1px solid #f05f40
border: 2px solid #f05f40
}
/* Theme Colors */
@ -83,7 +87,8 @@ div.text-footer{
text-align: center;
}
section{padding:8rem 0}
/* Changed padding */
section{padding:2rem 0}
.section-heading{margin-top:0}
::-moz-selection{color:#fff;background:#212529;text-shadow:none}
::selection{color:#fff;background:#212529;text-shadow:none}
@ -204,11 +209,8 @@ header.masthead p{font-weight:300}
/* Blockquotes */
blockquote {
border: 1px solid #212529;
border-left: 10px solid #f05f40;
border: 2px solid #f05f40;
border-radius: 0px;
background: #212529;
color: white;
font-size: .9rem;
margin: 10px;
padding: 10px 20px;
@ -216,8 +218,7 @@ padding: 10px 20px;
blockquote p {
margin: 0;
line-height: 30px;
padding-bottom: 20px;
line-height: 25px;
}
blockquote .small {
@ -229,13 +230,12 @@ text-align: right;
/* Code Blocks */
code {
color: #f05f40;
color: #ad462e;
font-size: .9rem;
}
pre.highlight {
border: 1px solid #212529;
border-left: 10px solid #212529;
border-left: 2px solid #212529;
background: white;
color: black;
font-size: .9rem;
@ -257,8 +257,8 @@ padding: 10px 20px;
margin: 0 3em 3em 0;
border-radius: 50%;
padding: .25em;
width: 80px;
height: 80px;
width: 50px;
height: 50px;
background-color: #F8F8F8;
}
@ -306,6 +306,7 @@ padding: 10px 20px;
.station-logos img {
max-height: 200px;
max-width: 200px;
margin: auto;
}
.station-logos-row {
@ -317,20 +318,49 @@ padding: 10px 20px;
padding: 5px;
}
/* TOC */
.toc {
background-color: #fff;
margin: 0px 0;
padding: 10px 0px;
/*------------------------------------
List
------------------------------------*/
.list-line {
list-style: none;
padding-left: 0;
}
/* Page Title */
.allcaps {
text-transform: uppercase
.list-line li {
position: relative;
color: #FF6745;
padding-left: 1.5rem;
}
.center {
margin: auto;
width: 50%;
padding: 10px;
.list-line li::before {
position: absolute;
top: 0;
left: 0;
content: "—";
color: #FF6745;
}
.list-icon {
list-style: none;
padding-left: 0;
}
.list-icon li {
position: relative;
color: #212529;
padding-left: 1.8rem;
margin-bottom: 1.8rem;
}
.list-icon li::before {
position: absolute;
top: 0;
left: 0;
}
.list-icon-star li::before {
content: "\f005";
font-family: "Font Awesome 5 Free";
font-weight: 400;
color: #007bff;
}

142
docs/docs.html Normal file
View file

@ -0,0 +1,142 @@
---
layout: default
title: Docs
---
<main>
<section class="text-center pt-11 pb-6">
<div class="container">
<div class="w-md-75 w-lg-50 mx-auto text-center mb-5">
<h2 class="h3 text-center">Knowledge Base</h2>
<p>All of the guides you need to set up, maintain, and use Libretime, all in one place.</p>
</div>
<div class="row">
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="fas fa-save fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/install">Install</a></h4>
<p class="card-text mb-4">Get Libretime up and running in just 10 minutes.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="fas fa-wrench fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/docs/host-configuration">Configure</a></h4>
<p class="card-text mb-4">Prepare Libretime for primetime.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="far fa-clock fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/docs/scheduling-shows">Schedule Shows</a></h4>
<p class="card-text mb-4">Putting in your first show? Start here.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="fa fa-users fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/docs/users">User Accounts</a></h4>
<p class="card-text mb-4">Learn how to add, change, and delete user accounts.</p>
</div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="fas fa-people-carry fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/contribute">Contribute to Libretime</a></h4>
<p class="card-text mb-4">Love what we do? Help us out!</p>
</div>
</div>
</div>
<div class="col-md-4 mb-5">
<div class="card p-3 border-0 shadow">
<div class="card-header border-0"><i class="fa fa-exclamation-triangle fa-3x text-dark"></i></div>
<div class="card-body pt-0">
<h4 class="h5 mb-2"><a class="link-dark" href="/docs/troubleshooting">Troubleshooting</a></h4>
<p class="card-text mb-4">Something not working? Here's a quick guide to fixing Libretime.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Section -->
<div class="container">
<div class="card shadow-sm">
<div class="card-body p-4 px-md-7">
<div class="d-md-flex align-items-center">
<div class="w-100 mb-3 mb-md-0 pr-md-5">
<h2 class="h4 font-weight-light mb-0">Can't find what you're looking for?</h2>
<p class="font-weight-light mb-0">Ask for help on our Github repo!</p>
</div>
<div class="text-md-right w-100">
<a class="btn btn-dark" href="https://github.com/LibreTime/libretime/issues/new/choose">Submit a Request</a>
</div>
</div>
</div>
</div>
</div>
<!-- End Section -->
<section class="py-11">
<div class="container">
<div class="row">
<div class="col-md-4 mb-5 mb-md-0">
<i class="fas fa-headphones-alt fa-2x text-dark mb-3"></i>
<h3 class="h5 mb-2">Using Libretime</h3>
<ul class="list-unstyled">
{% for doc in site.docs %}
{% if doc.category == "interface" %}
<li class="mb-2"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
<div class="col-md-4 mb-5 mb-md-0">
<i class="fas fa-user-tie fa-2x text-dark mb-3"></i>
<h3 class="h5 mb-2">For Program Managers</h3>
<ul class="list-unstyled">
{% for doc in site.docs %}
{% if doc.category == "manager" %}
<li class="mb-2"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
<div class="col-md-4 mb-5 mb-md-0">
<i class="fas fa-user-secret fa-2x text-dark mb-3"></i>
<h3 class="h5 mb-2">For System Administrators</h3>
<ul class="list-unstyled">
{% for doc in site.docs %}
{% if doc.category == "admin" %}
<li class="mb-2"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
</div>
</div>
</section>
</main>

View file

@ -1,4 +0,0 @@
---
title: Docs
layout: guides
---

Some files were not shown because too many files have changed in this diff Show more