Replace IceCast with IceCast-KH for stream performance and license reporting reasons.
This commit is contained in:
parent
8db197a3a3
commit
0ac6b02b3b
|
@ -183,7 +183,7 @@ class IceCast extends FrontendAbstract
|
|||
{
|
||||
$config_path = $this->station->getRadioConfigDir() . '/icecast.xml';
|
||||
|
||||
return '/usr/bin/icecast2 -c ' . $config_path;
|
||||
return '/usr/local/bin/icecast -c ' . $config_path;
|
||||
}
|
||||
|
||||
public function getStreamUrl()
|
||||
|
@ -264,12 +264,12 @@ class IceCast extends FrontendAbstract
|
|||
'limits' => [
|
||||
'clients' => 100,
|
||||
'sources' => 3,
|
||||
'threadpool' => 5,
|
||||
// 'threadpool' => 5,
|
||||
'queue-size' => 524288,
|
||||
'client-timeout' => 30,
|
||||
'header-timeout' => 15,
|
||||
'source-timeout' => 10,
|
||||
'burst-on-connect' => 1,
|
||||
// 'burst-on-connect' => 1,
|
||||
'burst-size' => 65535,
|
||||
],
|
||||
'authentication' => [
|
||||
|
@ -286,14 +286,15 @@ class IceCast extends FrontendAbstract
|
|||
'mount' => [],
|
||||
'fileserve' => 1,
|
||||
'paths' => [
|
||||
'basedir' => '/usr/share/icecast2',
|
||||
'basedir' => '/usr/local/share/icecast',
|
||||
'logdir' => $config_dir,
|
||||
'webroot' => '/usr/share/icecast2/web',
|
||||
'adminroot' => '/usr/share/icecast2/admin',
|
||||
'webroot' => '/usr/local/share/icecast/web',
|
||||
'adminroot' => '/usr/local/share/icecast/admin',
|
||||
'pidfile' => $config_dir . '/icecast.pid',
|
||||
'x-forwarded-for' => '127.0.0.1',
|
||||
'alias' => [
|
||||
'@source' => '/',
|
||||
'@destination' => '/status.xsl',
|
||||
'@dest' => '/status.xsl',
|
||||
],
|
||||
],
|
||||
'logging' => [
|
||||
|
|
|
@ -139,7 +139,7 @@ class ShoutCast2 extends FrontendAbstract
|
|||
public function getCommand()
|
||||
{
|
||||
$config_path = $this->station->getRadioConfigDir();
|
||||
$sc_binary = realpath(APP_INCLUDE_ROOT . '/..') . '/servers/sc_serv';
|
||||
$sc_binary = realpath(APP_INCLUDE_ROOT . '/..') . '/servers/shoutcast2/sc_serv';
|
||||
$sc_config = $config_path . '/sc_serv.conf';
|
||||
|
||||
return $sc_binary . ' ' . $sc_config;
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:import href="xml2json.xslt"/>
|
||||
<xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="UTF-8" media-type="application/json"/>
|
||||
<xsl:strip-space elements="*"/>
|
||||
|
||||
<!-- override imported transform variable to enable output -->
|
||||
<xsl:variable name="output">true</xsl:variable>
|
||||
|
||||
<!-- hide certain nodes from all sources -->
|
||||
<xsl:template match="icestats/source/max_listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/source/public"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/source/source_ip"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/source/slow_listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/source/*[contains(name(), 'total_bytes')]"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/source/user_agent" ><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
|
||||
<!-- hide certain global nodes -->
|
||||
<xsl:template match="icestats/sources"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/clients"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/stats"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="icestats/listeners"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
<xsl:template match="node()[contains(name(), 'connections')]"><xsl:if test="not(following-sibling::*)">"dummy":null}</xsl:if></xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -0,0 +1,215 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<!--
|
||||
Copyright (c) 2006,2008 Doeke Zanstra
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer. Redistributions in binary
|
||||
form must reproduce the above copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other materials provided with
|
||||
the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
|
||||
<xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="UTF-8" media-type="application/json"/>
|
||||
<xsl:strip-space elements="*"/>
|
||||
<!--default to no output-->
|
||||
<xsl:variable name="output">false</xsl:variable>
|
||||
|
||||
<!--constant-->
|
||||
<xsl:variable name="d">0123456789</xsl:variable>
|
||||
|
||||
<!-- ignore document text -->
|
||||
<xsl:template match="text()[preceding-sibling::node() or following-sibling::node()]"/>
|
||||
|
||||
<!-- string -->
|
||||
<xsl:template match="text()">
|
||||
<xsl:call-template name="escape-string">
|
||||
<xsl:with-param name="s" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Main template for escaping strings; used by above template and for object-properties
|
||||
Responsibilities: placed quotes around string, and chain up to next filter, escape-bs-string -->
|
||||
<xsl:template name="escape-string">
|
||||
<xsl:param name="s"/>
|
||||
<xsl:text>"</xsl:text>
|
||||
<xsl:call-template name="escape-bs-string">
|
||||
<xsl:with-param name="s" select="$s"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>"</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Escape the backslash (\) before everything else. -->
|
||||
<xsl:template name="escape-bs-string">
|
||||
<xsl:param name="s"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($s,'\')">
|
||||
<xsl:call-template name="escape-quot-string">
|
||||
<xsl:with-param name="s" select="concat(substring-before($s,'\'),'\\')"/>
|
||||
</xsl:call-template>
|
||||
<xsl:call-template name="escape-bs-string">
|
||||
<xsl:with-param name="s" select="substring-after($s,'\')"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:call-template name="escape-quot-string">
|
||||
<xsl:with-param name="s" select="$s"/>
|
||||
</xsl:call-template>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Escape the double quote ("). -->
|
||||
<xsl:template name="escape-quot-string">
|
||||
<xsl:param name="s"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($s,'"')">
|
||||
<xsl:call-template name="encode-string">
|
||||
<xsl:with-param name="s" select="concat(substring-before($s,'"'),'\"')"/>
|
||||
</xsl:call-template>
|
||||
<xsl:call-template name="escape-quot-string">
|
||||
<xsl:with-param name="s" select="substring-after($s,'"')"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:call-template name="encode-string">
|
||||
<xsl:with-param name="s" select="$s"/>
|
||||
</xsl:call-template>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Replace tab, line feed and/or carriage return by its matching escape code. Can't escape backslash
|
||||
or double quote here, because they don't replace characters (� becomes \t), but they prefix
|
||||
characters (\ becomes \\). Besides, backslash should be seperate anyway, because it should be
|
||||
processed first. This function can't do that. -->
|
||||
<xsl:template name="encode-string">
|
||||
<xsl:param name="s"/>
|
||||
<xsl:choose>
|
||||
<!-- tab -->
|
||||
<xsl:when test="contains($s,'	')">
|
||||
<xsl:call-template name="encode-string">
|
||||
<xsl:with-param name="s" select="concat(substring-before($s,'	'),'\t',substring-after($s,'	'))"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<!-- line feed -->
|
||||
<xsl:when test="contains($s,'
')">
|
||||
<xsl:call-template name="encode-string">
|
||||
<xsl:with-param name="s" select="concat(substring-before($s,'
'),'\n',substring-after($s,'
'))"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<!-- carriage return -->
|
||||
<xsl:when test="contains($s,'
')">
|
||||
<xsl:call-template name="encode-string">
|
||||
<xsl:with-param name="s" select="concat(substring-before($s,'
'),'\r',substring-after($s,'
'))"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise><xsl:value-of select="$s"/></xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- number (no support for javascript mantissa) -->
|
||||
<xsl:template match="text()[not(string(number())='NaN' or
|
||||
(starts-with(.,'0' ) and . != '0'))]">
|
||||
<xsl:value-of select="."/>
|
||||
</xsl:template>
|
||||
|
||||
<!-- boolean, case-insensitive -->
|
||||
<xsl:template match="text()[translate(.,'TRUE','true')='true']">true</xsl:template>
|
||||
<xsl:template match="text()[translate(.,'FALSE','false')='false']">false</xsl:template>
|
||||
|
||||
<!-- objects and arrays -->
|
||||
<xsl:template match="*" name="base">
|
||||
<xsl:choose>
|
||||
<!-- complete array -->
|
||||
<xsl:when test="(count(../*[name(current())=name()])=count(../*)) and count(../*[name(current())=name()])>1">
|
||||
<xsl:variable name="el" select="name()"/>
|
||||
<xsl:if test="not(following-sibling::*[name()=$el])">
|
||||
<xsl:text>[</xsl:text>
|
||||
<xsl:for-each select="../*[name()=$el]">
|
||||
<xsl:if test="position()!=1">,</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="not(child::node())">
|
||||
<xsl:text>null</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates select="child::node()"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
<xsl:text>]</xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
|
||||
<!-- partial array -->
|
||||
<xsl:when test="count(../*[name(current())=name()])>1">
|
||||
<xsl:if test="not(preceding-sibling::*)">{</xsl:if>
|
||||
<xsl:variable name="el" select="name()"/>
|
||||
<xsl:if test="not(following-sibling::*[name()=$el])">
|
||||
<xsl:call-template name="escape-string">
|
||||
<xsl:with-param name="s" select="$el"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>:[</xsl:text>
|
||||
<xsl:for-each select="../*[name()=$el]">
|
||||
<xsl:if test="position()!=1">,</xsl:if>
|
||||
<xsl:choose>
|
||||
<xsl:when test="not(child::node())">
|
||||
<xsl:text>null</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates select="child::node()"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
<xsl:text>]</xsl:text>
|
||||
<xsl:if test="following-sibling::*">,</xsl:if>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(following-sibling::*)">}</xsl:if>
|
||||
</xsl:when>
|
||||
|
||||
<!-- object -->
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="not(preceding-sibling::*)">{</xsl:if>
|
||||
<xsl:call-template name="escape-string">
|
||||
<xsl:with-param name="s" select="name()"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>:</xsl:text>
|
||||
<!-- check type of node -->
|
||||
<xsl:choose>
|
||||
<!-- null nodes -->
|
||||
<xsl:when test="count(child::node())=0">null</xsl:when>
|
||||
<!-- other nodes -->
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates select="child::node()"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<!-- end of type check -->
|
||||
<xsl:if test="following-sibling::*">,</xsl:if>
|
||||
<xsl:if test="not(following-sibling::*)">}</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- convert root element to an anonymous container -->
|
||||
<xsl:template match="/">
|
||||
<xsl:if test="$output='true'">
|
||||
<xsl:apply-templates select="node()"/>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -32,4 +32,4 @@ if [ $APP_ENV = "production" ]; then
|
|||
git reset --hard && git pull
|
||||
fi
|
||||
|
||||
ansible-playbook util/ansible/update.yml --inventory=util/ansible/hosts --extra-vars "app_env=$APP_ENV update_revision=3"
|
||||
ansible-playbook util/ansible/update.yml --inventory=util/ansible/hosts --extra-vars "app_env=$APP_ENV update_revision=4"
|
|
@ -25,4 +25,6 @@
|
|||
- "{{ tmp_base }}/sessions"
|
||||
- "{{ tmp_base }}/proxies"
|
||||
- "{{ app_base }}/stations"
|
||||
- "{{ app_base }}/servers"
|
||||
- "{{ app_base }}/servers"
|
||||
- "{{ app_base }}/servers/shoutcast2"
|
||||
- "{{ app_base }}/servers/icecast2"
|
|
@ -1,16 +1,43 @@
|
|||
---
|
||||
- name: Install IceCast2 (14.04)
|
||||
- name: Install IceCast-KH Dependencies
|
||||
become: true
|
||||
apt: deb=http://downloadcontent.opensuse.org/repositories/multimedia:/xiph/xUbuntu_14.04/amd64/icecast2_2.4.2-2_amd64.deb
|
||||
when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'trusty'
|
||||
apt: pkg="{{ item }}" install_recommends=no state=latest
|
||||
with_items:
|
||||
- libxml2
|
||||
- libxslt1-dev
|
||||
- libvorbis-dev
|
||||
- libcurl4-openssl-dev
|
||||
- pkg-config
|
||||
|
||||
- name: Install IceCast2 (16.04)
|
||||
- name: Download IceCast-KH Source
|
||||
get_url:
|
||||
url: https://github.com/karlheyes/icecast-kh/archive/icecast-2.4.0-kh5.tar.gz
|
||||
dest: "{{ app_base }}/servers/icecast2/icecast2.tar.gz"
|
||||
|
||||
- name: Extract IceCast-KH Source
|
||||
unarchive:
|
||||
src: "{{ app_base }}/servers/icecast2/icecast2.tar.gz"
|
||||
dest: "{{ app_base }}/servers/icecast2"
|
||||
remote_src: yes
|
||||
creates: "{{ app_base }}/servers/icecast2/configure"
|
||||
mode: "u=rwx,g=rx,o=rx"
|
||||
owner: "azuracast"
|
||||
group: "www-data"
|
||||
extra_opts: "--strip-components=1"
|
||||
|
||||
- name: Build IceCast-KH
|
||||
become: true
|
||||
apt: pkg=icecast2 state=latest
|
||||
when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'xenial'
|
||||
shell: "cd {{ app_base }}/servers/icecast2 && ./configure && make && make install"
|
||||
args:
|
||||
chdir: "{{ app_base }}/servers/icecast2"
|
||||
creates: "/usr/local/bin/icecast"
|
||||
|
||||
- name: Link Fallback Error MP3
|
||||
file: src="{{ www_base }}/resources/error.mp3" dest="/usr/share/icecast2/web/error.mp3" state=link
|
||||
- name: Link IceCast Resource Files
|
||||
file: src="{{ item.src }}" dest="{{ item.dest }}" state=link
|
||||
with_items:
|
||||
- { src: "{{ www_base }}/resources/error.mp3", dest: "/usr/local/share/icecast/web/error.mp3" }
|
||||
- { src: "{{ www_base }}/resources/status-json.xsl", dest: "/usr/local/share/icecast/web/status-json.xsl" }
|
||||
- { src: "{{ www_base }}/resources/xml2json.xslt", dest: "/usr/local/share/icecast/web/xml2json.xslt" }
|
||||
|
||||
- name: Remove problematic LiquidSoap plugins
|
||||
become: true
|
||||
|
@ -33,21 +60,21 @@
|
|||
- name: Download ShoutCast 2 (x86)
|
||||
get_url:
|
||||
url: http://download.nullsoft.com/shoutcast/tools/sc_serv2_linux-latest.tar.gz
|
||||
dest: "{{ app_base }}/servers/sc_serv.tar.gz"
|
||||
dest: "{{ app_base }}/servers/shoutcast2/sc_serv.tar.gz"
|
||||
when: ansible_architecture == 'i386'
|
||||
|
||||
- name: Download ShoutCast 2 (x64)
|
||||
get_url:
|
||||
url: http://download.nullsoft.com/shoutcast/tools/sc_serv2_linux_x64-latest.tar.gz
|
||||
dest: "{{ app_base }}/servers/sc_serv.tar.gz"
|
||||
dest: "{{ app_base }}/servers/shoutcast2/sc_serv.tar.gz"
|
||||
when: ansible_architecture == 'x86_64'
|
||||
|
||||
- name: Extract ShoutCast 2 Binary
|
||||
unarchive:
|
||||
src: "{{ app_base }}/servers/sc_serv.tar.gz"
|
||||
dest: "{{ app_base }}/servers/"
|
||||
src: "{{ app_base }}/servers/shoutcast2/sc_serv.tar.gz"
|
||||
dest: "{{ app_base }}/servers/shoutcast2"
|
||||
remote_src: yes
|
||||
creates: "{{ app_base }}/servers/sc_serv"
|
||||
creates: "{{ app_base }}/servers/shoutcast2/sc_serv"
|
||||
mode: "u=rwx,g=rx,o=rx"
|
||||
owner: "azuracast"
|
||||
group: "www-data"
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
roles:
|
||||
- init
|
||||
- azuracast-config
|
||||
- { role: azuracast-radio, when: update_revision|int < 2 }
|
||||
- { role: azuracast-radio, when: update_revision|int < 4 }
|
||||
- { role: nginx, when: update_revision|int < 2 }
|
||||
- { role: php, when: update_revision|int < 3 }
|
||||
- { role: influxdb, when: update_revision|int < 2 }
|
||||
|
|
Loading…
Reference in New Issue