Commiting to test quickstart.sh
This commit is contained in:
parent
80542825e8
commit
7dab6edb83
|
@ -5,13 +5,12 @@ 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
|
||||
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
|
||||
|
@ -22,6 +21,7 @@ headbuttontext: Get LibreTime
|
|||
collections:
|
||||
docs:
|
||||
output: true
|
||||
permalink: /docs/:name
|
||||
|
||||
# Build settings
|
||||
plugins:
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
navbarlink:
|
||||
- name: Install
|
||||
url: /install
|
||||
- name: Docs
|
||||
url: /docs
|
||||
- name: Github
|
||||
url: https://github.com/LibreTime/libretime
|
|
@ -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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -0,0 +1,121 @@
|
|||
---
|
||||
layout: article
|
||||
title: Dashboard
|
||||
category: interface
|
||||
---
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
layout: article
|
||||
title: FreeIPA Configuration
|
||||
category: admin
|
||||
category: install
|
||||
---
|
||||
|
||||
You can configure LibreTime to delegate all authentication to a FreeIPA server.
|
||||
|
|
|
@ -0,0 +1,280 @@
|
|||
---
|
||||
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
|
||||
|
||||
### Changing the default PostgreSQL passwords {#postgre}
|
||||
|
||||
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.
|
||||
|
||||
### Changing the default Icecast passwords {#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` field below with your own username and password.
|
||||
|
||||
```
|
||||
<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.
|
||||
|
||||
```
|
||||
service icecast2 restart
|
||||
```
|
||||
|
||||
> 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.
|
||||
|
||||
### 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 500 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 by `sudo systemctl apache restart`.
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
---
|
||||
|
||||
## Setting the server time
|
||||
|
||||
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:
|
||||
|
||||
date
|
||||
|
||||
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 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: Install
|
||||
layout: article
|
||||
git: install.md
|
||||
category: install
|
||||
---
|
||||
|
||||
> Note: this guide is assuming you are using Ubuntu 18.04 LTS for installation, which comes with `ufw` and `netplan`,
|
||||
|
@ -11,12 +11,10 @@ these are less tested. Firewall and static IP address configuration will need to
|
|||
|
||||
## Minimum System Requirements
|
||||
|
||||
| On-Premises Install | Cloud Install |
|
||||
|---------------------|---------------|
|
||||
| (FM + Internet Radio) | (Internet Radio Only) |
|
||||
| 1 Ghz Processor| 1vCPU |
|
||||
| 2 GB RAM | 2 GB RAM |
|
||||
| Wired ethernet connection, static IP address | 2 TB of data transfer/month |
|
||||
- Ubuntu 18.04 LTS, Debian 9 and 10, Raspbian 9 and 10
|
||||
- 1 Ghz Processor
|
||||
- 4 GB RAM recommended (2 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.
|
||||
|
@ -65,7 +63,7 @@ sudo ufw enable 8001/tcp
|
|||
sudo ufw enable 8002/tcp
|
||||
```
|
||||
|
||||
> If needed, instuctions for setting up a reverse proxy can be found [here](quickstart#reverse-proxy).
|
||||
> If needed, instuctions for setting up a reverse proxy can be found [here](/docs/reverse-proxy).
|
||||
|
||||
### Installing LibreTime
|
||||
|
||||
|
@ -110,538 +108,4 @@ the `www-data` user needs to be added to the `audio` user group using the comman
|
|||
|
||||
```
|
||||
sudo adduser www-data audio
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Reverse Proxy {#reverse-proxy}
|
||||
|
||||
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**](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](quickstart). 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](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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Host Configuration
|
||||
|
||||
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
|
||||
|
||||
### Changing the default PostgreSQL passwords {#postgre}
|
||||
|
||||
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.
|
||||
|
||||
### Changing the default Icecast passwords {#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` field below with your own username and password.
|
||||
|
||||
```
|
||||
<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.
|
||||
|
||||
```
|
||||
service icecast2 restart
|
||||
```
|
||||
|
||||
> 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.
|
||||
|
||||
### 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 500 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 by `sudo systemctl apache restart`.
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
---
|
||||
|
||||
## Setting the server time
|
||||
|
||||
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:
|
||||
|
||||
date
|
||||
|
||||
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 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## SSL Configuration
|
||||
|
||||
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](https://www.eff.org/). 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**.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
```
|
|
@ -1,239 +0,0 @@
|
|||
---
|
||||
layout: article
|
||||
title: Library
|
||||
git: library.md
|
||||
category: dj
|
||||
---
|
||||
|
||||
## Dashboard {#dashboard}
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## Playlists {#playlists}
|
||||
|
||||
### Creating a new playlist
|
||||
|
||||
You can create a new playlist on the toolbar of the **Playlists** page.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
## Smartblocks {#smartblocks}
|
||||
|
||||
### Creating a Smartblock
|
||||
|
||||

|
||||
|
||||
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 never overflow the Time Limit. For instance if you set a time limit of 1 hour. It will add tracks to the schedule until it can't add any more tracks without exceeding the hour. 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". This will make LibreTime add tracks that meet the criteria until it equals or is longer than the time limit. This is helpful for avoiding dead air on shows that are being autoscheduled.
|
||||
|
||||

|
||||
|
||||
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](preparing-media) for tips on tagging content.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## Podcasts {#podcasts}
|
||||
|
||||
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](library#smartblocks) 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>
|
||||
|
||||
<br>
|
||||
### Podcasts Dashboard
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
## Webstreams {#webstreams}
|
||||
|
||||
<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.
|
||||
|
||||

|
||||
|
||||
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](../live-shows-with-mixxx/index.md).
|
|
@ -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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,13 +1,10 @@
|
|||
---
|
||||
layout: article
|
||||
title: Built-in Microsite
|
||||
git: microsite.md
|
||||
category: admin
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
---
|
||||
layout: article
|
||||
title: Playlists and Smartblocks
|
||||
category: interface
|
||||
---
|
||||
|
||||
### Creating a new playlist
|
||||
|
||||
You can create a new playlist on the toolbar of the **Playlists** page.
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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 never overflow the Time Limit. For instance if you set a time limit of 1 hour. It will add tracks to the schedule until it can't add any more tracks without exceeding the hour. 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". This will make LibreTime add tracks that meet the criteria until it equals or is longer than the time limit. This is helpful for avoiding dead air on shows that are being autoscheduled.
|
||||
|
||||

