Merge branch 'docs'

This commit is contained in:
Kyle Robbertze 2020-07-11 15:07:55 +02:00
commit 49065b16de
1616 changed files with 70301 additions and 3280 deletions

2
.gitignore vendored
View file

@ -16,3 +16,5 @@ airtime_mvc/tests/log/*.log
.vagrant/
.DS_Store
.idea/
/docs/_site/*
/docs/.jekyll-cache/*

3
Vagrantfile vendored
View file

@ -67,6 +67,9 @@ Vagrant.configure("2") do |config|
# Provision LibreTime
config.vm.provision "install", type: "shell", inline: "cd /vagrant; ./install %s --web-port=8080" % installer_args
# Provision docs
config.vm.provision "build-site-jekyll", type: "shell", path: "docs/jekyll.sh"
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

4
docs/404.html Normal file
View file

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

68
docs/Gemfile.lock Normal file
View file

@ -0,0 +1,68 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
concurrent-ruby (1.1.6)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
ffi (1.13.1)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (1.8.3)
concurrent-ruby (~> 1.0)
jekyll (4.1.0)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.4.0)
pathutil (~> 0.9)
rouge (~> 3.0)
safe_yaml (~> 1.0)
terminal-table (~> 1.8)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.2.1)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.2.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (4.0.5)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.4)
rouge (3.20.0)
safe_yaml (1.0.5)
sassc (2.4.0)
ffi (~> 1.9)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
unicode-display_width (1.7.0)
PLATFORMS
ruby
DEPENDENCIES
jekyll (~> 4.1)
kramdown (~> 2.2, >= 2.2.1)
BUNDLED WITH
2.1.4

View file

@ -1,8 +1,24 @@
title: LibreTime Radio Automation
description: An open source radio automation server made for (and made by) low-power FM stations and the rest of us.
title: LibreTime
description: An open source radio automation server made for (and by) low-power FM stations and the rest of us.
logo: 144px.png
show_downloads: false
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
theme: jekyll-theme-minimal
layouts_dir: _layouts
data_dir: _data
data_dir: _data
includes_dir: _includes
favicon: favicon.ico
# For splash page layout only
headimage: img/header.jpg
headtext: Open Source Radio Automation
headsubtext: Everything you need to get your terrestrial / on-line radio station up and broadcasting like a pro - without breaking the bank!
# items below - only for first front page link
headbuttonurl: index#get-started
headbuttontext: Get LibreTime
# Build settings
plugins:
- kramdown

View file

@ -1,249 +0,0 @@
@font-face{
font-family:'Noto Sans';
font-weight:400;
font-style:normal;
src:url("../fonts/Noto-Sans-regular/Noto-Sans-regular.eot");
src:url("../fonts/Noto-Sans-regular/Noto-Sans-regular.eot?#iefix") format("embedded-opentype"),local("Noto Sans"),local("Noto-Sans-regular"),url("../fonts/Noto-Sans-regular/Noto-Sans-regular.woff2") format("woff2"),url("../fonts/Noto-Sans-regular/Noto-Sans-regular.woff") format("woff"),url("../fonts/Noto-Sans-regular/Noto-Sans-regular.ttf") format("truetype"),url("../fonts/Noto-Sans-regular/Noto-Sans-regular.svg#NotoSans") format("svg")
}
@font-face{
font-family:'Noto Sans';
font-weight:700;
font-style:normal;
src:url("../fonts/Noto-Sans-700/Noto-Sans-700.eot");
src:url("../fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix") format("embedded-opentype"),local("Noto Sans Bold"),local("Noto-Sans-700"),url("../fonts/Noto-Sans-700/Noto-Sans-700.woff2") format("woff2"),url("../fonts/Noto-Sans-700/Noto-Sans-700.woff") format("woff"),url("../fonts/Noto-Sans-700/Noto-Sans-700.ttf") format("truetype"),url("../fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans") format("svg")
}
@font-face{
font-family:'Noto Sans';
font-weight:400;
font-style:italic;
src:url("../fonts/Noto-Sans-italic/Noto-Sans-italic.eot");
src:url("../fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix") format("embedded-opentype"),local("Noto Sans Italic"),local("Noto-Sans-italic"),url("../fonts/Noto-Sans-italic/Noto-Sans-italic.woff2") format("woff2"),url("../fonts/Noto-Sans-italic/Noto-Sans-italic.woff") format("woff"),url("../fonts/Noto-Sans-italic/Noto-Sans-italic.ttf") format("truetype"),url("../fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans") format("svg")
}
@font-face{
font-family:'Noto Sans';
font-weight:700;
font-style:italic;
src:url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot");
src:url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix") format("embedded-opentype"),local("Noto Sans Bold Italic"),local("Noto-Sans-700italic"),url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2") format("woff2"),url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff") format("woff"),url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf") format("truetype"),url("../fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans") format("svg")
}
.highlight table td{padding:5px}
.highlight table pre{margin:0}
.highlight .cm{color:#999988;font-style:italic}
.highlight .cp{color:#999999;font-weight:bold}
.highlight .c1{color:#999988;font-style:italic}
.highlight .cs{color:#999999;font-weight:bold;font-style:italic}
.highlight .c,.highlight .cd{color:#999988;font-style:italic}
.highlight .err{color:#a61717;background-color:#e3d2d2}
.highlight .gd{color:#000000;background-color:#ffdddd}
.highlight .ge{color:#000000;font-style:italic}
.highlight .gr{color:#aa0000}
.highlight .gh{color:#999999}
.highlight .gi{color:#000000;background-color:#ddffdd}
.highlight .go{color:#888888}
.highlight .gp{color:#555555}
.highlight .gs{font-weight:bold}
.highlight .gu{color:#aaaaaa}
.highlight .gt{color:#aa0000}
.highlight .kc{color:#000000;font-weight:bold}
.highlight .kd{color:#000000;font-weight:bold}
.highlight .kn{color:#000000;font-weight:bold}
.highlight .kp{color:#000000;font-weight:bold}
.highlight .kr{color:#000000;font-weight:bold}
.highlight .kt{color:#445588;font-weight:bold}
.highlight .k,.highlight .kv{color:#000000;font-weight:bold}
.highlight .mf{color:#009999}
.highlight .mh{color:#009999}
.highlight .il{color:#009999}
.highlight .mi{color:#009999}
.highlight .mo{color:#009999}
.highlight .m,.highlight .mb,.highlight .mx{color:#009999}
.highlight .sb{color:#d14}.highlight .sc{color:#d14}
.highlight .sd{color:#d14}.highlight .s2{color:#d14}
.highlight .se{color:#d14}.highlight .sh{color:#d14}
.highlight .si{color:#d14}.highlight .sx{color:#d14}
.highlight .sr{color:#009926}.highlight .s1{color:#d14}
.highlight .ss{color:#990073}.highlight .s{color:#d14}
.highlight .na{color:#008080}.highlight .bp{color:#999999}
.highlight .nb{color:#0086B3}.highlight .nc{color:#445588;font-weight:bold}
.highlight .no{color:#008080}.highlight .nd{color:#3c5d5d;font-weight:bold}
.highlight .ni{color:#800080}.highlight .ne{color:#990000;font-weight:bold}
.highlight .nf{color:#990000;font-weight:bold}
.highlight .nl{color:#990000;font-weight:bold}
.highlight .nn{color:#555555}.highlight .nt{color:#000080}
.highlight .vc{color:#008080}.highlight .vg{color:#008080}
.highlight .vi{color:#008080}.highlight .nv{color:#008080}
.highlight .ow{color:#000000;font-weight:bold}
.highlight .o{color:#000000;font-weight:bold}
.highlight .w{color:#bbbbbb}
.highlight{background-color:#f8f8f8}
body{
background-color:#fff;
padding:50px;
font:14px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
color:#727272;
font-weight:400
}
h1,h2,h3,h4,h5,h6{
color:#222;
margin:0 0 20px
}
p,ul,ol,table,pre,dl{
margin:0 0 20px
}
h1,h2,h3{
line-height:1.1
}
h1{
font-size:28px
}
h2{
color:#393939
}
h3,h4,h5,h6{
color:#494949
}
a{
color:#E62129;
text-decoration:none
}
a:hover,a:focus{
color:#FC3617;
font-weight:bold
}
a small{
font-size:11px;
color:#F25416;
margin-top:-0.3em;
display:block
}
a:hover small{
color:#F25416
}
.wrapper{
width:860px;
margin:0 auto
}
blockquote{
border-left:1px solid #e5e5e5;
margin:0;
padding:0 0 0 20px;
font-style:italic
}
code,pre{
font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace;
color:#333
}
pre{
padding:8px 15px;
background:#f8f8f8;
border-radius:5px;
border:1px solid #e5e5e5;
overflow-x:auto
}
table{
width:100%;
border-collapse:collapse
}
th,td{
text-align:left;
padding:5px 10px;
border-bottom:1px solid #e5e5e5
}
dt{
color:#444;
font-weight:700
}
th{
color:#444
}
img{
max-width:100%
}
header{
width:270px;
float:left;
position:fixed;
-webkit-font-smoothing:subpixel-antialiased
}
header ul{
list-style:none;
height:40px;
padding:0;
background:#f4f4f4;
border-radius:5px;
border:1px solid #e0e0e0;
width:270px
}
header li{
width:89px;
float:left;
border-right:1px solid #e0e0e0;
height:40px
}
header li:first-child a{border-radius:5px 0 0 5px}
header li:last-child a{border-radius:0 5px 5px 0}
header ul a{
line-height:1;
font-size:11px;
color:#676767;
display:block;
text-align:center;
padding-top:6px;
height:34px
}
header ul a:hover,header ul a:focus{color:#675C5C;font-weight:bold}
header ul a:active{background-color:#f0f0f0}
strong{color:#222;font-weight:700}
header ul li+li+li{border-right:none;width:89px}
header ul a strong{font-size:14px;display:block;color:#222}
section{width:500px;float:right;padding-bottom:50px}
small{font-size:11px}
hr{border:0;background:#e5e5e5;height:1px;margin:0 0 20px}
footer{
width:270px;
float:left;
position:fixed;
bottom:50px;
-webkit-font-smoothing:subpixel-antialiased
}
@media print, screen and (max-width: 960px){
div.wrapper{
width:auto;
margin:0
}
header,section,footer{
float:none;
position:static;
width:auto
}
header{
padding-right:320px
}
section{
border:1px solid #e5e5e5;
border-width:1px 0;
padding:20px 0;
margin:0 0 20px
}
header a small{
display:inline
}
header ul{
position:absolute;
right:50px;
top:52px
}
}
@media print, screen and (max-width: 720px){
body{word-wrap:break-word}
header{padding:0}
header ul,header p.view{position:static}pre,code{word-wrap:normal}
}
@media print, screen and (max-width: 480px){
body{padding:15px}
header ul{width:99%}
header li,header ul li+li+li{width:33%}
}
@media print{
body{padding:0.4in;font-size:12pt;color:#444}
}

View file

@ -1,270 +0,0 @@
body {
background-color: #fff;
padding:50px;
font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
color:#595959;
font-weight:400;
}
h1, h2, h3, h4, h5, h6 {
color:#222;
margin:0 0 20px;
}
p, ul, ol, table, pre, dl {
margin:0 0 20px;
}
h1, h2, h3 {
line-height:1.1;
}
h1 {
font-size:28px;
font-weight: 500;
}
h2 {
color:#393939;
font-weight: 500;
}
h3, h4, h5, h6 {
color:#494949;
font-weight: 500;
}
a {
color:#39c;
text-decoration:none;
}
a:hover {
color:#069;
}
a small {
font-size:11px;
color:#777;
margin-top:-0.3em;
display:block;
}
a:hover small {
color:#777;
}
.wrapper {
width:860px;
margin:0 auto;
}
blockquote {
border-left:1px solid #e5e5e5;
margin:0;
padding:0 0 0 20px;
font-style:italic;
}
code, pre {
font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace;
color:#333;
}
pre {
padding:8px 15px;
background: #f8f8f8;
border-radius:5px;
border:1px solid #e5e5e5;
overflow-x: auto;
}
table {
width:100%;
border-collapse:collapse;
}
th, td {
text-align:left;
padding:5px 10px;
border-bottom:1px solid #e5e5e5;
}
dt {
color:#444;
font-weight:500;
}
th {
color:#444;
}
img {
max-width:100%;
}
header {
width:270px;
float:left;
position:fixed;
-webkit-font-smoothing:subpixel-antialiased;
}
header ul {
list-style:none;
height:40px;
padding:0;
background: #f4f4f4;
border-radius:5px;
border:1px solid #e0e0e0;
width:270px;
}
header li {
width:89px;
float:left;
border-right:1px solid #e0e0e0;
height:40px;
}
header li:first-child a {
border-radius:5px 0 0 5px;
}
header li:last-child a {
border-radius:0 5px 5px 0;
}
header ul a {
line-height:1;
font-size:11px;
color:#999;
display:block;
text-align:center;
padding-top:6px;
height:34px;
}
header ul a:hover {
color:#999;
}
header ul a:active {
background-color:#f0f0f0;
}
strong {
color:#222;
font-weight:500;
}
header ul li + li + li {
border-right:none;
width:89px;
}
header ul a strong {
font-size:14px;
display:block;
color:#222;
}
section {
width:500px;
float:right;
padding-bottom:50px;
}
small {
font-size:11px;
}
hr {
border:0;
background:#e5e5e5;
height:1px;
margin:0 0 20px;
}
footer {
width:270px;
float:left;
position:fixed;
bottom:50px;
-webkit-font-smoothing:subpixel-antialiased;
}
@media print, screen and (max-width: 960px) {
div.wrapper {
width:auto;
margin:0;
}
header, section, footer {
float:none;
position:static;
width:auto;
}
header {
padding-right:320px;
}
section {
border:1px solid #e5e5e5;
border-width:1px 0;
padding:20px 0;
margin:0 0 20px;
}
header a small {
display:inline;
}
header ul {
position:absolute;
right:50px;
top:52px;
}
}
@media print, screen and (max-width: 720px) {
body {
word-wrap:break-word;
}
header {
padding:0;
}
header ul, header p.view {
position:static;
}
pre, code {
word-wrap:normal;
}
}
@media print, screen and (max-width: 480px) {
body {
padding:15px;
}
header ul {
width:99%;
}
header li, header ul li + li + li {
width:33%;
}
}
@media print {
body {
padding:0.4in;
font-size:12pt;
color:#444;
}
}

View file

@ -1,14 +0,0 @@
pre.codehilite > code,
div.codehilite > pre {
color: #808080;
padding: 1em;
border-radius: 3px;
font-size: 110%;
font-weight: bold;
overflow: auto;
}
pre.codehilite > code.language-console > span,
div.codehilite > pre > span[style*="color: #AA22FF"] {
color: #808080 !important;
}

50
docs/_data/nav.yml Normal file
View file

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

View file

@ -1,53 +0,0 @@
sidebar:
- title: About LibreTime
subfolderitems:
- page: Features
url: features
- page: FAQ
url: faq
- page: Contribute to LibreTime
url: contribute
- page:
- title: Installation
subfolderitems:
- page: Quick Install
url: quickstart
subsubfolderitems:
- page: Host Configuration
url: host-configuration
- page: Setting the Server Time
url: setting-the-server-time
- page: Configuring Track Types
url: track-types
- page: Setting up SSL
url: ssl-config
- page:
- title: Using LibreTime
subfolderitems:
- page: Preparing Media
url: preparing-media
- page: Scheduling Shows
url: scheduling-shows
- page: Broadcasting Live
url: live-broadcast
- page: Adding Users
url: users
- page: Help!
url: troubleshooting
subsubfolderitems:
- page: More Tutorials
url: tutorials
- page:
- title: Radio Broadcasting 101
subfolderitems:
- page: UNESCO Public Radio Guide
url: learnradio-unescoguide
- page:
- title: Appendix
subfolderitems:
- page: HD Audio Modules
url: hd-audio-modules
- page: Rights and Royalties
url: rights-royalties
- page: Media Folders used by LibreTime
url: folders

31
docs/_includes/fans.html Normal file
View file

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

View file

@ -0,0 +1,8 @@
<footer>
<section class="footer-dark text-white">
<div class="text-footer">
<small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/volny">Felix Volny</a>, <a href="https://github.com/ned-kelly">ned-kelly</a> and <a href="https://github.com/zklosko">Zachary Klosko</a> &nbsp; | &nbsp;</small>
<small>Code and docs licensed under GPLv2. More details <a href="http://sourcefabric.booktype.pro/airtime-25-for-broadcasters/about-this-manual/">here</a>. </small>
</div>
</section>
</footer>

17
docs/_includes/head.html Normal file
View file

@ -0,0 +1,17 @@
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<!-- Custom fonts for this template -->
<link href="vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Merriweather:400,300,300italic,400italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
<!-- Plugin CSS -->
<link href="vendor/magnific-popup/magnific-popup.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/creative.min.css" rel="stylesheet">

View file

@ -0,0 +1,31 @@
<nav class="navbar navbar-expand-lg navbar-light fixed-top navbar-shrink" id="mainNav">
<div class="container">
<a class="navbar-brand js-scroll-trigger" href="/index">
{{ site.title }} </a>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="/install">Install</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/guides">Docs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://www.youtube.com/channel/UC-MA9GzkTb8th1YlDmF0NfA" target="_blank"><i class="fab fa-youtube"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://github.com/LibreTime/libretime" target="_blank"><i class="fab fa-github"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://discourse.libretime.org/" target="_blank"><i class="fab fa-discourse"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" href="https://chat.libretime.org/login" target="_blank"><i class="fas fa-comments"></i></a>
</li>
</ul>
</div>
</div>
</nav>

View file

@ -0,0 +1,43 @@
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
<script src="https://unpkg.com/bootstrap-table@1.16.0/dist/bootstrap-table.min.js"></script>
<!-- For Scroll to Top text; from https://getflywheel.com/layout/sticky-back-to-top-button-tutorial/ -->
<script>
// Set a variable for our button element.
const scrollToTopButton = document.getElementById('js-top');
const scrollFunc = () => {
// Get the current scroll value
let y = window.scrollY;
// If the scroll value is greater than the window height, let's add a class to the scroll-to-top button to show it!
if (y > 0) {
scrollToTopButton.className = "top-link show";
} else {
scrollToTopButton.className = "top-link hide";
}
};
window.addEventListener("scroll", scrollFunc);
const scrollToTop = () => {
// Let's set a variable for the number of pixels we are from the top of the document.
const c = document.documentElement.scrollTop || document.body.scrollTop;
// If that number is greater than 0, we'll scroll back to 0, or the top of the document.
// We'll also animate that scroll with requestAnimationFrame:
// https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame
if (c > 0) {
window.requestAnimationFrame(scrollToTop);
// ScrollTo takes an x and a y coordinate.
// Increase the '10' value to get a smoother/slower scroll!
window.scrollTo(0, c - c / 10);
}
};
// When the button is clicked, run our ScrolltoTop function above!
scrollToTopButton.onclick = function(e) {
e.preventDefault();
scrollToTop();
}
</script>

112
docs/_includes/toc.html Normal file
View file

@ -0,0 +1,112 @@
{% 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 }}

43
docs/_layouts/404.html Normal file
View file

@ -0,0 +1,43 @@
<!doctype html>
<html lang="en">
<head>
{% include head.html %}
<style type="text/css" media="screen">
h1 {
margin: 30px 0;
font-size: 4em;
line-height: 1;
letter-spacing: -1px;
}
img {
max-width: 250px;
}
.center-text {
text-align: center;
}
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body id="page-top">
<!-- Navigation -->
{% include navbar.html %}
<div class="container-fluid">
<section class="bg-dark text-white center-text">
<img src="img/404.png" alt="404 Tape">
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
<a href="guides"><svg class="bi bi-arrow-left-circle-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-7.646 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L6.207 7.5H11a.5.5 0 0 1 0 1H6.207l2.147 2.146z"/>
</svg> Back to Docs
</a>
</section>
</div>
{% include footer.html %}
{% include scripts.html %}
</body>
</html>

View file

@ -1,113 +1,78 @@
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
{% seo %}
<link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->
{% include head.html %}
<style>
header{
width:270px;
float:left;
position:static;
-webkit-font-smoothing:subpixel-antialiased
}
footer{
width:270px;
float:left;
position:static;
bottom:50px;
-webkit-font-smoothing:subpixel-antialiased
}
a{
color:#E62129;
text-decoration:none
}
a:hover,a:focus{
color:#FC3617;
font-weight:bold
}
a small{
font-size:11px;
color:#F25416;
margin-top:-0.3em;
display:block
}
a:hover small{
color:#F25416
}
</style>
<title>{{ site.title }} - {{ page.title }}</title>
</head>
<body>
<div class="wrapper">
<header>
<h1><a href="{{ "/" | absolute_url }}">{{ site.title | default: site.github.repository_name }}</a></h1>
{% if site.logo %}
<img src="{{site.logo | relative_url}}" alt="Logo" />
{% endif %}
<body id="page-top">
<p>{{ site.description | default: site.github.project_tagline }}</p>
{% if site.github.is_project_page %}
<p class="view"><a href="{{ site.github.repository_url }}">View the Project on GitHub <small>{{ site.github.repository_nwo }}</small></a></p>
{% endif %}
{% if site.github.is_user_page %}
<p class="view"><a href="{{ site.github.owner_url }}">View My GitHub Profile</a></p>
{% endif %}
{% if site.show_downloads %}
<ul class="downloads">
<li><a href="{{ site.github.zip_url }}">Download <strong>ZIP File</strong></a></li>
<li><a href="{{ site.github.tar_url }}">Download <strong>TAR Ball</strong></a></li>
<li><a href="{{ site.github.repository_url }}">View On <strong>GitHub</strong></a></li>
</ul>
{% endif %}
<div>
{% for item in site.data.navigation.sidebar %}
<br><strong>{{ item.title }}</strong>
{% if item.subfolderitems[0] %}
{% for entry in item.subfolderitems %}
<br><a href="{{ entry.url }}">{{ entry.page }}</a>
{% if entry.subsubfolderitems[0] %}
{% for subentry in entry.subsubfolderitems %}
<br> &nbsp; -- <a href="{{ subentry.url }}">{{ subentry.page }}</a>
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
<!-- Navigation -->
{% include navbar.html %}
<!-- Scroll to Top link -->
<a class="top-link hide" href="" id="js-top">
<svg class="bi bi-arrow-up-circle-fill" width="4em" height="4em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-10.646.354a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 6.207V11a.5.5 0 0 1-1 0V6.207L5.354 8.354z"/>
</svg>
<span class="screen-reader-text">Back to top</span>
</a>
<div class="container">
<div class="row bg-dark text-white">
<div class="col">
<br>
<a href="guides"><svg class="bi bi-arrow-left-circle-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-7.646 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L6.207 7.5H11a.5.5 0 0 1 0 1H6.207l2.147 2.146z"/>
</svg> Back
</a>
<br>
<p></p>
</div>
</header>
<section>
{{ content }}
</section>
<footer>
<br>
<p><small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/orderedlist">orderedlist</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>
<div class="col white-text center text-footer">
<h5 class="allcaps">{{ page.title }}</h5>
</div>
<div class="col white-text center text-footer">
</div>
</div>
</div>
<script src="{{ "/assets/js/scale.fix.js" | relative_url }}"></script>
{% if site.google_analytics %}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', '{{ site.google_analytics }}', 'auto');
ga('send', 'pageview');
</script>
{% endif %}
<div class="container">
<div class="row no-gutters">
<div class="col-9">
<div class="d-block d-sm-none d-sm-block d-md-block d-lg-none">
<hr class="my-4">
<div class="text-footer">
<h5 class="allcaps">Contents</h5>
</div>
<div class="toc" >{% include toc.html html=content class=toc %}</div>
<hr class="my-4">
</div>
<nav class="content">
{{ content }}
<p></p>
{% if page.git %}
<a href="https://github.com/LibreTime/libretime/edit/master/docs/{{page.git}}" target="_blank">
<i class="far fa-edit"></i> Edit on Github
</a>
{% endif %}
</nav>
</div>
<div class="col d-none d-sm-none d-md-none d-lg-block">
<hr class="my-4">
<div class="text-footer">
<h5 class="allcaps">Contents</h5>
</div>
<div class="toc" >{% include toc.html html=content class=toc %}</div>
<hr class="my-4">
</div>
</div>
</div>
{% include footer.html %}
{% include scripts.html %}
</body>
</html>

137
docs/_layouts/guides.html Normal file
View file

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

245
docs/_layouts/splash.html Normal file
View file

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

View file

@ -1,9 +1,50 @@
Exporting the schedule
----------------------
---
layout: default
title: Analytics
git: analytics.md
---
## History {#history}
On the History menu, the **Playout History** page enables you to view a list of files played within a specific date and time range. This page is designed to help your station prepare reports for music royalty collection societies and regulatory agencies.
Search results can be copied to the clipboard using the **Copy** button, exported as data in **CSV** format (comma separated values), exported as a document in **PDF** format, or displayed in a printer-friendly format using the **Print** button. (Your web browser must have an Adobe Flash plugin installed for these buttons to appear). Press the **Esc** key to return to the LibreTime interface once the print job is complete.
This page has three tabs: **Log Sheet**, **File Summary** and **Show Summary**. On any of these tabs, you can select a date and time range by clicking the calendar and clock icons in the upper left corner of the page. Then click the search button, which has a magnifying glass icon, to the right. A list of files played during that date and time range will appear further down the page.
![](img/log-sheet.png)
In the **Log Sheet** tab, the playout history is sorted by **Start Time** and **End Time** by default.
The number of times each file was played and the length of the files are shown in the **File Summary** tab. To make optimal use of this feature for royalty reporting purposes, music files must be tagged with **Composer** and **Copyright** metadata. The artist performing a piece of music may not be the original composer of the work, or the copyright holder of the sound recording.
On the **Show Summary** tab, click the name of a show within the search range to expand its row and see its playout details.
### Manual logging
If your station features playout from analogue sources such as turntables or microphones, there is no automatic metadata for LibreTime to collect from these inputs. To ensure that the playout history is complete, you can add log entries manually by clicking the **+ Create Entry** button. This action opens a pop-up window with default fields of Start Time, End Time, Title and Creator. Click the **Find** button to automatically fill the **Choose Show Instance** menu with the names of shows that took place within the specified time range. Then click the **Save** button to enter the new item into the playout history.
Log entries can also be manually deleted, using the button with the trashcan icon, to the right of the **+ Create Entry** button. Pages of entries can be selected for deletion using the **Select** drop-down menu.
## History Templates
![](img/history-templates.png)
The **History Templates** page on the History menu enables you to prepare reports with the exact content required by regulatory agencies in the territories that you are broadcasting to. You can begin creating a custom template by clicking the button **New Log Sheet Template** or the button **New File Summary Template**.
![](img/new-hist-temp.png)
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.
When the template is in the format you require, click the **Save** button, and **Set Default Template** if you wish. The new template will now be listed on the History Templates page. If you have set a new default template, any changes will be visible on the tabs of the Playout History page.
## Exporting the schedule {#exporting}
LibreTime has a feature which enables your station's show and schedule information to be displayed on remote websites. This feature is included in LibreTime because you would not usually invite the general public to access your LibreTime server directly. If you had very large numbers of people requesting data from the LibreTime server at once, the burst of network traffic might overload the server, potentially disrupting your broadcasts. If carried out maliciously, this network overload is known as a *denial of service attack*.
Instead, your public-facing web server can retrieve the schedule information from the LibreTime API. This information can then be displayed on your broadcast station or affiliate websites by a content management system, such as Sourcefabric's **Newscoop** (<http://newscoop.sourcefabric.org/>). It can be presented using Javascript widgets and styled with CSS, in any format that you require. The **Broadcaster** theme for Newscoop (<https://github.com/newscoop/theme-Broadcaster>) integrates these widgets with ready-to-use styles.
Instead, your public-facing web server can retrieve the schedule information from the LibreTime API. It can be presented using Javascript widgets and styled with CSS, in any format that you require.
There are two kinds of information that can be retrieved remotely from the LibreTime API without authentication; the metadata for the current show plus the following show (live-info), or the schedule for the current week and the week ahead (week-info). The week-info metadata includes show names, times, and individual show URLs on your public website. That way, the audience for your station can click through from the schedule information to find out more about a particular show, or download a previous show recording that you might have made available.
@ -131,10 +172,7 @@ In this case, the metadata returned would be in a different format from the abov
If you see the message *You are not allowed to access this resource* when attempting to display schedule information in your web browser, log in to the LibreTime administration interface, click *System* in the main menu, then *Preferences*. Set **Allow Remote Websites To Access "Schedule" Info?** to **Enabled**, click the **Save** button, then refresh the browser window opened on the schedule export URL. If you do not wish to make schedule information available to the public, set this option to **Disabled** instead.
![](img/Screenshot497-System_preferences_240.png)
Caching schedule information
----------------------------
### Caching schedule information
If the LibreTime server is behind a firewall, or you want to protect the LibreTime server from large numbers of schedule requests, you may wish to cache the schedule information on a public-facing or intermediate server. You can then create a firewall rule that only allows the schedule server to connect to the LibreTime server, in addition to any remote users of the LibreTime web interface.
@ -225,8 +263,7 @@ containing the line:
The schedule server will now be serving the same show information as the LibreTime server, with a cache lifetime of one minute. You can adjust the cache lifetime by altering the frequency of the cron job that polls the LibreTime server.
Pushing schedule information via FTP or SSH
-------------------------------------------
### Pushing schedule information via FTP or SSH
If there is no inbound access to the LibreTime server at all, an FTP script can be used to push cached schedule data from LibreTime to an external web server. The standard ftp command should be available on the LibreTime server and the external web server should have a suitably restricted FTP account set up. After following steps 1 and 2 above to export schedule data to a pair of temporary files on the LibreTime server, create a new script on the LibreTime server to automatically make the upload:
@ -250,4 +287,18 @@ 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.
If you have secure shell access (SSH) to the remote web server, you could write a script to use the secure copy command (scp) instead of ftp.
---
## Streaming Listener Statistics
The Listener Stats page on the Analytics menu shows graphs of listener connections to the configured streaming servers for the selected date and time range.  On the right side, a green **Status** indicator shows **OK** if the connection to the streaming server is active.
![](img/portfolio/stream-stats.jpg)
If the status indicator is red, check that the **Admin User** and **Admin Password** settings are correct under **Additional Options** for the named mount point, such as *libretime\_128*, on the **Streams** page of the **Settings** menu.
By default, statistics for the last 24 hours of streaming are shown. To change this date and time range, click the calendar and clock icons in the lower left corner of the page, then click the magnifying glass icon.
> To choose which particular streams should have statistics displayed, click the check boxes for the individual colour-coded mount points, just below the graph.

View file

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

View file

@ -1,106 +0,0 @@
# How to Setup Genre based AutoDJ
* YouTube video
[![How to Setup Genre based AutoDJ](http://img.youtube.com/vi/XNVIDnczrOk/0.jpg)](https://www.youtube-nocookie.com/embed/XNVIDnczrOk "How to Setup Genre based AutoDJ")
## Text-based Step-by-step
In this tutorial we will focus on how to build a traditional auto DJ system
where we use a feature called smart blocks and auto loading playlists to play
random music tracks of a certain genre during a show. This tutorial is
primarily focused on program managers but users who are DJs can also benefit
from smart blocks but will only be able to manually schedule them.
So for the purposes of this tutorial we are going to assume that you
have uploaded a number of files of music with the genre metadata all
matching a specific genre, for instance, Alternative. This can be done
ahead of time, but LibreTime has no way of automatically grouping sub
genres and so it is important that you spend some time curating the
track metadata before you upload it to LibreTime as there is not
currently a way to bulk edit tracks from inside LibreTime. Also once
tracks are uploaded the metadata of the track itself isnt changed but
just how it is represented in the LibreTime database. This might change
in the future but would only affect you if you were downloading tracks
and uploading them to another instance and hoped that the changes you
made were saved.
So we can bulk upload a number of creative commons licensed tracks that
have their genre all set to specific genres as one way of getting tracks
if you dont have a mp3 collection of your own to draw from. See links
below for some spots where you can procure tracks where the creators
gave permission for everyone to redistribute play and share them.
One the tracks are uploaded to the system and imported we can now create
a smartblock that will select the tracks that match a certain genre. For
this we will use Genre contains Jazz this will match any track that
has genre anywhere in its genre so big band jazz and swing jazz
would match as well as acid jazz. Any subgenre that doesnt include
jazz explicitly such as be bop would need to be added as a new
modifier.
For the purposes of this smart block we want to select 4 random items.
We also want to avoid really long tracks that are longer than 10
minutes. So we will add the modifier Length is less than 00:10:00
and now this smart block will pull 4 smart blocks. Be sure to preview it
to make sure that you have some matches in your library. This will also
save it.
Now we are going to create a new smart block that plays one promo or
station ID.
Click smartblock and new and then type in the name promo OR ID and then
change the criteria Genre to is promo and now click new modifier and
then is TOTHID.
And then change limit to 1 items.
Now we are going to create a playlist that contains these two smart
blocks.
Click new and then type Jazz with promos
and then click smartblocks and add the Jazz Songs followed by the Promo
or ID smart block.
Now this playlist can be dragged into a schedule show to add 3 random
jazz songs followed by a promo. You can manually repeat the selection in
the playlist to create a long auto DJ playlist. For instance lets add 3
more Jazz Songs and then add 3 Jazz Songs again followed by a Promo or
ID. Now lets save this playlist and go and add it to a scheduled show.
This is a quick and easy way for you to manually schedule a large chunk
of time. You can also use this as an autoloading playlist.
Lets assign this to a new 3 hour show. Called lots of Jazz. Now lets go
under Autoloading Playlist and enable that and in this spot we will
check repeat until full. This will mean that the system will keep
scheduling this playlist until the show is completely full. The only
problem here is that at the end of the show it is almost assured that a
track will be cut off. If you are a web station and you just want to
schedule music for long lengths of time you can schedule shows that are
up to 24 hours long.
On the other hand if you are an FCC licensed station you are required to
have top of the hour IDs as close as possible to the top of the hour. In
this case the random selection of tracks might not suffice for
compliance.
If you have a station ID playlist smartblock in your intro playlist (see
previous tutorial linked below) and you have your tracks broken up
hourly this shouldnt be an issue but it still might result in tracks
being cut of in the middle.
So the best option currently is to change the music tracks to fill the
remaining show from the previous selection of 3 items. And then be sure
to add a promos or musical sound bridges at the end that are also time
remaining but allow overfill.
It is possible that we could improve the way the autoloading playlists
work in the future, please check out LibreTime.org for the latest
release notes and feel free to ask any questions at our forum at
[https://discourse.LibreTime.org](https://discourse.LibreTime.org/)
Thanks for tuning in to another LibreTime tutorial. Our next tutorial
will show you how to use autoloading playlists to add show specific
underwriting or advertisements.

View file

@ -1,5 +1,10 @@
Backing up the server
--------------------
---
layout: default
title: Backing Up The Server
git: backing-up-the-server.md
---
## Database Backup
The following shell commands can be used for database backup and restore on a
running *PostgreSQL* server in an LibreTime system.
@ -46,8 +51,7 @@ which is backed up by your storage backup tool of choice; for example, the
restore can be made along with a matching and complete version of the LibreTime
database from the day that the storage backup was made. 
Storage backup
--------------
## Storage backup
Backing up the LibreTime database with **pg\_dumpall** will not back up the
LibreTime media storage server, which is likely to need a great deal more backup
@ -63,12 +67,10 @@ the backup server also contains an LibreTime installation, it should be possible
to switch playout to this second machine relatively quickly, in case of a
hardware failure or other emergency on the production server.
A standard incremental backup tool on GNU/Linux servers is *rsync*
[(http://rsync.samba.org/)](http://rsync.samba.org/)) which can be installed
A standard incremental backup tool on GNU/Linux servers is [rsync](http://rsync.samba.org/) which can be installed
using the package manager of your GNU/Linux distribution. However, incremental
backup alone cannot help in the scenario where a file which later proves to be
important has been deleted by an administrator. For backups that can be rolled
back to restore from an earlier date than the current backup, the tool
*rdiff-backup*
[(http://www.nongnu.org/rdiff-backup/](http://www.nongnu.org/rdiff-backup/)) can
[rdiff-backup](http://www.nongnu.org/rdiff-backup/) can
be deployed.  

View file

@ -1,39 +0,0 @@
# How to Build Your Schedule
* YouTube video
[![Build Station Schedule](http://img.youtube.com/vi/EfNhl-yQcn8/0.jpg)](https://www.youtube-nocookie.com/embed/EfNhl-yQcn8 "How to build your schedule")
## Step-by-step Text Based
A description of the steps involved in adding a show to the LibreTime calendar
schedule for future playback including repeating shows
**Audience**: Program Managers and Admins
1. Click on the Calendar menu item on the left side of the screen
1. Click on the blue New Show button
1. Under **What** - type in a Name to replace Untitled Show
1. Optional add URL, Genre and Description
1. Under **When** click **In The Future**
1. Select a date and time for the **Start Time** and **End Time**
1. Time is entered as 00:00 where the first 2 digits are the hour in 24 hour
time and the second 2 digits are the minutes. So 15:00 is 3PM. *Note: 24 hours
is the maximum show time and Midnight is 00:00 of the next date.*
1. Click **Repeats** if this show will air more than once.
1. If it airs at the same time of the day on more than one day of the week then
check the boxes next to the Days it should repeat on.
1. If this is a limited engagement show uncheck **No End?** and select the date
at which this show should no longer be on the schedule.
* **Autoloading Playlist** is used if you will generate the content for this
show using a playlist possibly containing smartblocks to dynamically generate
it. Ihf this is checked and a playlist is selected, LibreTime will schedule it
an hour before the show is set to air as well as any **Intro & Outro Playlist**
configured in the Admin settings. See other How Tos for ideas about how to use Autoloading playlists.
1. **Live Stream Input** contains the streaming information for DJs and if
**Use LibreTime Authentication** is checked then DJs can login to stream live
if they are added to the **Who** section.
1. **Who** is where you can give DJ users permission to schedule tracks for
this show and stream live during the show spot. You can check the box
next to them or type their name and click the drop down.
1. **Style** allows you to select a custom color and add a show Logo for this
show.

View file

@ -1,145 +0,0 @@
---
sidebar: mainmenus
---
# 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.
![](img/Screenshot451-Calendar.png)
In the top left corner of the page, you can go back or forward through the **Calendar** by clicking on the buttons which have a small grey triangle in a white circle. Click the **today** button to jump to today's date in the current view. (The **today** button will be greyed out if you are already viewing that date). In the **day** or **week** views, there is also a drop-down menu which allows you to set the resolution displayed for the calendar, ranging from one minute per row to sixty minutes per row.
![](img/Screenshot452-Calendar_resolution.png)
Adding a show
-------------
Only *Admins* and *Program Managers* can use this feature. To add a new show to the Calendar, click the **+ New Show** button in the top left corner of the page, or click on any future row or box in the Calendar which is empty. Either of these actions opens the **Add this show** box, which has seven sections, arranged vertically: **What**, **Autoloading Playlist**, **When**, **Live Stream Input**, **Record & Rebroadcast**, **Who**, and **Style**. Click the small orange triangle to the left of the section name if you wish to minimize or maximize it.
What
----
In the **What** box, enter the **Name**, public website **URL**, **Genre** and **Description** for the show that you are creating.
![](img/Screenshot453-Show_what.png)
Autoloading Playlist
------------------
In this section, you can select a playlist that will be used for this show. The playlist must already be defined in your library. **Auto Schedule Playlist** needs to be checked for **Select Playlist** and **Repeat AutoPlaylist Until Show is Full** to be visible.
![](img/Screenshot454-Show_playlist.png)
When
----
Next, in the **When** section, if you clicked on a date in the **Calendar** this should already be entered in the **Date/Time Start** field. To set another date for the show, click on the date in the **Date/Time Start** field and select the date that you require from the small pop-up calendar which will appear. Click on the adjacent time field to set the start time for the show, with the pop-up **Hour** and **Minute** box. The Minute values in the pop-up time boxes are rounded to the nearest five minutes. You can also adjust the times manually by clicking into the fields and typing. Repeat the process to set the **Date/Time End** fields. The **Start Time** can be **Now** or **In the Future**. A show that starts now, will start at the time save is pressed, while a future show will start at the time set. The **Duration** of the show will be displayed automatically, based on the start and end times you have set.
By default, the **Timezone** of the show start and end times will be the timezone of the station, as set on the Preferences page on the System menu. You can specify an alternative time zone using the drop-down menu, if you wish. The time zone displayed in the Calendar when you log in depends on your personal settings. See 'Updating your own account' in the chapter *Users* for more details.
![](img/Screenshot526-Add_show_when_250.png)
LibreTime will only allow you to enter valid times for shows. If you attempt to schedule show times which would be impossible, by ending the show before it begins, LibreTime will highlight the error with a pink background.
![](img/Screenshot527-negative_time250.png)
To schedule a regular show, check the **Repeats?** box, which will make a new section of the dialog appear. Optionally, click the **Link:** box to automatically schedule the same content in the repeated shows as in the original show.
![](img/Screenshot528-Link_shows_250.png)
Then select either **weekly**, **every 2 weeks**, **every 3 weeks**, **every 4 weeks** or **monthly** from the **Repeat Type** drop-down menu. If you have selected a weekly option, check the boxes for the days of the week that you want to schedule the regular show on. If you have selected **monthly**, you have the option to **Repeat By: day of the month** (for example the 9th of each month) or **day of the week** (for example the second Wednesday of each month).
![](img/Screenshot529-repeat_type_monthly_250.png)
Uncheck the **No End?** box and set the **Date End** for the regular show to finish, or leave the **No End?** box checked to schedule the show indefinitely.
![](img/Screenshot530-show_end_date_250.png)
Live Stream Input
-----------------
The **Live Stream Input** section can be used to enable live input streams during the show, and also to configure authentication for them. If you check the **Use LibreTime Authentication** box, the DJs (presenters) of the show will be able to connect a live stream to LibreTime's **Show Source Mount Point** using their login name and password. See the chapter *Stream Settings* for details.
If you check the **Use Custom Authentication** box instead, you can set a one-time username and password pair for live stream input to the show. For example, you may wish to create an authenticated live stream input for a particular remote news reporter, without providing any further access to your LibreTime server for that person.
![](img/Screenshot457-Live_stream_input.png)
A reminder of the connection **Host**, **Port** and **Mount** for the live input stream to use is shown at the end of the **Live Stream Input** section.
Record & Rebroadcast
--------------------
The **Record & Rebroadcast** section is currently not working, and so has been removed from the web interface. If this feature is important to you, please search for relevant issues in the [LibreTime github repository](https://github.com/LibreTime/libretime/search?q=record&type=Issues) and help us make it happen!
Who
---
In the **Who** section, type the first few letters of the name of the show's DJ (presenter) in the **Search Users** field to select a name from the LibreTime database, or check one of the **DJs** boxes in the vertical list below. This association of a DJ name with a particular show enables that presenter to add playout media to the show, and also to connect a live Show Source input stream (if that has been enabled), so it is important to get the DJ's name right.
![](img/Screenshot161-Show_users.png)
Style
-----
Show colours in the Calendar are set automatically, based on the **Name** of the show, so that individual shows can be easily identified in the **Calendar**. If you wish, you can select a **Background Colour** and **Text Colour** manually by clicking the boxes in the **Style** section. Click the coloured circle icon in the lower right corner to close this pop-up window.
![](img/Screenshot162-Show_colours.png) 
Optionally, you can upload a Show Logo by clicking the **Browse** button.
![](img/Screenshot584-Show_logo.png)
Finally, click the **Add this show** button at the top or bottom of the box. The new show will now be displayed in the **Calendar**, with a regular slot if you have chosen to schedule one. 
Editing a show
--------------
Show configuration and metadata can be changed at any time, except for **Date/Time Start** and **Record from Line In?** options, which are fixed after broadcast of that show commences. Click the show in the Calendar, and select **Edit Show** from the pop-up context menu. This opens the **Update Show** box, which is almost exactly the same as the **Add this Show** box. Click the **+ Update show** button at the top or bottom of the box when you are done.
![](img/Screenshot459-Update_show.png)
Episodes of repeating shows also have an **Instance Description** field in which you can add details for that particular episode. Click the episode in the Calendar, click **Edit** on the pop-up menu, then click **Edit this instance**. After entering an Instance Description, click the **+ Update show** button.
![](img/Screenshot583-Show_instance_description_vC9ooiT.png)
Alternatively, individual shows can be clicked on and dragged to new days and times in the calendar. However, LibreTime will not allow you to drag a future show into the past, or drag and drop instances of a repeated show. In the **Day** and **Week** views, show length can be adjusted by clicking on the lower edge of the show box, and dragging the edge of the box upwards or downwards. The new show length is calculated automatically.
Adding content to a show
------------------------
To add content to a show, click the show in any view on the Calendar, and select **Schedule Tracks** from the pop-up menu. Shows that do not yet contain any scheduled content are marked with a red exclamation mark icon, to the right of the show start and end times in the top bar. Shows partially filled with content have a yellow exclamation mark icon. During playout of the show, a green play icon will also be shown in the top bar.
![](img/Screenshot488-Add_remove_content.png)
The **Schedule Tracks** action opens a window with the name of the show. Like when using the **Now Playing** page, you can search for content items and add them to the show schedule on the right side of the page. Refer to the *Now Playing* chapter for details.
When your show has all the required content, click the **OK** button in the bottom right corner to close the window. Back in the **Calendar**, click the show and select **View** from the pop-up menu to view a list of content now included in the show.
![](img/Screenshot489-Show_Content.png)
The **Contents of Show** window is a read-only interface featuring an orange bar which indicates how much media has been added to the show. Click the **OK** button in the bottom right corner, or the white **x** icon in the top right corner, to close the window.
![](img/Screenshot353-Contents_of_show.png)
Removing content from a show
----------------------------
To remove an individual item from a show, click on the show in the **Calendar**, and select **Schedule Tracks** from the pop-up menu. In the window which opens, click any item you wish to remove from the show, then click **Delete** on the pop-up menu, or check the box in the item's row then click the **Remove** icon at the top of the table. To remove all files and playlists from a show, click on the show in the **Calendar**, and select **Clear Show** from the pop-up menu. 
Deleting an upcoming show
---------------------------
To delete an upcoming instance of a repeating show, click on the show in the **Calendar**, and select **Delete**, then **Delete Instance** from the pop-up menu. If you wish to delete all future instances of a repeating show, select **Delete Instance and All Following** from the pop-up menu.
![](img/Screenshot490-Delete_this_instance.png)
You cannot delete or remove content from shows that have already played out. These shows have only one option on the pop-up menu, which is **View**.
Cancelling playout
------------------
If you wish to cancel playout of a show while it is running, click on the show in the **Calendar** and select **Cancel Show** from the pop-up menu. LibreTime will ask you if you are sure about this action, as it cannot be undone.
![](img/Screenshot357-Cancel_current_show.png)

View file

@ -1,8 +1,11 @@
# How to Contribute to the LibreTime Project
---
layout: default
title: Contributing to LibreTime
git: contribute.md
---
LibreTime is a community project, maintained by an awesome group of volunteers. Being a "free as in freedom" project,
we need the help of our users to keep the project going. You don't have to know how to write code in order to help.
Check out some of ways you can give back to the LibreTime project below.
> LibreTime is a fork of AirTime due to stalled development of the FLOSS version. For background on this,
see this [open letter to the Airtime community](https://gist.github.com/hairmare/8c03b69c9accc90cfe31fd7e77c3b07d).
## Bug reporting
@ -21,6 +24,15 @@ Have an idea that would make LibreTime even better than it is right now? Start a
LibreTime can run in over 15 different languages due to the gracious help of our volunteers. Is your language not
supported? Follow [this guide](interface-localization) to add your language to LibreTime!
## Help write documentation for LibreTime
Our site is now run by Jekyll. After cloning our repo locally, enter the `/docs` directory and run
```
bundle install
jekyll serve
```
## Help write code for LibreTime
Are you familar with coding in PHP? Have you made projects in Liquidsoap and some of the other services we use?

336
docs/css/creative.min.css vendored Executable file
View file

@ -0,0 +1,336 @@
/*!
* Start Bootstrap - Libretime v1.0.0 ()
* Copyright 2013-2018
* Licensed under MIT (https://github.com/BlackrockDigital/libretime-website/blob/master/LICENSE)
*/
body,html{
width:100%;height:100%
}
body{
font-family:Merriweather,'Helvetica Neue',Arial,sans-serif;
padding-top: 57px;
}
hr{
max-width:50px;border-width:3px;border-color:#f05f40
}
hr.light{
border-color:#fff
}
img{
width:100%;
max-width: 600px;
}
a{
color:#f05f40;
-webkit-transition:all .2s;
transition:all .2s;
}
a:hover{
color:#f05f40
}
h1,h2,h3,h4,h5,h6{
font-family:'Open Sans','Helvetica Neue',Arial,sans-serif;
}
/* Correcting overscroll on TOC links */
:target{
padding-top: 57px;
}
/* Table Properties */
table{
padding: 20px;
}
th{
background-color: #f05f40;
text-align: center;
color: white;
}
tr, td{
padding: 15px;
text-align: left;
border-bottom: 1px solid #f05f40
}
/* Theme Colors */
.bg-primary{
background-color:#f05f40!important
}
.bg-dark{
background-color:#212529!important
}
.footer-dark{
background-color:#212529!important;
padding:2rem 0
}
.text-faded{
color:rgba(255,255,255,.9)
}
div.text-footer{
text-align: center;
}
section{padding:8rem 0}
.section-heading{margin-top:0}
::-moz-selection{color:#fff;background:#212529;text-shadow:none}
::selection{color:#fff;background:#212529;text-shadow:none}
img::-moz-selection{color:#fff;background:0 0}
img::selection{color:#fff;background:0 0}
img::-moz-selection{color:#fff;background:0 0}
#mainNav{
border-bottom:1px solid rgba(33,37,41,.1);background-color:#fff;font-family:'Open Sans','Helvetica Neue',Arial,sans-serif;-webkit-transition:all .2s;transition:all .2s
}
#mainNav .navbar-brand{
font-weight:700;
text-transform:uppercase;
color:#f05f40;
font-family:'Open Sans','Helvetica Neue',Arial,sans-serif
}
#mainNav .navbar-brand:focus,
#mainNav .navbar-brand:hover{color:#f05f40}
#mainNav .navbar-nav>li.nav-item>a.nav-link,
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus{
font-size:.9rem;font-weight:700;text-transform:uppercase;color:#212529
}
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus:hover,
#mainNav .navbar-nav>li.nav-item>a.nav-link:hover{color:#f05f40}
#mainNav .navbar-nav>li.nav-item>a.nav-link.active,
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus.active{color:#f05f40!important;background-color:transparent}
#mainNav .navbar-nav>li.nav-item>a.nav-link.active:hover,
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus.active:hover{background-color:transparent}
@media (min-width:992px){
#mainNav{border-color:transparent;background-color:transparent
}
#mainNav .navbar-brand{color:rgba(255,255,255,.7)}
#mainNav .navbar-brand:focus,#mainNav .navbar-brand:hover{color:#fff}
#mainNav .navbar-nav>li.nav-item>a.nav-link{padding:.5rem 1rem}
#mainNav .navbar-nav>li.nav-item>a.nav-link,
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus{color:rgba(255,255,255,.7)}
#mainNav .navbar-nav>li.nav-item>a.nav-link:focus:hover,
#mainNav .navbar-nav>li.nav-item>a.nav-link:hover{color:#fff}
#mainNav.navbar-shrink{border-bottom:1px solid rgba(33,37,41,.1);background-color:#fff}
#mainNav.navbar-shrink .navbar-brand{color:#f05f40}
#mainNav.navbar-shrink .navbar-brand:focus,
#mainNav.navbar-shrink .navbar-brand:hover{color:#f05f40}
#mainNav.navbar-shrink .navbar-nav>li.nav-item>a.nav-link,
#mainNav.navbar-shrink .navbar-nav>li.nav-item>a.nav-link:focus{color:#212529}
#mainNav.navbar-shrink .navbar-nav>li.nav-item>a.nav-link:focus:hover,
#mainNav.navbar-shrink .navbar-nav>li.nav-item>a.nav-link:hover{color:#f05f40}}
header.masthead{
padding-top:10rem;padding-bottom:calc(10rem - 56px);
background-image:url(../img/header.jpg);
background-position:center center;
background-size:cover
}
header.masthead hr{
margin-top:30px;
margin-bottom:30px
}
header.masthead h1{font-size:2rem}
header.masthead p{font-weight:300}
@media (min-width:768px){
header.masthead p{font-size:1.15rem}
}
@media (min-width:992px){
header.masthead{
height:100vh;min-height:650px;padding-top:0;padding-bottom:0
}
header.masthead h1{font-size:3rem}
}
@media (min-width:1200px){
header.masthead h1{font-size:4rem}
}
.service-box{max-width:400px}
.portfolio-box{position:relative;display:block;max-width:650px;margin:0 auto}
.portfolio-box .portfolio-box-caption{
position:absolute;bottom:0;display:block;width:100%;height:100%;text-align:center;opacity:0;color:#fff;background:rgba(240,95,64,.9);-webkit-transition:all .2s;transition:all .2s
}
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content{
position:absolute;top:50%;width:100%;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center
}
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category,.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{
padding:0 15px;font-family:'Open Sans','Helvetica Neue',Arial,sans-serif
}
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category{
font-size:14px;font-weight:600;text-transform:uppercase
}
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{font-size:18px}.portfolio-box:hover .portfolio-box-caption{opacity:1}.portfolio-box:focus{outline:0}
@media (min-width:768px){
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-category{font-size:16px}
.portfolio-box .portfolio-box-caption .portfolio-box-caption-content .project-name{font-size:22px}
}
.text-primary{color:#f05f40!important}
.btn{
font-weight:700;text-transform:uppercase;border:none;border-radius:300px;font-family:'Open Sans','Helvetica Neue',Arial,sans-serif
}
.btn-xl{padding:1rem 2rem}
.btn-primary{background-color:#f05f40;border-color:#f05f40}
.btn-primary:active,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#ee4b28!important}
.btn-primary:active,.btn-primary:focus{
-webkit-box-shadow:0 0 0 .2rem rgba(240,95,64,.5)!important;box-shadow:0 0 0 .2rem rgba(240,95,64,.5)!important
}
.btn-outline-full-width{border:1px solid #888;margin:5px;width:100%}
/* Blockquotes */
blockquote {
border: 1px solid #212529;
border-left: 10px solid #f05f40;
border-radius: 0px;
background: #212529;
color: white;
font-size: .9rem;
margin: 10px;
padding: 10px 20px;
}
blockquote p {
margin: 0;
line-height: 30px;
padding-bottom: 20px;
}
blockquote .small {
display: block;
font-size: 80%;
color: brown;
text-align: right;
}
/* Code Blocks */
code {
color: #f05f40;
font-size: .9rem;
}
pre.highlight {
border: 1px solid #212529;
border-left: 10px solid #212529;
background: white;
color: black;
font-size: .9rem;
margin: 10px;
padding: 10px 20px;
}
/* Scroll to Top */
.top-link {
transition: all .25s ease-in-out;
position: fixed;
bottom: 0;
right: 0;
display: inline-flex;
cursor: pointer;
align-items: center;
justify-content: center;
margin: 0 3em 3em 0;
border-radius: 50%;
padding: .25em;
width: 80px;
height: 80px;
background-color: #F8F8F8;
}
.show {
visibility: visible;
opacity: 1;
}
.hide {
visibility: hidden;
opacity: 0;
}
.screen-reader-text {
position: absolute;
clip-path: inset(50%);
margin: -1px;
border: 0;
padding: 0;
width: 1px;
height: 1px;
overflow: hidden;
word-wrap: normal !important;
clip: rect(1px, 1px, 1px, 1px);
&:focus {
display: block;
top: 5px;
left: 5px;
z-index: 100000;
clip-path: none;
background-color: #eee;
padding: 15px 23px 14px;
width: auto;
height: auto;
text-decoration: none;
line-height: normal;
color: #444;
font-size: 1em;
clip: auto !important;
}
}
/* Station Logos for Splash Page */
.station-logos img {
max-height: 200px;
max-width: 200px;
}
.station-logos-row {
display: flex;
}
.station-logos-col {
flex: 25%;
padding: 5px;
}
/* TOC */
.toc {
background-color: #fff;
margin: 0px 0;
padding: 10px 0px;
}
/* Page Title */
.allcaps {
text-transform: uppercase
}
.center {
margin: auto;
width: 50%;
padding: 10px;
}

View file

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

View file

@ -1,34 +0,0 @@
---
sidebar: main
---
# Frequently Asked Questions
**What is LibreTime?**
LibreTime is a community managed fork of the AirTime project.
It is managed by a friendly inclusive community of stations
from around the globe that use, document and improve LibreTime.
**Can I upgrade to LibreTime?**
In theory you can update any pre 3.0 version of AirTime to
LibreTime 3.0.0 and above. More information on [Upgrading](upgrading)
is in the docs.
LibreTime is complex software, as such it is close to impossible
to guarantee that every upgrade path works as intended. This
means you should trial the update on a parallel test
infrastructure to minimize possible downtime.
Please let the community know if you encounter issues with the
update process.
**Why are Cue-In/Out points wrong in some tracks? / What's with silan?**
The silan silence detection is currently outdated on almost all distributions. The older versions report clearly wrong information and may segfault at the worst. Versions starting with 0.3.3 (and some patched 0.3.2 builds) are much better but still need thorough testing. Please see the [release notes](https://github.com/LibreTime/libretime/releases) for up to date mitigation scenarios and details on the issues.
**Why did you fork AirTime?**
See this [open letter to the Airtime community](https://gist.github.com/hairmare/8c03b69c9accc90cfe31fd7e77c3b07d).

BIN
docs/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View file

@ -1,80 +0,0 @@
---
sidebar: main
---
# What is LibreTime?
[LibreTime](http://libretime.org/ "LibreTime homepage") is the open broadcast
software for scheduling and remote station management. Web browser access to
the station's media library, multi-file upload and automatic metadata import
features are coupled with a collaborative online scheduling calendar and
playlist management. The scheduling calendar is managed through an easy-to-use
interface and triggers playout with sub-second precision.
![](img/Screenshot540-Now_playing_250.png)
LibreTime is intended to provide a solution for a wide range of broadcast
projects, from community to public and commercial stations. The scalability of
LibreTime allows implementation in a number of scenarios, ranging from an
unmanned broadcast unit accessed remotely through the Internet, to a local
network of machines accessing a central LibreTime storage system. LibreTime
supports the playout of lossy compressed audio files in both MP3 and AAC
formats and the open, royalty-free equivalent
[Ogg Vorbis](http://www.vorbis.com/ "Ogg Vorbis homepage"). It also supports
playout of lossless FLAC and WAV format audio files.
LibreTime manages the [Liquidsoap](http://savonet.sourceforge.net/) stream
generator at the heart of the system. Liquidsoap generates streams from files
in the LibreTime library and any remote input streams that you specify.
Available stream output formats include Ogg Vorbis, Ogg Opus, MP3, and AAC. The
library is indexed in a [PostgreSQL](http://www.postgresql.org/) database to
enable searching. Live shows can be recorded automatically with
[Ecasound](http://eca.cx/ecasound/ "Ecasound homepage"), using the sound card
line input. News editors, DJs and station controllers can use LibreTime to
build playlists or smart blocks and manage media files (upload, edit metadata,
manage advertisements) at the station or via the Internet.
The scheduler in LibreTime has a calendar view, organized by months, weeks or
days. Program editors can schedule playlists and shows here for their
broadcast station. In some scenarios, the transmitter is situated outside the
reach of the broadcaster and all program management has to be maintained
through the web interface. Possible reasons for this scenario might be of a
pragmatic nature (running many stations from one central office due to limited
human resources) or an emergency (running a transmitter in a crisis area
without putting staff at risk).
LibreTime services
----------------
| Service | Description |
|---------|-------------|
| libretime-analyzer | Keeps track of files being added, renamed, moved or removed from storage, and reads their metadata using the Mutagen library. |
| [PostgreSQL](https://www.postgresql.org/) | Contains the location of those media files and their metadata. This means you can search for and playlist a set of media files according to the specific metadata that you require, or use a 'smart block' to select the files for you. The database also contains details of specified remote input streams. |
| Pypo | (Python Playout engine) Downloads media from the storage up to 24 hours ahead of playout and checks it for average level (with ReplayGain tools) and leading or trailing silence (with Silan). At playout time, the media to be broadcast is sent to Liquidsoap. |
| [Liquidsoap](https://www.liquidsoap.info/) | Takes individual media files and remote input streams, and assembles them into a continuous output stream. This stream can be sent to a sound card (e.g. for a broadcast mixer, on the way to an FM or DAB transmitter) or to a streaming server for IP network distribution, over the LAN, local WiFi or the Internet. You can stream to a sound card and up to three different stream distribution servers with the same LibreTime server, if you wish. |
| [Icecast](https://www.icecast.org/) or [Shoutcast](https://shoutcast.com/) | Audio streaming server, used for creating an internet radio stream from LibreTime. Icecast is included in the LibreTime installation by default. Note: If a suitable Liquidsoap output is not available for your streaming service of choice, you can send audio from Liquidsoap to a separate encoding or streaming machine via a sound card or relay stream. |
| [Monit](https://mmonit.com/monit/) | Monitors the health of pypo, libretime-analyzer and Liquidsoap, and reports the status of these services to LibreTime. |
| [RabbitMQ](https://www.rabbitmq.com/) | Pushes messages from LibreTime to libretime-analyzer and pypo about changes to media files and the playout schedule. |
Example studio broadcast system
-------------------------------
In the diagram of an FM radio station below, LibreTime is hosted on a server
connected to the local network, with direct soundcard access. Liquidsoap
outputs streams to both the transmitter, via the main studio mixer, and
streaming media servers. The machine running LibreTime is behind a firewall
because it is also connected to the Internet for remote access by media
contributors. This enables LibreTime to offer password-protected access to the
media library and scheduling from both inside and outside the studio building.
![](img/libretime_architecture.svg)
Example web broadcast system
----------------------------
In the diagram below, LibreTime is hosted on a remote web server, and has no
soundcard. There does not need to be a centralised studio, although LibreTime
can enable remote studios to stream in to Liquidsoap at authorised times.
Optionally, the outgoing Icecast stream can be relayed to a transmitter.
![](img/libretime_web_architecture.svg)

View file

@ -1,16 +0,0 @@
---
sidebar: appendix
---
# Media Library Folders
LibreTime's media library is inside the */srv/airtime/stor/* folder on your server, by default.
Tracks are uploaded into the imported subdirectory and then a separate directory based upon the user
ID # of the user who uploaded it and then into a folder based upon the artist.
LibreTime unlike Airtime does not currently monitor the files for changes after they are uploaded.
The media library is not designed to be edited directly after files are uploaded. This was done as part of a
move towards enabling cloud-based file hosting. There are currently two works in progress to support filesystem
imports and sync but neither of them have been finished as of the time of this writing. See
[#70](https://github.com/LibreTime/libretime/issues/70). In addition LibreTime does not write metadata changes
back to the files. See [#621](https://github.com/LibreTime/libretime/issues/621)

View file

@ -1,11 +1,14 @@
# FreeIPA configuration
---
layout: default
title: FreeIPA Configuration
---
You can configure LibreTime to delegate all authentication to a FreeIPA server.
This allows you users to use their existing FreeIPA credentials. For this to
work you need to configure Apache to use `mod_authnz_pam` and `mod_intercept_form_submit`.
## Apache configuration
## Apache configuration {#apache}
After installing the needed modules you can set up Apache to intercept form logins and
check them against pam.
@ -35,7 +38,7 @@ check them against pam.
</Location>
```
## PAM configuration
## PAM configuration {#pam}
The above configuration expects a PAM configuration for the `http-libretime` service.
@ -46,7 +49,7 @@ auth required pam_sss.so
account required pam_sss.so
```
## LDAP configuration
## LDAP configuration {#ldap}
LibreTime needs direct access to LDAP so it can fetch additional information. It does so with
a [system account](https://www.freeipa.org/page/HowTo/LDAP#System_Accounts) that you need to
@ -92,7 +95,7 @@ groupmap_admin = 'cn=admins,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
groupmap_superadmin = 'cn=superadmin,cn=groups,cn=accounts,dc=int,dc=example,dc=org'
```
## Enable FreeIPA auth
## Enable FreeIPA Authentication {#freeipa}
After everything is set up properly you can enable FreeIPA auth in `airtime.conf`:

5
docs/gemfile Normal file
View file

@ -0,0 +1,5 @@
source 'https://rubygems.org'
gem 'kramdown', '~> 2.2', '>= 2.2.1'
gem 'jekyll', '~> 4.1'

View file

@ -1,81 +0,0 @@
# Settings
![](img/station-info-settings.png)
On the **Settings** menu, click **General** to set your **Station Name**. This
text is shown in your web browser's title bar when your station staff are logged
into LibreTime, and optionally in stream metadata. You can also set a **Station
Description** and **Station Logo** here.
![](img/general-playback-settings.png)
The **Default Interface Language** drop-down menu sets the default localization
for your LibreTime instance, and the **Station Timezone** drop-down menu can be
used to display local time at your station. LibreTime stores show times
internally in UTC format (similar to *Greenwich Mean Time*), but displays local
time for the convenience of your station staff. You can also set the day of the
week that you wish to start your station's weekly schedule on, which defaults
to Sunday.
The **Track Type Default** enables you to select a track type default for uploads.
Initially, the **Default Fade In** and **Default Fade Out** times for automated
fades are set to half a second, and the **Default Crossfade Duration** is set to
zero seconds. Custom fade and crossfade times can be set for adjacent items in a
playlist or static smart block. See the chapter *Library* for details.
The **Intro Autoloading Playlist** enables you to select a playlist that will be
scheduled at the beginning of every show that has enabled an autoloading
playlist. This can be used for instance to insert a station ID or other
announcements a the top of every show.
The **Outro Autoloading Playlist** enables you to select a playlist that will be
scheduled after the content of every show with an autoloading playlist.
The **Overwrite Podcast Episode Metatags** option which is enabled by default
causes LibreTime to override the Artist, Title & Album fields on any tracks
downloaded from a podcast with information from the RSS feed.
The **Generate a smartblock and a playlist upon creation of a new podcast**
option when enabled will create a smartblock matching the newest episode of a
podcast and a playlist containing that smartblock automatically upon adding a
podcast to LibreTime. This can also be done manually by the generate smartblock
and playlist button under a podcasts settings which is why it is disabled by
default.
![](img/api-settings.png)
You can enable live, read-only access to the LibreTime schedule calendar for
your station's public website with the **Public LibreTime API** option, if you
wish. (There is more about this feature in the
[*Exporting the schedule*](exporting-the-schedule) chapter, in the
*Advanced Configuration* section of this book).
The **Allowed CORS URLs** is intended to deal with situations where you want a
remote site with a different domain to access the API. This is relevant when
there is a reverse proxy server in front of LibreTime. If you are using a
reverse proxy, the URLs that will be used to access it should be added here.
The **Display login button on your Radio Page?** will determine whether visitors
to your site see a link to login. If this is disabled DJs and admins will need
to goto http://SITEURL/login to be able to login.
The **Tune-In Settings** section is intended for stations that have partnered
with TuneIn to automatically push their now playing metadata to TuneIn. This
hasn't been tested and also requires special credentials from TuneIn.
![](img/dangerous-options.png)
The **Dangerous Options** section provides an administrator the ability to erase
the entire LibreTime library.
When you are done remember click the **Save** button at the top or bottom of the
form.
![](img/save-button.png)
Individual LibreTime users can choose another interface localization when they
log in, or set personal preferences for localization and time zone by clicking
their username on the right side of the menu bar.
![](img/Screenshot475-Edit_own_user_account.png)

4
docs/guides.md Normal file
View file

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

View file

@ -1,316 +1,318 @@
---
sidebar: appendix
layout: default
title: HD Audio Modules
git: hd-audio-modules.md
---
# HD Audio Modules
This listing is provided to help ensure that the correct model parameter is passed to the ALSA kernel module for an Intel HDA soundcard, if one is fitted to your LibreTime server. See the chapter *Preparing the server* in this book for more details.
Model name Description
---------- -----------
ALC880
======
3stack 3-jack in back and a headphone out
3stack-digout 3-jack in back, a HP out and a SPDIF out
5stack 5-jack in back, 2-jack in front
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
6stack 6-jack in back, 2-jack in front
6stack-digout 6-jack with a SPDIF out
```
Model name Description
---------- -----------
ALC880
======
3stack 3-jack in back and a headphone out
3stack-digout 3-jack in back, a HP out and a SPDIF out
5stack 5-jack in back, 2-jack in front
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
6stack 6-jack in back, 2-jack in front
6stack-digout 6-jack with a SPDIF out
ALC260
======
N/A
ALC260
======
N/A
ALC262
======
inv-dmic Inverted internal mic workaround
ALC262
======
inv-dmic Inverted internal mic workaround
ALC267/268
==========
inv-dmic Inverted internal mic workaround
ALC267/268
==========
inv-dmic Inverted internal mic workaround
ALC269/270/275/276/28x/29x
======
laptop-amic Laptops with analog-mic input
laptop-dmic Laptops with digital-mic input
alc269-dmic Enable ALC269(VA) digital mic workaround
alc271-dmic Enable ALC271X digital mic workaround
inv-dmic Inverted internal mic workaround
headset-mic Indicates a combined headset (headphone+mic) jack
lenovo-dock Enables docking station I/O for some Lenovos
dell-headset-multi Headset jack, which can also be used as mic-in
dell-headset-dock Headset jack (without mic-in), and also dock I/O
ALC269/270/275/276/28x/29x
======
laptop-amic Laptops with analog-mic input
laptop-dmic Laptops with digital-mic input
alc269-dmic Enable ALC269(VA) digital mic workaround
alc271-dmic Enable ALC271X digital mic workaround
inv-dmic Inverted internal mic workaround
headset-mic Indicates a combined headset (headphone+mic) jack
lenovo-dock Enables docking station I/O for some Lenovos
dell-headset-multi Headset jack, which can also be used as mic-in
dell-headset-dock Headset jack (without mic-in), and also dock I/O
ALC66x/67x/892
==============
mario Chromebook mario model fixup
asus-mode1 ASUS
asus-mode2 ASUS
asus-mode3 ASUS
asus-mode4 ASUS
asus-mode5 ASUS
asus-mode6 ASUS
asus-mode7 ASUS
asus-mode8 ASUS
inv-dmic Inverted internal mic workaround
dell-headset-multi Headset jack, which can also be used as mic-in
ALC66x/67x/892
==============
mario Chromebook mario model fixup
asus-mode1 ASUS
asus-mode2 ASUS
asus-mode3 ASUS
asus-mode4 ASUS
asus-mode5 ASUS
asus-mode6 ASUS
asus-mode7 ASUS
asus-mode8 ASUS
inv-dmic Inverted internal mic workaround
dell-headset-multi Headset jack, which can also be used as mic-in
ALC680
======
N/A
ALC680
======
N/A
ALC88x/898/1150
======================
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
acer-aspire-8930g Acer Aspire 8330G/6935G
acer-aspire Acer Aspire others
inv-dmic Inverted internal mic workaround
no-primary-hp VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
ALC88x/898/1150
======================
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
acer-aspire-8930g Acer Aspire 8330G/6935G
acer-aspire Acer Aspire others
inv-dmic Inverted internal mic workaround
no-primary-hp VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
ALC861/660
==========
N/A
ALC861/660
==========
N/A
ALC861VD/660VD
==============
N/A
ALC861VD/660VD
==============
N/A
CMI9880
=======
minimal 3-jack in back
min_fp 3-jack in back, 2-jack in front
full 6-jack in back, 2-jack in front
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
allout 5-jack in back, 2-jack in front, SPDIF out
auto auto-config reading BIOS (default)
CMI9880
=======
minimal 3-jack in back
min_fp 3-jack in back, 2-jack in front
full 6-jack in back, 2-jack in front
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
allout 5-jack in back, 2-jack in front, SPDIF out
auto auto-config reading BIOS (default)
AD1882 / AD1882A
================
3stack 3-stack mode
3stack-automute 3-stack with automute front HP (default)
6stack 6-stack mode
AD1882 / AD1882A
================
3stack 3-stack mode
3stack-automute 3-stack with automute front HP (default)
6stack 6-stack mode
AD1884A / AD1883 / AD1984A / AD1984B
====================================
desktop 3-stack desktop (default)
laptop laptop with HP jack sensing
mobile mobile devices with HP jack sensing
thinkpad Lenovo Thinkpad X300
touchsmart HP Touchsmart
AD1884A / AD1883 / AD1984A / AD1984B
====================================
desktop 3-stack desktop (default)
laptop laptop with HP jack sensing
mobile mobile devices with HP jack sensing
thinkpad Lenovo Thinkpad X300
touchsmart HP Touchsmart
AD1884
======
N/A
AD1884
======
N/A
AD1981
======
basic 3-jack (default)
hp HP nx6320
thinkpad Lenovo Thinkpad T60/X60/Z60
toshiba Toshiba U205
AD1981
======
basic 3-jack (default)
hp HP nx6320
thinkpad Lenovo Thinkpad T60/X60/Z60
toshiba Toshiba U205
AD1983
======
N/A
AD1983
======
N/A
AD1984
======
basic default configuration
thinkpad Lenovo Thinkpad T61/X61
dell_desktop Dell T3400
AD1984
======
basic default configuration
thinkpad Lenovo Thinkpad T61/X61
dell_desktop Dell T3400
AD1986A
=======
6stack 6-jack, separate surrounds (default)
3stack 3-stack, shared surrounds
laptop 2-channel only (FSC V2060, Samsung M50)
laptop-eapd 2-channel with EAPD (ASUS A6J)
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
samsung 2-channel with EAPD (Samsung R65)
samsung-p50 2-channel with HP-automute (Samsung P50)
AD1986A
=======
6stack 6-jack, separate surrounds (default)
3stack 3-stack, shared surrounds
laptop 2-channel only (FSC V2060, Samsung M50)
laptop-eapd 2-channel with EAPD (ASUS A6J)
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
samsung 2-channel with EAPD (Samsung R65)
samsung-p50 2-channel with HP-automute (Samsung P50)
AD1988/AD1988B/AD1989A/AD1989B
==============================
6stack 6-jack
6stack-dig ditto with SPDIF
3stack 3-jack
3stack-dig ditto with SPDIF
laptop 3-jack with hp-jack automute
laptop-dig ditto with SPDIF
auto auto-config reading BIOS (default)
AD1988/AD1988B/AD1989A/AD1989B
==============================
6stack 6-jack
6stack-dig ditto with SPDIF
3stack 3-jack
3stack-dig ditto with SPDIF
laptop 3-jack with hp-jack automute
laptop-dig ditto with SPDIF
auto auto-config reading BIOS (default)
Conexant 5045
=============
laptop-hpsense Laptop with HP sense (old model laptop)
laptop-micsense Laptop with Mic sense (old model fujitsu)
laptop-hpmicsense Laptop with HP and Mic senses
benq Benq R55E
laptop-hp530 HP 530 laptop
test for testing/debugging purpose, almost all controls
can be adjusted. Appearing only when compiled with
$CONFIG_SND_DEBUG=y
Conexant 5045
=============
laptop-hpsense Laptop with HP sense (old model laptop)
laptop-micsense Laptop with Mic sense (old model fujitsu)
laptop-hpmicsense Laptop with HP and Mic senses
benq Benq R55E
laptop-hp530 HP 530 laptop
test for testing/debugging purpose, almost all controls
can be adjusted. Appearing only when compiled with
$CONFIG_SND_DEBUG=y
Conexant 5047
=============
laptop Basic Laptop config
laptop-hp Laptop config for some HP models (subdevice 30A5)
laptop-eapd Laptop config with EAPD support
test for testing/debugging purpose, almost all controls
can be adjusted. Appearing only when compiled with
$CONFIG_SND_DEBUG=y
Conexant 5047
=============
laptop Basic Laptop config
laptop-hp Laptop config for some HP models (subdevice 30A5)
laptop-eapd Laptop config with EAPD support
test for testing/debugging purpose, almost all controls
can be adjusted. Appearing only when compiled with
$CONFIG_SND_DEBUG=y
Conexant 5051
=============
laptop Basic Laptop config (default)
hp HP Spartan laptop
hp-dv6736 HP dv6736
hp-f700 HP Compaq Presario F700
ideapad Lenovo IdeaPad laptop
toshiba Toshiba Satellite M300
Conexant 5051
=============
laptop Basic Laptop config (default)
hp HP Spartan laptop
hp-dv6736 HP dv6736
hp-f700 HP Compaq Presario F700
ideapad Lenovo IdeaPad laptop
toshiba Toshiba Satellite M300
Conexant 5066
=============
laptop Basic Laptop config (default)
hp-laptop HP laptops, e g G60
asus Asus K52JU, Lenovo G560
dell-laptop Dell laptops
dell-vostro Dell Vostro
olpc-xo-1_5 OLPC XO 1.5
ideapad Lenovo IdeaPad U150
thinkpad Lenovo Thinkpad
Conexant 5066
=============
laptop Basic Laptop config (default)
hp-laptop HP laptops, e g G60
asus Asus K52JU, Lenovo G560
dell-laptop Dell laptops
dell-vostro Dell Vostro
olpc-xo-1_5 OLPC XO 1.5
ideapad Lenovo IdeaPad U150
thinkpad Lenovo Thinkpad
STAC9200
========
ref Reference board
oqo OQO Model 2
dell-d21 Dell (unknown)
dell-d22 Dell (unknown)
dell-d23 Dell (unknown)
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
dell-m22 Dell Latitude D620, Dell Latitude D820
dell-m23 Dell XPS M1710, Dell Precision M90
dell-m24 Dell Latitude 120L
dell-m25 Dell Inspiron E1505n
dell-m26 Dell Inspiron 1501
dell-m27 Dell Inspiron E1705/9400
gateway-m4 Gateway laptops with EAPD control
gateway-m4-2 Gateway laptops with EAPD control
panasonic Panasonic CF-74
auto BIOS setup (default)
STAC9200
========
ref Reference board
oqo OQO Model 2
dell-d21 Dell (unknown)
dell-d22 Dell (unknown)
dell-d23 Dell (unknown)
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
dell-m22 Dell Latitude D620, Dell Latitude D820
dell-m23 Dell XPS M1710, Dell Precision M90
dell-m24 Dell Latitude 120L
dell-m25 Dell Inspiron E1505n
dell-m26 Dell Inspiron 1501
dell-m27 Dell Inspiron E1705/9400
gateway-m4 Gateway laptops with EAPD control
gateway-m4-2 Gateway laptops with EAPD control
panasonic Panasonic CF-74
auto BIOS setup (default)
STAC9205/9254
=============
ref Reference board
dell-m42 Dell (unknown)
dell-m43 Dell Precision
dell-m44 Dell Inspiron
eapd Keep EAPD on (e.g. Gateway T1616)
auto BIOS setup (default)
STAC9205/9254
=============
ref Reference board
dell-m42 Dell (unknown)
dell-m43 Dell Precision
dell-m44 Dell Inspiron
eapd Keep EAPD on (e.g. Gateway T1616)
auto BIOS setup (default)
STAC9220/9221
=============
ref Reference board
3stack D945 3stack
5stack D945 5stack + SPDIF
intel-mac-v1 Intel Mac Type 1
intel-mac-v2 Intel Mac Type 2
intel-mac-v3 Intel Mac Type 3
intel-mac-v4 Intel Mac Type 4
intel-mac-v5 Intel Mac Type 5
intel-mac-auto Intel Mac (detect type according to subsystem id)
macmini Intel Mac Mini (equivalent with type 3)
macbook Intel Mac Book (eq. type 5)
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
imac-intel Intel iMac (eq. type 2)
imac-intel-20 Intel iMac (newer version) (eq. type 3)
ecs202 ECS/PC chips
dell-d81 Dell (unknown)
dell-d82 Dell (unknown)
dell-m81 Dell (unknown)
dell-m82 Dell XPS M1210
auto BIOS setup (default)
STAC9220/9221
=============
ref Reference board
3stack D945 3stack
5stack D945 5stack + SPDIF
intel-mac-v1 Intel Mac Type 1
intel-mac-v2 Intel Mac Type 2
intel-mac-v3 Intel Mac Type 3
intel-mac-v4 Intel Mac Type 4
intel-mac-v5 Intel Mac Type 5
intel-mac-auto Intel Mac (detect type according to subsystem id)
macmini Intel Mac Mini (equivalent with type 3)
macbook Intel Mac Book (eq. type 5)
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
imac-intel Intel iMac (eq. type 2)
imac-intel-20 Intel iMac (newer version) (eq. type 3)
ecs202 ECS/PC chips
dell-d81 Dell (unknown)
dell-d82 Dell (unknown)
dell-m81 Dell (unknown)
dell-m82 Dell XPS M1210
auto BIOS setup (default)
STAC9202/9250/9251
==================
ref Reference board, base config
m1 Some Gateway MX series laptops (NX560XL)
m1-2 Some Gateway MX series laptops (MX6453)
m2 Some Gateway MX series laptops (M255)
m2-2 Some Gateway MX series laptops
m3 Some Gateway MX series laptops
m5 Some Gateway MX series laptops (MP6954)
m6 Some Gateway NX series laptops
auto BIOS setup (default)
STAC9202/9250/9251
==================
ref Reference board, base config
m1 Some Gateway MX series laptops (NX560XL)
m1-2 Some Gateway MX series laptops (MX6453)
m2 Some Gateway MX series laptops (M255)
m2-2 Some Gateway MX series laptops
m3 Some Gateway MX series laptops
m5 Some Gateway MX series laptops (MP6954)
m6 Some Gateway NX series laptops
auto BIOS setup (default)
STAC9227/9228/9229/927x
=======================
ref Reference board
ref-no-jd Reference board without HP/Mic jack detection
3stack D965 3stack
5stack D965 5stack + SPDIF
5stack-no-fp D965 5stack without front panel
dell-3stack Dell Dimension E520
dell-bios Fixes with Dell BIOS setup
dell-bios-amic Fixes with Dell BIOS setup including analog mic
volknob Fixes with volume-knob widget 0x24
auto BIOS setup (default)
STAC9227/9228/9229/927x
=======================
ref Reference board
ref-no-jd Reference board without HP/Mic jack detection
3stack D965 3stack
5stack D965 5stack + SPDIF
5stack-no-fp D965 5stack without front panel
dell-3stack Dell Dimension E520
dell-bios Fixes with Dell BIOS setup
dell-bios-amic Fixes with Dell BIOS setup including analog mic
volknob Fixes with volume-knob widget 0x24
auto BIOS setup (default)
STAC92HD71B*
============
ref Reference board
dell-m4-1 Dell desktops
dell-m4-2 Dell desktops
dell-m4-3 Dell desktops
hp-m4 HP mini 1000
hp-dv5 HP dv series
hp-hdx HP HDX series
hp-dv4-1222nr HP dv4-1222nr (with LED support)
auto BIOS setup (default)
STAC92HD71B*
============
ref Reference board
dell-m4-1 Dell desktops
dell-m4-2 Dell desktops
dell-m4-3 Dell desktops
hp-m4 HP mini 1000
hp-dv5 HP dv series
hp-hdx HP HDX series
hp-dv4-1222nr HP dv4-1222nr (with LED support)
auto BIOS setup (default)
STAC92HD73*
===========
ref Reference board
no-jd BIOS setup but without jack-detection
intel Intel DG45* mobos
dell-m6-amic Dell desktops/laptops with analog mics
dell-m6-dmic Dell desktops/laptops with digital mics
dell-m6 Dell desktops/laptops with both type of mics
dell-eq Dell desktops/laptops
alienware Alienware M17x
auto BIOS setup (default)
STAC92HD73*
===========
ref Reference board
no-jd BIOS setup but without jack-detection
intel Intel DG45* mobos
dell-m6-amic Dell desktops/laptops with analog mics
dell-m6-dmic Dell desktops/laptops with digital mics
dell-m6 Dell desktops/laptops with both type of mics
dell-eq Dell desktops/laptops
alienware Alienware M17x
auto BIOS setup (default)
STAC92HD83*
===========
ref Reference board
mic-ref Reference board with power management for ports
dell-s14 Dell laptop
dell-vostro-3500 Dell Vostro 3500 laptop
hp-dv7-4000 HP dv-7 4000
hp_cNB11_intquad HP CNB models with 4 speakers
hp-zephyr HP Zephyr
hp-led HP with broken BIOS for mute LED
hp-inv-led HP with broken BIOS for inverted mute LED
auto BIOS setup (default)
STAC92HD83*
===========
ref Reference board
mic-ref Reference board with power management for ports
dell-s14 Dell laptop
dell-vostro-3500 Dell Vostro 3500 laptop
hp-dv7-4000 HP dv-7 4000
hp_cNB11_intquad HP CNB models with 4 speakers
hp-zephyr HP Zephyr
hp-led HP with broken BIOS for mute LED
hp-inv-led HP with broken BIOS for inverted mute LED
auto BIOS setup (default)
STAC9872
========
vaio VAIO laptop without SPDIF
auto BIOS setup (default)
STAC9872
========
vaio VAIO laptop without SPDIF
auto BIOS setup (default)
Cirrus Logic CS4206/4207
========================
mbp55 MacBook Pro 5,5
imac27 IMac 27 Inch
auto BIOS setup (default)
Cirrus Logic CS4206/4207
========================
mbp55 MacBook Pro 5,5
imac27 IMac 27 Inch
auto BIOS setup (default)
Cirrus Logic CS4208
===================
mba6 MacBook Air 6,1 and 6,2
gpio0 Enable GPIO 0 amp
auto BIOS setup (default)
Cirrus Logic CS4208
===================
mba6 MacBook Air 6,1 and 6,2
gpio0 Enable GPIO 0 amp
auto BIOS setup (default)
VIA VT17xx/VT18xx/VT20xx
========================
auto BIOS setup (default)
VIA VT17xx/VT18xx/VT20xx
========================
auto BIOS setup (default)
```

View file

@ -1,11 +0,0 @@
# Help menu
The first entry on LibreTime's **Help** menu offers a **Getting Started** guide
for new users. Further down, there is also a link to the online version of this
**User Manual**.
![](img/Screenshot460-Help_page.png)
You can visit the LibreTime online support forum at
<https://discourse.libretime.org/c/get-help> to ask for help from the community
regarding your LibreTime setup.

View file

@ -1,4 +0,0 @@
History Templates
-----------------
Coming soon.

View file

@ -1,40 +0,0 @@
# 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.
![](img/Screenshot533-Playout_history_250.png)
The number of times each file was played and the length of the files are shown in the **File Summary** tab. To make optimal use of this feature for royalty reporting purposes, music files must be tagged with **Composer** and **Copyright** metadata. The artist performing a piece of music may not be the original composer of the work, or the copyright holder of the sound recording.
![](img/Screenshot534-File_summary_250.png)
On the **Show Summary** tab, click the name of a show within the search range to expand its row and see its playout details.
![](img/Screenshot535-Show_summary_250.png)
## Manual logging
If your station features playout from analogue sources such as turntables or microphones, there is no automatic metadata for LibreTime to collect from these inputs. To ensure that the playout history is complete, you can add log entries manually by clicking the **+ Create Entry** button. This action opens a pop-up window with default fields of Start Time, End Time, Title and Creator. Click the **Find** button to automatically fill the **Choose Show Instance** menu with the names of shows that took place within the specified time range. Then click the **Save** button to enter the new item into the playout history.
![](img/Screenshot536-Manual_login_250.png)
Log entries can also be manually deleted, using the button with the trashcan icon, to the right of the **+ Create Entry** button. Pages of entries can be selected for deletion using the **Select** drop-down menu.
## 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**.
![](img/Screenshot537-History_templates.png)
Either of these actions opens a page in which you can name the new template, and add or remove elements from the list on the left. To add a new element from the list on the right, click the plus icon for the item you require. If the element you require is not listed, you can use the **Add New Field** box at the lower end of the right side column. Select *string*, *boolean*, *integer*, or *float*, depending on the type of data that you wish to log, and then click the **+ Add** button.
![](img/Screenshot538-Log_sheet_template_250.png)
When the template is in the format you require, click the **Save** button, and **Set Default Template** if you wish. The new template will now be listed on the History Templates page. If you have set a new default template, any changes will be visible on the tabs of the Playout History page.

View file

@ -1,179 +0,0 @@
---
sidebar: installer
---
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
---------------------------
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
----------------------------------------
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.
API client configuration
------------------------
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
----------------------------------
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 and recorder settings
-----------------------------
Settings for pypo, the playout and recording 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

View file

@ -1,4 +1,10 @@
# Icecast and Shoutcast stream configuration
---
layout: default
title: Icecast and Shoutcast Stream Configuration
git: icecast-shoutcast.md
---
## Background
LibreTime supports direct connection to two popular streaming media servers, the open source **Icecast** (<http://www.icecast.org>) and the proprietary **SHOUTcast** (<http://www.shoutcast.com>). Apart from the software license, the main difference between these two servers is that Icecast supports simultaneous MP3, AAC, Ogg Vorbis or Ogg Opus streaming from LibreTime, whereas SHOUTcast supports MP3 and AAC streams but not Ogg Vorbis or Opus. The royalty-free Ogg Vorbis format has the advantage of better sound quality than MP3 at lower bitrates, which has a direct impact on the amount of bandwidth that your station will require to serve the same number of listeners. Ogg Opus also benefits from good sound quality at low bitrates, with the added advantage of lower latency than other streaming formats. Opus is now an IETF standard (<http://tools.ietf.org/html/rfc6716>) and requires Icecast 2.4 or later to be installed on the streaming server.
@ -10,8 +16,7 @@ Because LibreTime supports simultaneous streaming in multiple formats, it is pos
Conversely, you may have a music station which wants to stream at 160kbps or 192kbps to offer a quality advantage over stations streaming at 128kbps or less. Since Ogg, AAC and MP3 formats use lossy compression, listeners will only hear the benefit of higher streaming bitrates if the media files in the LibreTime storage server are encoded at an equivalent bitrate, or higher.
UTF-8 metadata in Icecast MP3 streams
-------------------------------------
## UTF-8 metadata in Icecast MP3 streams
When sending metadata about your stream to an Icecast server in non-Latin alphabets, you may find that Icecast does not display the characters correctly for an MP3 stream, even though they are displayed correctly for an Ogg Vorbis stream. In the following screenshot, Russian characters are being displayed incorrectly in the *Current Song* field for the MP3 stream:
@ -31,8 +36,7 @@ After saving the */etc/icecast2/icecast.xml* file, you should restart the Icecas
Detaching from the console
icecast2.
Icecast handover configuration
------------------------------
## Icecast handover configuration
In a typical radio station configuration, the live output from the broadcast studio and the scheduled output from LibreTime are mixed together before being sent further along the broadcast chain, to a transmitter or streaming media server on the Internet. (This may not be the case if your LibreTime server is remote from the studio, and you are using the **Show Source Mount Point** or **Master Source Mount Point** to mix live and scheduled content. See the *Stream Settings* chapter for details).
@ -69,8 +73,7 @@ These mount point definitions mean that a client connecting to a URL such as *ht
Setting the value of *<fallback-override>* to 1 (enabled) means that when the */live.ogg* mount point becomes available again, the client will be re-connected to it.  If you wish to hide the */airtime\_128* and */live.ogg* mount points from the public Icecast web interface, set the value of *<hidden>* in each of these definitions to 1.
Source configuration
--------------------
## Source configuration
Connect the other source to the Icecast server with the same parameters defined in the */etc/airtime/liquidsoap.cfg* file, except for the mount point. This should one of the mount points you have defined in the */etc/icecast2/icecast.xml* file, such as */live.ogg* in the example above.
@ -80,3 +83,40 @@ To configure **Mixxx** for streaming to Icecast, click *Options*, *Preferences*,
By default, Icecast streams are buffered to guard against network problems, which causes latency for remote listeners. When monitoring the stream from a remote location, you may have to begin the live stream a few seconds before the previous stream ends to enable a smooth transition.
## Promoting your station through Icecast
If you have an Icecast server, you can put a link to the Icecast status page (by default at port 8000) on your station's homepage,
to provide an overview of available streams. See the chapter *Interface customization* for tips on theming the
Icecast status page. You can also use Now Playing widgets (see the chapter *Exporting the schedule*) or HTML5 stream players (see the chapter *Stream player for your website*) to help grow your audience.
On an Icecast server, you can uncomment the `<directory>` section in the _/etc/icecast2/icecast.xml_ file to have
your station automatically listed on the Icecast directory website <http://dir.xiph.org> which could help you pick
up more listeners.
<!-- Uncomment this if you want directory listings -->
<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
</directory>
The Indymedia stream directory at <http://radio.indymedia.org/en/yp> links to grassroots independent radio projects around the world. You can add your station to their list with an additional *<directory>* section, as follows:
<directory>
<yp-url-timeout>15</yp-url-timeout>
<yp-url>http://radio.indymedia.org/cgi-bin/yp-cgi</yp-url>
</directory>
Another stream directory service is provided by the Liquidsoap Flows! site <http://flows.liquidsoap.fm/>. The following section can be added to the file */usr/lib/airtime/pypo/bin/liquidsoap\_scripts/ls\_script.liq* after *add\_skip\_command(s)* on line 174, for a stream named '*ourstation*':
ourstation = register_flow(
radio="Rock 'n Roll Radio",
website="http://radio.example.com/",
description="Canada's most rockin' radio!",
genre="Rock",
user="",
password="",
streams=[("ogg/128k","http://streaming.example.com/libretime_128")],
ourstation)
For the time being, a stream can be registered on the Liquidsoap Flows! site with any username and password. Authenticated services may be offered in future.

BIN
docs/img/404.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

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