Merge branch 'docs'
2
.gitignore
vendored
|
@ -16,3 +16,5 @@ airtime_mvc/tests/log/*.log
|
|||
.vagrant/
|
||||
.DS_Store
|
||||
.idea/
|
||||
/docs/_site/*
|
||||
/docs/.jekyll-cache/*
|
3
Vagrantfile
vendored
|
@ -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
|
||||
|
|
BIN
docs/144px.png
Before Width: | Height: | Size: 12 KiB |
4
docs/404.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
permalink: /404.html
|
||||
layout: 404
|
||||
---
|
68
docs/Gemfile.lock
Normal 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
|
|
@ -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
|
||||
|
|
@ -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}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
@ -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
|
|
@ -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
|
@ -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>
|
8
docs/_includes/footer.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<footer>
|
||||
<section class="footer-dark text-white">
|
||||
<div class="text-footer">
|
||||
<small>Hosted on GitHub Pages — Theme by <a href="https://github.com/volny">Felix Volny</a>, <a href="https://github.com/ned-kelly">ned-kelly</a> and <a href="https://github.com/zklosko">Zachary Klosko</a> | </small>
|
||||
<small>Code and docs licensed under GPLv2. More details <a href="http://sourcefabric.booktype.pro/airtime-25-for-broadcasters/about-this-manual/">here</a>. </small>
|
||||
</div>
|
||||
</section>
|
||||
</footer>
|
17
docs/_includes/head.html
Normal 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">
|
31
docs/_includes/navbar.html
Normal 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>
|
43
docs/_includes/scripts.html
Normal 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
|
@ -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
|
@ -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>
|
|
@ -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> -- <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 — 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
|
@ -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
|
@ -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 & automated playlists to drag-and-drop visual editing & 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 & 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 & 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 & 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>
|
|
@ -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.
|
||||
|
||||

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

|
||||
|
||||
The **History Templates** page on the History menu enables you to prepare reports with the exact content required by regulatory agencies in the territories that you are broadcasting to. You can begin creating a custom template by clicking the button **New Log Sheet Template** or the button **New File Summary Template**.
|
||||
|
||||

|
||||
|
||||
Either of these actions opens a page in which you can name the new template, and add or remove elements from the list on the left. To add a new element from the list on the right, click the plus icon for the item you require. If the element you require is not listed, you can use the **Add New Field** box at the lower end of the right side column. Select *string*, *boolean*, *integer*, or *float*, depending on the type of data that you wish to log, and then click the **+ Add** button.
|
||||
|
||||
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.
|
||||
|
||||

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

|
||||
|
||||
If the status indicator is red, check that the **Admin User** and **Admin Password** settings are correct under **Additional Options** for the named mount point, such as *libretime\_128*, on the **Streams** page of the **Settings** menu.
|
||||
|
||||
By default, statistics for the last 24 hours of streaming are shown. To change this date and time range, click the calendar and clock icons in the lower left corner of the page, then click the magnifying glass icon.
|
||||
|
||||
> To choose which particular streams should have statistics displayed, click the check boxes for the individual colour-coded mount points, just below the graph.
|
|
@ -1,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.
|
||||
|
||||
|
|
106
docs/autodj.md
|
@ -1,106 +0,0 @@
|
|||
# How to Setup Genre based AutoDJ
|
||||
* YouTube video
|
||||
|
||||
[](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 isn’t 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 don’t 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 doesn’t 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 shouldn’t 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.
|
|
@ -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.
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
# How to Build Your Schedule
|
||||
* YouTube video
|
||||
|
||||
[](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.
|
145
docs/calendar.md
|
@ -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.
|
||||
|
||||

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

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

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

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

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

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

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

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

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

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

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

|
||||
|
||||
Optionally, you can upload a Show Logo by clicking the **Browse** button.
|
||||
|
||||

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

|
||||
|
||||
Episodes of repeating shows also have an **Instance Description** field in which you can add details for that particular episode. Click the episode in the Calendar, click **Edit** on the pop-up menu, then click **Edit this instance**. After entering an Instance Description, click the **+ Update show** button.
|
||||
|
||||

|
||||
|
||||
Alternatively, individual shows can be clicked on and dragged to new days and times in the calendar. However, LibreTime will not allow you to drag a future show into the past, or drag and drop instances of a repeated show. In the **Day** and **Week** views, show length can be adjusted by clicking on the lower edge of the show box, and dragging the edge of the box upwards or downwards. The new show length is calculated automatically.
|
||||
|
||||
Adding content to a show
|
||||
------------------------
|
||||
|
||||
To add content to a show, click the show in any view on the Calendar, and select **Schedule Tracks** from the pop-up menu. Shows that do not yet contain any scheduled content are marked with a red exclamation mark icon, to the right of the show start and end times in the top bar. Shows partially filled with content have a yellow exclamation mark icon. During playout of the show, a green play icon will also be shown in the top bar.
|
||||
|
||||

|
||||
|
||||
The **Schedule Tracks** action opens a window with the name of the show. Like when using the **Now Playing** page, you can search for content items and add them to the show schedule on the right side of the page. Refer to the *Now Playing* chapter for details.
|
||||
|
||||
When your show has all the required content, click the **OK** button in the bottom right corner to close the window. Back in the **Calendar**, click the show and select **View** from the pop-up menu to view a list of content now included in the show.
|
||||
|
||||

|
||||
|
||||
The **Contents of Show** window is a read-only interface featuring an orange bar which indicates how much media has been added to the show. Click the **OK** button in the bottom right corner, or the white **x** icon in the top right corner, to close the window.
|
||||
|
||||

|
||||
|
||||
Removing content from a show
|
||||
----------------------------
|
||||
|
||||
To remove an individual item from a show, click on the show in the **Calendar**, and select **Schedule Tracks** from the pop-up menu. In the window which opens, click any item you wish to remove from the show, then click **Delete** on the pop-up menu, or check the box in the item's row then click the **Remove** icon at the top of the table. To remove all files and playlists from a show, click on the show in the **Calendar**, and select **Clear Show** from the pop-up menu.
|
||||
|
||||
Deleting an upcoming show
|
||||
---------------------------
|
||||
|
||||
To delete an upcoming instance of a repeating show, click on the show in the **Calendar**, and select **Delete**, then **Delete Instance** from the pop-up menu. If you wish to delete all future instances of a repeating show, select **Delete Instance and All Following** from the pop-up menu.
|
||||
|
||||

|
||||
|
||||
You cannot delete or remove content from shows that have already played out. These shows have only one option on the pop-up menu, which is **View**.
|
||||
|
||||
Cancelling playout
|
||||
------------------
|
||||
|
||||
If you wish to cancel playout of a show while it is running, click on the show in the **Calendar** and select **Cancel Show** from the pop-up menu. LibreTime will ask you if you are sure about this action, as it cannot be undone.
|
||||
|
||||

|
||||
|
|
@ -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
|
@ -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;
|
||||
}
|
|
@ -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.
|
||||
|
||||

|
||||
|
||||
To display the content of a particular show, click **Filter by Show** and select
|
||||
the name of the show from the drop-down menu which will appear.
|
||||
|
||||

|
||||
|
||||
On the left side of the page, the **Start** and **End** times, **Duration**
|
||||
and **Title** of each content item are shown. On the right, **Creator**,
|
||||
**Album**, **Cue** or **Fade** times and **Mime** type (file format) can also be
|
||||
shown. This information can help you to prepare voice tracks for insertion into
|
||||
the show, including time checks if you wish. Putting current time information i
|
||||
to voice tracks describing specific content can, of course, limit the
|
||||
re-usability of those voice tracks, unless you always broadcast a particular
|
||||
item at the same time of day.
|
||||
|
||||
Click the **Show/hide columns** button on the right to configure the metadata
|
||||
displayed, by checking the boxes in the pop-up window.
|
||||
|
||||

|
||||
|
||||
The row for the currently playing item is displayed with a bright green
|
||||
background. Any underbooked shows (shows with insufficient content to fill the
|
||||
time allowed) are displayed with a row indicating the length of the underbooking
|
||||
in minutes and seconds. These rows contain a red exclamation mark in the first
|
||||
column, and have a pink background.
|
||||
|
||||

|
||||
|
||||
Removing content from a running show
|
||||
------------------------------------
|
||||
|
||||
If a show is overbooked, which means the total playout duration is longer than
|
||||
the time allowed for the show, a brown row indicates that the item will be faded
|
||||
out when the show ends. A red row indicates that the item will not be played at
|
||||
all. The length of the overbooking is shown in minutes and seconds in the last
|
||||
row of the show. To remove the extra items from the end of an overbooked show,
|
||||
click the **Scissors** button at the top left of the table.
|
||||
|
||||
Alternatively, check the boxes for items which have not yet completed playout,
|
||||
and click the **Trashcan** button, to the right of the Scissors, to remove them
|
||||
from the schedule. If you remove the currently playing item, playout will skip
|
||||
to the next item in the show automatically, so you should make sure you have
|
||||
enough items remaining in the show to avoid dead air.
|
||||
|
||||

|
||||
|
||||
If you have a long schedule displayed, and you wish to skip to the currently
|
||||
playing item, click the button with the end arrow icon, to the right of the
|
||||
**Trashcan**.
|
||||
|
||||
To cancel the current show completely, click the red button to the right again.
|
||||
A pop-up window will ask you to confirm the cancellation, as this action cannot
|
||||
be undone.
|
||||
|
||||

|
||||
|
||||
Items which are no longer available have an exclamation mark icon in the second
|
||||
column. This may happen for media files which were part of previous shows, and
|
||||
were removed from LibreTime's library (main storage or watched folders)
|
||||
subsequently. Items which are included in forthcoming shows cannot be removed
|
||||
from the Library via the LibreTime interface.
|
||||
|
||||
Adding content to a running show
|
||||
--------------------------------
|
||||
|
||||
After you have found the items that you want using the search tools, you can
|
||||
then drag and drop them from the library table on the left side of the page into
|
||||
the shows on the right side, including the current playing show.
|
||||
|
||||
If the current show has nothing playing out at the time, the new item will begin
|
||||
playing immediately. This manual triggering of playout can be used as a live
|
||||
assist technique, in which the LibreTime server's soundcard output is mixed with
|
||||
other sources such as microphones or telephone hybrids on its way to a
|
||||
transmitter, or a separate stream encoder. For instance, a live show's host may
|
||||
not wish to cut off a studio discussion in order to play music at a fixed time.
|
||||
|
||||

|
||||
|
||||
You can also select multiple items using the **Select** menu button, just
|
||||
beneath the simple search field, which has the options to **Select this page**
|
||||
of search results, **Deselect this page** and **Deselect all**. Alternatively,
|
||||
use the checkboxes on the left side of the library table to select specific
|
||||
items. Then drag one of the items into the show to add all of the selected
|
||||
items, or click the **Add to selected show** button, which has a plus icon. If
|
||||
you wish, you can also use the **Trashcan** button to permanently remove items
|
||||
from LibreTime's library. Only *admin* users have permission to delete all
|
||||
items.
|
||||
|
||||
To insert checkbox selected items at a specific time in the show schedule, click
|
||||
one of the songs in the schedule table. Then click the **Add to selected show**
|
||||
button in the library table. This will insert the library songs after the
|
||||
selected scheduled song.
|
||||
|
||||
To add a single item at the insertion point, double-click on it in the library.
|
||||
There is no need to select or drag the item first.
|
||||
|
||||
Right-clicking on a song in the schedule table will show a pop-up. This pop-up
|
||||
menu also enables you to audition the entire show in advance of playout, or
|
||||
remove the item that was clicked on from the show.
|
||||
|
||||
Multiple insertion points can be enabled, so that the same item is inserted into
|
||||
the schedule at different times. For example, you may wish to play a news report
|
||||
every hour, or a station ident after every five music files.
|
34
docs/faq.md
|
@ -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
After Width: | Height: | Size: 70 KiB |
|
@ -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.
|
||||
|
||||

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

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

|
|
@ -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)
|
|
@ -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
|
@ -0,0 +1,5 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem 'kramdown', '~> 2.2', '>= 2.2.1'
|
||||
|
||||
gem 'jekyll', '~> 4.1'
|
|
@ -1,81 +0,0 @@
|
|||
# Settings
|
||||
|
||||

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

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

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

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

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

|
4
docs/guides.md
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Docs
|
||||
layout: guides
|
||||
---
|
|
@ -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)
|
||||
```
|
11
docs/help.md
|
@ -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**.
|
||||
|
||||

|
||||
|
||||
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.
|
|
@ -1,4 +0,0 @@
|
|||
History Templates
|
||||
-----------------
|
||||
|
||||
Coming soon.
|
|
@ -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.
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
The **History Templates** page on the History menu enables you to prepare reports with the exact content required by regulatory agencies in the territories that you are broadcasting to. You can begin creating a custom template by clicking the button **New Log Sheet Template** or the button **New File Summary Template**.
|
||||
|
||||

|
||||
|
||||
Either of these actions opens a page in which you can name the new template, and add or remove elements from the list on the left. To add a new element from the list on the right, click the plus icon for the item you require. If the element you require is not listed, you can use the **Add New Field** box at the lower end of the right side column. Select *string*, *boolean*, *integer*, or *float*, depending on the type of data that you wish to log, and then click the **+ Add** button.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
|
@ -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
|
|
@ -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
After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 544 KiB |
Before Width: | Height: | Size: 560 KiB |
Before Width: | Height: | Size: 282 KiB |
Before Width: | Height: | Size: 337 KiB |
Before Width: | Height: | Size: 317 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 6.5 KiB |
BIN
docs/img/Playlist-Editor.png
Normal file
After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 23 KiB |