|
||||
|
||||
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](preparing-media) for tips on tagging content.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,19 +1,16 @@
|
|||
---
|
||||
layout: article
|
||||
title: Analytics
|
||||
git: analytics.md
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||

|
||||
|
||||
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**.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
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](library#smartblocks) 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>
|
||||
|
||||
<br>
|
||||
### Podcasts Dashboard
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,8 +1,7 @@
|
|||
---
|
||||
layout: article
|
||||
title: Preparing Media for LibreTime
|
||||
git: preparing-media.md
|
||||
category: dj
|
||||
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.
|
||||
|
@ -13,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.
|
||||
|
||||

|
||||

|
||||
|
||||
## Metadata in legacy character sets
|
||||
|
||||
|
@ -42,19 +41,19 @@ To actually convert all of the tags and strip any legacy ID3v1 tag present from
|
|||
|
||||
The name of the original character set follows the **-e** option. Other legacy character sets that mid3iconv can convert to UTF-8 include:
|
||||
|
||||
KOI8-R: Russian
|
||||
KOI8-U: Ukrainian
|
||||
KOI8-R: Russian
|
||||
KOI8-U: Ukrainian
|
||||
|
||||
GBK: Traditional Chinese
|
||||
GB2312: Simplified Chinese
|
||||
GBK: Traditional Chinese
|
||||
GB2312: Simplified Chinese
|
||||
|
||||
EUC-KR: Korean
|
||||
EUC-JP: Japanese
|
||||
EUC-KR: Korean
|
||||
EUC-JP: Japanese
|
||||
|
||||
CP1253: Greek
|
||||
CP1254: Turkish
|
||||
CP1255: Hebrew
|
||||
CP1256: Arabic
|
||||
CP1253: Greek
|
||||
CP1254: Turkish
|
||||
CP1255: Hebrew
|
||||
CP1256: Arabic
|
||||
|
||||
## Audio loudness
|
||||
|
||||
|
@ -94,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.
|
||||
|
||||

|
||||

|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
---
|
||||
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**](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](quickstart). 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](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
|
||||
```
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
layout: article
|
||||
title: Scheduling Shows
|
||||
git: scheduling-shows.md
|
||||
category: interface
|
||||
---
|
||||
|
||||
## Scheduling Shows
|
||||
|
@ -18,7 +18,7 @@ The main workflow in LibreTime is **Upload** media -> create a show on the **Cal
|
|||
|
||||
Once you log in, click on the big blue button on the left navigation that says **Upload**.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
@ -27,11 +27,11 @@ 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.
|
||||
|
||||

|
||||

|
||||
|
||||
Click on the blue **+ New Show** button to add a new show.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
@ -64,13 +64,13 @@ of the pane to add your show to the calendar.
|
|||
|
||||
Once your show is created, click on it to open its context menu. Select **Schedule Tracks** to open the track scheduler.
|
||||
|
||||

|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
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
|
||||
|
@ -81,63 +81,8 @@ Show playback will start and end as per each show's start and end times, allowin
|
|||
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.
|
||||
|
||||

|
||||

|
||||
|
||||
You can listen to your stream by going to `yourserverIP:8000` or by clicking the **Listen** button under the On Air
|
||||
indicator.
|
||||
|
||||
---
|
||||
|
||||
## Calendar Functions {#calendar}
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -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](https://www.eff.org/). 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**.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,8 +1,7 @@
|
|||
---
|
||||
layout: article
|
||||
title: Managing Users
|
||||
git: users.md
|
||||
category: manager
|
||||
category: interface
|
||||
---
|
||||
|
||||
> Note: if your Airtime server is accessible from the public Internet (ex. being hosted in a cloud VM)
|
||||
|
|
|
@ -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.
|
||||
|
||||

|
||||
|
||||
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](../live-shows-with-mixxx/index.md).
|
|
@ -3,10 +3,9 @@
|
|||
<div class="row">
|
||||
<div class="col-lg-12 text-center">
|
||||
<h2 class="section-heading">Our Biggest Fans</h2>
|
||||
<hr class="my-4">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<div class="station-logos">
|
||||
<div class="station-logos-row">
|
||||
<a class="station-logos-col" href="https://www.wrir.org" target="_blank">
|
||||
|
@ -23,7 +22,6 @@
|
|||
</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>
|
||||
|
|
|
@ -1,8 +1,53 @@
|
|||
<footer>
|
||||
<section class="footer-dark text-white">
|
||||
<div class="text-footer">
|
||||
<small>Hosted on GitHub Pages — 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> | </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="Docs UI Kit" style="width: 170px;">
|
||||
<p class="small font-weight-light mb-3">Docs UI Kit is fully responsive template with variety of documentation layouts, functional features and ready to use pages.</p>
|
||||
</div>
|
||||
</section>
|
||||
</footer>
|
||||
|
||||
<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="#">Code</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="https://opencollective.com/libretime">Donate</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">Write</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="#">FAQ</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/login">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 and docs licensed under GPLv2. More details <a href="http://sourcefabric.booktype.pro/airtime-25-for-broadcasters/about-this-manual/">here</a>.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
|
@ -7,11 +7,15 @@
|
|||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarResponsive">
|
||||
<ul class="navbar-nav ml-auto">
|
||||
{% for navbarlink in site.data.nav.navbarlink %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{navbarlink.url}}">{{navbarlink.name}}</a>
|
||||
<li class="nav-item ml-lg-4 mb-2 mb-lg-0">
|
||||
<a class="nav-link px-0" href="/docs/install"> Install</a>
|
||||
</li>
|
||||
<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 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>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -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 }}
|
|
@ -4,7 +4,7 @@ layout: default
|
|||
|
||||
<div class="container">
|
||||
<section class="center-text">
|
||||
<img src="img/404.png" alt="404 Tape">
|
||||
<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="/docs"><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">
|
||||
|
|
|
@ -8,14 +8,30 @@ layout: default
|
|||
<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">
|
||||
|
@ -25,10 +41,16 @@ layout: default
|
|||
<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">Contents</h4>
|
||||
<h4 class="h5 mb-3">In This Section</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="toc" >{% include toc.html html=content class=toc %}</div>
|
||||
<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>
|
||||
</div>
|
||||
|
|
|
@ -25,7 +25,7 @@ layout: default
|
|||
<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="article.html">Configure</a></h4>
|
||||
<h4 class="h5 mb-2"><a class="link-dark" href="/docs/host-configuration">Configure</a></h4>
|
||||
<p class="card-text mb-4">We strive to embrace and drive change in our industry.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -65,7 +65,7 @@ layout: default
|
|||
<div class="card p-3 border-0 shadow">
|
||||
<div class="card-header border-0"><i class="fa fa-adjust fa-3x text-dark"></i></div>
|
||||
<div class="card-body pt-0">
|
||||
<h4 class="h5 mb-2"><a class="link-dark" href="article.html">FAQs</a></h4>
|
||||
<h4 class="h5 mb-2"><a class="link-dark" href="/faq">FAQs</a></h4>
|
||||
<p class="card-text mb-4">Have questions? <br> We have answers.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -76,7 +76,7 @@ layout: default
|
|||
|
||||
<!-- Section -->
|
||||
<div class="container">
|
||||
<div class="card gradient-dark shadow-sm">
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-body p-5 px-md-7">
|
||||
<div class="d-md-flex align-items-center">
|
||||
<div class="w-100 mb-3 mb-md-0 pr-md-5">
|
||||
|
@ -98,11 +98,11 @@ layout: default
|
|||
<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">For DJs</h3>
|
||||
<h3 class="h5 mb-2">Using Libretime</h3>
|
||||
|
||||
<ul class="list-unstyled">
|
||||
{% for doc in site.docs %}
|
||||
{% if doc.category == "dj" %}
|
||||
{% if doc.category == "interface" %}
|
||||
<li class="mb-2"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
@ -110,7 +110,7 @@ layout: default
|
|||
</div>
|
||||
|
||||
<div class="col-md-4 mb-5 mb-md-0">
|
||||
<i class="fas fa-users fa-2x text-dark mb-3"></i>
|
||||
<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">
|
||||
|
@ -122,14 +122,14 @@ layout: default
|
|||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<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>
|
||||
<li class="mb-3"><a class="link-muted" href="{{doc.url}}">{{doc.title}}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
|
|
@ -1,504 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Title -->
|
||||
<title>FAQ | Docs - UI Kit</title>
|
||||
|
||||
<!-- Required Meta Tags Always Come First -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="shortcut icon" href="favicon.png">
|
||||
|
||||
<!-- Meta tags -->
|
||||
<meta name="keywords" content="documentation template, help desk, open source, free template, freebies, bootstrap 4, bootstrap4">
|
||||
<meta name="description" content="Docs UI Kit is beautiful Open Source Bootstrap 4 UI Kit under MIT license. The UI Kit comes with 10 beautiful complete and functional pages including lots of reusable and customizable UI Blocks. Every component crafted with love to speed up your workflow.">
|
||||
|
||||
<!-- Schema.org -->
|
||||
<meta itemprop="name" content="Documentation Help Desk by Htmlstream">
|
||||
<meta itemprop="description" content="Docs UI Kit is beautiful Open Source Bootstrap 4 UI Kit under MIT license. The UI Kit comes with 10 beautiful complete and functional pages including lots of reusable and customizable UI Blocks. Every component crafted with love to speed up your workflow.">
|
||||
<meta itemprop="image" content="docs-ui-kit-thumbnail.jpg">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="product">
|
||||
<meta name="twitter:site" content="@htmlstream">
|
||||
<meta name="twitter:title" content="Documentation Help Desk by Htmlstream">
|
||||
<meta name="twitter:description" content="Docs UI Kit is beautiful Open Source Bootstrap 4 UI Kit under MIT license. The UI Kit comes with 10 beautiful complete and functional pages including lots of reusable and customizable UI Blocks. Every component crafted with love to speed up your workflow.">
|
||||
<meta name="twitter:creator" content="@htmlstream">
|
||||
<meta name="twitter:image" content="docs-ui-kit-thumbnail.jpg">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:title" content="Documentation Help Desk by Htmlstream">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://htmlstream.com/preview/docs-ui-kit/index.html">
|
||||
<meta property="og:image" content="docs-ui-kit-thumbnail.jpg">
|
||||
<meta property="og:description" content="Docs UI Kit is beautiful Open Source Bootstrap 4 UI Kit under MIT license. The UI Kit comes with 10 beautiful complete and functional pages including lots of reusable and customizable UI Blocks. Every component crafted with love to speed up your workflow.">
|
||||
<meta property="og:site_name" content="Htmlstream">
|
||||
|
||||
<!-- Google Fonts -->
|
||||
<link href="//fonts.googleapis.com/css?family=Poppins:300,400,500,600" rel="stylesheet">
|
||||
|
||||
<!-- CSS Implementing Plugins -->
|
||||
<link rel="stylesheet" href="assets/vendor/font-awesome/css/fontawesome-all.min.css">
|
||||
|
||||
<!-- CSS Template -->
|
||||
<link rel="stylesheet" href="assets/css/theme.css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Header -->
|
||||
<header class="duik-header">
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary position-absolute left-0 right-0 flex-nowrap z-index-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="home-page-1.html"><img src="assets/img/logo-light.png" alt="Docs UI Kit" style="width: 150px;"></a>
|
||||
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo" aria-controls="navbarTogglerDemo" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarTogglerDemo">
|
||||
<ul class="navbar-nav mt-2 mt-lg-0 small">
|
||||
<li class="nav-item mb-2 mb-lg-0">
|
||||
<a class="nav-link" href="index.html">Back to UI Kit</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="navbar-nav ml-auto mt-2 mt-lg-0">
|
||||
<li class="nav-item ml-lg-6 mb-2 mb-lg-0">
|
||||
<a class="nav-link px-0" href="home-page-1.html">Home</a>
|
||||
</li>
|
||||
<li class="nav-item dropdown active ml-lg-6 mb-2 mb-lg-0">
|
||||
<a class="nav-link px-0" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
Pages <i class="fas fa-angle-down small ml-1"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item" href="home-page-2.html">Home Option</a>
|
||||
<a class="dropdown-item" href="home-page-3.html">Home Dark</a>
|
||||
<a class="dropdown-item" href="article.html">Article</a>
|
||||
<a class="dropdown-item active" href="faq.html">FAQ</a>
|
||||
<a class="dropdown-item" href="contacts.html">Contacts</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item dropdown ml-lg-6 mb-2 mb-lg-0">
|
||||
<a class="nav-link px-0" href="#" id="navbarDropdown-2" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
Docs Layouts <i class="fas fa-angle-down small ml-1"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown-2">
|
||||
<a class="dropdown-item" href="doc-1.html" target="_blank">Docs Layout 1 <i class="fa fa-external-link-square-alt text-muted small opacity-30 ml-2"></i></a>
|
||||
<a class="dropdown-item" href="doc-2.html" target="_blank">Docs Layout 2 <i class="fa fa-external-link-square-alt text-muted small opacity-30 ml-1"></i></a>
|
||||
<a class="dropdown-item" href="doc-3.html" target="_blank">Docs Layout 3 <i class="fa fa-external-link-square-alt text-muted small opacity-30 ml-1"></i></a>
|
||||
<a class="dropdown-item" href="doc-4.html" target="_blank">Docs Layout 4 <i class="fa fa-external-link-square-alt text-muted small opacity-30 ml-1"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item ml-lg-6 mb-2 mb-lg-0">
|
||||
<a class="nav-link px-0" href="https://github.com/htmlstreamofficial/docs-ui-kit" target="_blank"><i class="fab fa-github mr-1"></i> Star on Github</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<!-- End Navbar -->
|
||||
</header>
|
||||
<!-- End Header -->
|
||||
|
||||
<!-- Promo Section -->
|
||||
<section class="duik-promo bg-primary">
|
||||
<div class="container duik-promo-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">Frequently Asked Questions</h1>
|
||||
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb breadcrumb-light">
|
||||
<li class="breadcrumb-item"><a href="#">Home</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">FAQ</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>
|
||||
<div class="container pt-11 pb-8">
|
||||
<div class="row">
|
||||
<div class="col-lg-4 mb-4 mb-lg-3 order-lg-2">
|
||||
<div class="js-sticky-sidebar">
|
||||
<div class="list-group mb-4" id="faq" role="tablist">
|
||||
<a class="list-group-item list-group-item-action active" id="faq-purchase" data-toggle="tab" href="#faq-purchase-content" role="tab" aria-controls="faq-purchase-content" aria-selected="true">
|
||||
<i class="fa fa-fw fa-shopping-basket mr-1"></i> Purchase
|
||||
</a>
|
||||
|
||||
<a class="list-group-item list-group-item-action" id="faq-installation" data-toggle="tab" href="#faq-installation-content" role="tab" aria-controls="faq-installation-content" aria-selected="false">
|
||||
<i class="fa fa-fw fa-adjust mr-1"></i> Installation
|
||||
</a>
|
||||
|
||||
<a class="list-group-item list-group-item-action" id="faq-update" data-toggle="tab" href="#faq-update-content" role="tab" aria-controls="faq-update-content" aria-selected="false">
|
||||
<i class="fa fa-fw fa-layer-group mr-1"></i> Update
|
||||
</a>
|
||||
|
||||
<a class="list-group-item list-group-item-action" id="faq-gitlab" data-toggle="tab" href="#faq-gitlab-content" role="tab" aria-controls="faq-gitlab-content" aria-selected="false">
|
||||
<i class="fab fa-fw fa-github mr-1"></i> Github
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Call To Action -->
|
||||
<a class="card border-0 bg-primary link-white text-white mb-4" href="https://github.com/htmlstreamofficial/docs-ui-kit">
|
||||
<div class="card-body z-index-1">
|
||||
<div class="d-flex align-items-center">
|
||||
<i class="fab fa-github fa-3x mr-4"></i>
|
||||
<p class="mb-0">Stay up to date for any updates and contributions!</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>
|
||||
<!-- End Call To Action -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 pr-lg-6 order-lg-1">
|
||||
<div class="tab-content" id="faqTabContent">
|
||||
<div class="tab-pane fade show active" id="faq-purchase-content" role="tabpanel" aria-labelledby="faq-purchase">
|
||||
<div class="accordion" id="accordionExample-001">
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center" id="headingOne-001" data-toggle="collapse" data-target="#collapseOne-001" aria-expanded="true" aria-controls="collapseOne-001" role="region">
|
||||
<h6 class="mb-0">What is Docs UI Kit?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
|
||||
<div id="collapseOne-001" class="collapse show" aria-labelledby="headingOne-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Docs UI Kit is beautiful Open Source Bootstrap 4 UI Kit under MIT license. The UI Kit comes with more than 10 beautiful complete pages and includes a lot of reusable and customizable UI Blocks. Furthermore, Docs UI Kit includes 4 different Documentation Layouts.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingTwo-001" data-toggle="collapse" data-target="#collapseTwo-001" aria-expanded="false" aria-controls="collapseTwo-001" role="region">
|
||||
<h6 class="mb-0">Is it really free and under MIT license?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseTwo-001" class="collapse" aria-labelledby="headingTwo-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Yes! It's just absolutely FREE and comes with a simple license! If you have any questions or doubts, please feel free to reach us <a href="#">here</a>.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingThree-001" data-toggle="collapse" data-target="#collapseThree-001" aria-expanded="false" aria-controls="collapseThree-001" role="region">
|
||||
<h6 class="mb-0">Can I use Docs UI Kit in commercial project?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseThree-001" class="collapse" aria-labelledby="headingThree-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Yes! Docs UI Kit is absolutely Free and you can use in both personal and commercial projects without any attribution. However, we would much appreciate for any attribution.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center" id="headingFour-001" data-toggle="collapse" data-target="#collapseFour-001" aria-expanded="true" aria-controls="collapseFour-001" role="region">
|
||||
<h6 class="mb-0">Where can I download Docs UI Kit?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
|
||||
<div id="collapseFour-001" class="collapse" aria-labelledby="headingFour-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">You can download Docs UI Kit on <a target="_blank" href="https://htmlstream.com/">Htmlstream website</a> or on the <a href="#">Github page</a>.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingFive-001" data-toggle="collapse" data-target="#collapseFive-001" aria-expanded="false" aria-controls="collapseFive-001" role="region">
|
||||
<h6 class="mb-0">Do you provide free or premium support?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseFive-001" class="collapse" aria-labelledby="headingFive-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Corrently, all our freebies comes with community support and you can open an issue on the product <a href="#">github page</a>. We will do our best to answers your questions.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingSix-001" data-toggle="collapse" data-target="#collapseSix-001" aria-expanded="false" aria-controls="collapseSix-001" role="region">
|
||||
<h6 class="mb-0">Can I contribute to Docs UI Kit?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseSix-001" class="collapse" aria-labelledby="headingSix-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Sure! Please feel free to contribute - we appreciate any community help! You can <a href="#">pull request</a> on github page.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingSeven-001" data-toggle="collapse" data-target="#collapseSeven-001" aria-expanded="false" aria-controls="collapseSeven-001" role="region">
|
||||
<h6 class="mb-0">How to use search in Docs Layouts?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseSeven-001" class="collapse" aria-labelledby="headingSeven-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">You can check out our documenttion for detailed examples.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingEight-001" data-toggle="collapse" data-target="#collapseEight-001" aria-expanded="false" aria-controls="collapseEight-001" role="region">
|
||||
<h6 class="mb-0">How many pages includes Docs UI Kit?</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseEight-001" class="collapse" aria-labelledby="headingEight-001" data-parent="#accordionExample-001">
|
||||
<div class="card-body">Docs UI Kit comes with 10+ example pages.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade" id="faq-installation-content" role="tabpanel" aria-labelledby="faq-installation">
|
||||
<div class="accordion" id="accordionExample-002">
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center" id="headingOne-002" data-toggle="collapse" data-target="#collapseOne-002" aria-expanded="true" aria-controls="collapseOne-002" role="region">
|
||||
<h6 class="mb-0">Installation Group Item #1</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
|
||||
<div id="collapseOne-002" class="collapse show" aria-labelledby="headingOne-002" data-parent="#accordionExample-002">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingTwo-002" data-toggle="collapse" data-target="#collapseTwo-002" aria-expanded="false" aria-controls="collapseTwo-002" role="region">
|
||||
<h6 class="mb-0">Installation Group Item #2</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseTwo-002" class="collapse" aria-labelledby="headingTwo-002" data-parent="#accordionExample-002">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingThree-002" data-toggle="collapse" data-target="#collapseThree-002" aria-expanded="false" aria-controls="collapseThree-002" role="region">
|
||||
<h6 class="mb-0">Installation Group Item #3</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseThree-002" class="collapse" aria-labelledby="headingThree-002" data-parent="#accordionExample-002">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade" id="faq-update-content" role="tabpanel" aria-labelledby="faq-update">
|
||||
<div class="accordion" id="accordionExample-003">
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center" id="headingOne-003" data-toggle="collapse" data-target="#collapseOne-003" aria-expanded="true" aria-controls="collapseOne-003" role="region">
|
||||
<h6 class="mb-0">Update Group Item #1</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
|
||||
<div id="collapseOne-003" class="collapse show" aria-labelledby="headingOne-003" data-parent="#accordionExample-003">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingTwo-003" data-toggle="collapse" data-target="#collapseTwo-003" aria-expanded="false" aria-controls="collapseTwo-003" role="region">
|
||||
<h6 class="mb-0">Update Group Item #2</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseTwo-003" class="collapse" aria-labelledby="headingTwo-003" data-parent="#accordionExample-003">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingThree-003" data-toggle="collapse" data-target="#collapseThree-003" aria-expanded="false" aria-controls="collapseThree-003" role="region">
|
||||
<h6 class="mb-0">Update Group Item #3</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseThree-003" class="collapse" aria-labelledby="headingThree-003" data-parent="#accordionExample-003">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade" id="faq-gitlab-content" role="tabpanel" aria-labelledby="faq-gitlab">
|
||||
<div class="accordion" id="accordionExample-004">
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center" id="headingOne-004" data-toggle="collapse" data-target="#collapseOne-004" aria-expanded="true" aria-controls="collapseOne-004" role="region">
|
||||
<h6 class="mb-0">Gitlab Group Item #1</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
|
||||
<div id="collapseOne-004" class="collapse show" aria-labelledby="headingOne-004" data-parent="#accordionExample-004">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingTwo-004" data-toggle="collapse" data-target="#collapseTwo-004" aria-expanded="false" aria-controls="collapseTwo-004" role="region">
|
||||
<h6 class="mb-0">Gitlab Group Item #2</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseTwo-004" class="collapse" aria-labelledby="headingTwo-004" data-parent="#accordionExample-004">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card border-bottom mb-3">
|
||||
<div class="card-header accordion-header d-flex align-items-center collapsed" id="headingThree-004" data-toggle="collapse" data-target="#collapseThree-004" aria-expanded="false" aria-controls="collapseThree-004" role="region">
|
||||
<h6 class="mb-0">Gitlab Group Item #3</h6>
|
||||
<i class="fas fa-angle-down accordion-control ml-auto text-primary"></i>
|
||||
</div>
|
||||
<div id="collapseThree-004" class="collapse" aria-labelledby="headingThree-004" data-parent="#accordionExample-004">
|
||||
<div class="card-body">
|
||||
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section class="bg-light py-11 text-center">
|
||||
<div class="container">
|
||||
<i class="fas fa-headset fa-4x text-primary mb-4"></i>
|
||||
<h2 class="h3 mb-3">Can't find what you're looking for?</h2>
|
||||
<div class="lead mb-5">Let us help you right now!</div>
|
||||
<a class="btn px-5 btn-primary" href="#">Submit a Request</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="bg-dark 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="assets/img/logo-light.png" alt="Docs UI Kit" style="width: 170px;">
|
||||
<p class="small font-weight-light mb-3">Docs UI Kit is fully responsive template with variety of documentation layouts, functional features and ready to use pages.</p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4 col-lg-2 mb-4">
|
||||
<h4 class="h6 text-white mb-3">Company</h4>
|
||||
|
||||
<!-- Links -->
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-3"><a class="link-white-55" href="#">About Us</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">Offers</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">Contacts</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="#">Community</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">Status</a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">FAQ</a></li>
|
||||
</ul>
|
||||
<!-- End Links -->
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4 col-lg-2 mb-4">
|
||||
<h4 class="h6 text-white mb-3">Contacts</h4>
|
||||
|
||||
<!-- Links -->
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-3"><a class="link-white-55" href="#">info@htmlstream.com </a></li>
|
||||
<li class="mb-3"><a class="link-white-55" href="#">1-800-643-4500</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">© 2019 <a class="text-white" href="https://htmlstream.com/">Htmlstream</a>. Under MIT license.</p>
|
||||
</div>
|
||||
|
||||
<div class="col-md-5 text-md-right">
|
||||
<ul class="list-inline mb-0">
|
||||
<li class="list-inline-item mr-1 mr-xl-2">
|
||||
<a class="link-white-55" target="_blank" href="https://github.com/htmlstreamofficial/">
|
||||
<i class="fab fa-github"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-inline-item mx-1 mx-xl-2">
|
||||
<a class="link-white-55" target="_blank" href="https://www.facebook.com/htmlstream">
|
||||
<i class="fab fa-facebook"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-inline-item mx-1 mx-xl-2">
|
||||
<a class="link-white-55" target="_blank" href="https://www.instagram.com/htmlstream">
|
||||
<i class="fab fa-instagram"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-inline-item mx-1 mx-xl-2">
|
||||
<a class="link-white-55" target="_blank" href="https://twitter.com/htmlstream">
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="list-inline-item ml-1 ml-xl-2">
|
||||
<a class="link-white-55" target="_blank" href="https://dribbble.com/htmlstream">
|
||||
<i class="fab fa-dribbble"></i>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- End Footer -->
|
||||
|
||||
<!-- Go to Top -->
|
||||
<a class="js-go-to duik-go-to" href="javascript:;">
|
||||
<span class="fa fa-arrow-up duik-go-to__inner"></span>
|
||||
</a>
|
||||
<!-- End Go to Top -->
|
||||
|
||||
<!-- JS Global Compulsory -->
|
||||
<script src="assets/vendor/jquery/dist/jquery.min.js"></script>
|
||||
<script src="assets/vendor/jquery-migrate/dist/jquery-migrate.min.js"></script>
|
||||
<script src="assets/vendor/popper.js/dist/umd/popper.min.js"></script>
|
||||
<script src="assets/vendor/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
|
||||
<!-- JS Implementing Plugins -->
|
||||
<script src="assets/vendor/sticky-sidebar/dist/sticky-sidebar.min.js"></script>
|
||||
|
||||
<!-- JS -->
|
||||
<script src="assets/js/main.js"></script>
|
||||
<script src="assets/js/sticky-sidebar.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -88,6 +88,13 @@
|
|||
</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>
|
||||
|
||||
<!-- Features Block -->
|
||||
|
@ -96,7 +103,6 @@
|
|||
<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>
|
||||
|
@ -214,7 +220,7 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Dark "Our Biggest Fans" Section -->
|
||||
<!-- "Our Biggest Fans" Section -->
|
||||
{% include fans.html %}
|
||||
|
||||
<section class="bg-dark text-white" id="get-started">
|
||||
|
@ -222,7 +228,6 @@
|
|||
<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;">
|
||||
|
@ -238,6 +243,7 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
{% include footer.html %}
|
||||
|
||||
{% include scripts.html %}
|
||||
|
|
|
@ -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{
|
||||
|
@ -56,9 +56,9 @@ th{
|
|||
}
|
||||
|
||||
tr, td{
|
||||
padding: 15px;
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #f05f40
|
||||
border: 2px solid #f05f40
|
||||
}
|
||||
|
||||
/* Theme Colors */
|
||||
|
@ -205,11 +205,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;
|
||||
|
@ -235,8 +232,7 @@ 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;
|
||||
|
@ -258,8 +254,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;
|
||||
}
|
||||
|
||||
|
@ -325,13 +321,66 @@ padding: 10px 20px;
|
|||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
/* Page Title */
|
||||
.allcaps {
|
||||
text-transform: uppercase
|
||||
/* Gradients */
|
||||
.gradient-dark {
|
||||
background-color: #343a40;
|
||||
background-image: -webkit-gradient(linear, left top, right top, from(#343a40), to(#000));
|
||||
background-image: -webkit-linear-gradient(left, #343a40, #000);
|
||||
background-image: -o-linear-gradient(left, #343a40, #000);
|
||||
background-image: linear-gradient(to right, #343a40, #000);
|
||||
}
|
||||
|
||||
.center {
|
||||
margin: auto;
|
||||
width: 50%;
|
||||
padding: 10px;
|
||||
.gradient-primary {
|
||||
background-color: transparent;
|
||||
background-image: -webkit-gradient(linear, left top, right top, from(#FF7657), to(#FF6745));
|
||||
background-image: -webkit-linear-gradient(left, #FF7657, #FF6745);
|
||||
background-image: -o-linear-gradient(left, #FF7657, #FF6745);
|
||||
background-image: linear-gradient(to right, #FF7657, #FF6745);
|
||||
}
|
||||
|
||||
/*------------------------------------
|
||||
List
|
||||
------------------------------------*/
|
||||
.list-line {
|
||||
list-style: none;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.list-line li {
|
||||
position: relative;
|
||||
color: #FF6745;
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
# /bin/bash
|
||||
# This script allows for a one-liner to download and install Libretime
|
||||
# using the default settings. Assumes a clean server setup. Needs sudo.
|
||||
|
||||
git clone https://github.com/LibreTime/libretime.git
|
||||
|
||||
cd libretime
|
||||
|
||||
bash install -fiap
|
Loading…
Reference in New Issue