mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-12-04 14:46:30 -05:00
Merge branch 'ph3-web'
Thanks to Marvin Scholz for all the great work!
This commit is contained in:
commit
b419a500ac
@ -4,17 +4,16 @@
|
|||||||
<xsl:variable name="title">Error</xsl:variable>
|
<xsl:variable name="title">Error</xsl:variable>
|
||||||
|
|
||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<div class="roundbox">
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
<xsl:for-each select="/report/incident">
|
<xsl:for-each select="/report/incident">
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Response</h3>
|
<h3 class="box_title">Response</h3>
|
||||||
<h4>Message</h4>
|
<h4>Message</h4>
|
||||||
<p><xsl:value-of select="state/text" /></p>
|
<p><xsl:value-of select="state/text" /></p>
|
||||||
<xsl:if test="state/@definition">
|
<xsl:if test="state/@definition">
|
||||||
<p>Error code: <xsl:value-of select="state/@definition" /></p>
|
<p>Error code: <xsl:value-of select="state/@definition" /></p>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
</div>
|
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -5,8 +5,12 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title><xsl:if test="$title"><xsl:value-of select="$title"/> — </xsl:if>Icecast Admin</title>
|
<title><xsl:if test="$title"><xsl:value-of select="$title"/> — </xsl:if>Icecast Admin</title>
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="/assets/css/style.css" />
|
<link rel="stylesheet" type="text/css" href="/assets/css/style.css" />
|
||||||
|
|
||||||
|
<meta name="theme-color" content="#001826" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||||
<meta name="description" content="Icecast Server status page" />
|
<meta name="description" content="Icecast Server status page" />
|
||||||
</head>
|
</head>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -2,27 +2,24 @@
|
|||||||
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
||||||
<xsl:template name="header">
|
<xsl:template name="header">
|
||||||
|
|
||||||
<div class="header">
|
<header>
|
||||||
<h1>
|
<nav id="main-nav" role="primary">
|
||||||
<a href="/" title="Home page">Icecast</a>
|
<a href="/" id="branding">
|
||||||
<xsl:text> </xsl:text>
|
<img src="/assets/img/icecast.png" alt="Logo" />
|
||||||
<span>administration</span>
|
<h1>Icecast Server administration</h1>
|
||||||
</h1>
|
</a>
|
||||||
<div class="nav">
|
|
||||||
<label for="toggle-nav" class="nobar" title="Toggle navigation"></label>
|
|
||||||
<input type="checkbox" id="toggle-nav" />
|
|
||||||
<ul>
|
<ul>
|
||||||
<li class="on"><a href="/admin/stats.xsl">Administration</a></li>
|
<li class="adminlink"><a href="/admin/stats.xsl">Server status</a></li>
|
||||||
<li><a href="/admin/listmounts.xsl">Mountpoint list</a></li>
|
<li class="adminlink"><a href="/admin/listmounts.xsl">Mountpoint list</a></li>
|
||||||
<xsl:for-each select="(/report/extension/icestats | /icestats | /iceresponse)/modules/module">
|
<xsl:for-each select="(/report/extension/icestats | /icestats | /iceresponse)/modules/module">
|
||||||
<xsl:if test="@management-url and @management-title">
|
<xsl:if test="@management-url and @management-title">
|
||||||
<li><a href="{@management-url}"><xsl:value-of select="@management-title" /></a></li>
|
<li class="adminlink"><a href="{@management-url}"><xsl:value-of select="@management-title" /></a></li>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
<li><a href="/status.xsl">Public area</a></li>
|
<li class="right"><a href="/status.xsl">Public area</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</nav>
|
||||||
</div>
|
</header>
|
||||||
|
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -2,13 +2,14 @@
|
|||||||
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
||||||
<xsl:template name="mountnav">
|
<xsl:template name="mountnav">
|
||||||
<xsl:param name="mount" select="@mount"/>
|
<xsl:param name="mount" select="@mount"/>
|
||||||
<div class="nav">
|
<div class="mountnav">
|
||||||
<ul>
|
<ul class="boxnav">
|
||||||
|
<li><a href="stats.xsl?mount={$mount}#mount-1">Details</a></li>
|
||||||
<li><a href="listclients.xsl?mount={$mount}">Clients</a></li>
|
<li><a href="listclients.xsl?mount={$mount}">Clients</a></li>
|
||||||
<li><a href="moveclients.xsl?mount={$mount}">Move listeners</a></li>
|
<li><a href="moveclients.xsl?mount={$mount}">Move listeners</a></li>
|
||||||
<li><a href="updatemetadata.xsl?mount={$mount}">Metadata</a></li>
|
<li><a href="updatemetadata.xsl?mount={$mount}">Metadata</a></li>
|
||||||
<li><a href="killsource.xsl?mount={$mount}">Kill source</a></li>
|
<li class="critical"><a href="killsource.xsl?mount={$mount}">Kill source</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -16,10 +16,14 @@
|
|||||||
<!-- Header/Menu -->
|
<!-- Header/Menu -->
|
||||||
<xsl:call-template name="header" />
|
<xsl:call-template name="header" />
|
||||||
|
|
||||||
<xsl:call-template name="content" />
|
<main role="main">
|
||||||
|
<xsl:call-template name="content" />
|
||||||
|
</main>
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<xsl:call-template name="footer" />
|
<footer>
|
||||||
|
<xsl:call-template name="footer" />
|
||||||
|
</footer>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
24
admin/includes/player.xsl
Normal file
24
admin/includes/player.xsl
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
|
||||||
|
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
||||||
|
<xsl:template name="player">
|
||||||
|
<div>
|
||||||
|
<ul class="playlists">
|
||||||
|
<li><a href="{@mount}">Direct</a></li>
|
||||||
|
<li><a href="{@mount}.m3u">M3U</a></li>
|
||||||
|
<li><a href="{@mount}.xspf">XSPF</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Playlists section -->
|
||||||
|
<h4>Play stream</h4>
|
||||||
|
|
||||||
|
<!-- Player -->
|
||||||
|
<xsl:if test="content-type and ((content-type = 'application/ogg') or (content-type = 'audio/ogg') or (content-type = 'audio/webm'))">
|
||||||
|
<div class="audioplayer">
|
||||||
|
<audio controls="controls" preload="none">
|
||||||
|
<source src="{@mount}" type="{content-type}" />
|
||||||
|
</audio>
|
||||||
|
</div>
|
||||||
|
</xsl:if>
|
||||||
|
</div>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
30
admin/includes/playlist.xsl
Normal file
30
admin/includes/playlist.xsl
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
|
||||||
|
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
||||||
|
<xsl:template name="playlist">
|
||||||
|
<xsl:if test="playlist/*">
|
||||||
|
<h4>Playlist</h4>
|
||||||
|
<div class="playlist-container">
|
||||||
|
<table class="table-block">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Album</th>
|
||||||
|
<th width="10%">Track</th>
|
||||||
|
<th>Creator</th>
|
||||||
|
<th width="33%">Title</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<xsl:for-each select="playlist/trackList/track">
|
||||||
|
<tr>
|
||||||
|
<td><xsl:value-of select="album" /></td>
|
||||||
|
<td><xsl:value-of select="trackNum" /></td>
|
||||||
|
<td><xsl:value-of select="creator" /></td>
|
||||||
|
<td><xsl:value-of select="title" /></td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</xsl:if>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
@ -1,30 +1,47 @@
|
|||||||
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns="http://www.w3.org/1999/xhtml">
|
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
|
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
|
||||||
<!-- Import include files -->
|
<!-- Import include files -->
|
||||||
|
|
||||||
<xsl:template match="/node()">
|
<xsl:template match="/node()">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title><xsl:value-of select="$title"/> — Icecast Streaming Media Server</title>
|
<meta charset="utf-8" />
|
||||||
<link rel="stylesheet" type="text/css" href="style.css" />
|
<title><xsl:value-of select="$title"/> — Icecast Server</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
</head>
|
<link rel="stylesheet" type="text/css" href="/assets/css/style.css" media="screen, print" />
|
||||||
<body>
|
|
||||||
<h1 id="header">Icecast <xsl:value-of select="$title"/></h1>
|
<meta name="theme-color" content="#001826" />
|
||||||
<!--index header menu -->
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||||
<div id="menu">
|
<meta name="description" content="Icecast is free server software for streaming multimedia." />
|
||||||
<ul>
|
</head>
|
||||||
<li><a href="admin/">Administration</a></li>
|
<body>
|
||||||
<li><a href="status.xsl">Server Status</a></li>
|
<!-- Header and menu -->
|
||||||
<li><a href="server_version.xsl">Version</a></li>
|
<header>
|
||||||
</ul>
|
<nav id="main-nav" role="primary">
|
||||||
</div>
|
<a href="/" id="branding">
|
||||||
<!--end index header menu -->
|
<img src="/assets/img/icecast.png" alt="Logo" />
|
||||||
<xsl:call-template name="content" namespace="http://www.w3.org/1999/xhtml" />
|
<h1>Icecast Server</h1>
|
||||||
<div id="footer">
|
</a>
|
||||||
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
|
<ul>
|
||||||
</div>
|
<li><a href="/status.xsl">Status</a></li>
|
||||||
</body>
|
<li><a href="/server_version.xsl">Version</a></li>
|
||||||
</html>
|
<li class="right adminlink"><a href="/admin/">Administration</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!--<h1 id="header">Icecast <xsl:value-of select="$title"/></h1>-->
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<main role="main">
|
||||||
|
<xsl:call-template name="content" namespace="http://www.w3.org/1999/xhtml" />
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<footer>
|
||||||
|
<p>Support icecast development at <a href="http://icecast.org">icecast.org</a></p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -11,10 +11,11 @@
|
|||||||
<h2><xsl:value-of select="$title" /></h2>
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
|
|
||||||
<xsl:for-each select="source">
|
<xsl:for-each select="source">
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<!-- Mount nav -->
|
<!-- Mount nav -->
|
||||||
<xsl:call-template name="mountnav" />
|
<xsl:call-template name="mountnav" />
|
||||||
|
<h4>Listeners</h4>
|
||||||
<xsl:choose>
|
<xsl:choose>
|
||||||
<xsl:when test="listener">
|
<xsl:when test="listener">
|
||||||
<table class="table-flipscroll">
|
<table class="table-flipscroll">
|
||||||
@ -25,7 +26,7 @@
|
|||||||
<th>Role</th>
|
<th>Role</th>
|
||||||
<th>Sec. connected</th>
|
<th>Sec. connected</th>
|
||||||
<th>User Agent</th>
|
<th>User Agent</th>
|
||||||
<th>Action</th>
|
<th class="actions">Action</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -36,9 +37,8 @@
|
|||||||
<td><xsl:value-of select="role" /></td>
|
<td><xsl:value-of select="role" /></td>
|
||||||
<td><xsl:value-of select="connected" /></td>
|
<td><xsl:value-of select="connected" /></td>
|
||||||
<td><xsl:value-of select="useragent" /></td>
|
<td><xsl:value-of select="useragent" /></td>
|
||||||
<td>
|
<td class="actions">
|
||||||
<a href="killclient.xsl?mount={../@mount}&id={id}">Kick</a>
|
<a class="critical" href="killclient.xsl?mount={../@mount}&id={id}">Kick</a>
|
||||||
 
|
|
||||||
<a href="moveclients.xsl?mount={../@mount}&id={id}">Move</a>
|
<a href="moveclients.xsl?mount={../@mount}&id={id}">Move</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -50,7 +50,7 @@
|
|||||||
<p>No listeners connected</p>
|
<p>No listeners connected</p>
|
||||||
</xsl:otherwise>
|
</xsl:otherwise>
|
||||||
</xsl:choose>
|
</xsl:choose>
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
<!-- Import include files -->
|
<!-- Import include files -->
|
||||||
<xsl:include href="includes/page.xsl"/>
|
<xsl:include href="includes/page.xsl"/>
|
||||||
<xsl:include href="includes/mountnav.xsl"/>
|
<xsl:include href="includes/mountnav.xsl"/>
|
||||||
|
<xsl:include href="includes/player.xsl"/>
|
||||||
|
|
||||||
<xsl:variable name="title">Active Mountpoints</xsl:variable>
|
<xsl:variable name="title">Active Mountpoints</xsl:variable>
|
||||||
|
|
||||||
@ -37,23 +38,11 @@
|
|||||||
<xsl:choose>
|
<xsl:choose>
|
||||||
<xsl:when test="source">
|
<xsl:when test="source">
|
||||||
<xsl:for-each select="source">
|
<xsl:for-each select="source">
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<!-- Mount nav -->
|
<!-- Mount nav -->
|
||||||
<xsl:call-template name="mountnav" />
|
<xsl:call-template name="mountnav" />
|
||||||
<h4>Play stream</h4>
|
<xsl:call-template name="player" />
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="authenticator">
|
|
||||||
<a class="play" href="/auth.xsl">Auth</a>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<a class="play" href="{@mount}.m3u">► <span>M3U</span></a>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a class="play" href="{@mount}.xspf">► <span>XSPF</span></a>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a class="play" href="{@mount}.vclt">► <span>VCLT</span></a>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
<p><xsl:value-of select="listeners" /> Listener(s)</p>
|
<p><xsl:value-of select="listeners" /> Listener(s)</p>
|
||||||
|
|
||||||
<!-- Mount Authentication -->
|
<!-- Mount Authentication -->
|
||||||
@ -61,13 +50,13 @@
|
|||||||
<h4>Mount Authentication</h4>
|
<h4>Mount Authentication</h4>
|
||||||
<xsl:call-template name="authlist" />
|
<xsl:call-template name="authlist" />
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
</xsl:when>
|
</xsl:when>
|
||||||
<xsl:otherwise>
|
<xsl:otherwise>
|
||||||
<div class="aside error">
|
<aside class="info">
|
||||||
<strong>No mounts!</strong> There are no active mountpoints.
|
<strong>No mounts!</strong> There are no active mountpoints.
|
||||||
</div>
|
</aside>
|
||||||
</xsl:otherwise>
|
</xsl:otherwise>
|
||||||
</xsl:choose>
|
</xsl:choose>
|
||||||
</div>
|
</div>
|
||||||
|
@ -10,13 +10,13 @@
|
|||||||
<div class="section">
|
<div class="section">
|
||||||
<h2><xsl:value-of select="$title" /></h2>
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
<xsl:if test="iceresponse">
|
<xsl:if test="iceresponse">
|
||||||
<div class="aside error">
|
<aside class="error">
|
||||||
<xsl:value-of select="iceresponse/message" />
|
<xsl:value-of select="iceresponse/message" />
|
||||||
</div>
|
</aside>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
<xsl:for-each select="role">
|
<xsl:for-each select="role">
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Role <xsl:value-of select="@name" /> (<xsl:value-of select="@type" />)
|
<h3 class="box_title">Role <code><xsl:value-of select="@name" /></code> (<code><xsl:value-of select="@type" /></code>)
|
||||||
<xsl:if test="server_name">
|
<xsl:if test="server_name">
|
||||||
<xsl:text> </xsl:text><small><xsl:value-of select="server_name" /></small>
|
<xsl:text> </xsl:text><small><xsl:value-of select="server_name" /></small>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
@ -28,7 +28,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>User</th>
|
<th>User</th>
|
||||||
<xsl:if test="@can-deleteuser = 'true'">
|
<xsl:if test="@can-deleteuser = 'true'">
|
||||||
<th>Action</th>
|
<th class="actions">Action</th>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -37,8 +37,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td><xsl:value-of select="username" /></td>
|
<td><xsl:value-of select="username" /></td>
|
||||||
<xsl:if test="../../@can-deleteuser = 'true'">
|
<xsl:if test="../../@can-deleteuser = 'true'">
|
||||||
<td>
|
<td class="actions">
|
||||||
<a href="manageauth.xsl?id={../../@id}&username={username}&action=delete">Delete</a>
|
<a class="critical" href="manageauth.xsl?id={../../@id}&username={username}&action=delete">Delete</a>
|
||||||
</td>
|
</td>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</tr>
|
</tr>
|
||||||
@ -54,16 +54,19 @@
|
|||||||
<xsl:if test="@can-adduser = 'true'">
|
<xsl:if test="@can-adduser = 'true'">
|
||||||
<h4>Add User</h4>
|
<h4>Add User</h4>
|
||||||
<form method="post" action="manageauth.xsl">
|
<form method="post" action="manageauth.xsl">
|
||||||
<label for="username" class="hidden">Username</label>
|
|
||||||
<input type="text" id="username" name="username" value="" placeholder="Username" required="required" />
|
|
||||||
<label for="password" class="hidden">Password</label>
|
|
||||||
<input type="password" id="password" name="password" value="" placeholder="Password" required="required" />
|
|
||||||
<input type="hidden" name="id" value="{@id}"/>
|
<input type="hidden" name="id" value="{@id}"/>
|
||||||
<input type="hidden" name="action" value="add"/>
|
<input type="hidden" name="action" value="add"/>
|
||||||
|
|
||||||
|
<label for="username" class="hidden">Username: </label>
|
||||||
|
<input type="text" id="username" name="username" value="" placeholder="Username" required="required" />
|
||||||
|
 
|
||||||
|
<label for="password" class="hidden">Password: </label>
|
||||||
|
<input type="password" id="password" name="password" value="" placeholder="Password" required="required" />
|
||||||
|
 
|
||||||
<input type="submit" value="Add new user" />
|
<input type="submit" value="Add new user" />
|
||||||
</form>
|
</form>
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
</div>
|
</div>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<h2><xsl:value-of select="$title" /></h2>
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Mountpoint <xsl:value-of select="current_source" /></h3>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<!-- Mount nav -->
|
<!-- Mount nav -->
|
||||||
<xsl:call-template name="mountnav">
|
<xsl:call-template name="mountnav">
|
||||||
<xsl:with-param name="mount" select="current_source"/>
|
<xsl:with-param name="mount" select="current_source"/>
|
||||||
@ -38,17 +38,18 @@
|
|||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
</select>
|
</select>
|
||||||
<input type="hidden" name="mount" value="{current_source}" />
|
<input type="hidden" name="mount" value="{current_source}" />
|
||||||
|
 
|
||||||
<input type="submit" value="Move listeners" />
|
<input type="submit" value="Move listeners" />
|
||||||
</form>
|
</form>
|
||||||
</xsl:when>
|
</xsl:when>
|
||||||
<xsl:otherwise>
|
<xsl:otherwise>
|
||||||
<p>
|
<aside class="warning">
|
||||||
<strong>No mounts!</strong>
|
<strong>No mounts!</strong>
|
||||||
There are no other mountpoints you could move the listeners to.
|
There are no other mountpoints you could move the listeners to.
|
||||||
</p>
|
</aside>
|
||||||
</xsl:otherwise>
|
</xsl:otherwise>
|
||||||
</xsl:choose>
|
</xsl:choose>
|
||||||
</div>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -6,16 +6,14 @@
|
|||||||
<xsl:variable name="title">Server Response</xsl:variable>
|
<xsl:variable name="title">Server Response</xsl:variable>
|
||||||
|
|
||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<div class="section">
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
<h2><xsl:value-of select="$title" /></h2>
|
<xsl:for-each select="/iceresponse">
|
||||||
<xsl:for-each select="/iceresponse">
|
<section class="box">
|
||||||
<div class="article">
|
<h3 class="box_title">Response</h3>
|
||||||
<h3>Response</h3>
|
<h4>Message</h4>
|
||||||
<h4>Message</h4>
|
<p><xsl:value-of select="message" /></p>
|
||||||
<p><xsl:value-of select="message" /></p>
|
<p>(Return Code: <xsl:value-of select="return" />)</p>
|
||||||
<p>(Return Code: <xsl:value-of select="return" />)</p>
|
</section>
|
||||||
</div>
|
</xsl:for-each>
|
||||||
</xsl:for-each>
|
|
||||||
</div>
|
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -3,8 +3,12 @@
|
|||||||
<!-- Import include files -->
|
<!-- Import include files -->
|
||||||
<xsl:include href="includes/page.xsl"/>
|
<xsl:include href="includes/page.xsl"/>
|
||||||
<xsl:include href="includes/mountnav.xsl"/>
|
<xsl:include href="includes/mountnav.xsl"/>
|
||||||
|
<xsl:include href="includes/player.xsl"/>
|
||||||
|
<xsl:include href="includes/playlist.xsl"/>
|
||||||
|
|
||||||
<xsl:variable name="title">Stats</xsl:variable>
|
<xsl:param name="param-showall" />
|
||||||
|
<xsl:param name="param-has-mount" />
|
||||||
|
<xsl:variable name="title">Server status</xsl:variable>
|
||||||
|
|
||||||
<!-- Auth template -->
|
<!-- Auth template -->
|
||||||
<xsl:template name="authlist">
|
<xsl:template name="authlist">
|
||||||
@ -32,18 +36,21 @@
|
|||||||
|
|
||||||
|
|
||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<div class="section">
|
<h2>Server status</h2>
|
||||||
<h2>Administration</h2>
|
|
||||||
|
|
||||||
<!-- Global stats table -->
|
<!-- Global stats table -->
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Global server stats</h3>
|
<h3 class="box_title">Global server stats</h3>
|
||||||
<!-- Global subnav -->
|
<!-- Global subnav -->
|
||||||
<div class="nav">
|
<div class="stats">
|
||||||
<ul>
|
<ul class="boxnav">
|
||||||
<li><a href="reloadconfig.xsl">Reload Configuration</a></li>
|
<li><a href="reloadconfig.xsl">Reload Configuration</a></li>
|
||||||
|
<li><a href="?showall=true">Show all mounts</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h4>Statistics</h4>
|
||||||
|
|
||||||
<table class="table-block">
|
<table class="table-block">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -52,7 +59,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<xsl:for-each select="/icestats/*[not(self::source) and not(self::authentication)]">
|
<xsl:for-each select="/icestats/*[not(self::source) and not(self::authentication) and not(self::modules)]">
|
||||||
<tr>
|
<tr>
|
||||||
<td><xsl:value-of select="name()" /></td>
|
<td><xsl:value-of select="name()" /></td>
|
||||||
<td><xsl:value-of select="text()" /></td>
|
<td><xsl:value-of select="text()" /></td>
|
||||||
@ -66,27 +73,16 @@
|
|||||||
<h4>Authentication</h4>
|
<h4>Authentication</h4>
|
||||||
<xsl:call-template name="authlist" />
|
<xsl:call-template name="authlist" />
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</div>
|
</section>
|
||||||
|
|
||||||
<!-- Mount stats -->
|
<!-- Mount stats -->
|
||||||
|
<xsl:if test="$param-showall or $param-has-mount">
|
||||||
<xsl:for-each select="source">
|
<xsl:for-each select="source">
|
||||||
<div class="article">
|
<section class="box" id="mount-{position()}">
|
||||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<!-- Mount nav -->
|
<!-- Mount nav -->
|
||||||
<xsl:call-template name="mountnav" />
|
<xsl:call-template name="mountnav" />
|
||||||
<h4>Play stream</h4>
|
<xsl:call-template name="player" />
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="authenticator">
|
|
||||||
<a class="play" href="/auth.xsl">Auth</a>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<a class="play" href="{@mount}.m3u">► <span>M3U</span></a>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a class="play" href="{@mount}.xspf">► <span>XSPF</span></a>
|
|
||||||
<xsl:text> </xsl:text>
|
|
||||||
<a class="play" href="{@mount}.vclt">► <span>VCLT</span></a>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
<h4>Further information</h4>
|
<h4>Further information</h4>
|
||||||
<table class="table-block">
|
<table class="table-block">
|
||||||
<thead>
|
<thead>
|
||||||
@ -121,36 +117,16 @@
|
|||||||
</xsl:if>
|
</xsl:if>
|
||||||
|
|
||||||
<!-- Extra playlist -->
|
<!-- Extra playlist -->
|
||||||
<xsl:if test="playlist/*">
|
<xsl:call-template name="playlist" />
|
||||||
<h4>Playlist</h4>
|
|
||||||
<table class="table-block">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th>Album</th>
|
|
||||||
<th>Track</th>
|
|
||||||
<th>Creator</th>
|
|
||||||
<th>Title</th>
|
|
||||||
</tr>
|
|
||||||
<xsl:for-each select="playlist/trackList/track">
|
|
||||||
<tr>
|
|
||||||
<td><xsl:value-of select="album" /></td>
|
|
||||||
<td><xsl:value-of select="trackNum" /></td>
|
|
||||||
<td><xsl:value-of select="creator" /></td>
|
|
||||||
<td><xsl:value-of select="title" /></td>
|
|
||||||
</tr>
|
|
||||||
</xsl:for-each>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</xsl:if>
|
|
||||||
|
|
||||||
<!-- Mount Authentication -->
|
<!-- Mount Authentication -->
|
||||||
<xsl:if test="authentication">
|
<xsl:if test="authentication/*">
|
||||||
<h4>Mount Authentication</h4>
|
<h4>Mount Authentication</h4>
|
||||||
<xsl:call-template name="authlist" />
|
<xsl:call-template name="authlist" />
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
|
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
</div>
|
</xsl:if>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
@ -11,19 +11,28 @@
|
|||||||
<h2><xsl:value-of select="$title" /></h2>
|
<h2><xsl:value-of select="$title" /></h2>
|
||||||
|
|
||||||
<xsl:for-each select="source">
|
<xsl:for-each select="source">
|
||||||
<div class="article">
|
<section class="box">
|
||||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<!-- Mount nav -->
|
<!-- Mount nav -->
|
||||||
<xsl:call-template name="mountnav" />
|
<xsl:call-template name="mountnav" />
|
||||||
|
<h4>Update Metadata</h4>
|
||||||
|
<xsl:if test="content-type and not((content-type = 'application/mpeg') or (content-type = 'audio/aac') or (content-type = 'audio/aacp'))">
|
||||||
|
<aside class="warning">
|
||||||
|
<strong>Warning</strong>
|
||||||
|
This is only supported for legacy codecs using ICY as transport such as MP3 and AAC.
|
||||||
|
</aside>
|
||||||
|
</xsl:if>
|
||||||
<form method="post" action="/admin/metadata.xsl">
|
<form method="post" action="/admin/metadata.xsl">
|
||||||
<label for="metadata" class="hidden">Metadata</label>
|
|
||||||
<input type="text" id="metadata" name="song" value="" placeholder="Click to edit" required="required" />
|
|
||||||
<input type="hidden" name="mount" value="{@mount}" />
|
<input type="hidden" name="mount" value="{@mount}" />
|
||||||
<input type="hidden" name="mode" value="updinfo" />
|
<input type="hidden" name="mode" value="updinfo" />
|
||||||
<input type="hidden" name="charset" value="UTF-8" />
|
<input type="hidden" name="charset" value="UTF-8" />
|
||||||
|
|
||||||
|
<label for="metadata" class="hidden">Metadata:</label>
|
||||||
|
<input type="text" id="metadata" name="song" value="" placeholder="Click to edit" required="required" />
|
||||||
|
 
|
||||||
<input type="submit" value="Update Metadata" />
|
<input type="submit" value="Update Metadata" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</section>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
17
src/admin.c
17
src/admin.c
@ -462,6 +462,8 @@ void admin_send_response(xmlDocPtr doc,
|
|||||||
char *fullpath_xslt_template;
|
char *fullpath_xslt_template;
|
||||||
size_t fullpath_xslt_template_len;
|
size_t fullpath_xslt_template_len;
|
||||||
ice_config_t *config = config_get_config();
|
ice_config_t *config = config_get_config();
|
||||||
|
const char *showall;
|
||||||
|
const char *mount;
|
||||||
|
|
||||||
fullpath_xslt_template_len = strlen(config->adminroot_dir) + strlen(xslt_template) + strlen(PATH_SEPARATOR) + 1;
|
fullpath_xslt_template_len = strlen(config->adminroot_dir) + strlen(xslt_template) + strlen(PATH_SEPARATOR) + 1;
|
||||||
fullpath_xslt_template = malloc(fullpath_xslt_template_len);
|
fullpath_xslt_template = malloc(fullpath_xslt_template_len);
|
||||||
@ -470,7 +472,17 @@ void admin_send_response(xmlDocPtr doc,
|
|||||||
config_release_config();
|
config_release_config();
|
||||||
|
|
||||||
ICECAST_LOG_DEBUG("Sending XSLT (%s)", fullpath_xslt_template);
|
ICECAST_LOG_DEBUG("Sending XSLT (%s)", fullpath_xslt_template);
|
||||||
xslt_transform(doc, fullpath_xslt_template, client, 200, NULL);
|
|
||||||
|
COMMAND_OPTIONAL(client, "showall", showall);
|
||||||
|
COMMAND_OPTIONAL(client, "mount", mount);
|
||||||
|
|
||||||
|
if (showall && util_str_to_bool(showall)) {
|
||||||
|
const char *params[] = {"param-has-mount", mount ? "'true'" : NULL, "param-showall", "'true'", NULL};
|
||||||
|
xslt_transform(doc, fullpath_xslt_template, client, 200, NULL, params);
|
||||||
|
} else {
|
||||||
|
const char *params[] = {"param-has-mount", mount ? "'true'" : NULL, "param-showall", NULL, NULL};
|
||||||
|
xslt_transform(doc, fullpath_xslt_template, client, 200, NULL, params);
|
||||||
|
}
|
||||||
free(fullpath_xslt_template);
|
free(fullpath_xslt_template);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1238,6 +1250,9 @@ static void command_updatemetadata(client_t *client,
|
|||||||
node = admin_build_rootnode(doc, "icestats");
|
node = admin_build_rootnode(doc, "icestats");
|
||||||
srcnode = xmlNewChild(node, NULL, XMLSTR("source"), NULL);
|
srcnode = xmlNewChild(node, NULL, XMLSTR("source"), NULL);
|
||||||
xmlSetProp(srcnode, XMLSTR("mount"), XMLSTR(source->mount));
|
xmlSetProp(srcnode, XMLSTR("mount"), XMLSTR(source->mount));
|
||||||
|
if (source->running) {
|
||||||
|
xmlNewTextChild(srcnode, NULL, XMLSTR("content-type"), XMLSTR(source->format->contenttype));
|
||||||
|
}
|
||||||
xmlDocSetRootElement(doc, node);
|
xmlDocSetRootElement(doc, node);
|
||||||
|
|
||||||
admin_send_response(doc, client, response,
|
admin_send_response(doc, client, response,
|
||||||
|
@ -642,7 +642,7 @@ void client_send_reportxml(client_t *client, reportxml_t *report, document_domai
|
|||||||
|
|
||||||
ICECAST_LOG_DEBUG("Sending XSLT (%s)", fullpath_xslt_template);
|
ICECAST_LOG_DEBUG("Sending XSLT (%s)", fullpath_xslt_template);
|
||||||
fastevent_emit(FASTEVENT_TYPE_CLIENT_SEND_RESPONSE, FASTEVENT_FLAG_MODIFICATION_ALLOWED, FASTEVENT_DATATYPE_CLIENT, client);
|
fastevent_emit(FASTEVENT_TYPE_CLIENT_SEND_RESPONSE, FASTEVENT_FLAG_MODIFICATION_ALLOWED, FASTEVENT_DATATYPE_CLIENT, client);
|
||||||
xslt_transform(doc, fullpath_xslt_template, client, status, location);
|
xslt_transform(doc, fullpath_xslt_template, client, status, location, NULL);
|
||||||
free(fullpath_xslt_template);
|
free(fullpath_xslt_template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,6 +903,9 @@ static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, i
|
|||||||
for (i = 0; i < source_real->format->vc.comments; i++)
|
for (i = 0; i < source_real->format->vc.comments; i++)
|
||||||
__add_metadata(metadata, source_real->format->vc.user_comments[i]);
|
__add_metadata(metadata, source_real->format->vc.user_comments[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (source_real->running)
|
||||||
|
xmlNewTextChild(xmlnode, NULL, XMLSTR("content-type"), XMLSTR(source_real->format->contenttype));
|
||||||
}
|
}
|
||||||
avl_tree_unlock(global.source_tree);
|
avl_tree_unlock(global.source_tree);
|
||||||
|
|
||||||
@ -1050,7 +1053,7 @@ void stats_transform_xslt(client_t *client)
|
|||||||
|
|
||||||
doc = stats_get_xml(0, mount, client);
|
doc = stats_get_xml(0, mount, client);
|
||||||
|
|
||||||
xslt_transform(doc, xslpath, client, 200, NULL);
|
xslt_transform(doc, xslpath, client, 200, NULL, NULL);
|
||||||
|
|
||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
free(xslpath);
|
free(xslpath);
|
||||||
|
@ -320,7 +320,7 @@ static inline void _send_error(client_t *client, icecast_error_id_t id, int old_
|
|||||||
client_send_error_by_id(client, id);
|
client_send_error_by_id(client, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xslt_transform(xmlDocPtr doc, const char *xslfilename, client_t *client, int status, const char *location)
|
void xslt_transform(xmlDocPtr doc, const char *xslfilename, client_t *client, int status, const char *location, const char **params)
|
||||||
{
|
{
|
||||||
xmlDocPtr res;
|
xmlDocPtr res;
|
||||||
xsltStylesheetPtr cur;
|
xsltStylesheetPtr cur;
|
||||||
@ -344,7 +344,7 @@ void xslt_transform(xmlDocPtr doc, const char *xslfilename, client_t *client, in
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = xsltApplyStylesheet(cur, doc, NULL);
|
res = xsltApplyStylesheet(cur, doc, params);
|
||||||
if (res != NULL) {
|
if (res != NULL) {
|
||||||
if (xsltSaveResultToString(&string, &len, res, cur) < 0)
|
if (xsltSaveResultToString(&string, &len, res, cur) < 0)
|
||||||
problem = 1;
|
problem = 1;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
#include "icecasttypes.h"
|
#include "icecasttypes.h"
|
||||||
|
|
||||||
void xslt_transform(xmlDocPtr doc, const char *xslfilename, client_t *client, int status, const char *location);
|
void xslt_transform(xmlDocPtr doc, const char *xslfilename, client_t *client, int status, const char *location, const char **params);
|
||||||
void xslt_initialize(void);
|
void xslt_initialize(void);
|
||||||
void xslt_shutdown(void);
|
void xslt_shutdown(void);
|
||||||
void xslt_clear_cache(void);
|
void xslt_clear_cache(void);
|
||||||
|
@ -3,29 +3,14 @@
|
|||||||
webdir = $(pkgdatadir)/web
|
webdir = $(pkgdatadir)/web
|
||||||
|
|
||||||
nobase_web_DATA = \
|
nobase_web_DATA = \
|
||||||
status.xsl \
|
status.xsl \
|
||||||
favicon.ico \
|
|
||||||
icecast.png \
|
|
||||||
style.css \
|
|
||||||
auth.xsl \
|
auth.xsl \
|
||||||
server_version.xsl \
|
server_version.xsl \
|
||||||
tunein.png \
|
|
||||||
key.png \
|
|
||||||
status-json.xsl \
|
status-json.xsl \
|
||||||
xml2json.xslt \
|
xml2json.xslt \
|
||||||
|
favicon.ico \
|
||||||
assets/css/style.css \
|
assets/css/style.css \
|
||||||
assets/font/FiraMono-Bold.eot \
|
assets/img/icecast.png
|
||||||
assets/font/FiraMono-Regular.eot \
|
|
||||||
assets/font/FiraSans-Bold.eot \
|
|
||||||
assets/font/FiraSans-BoldItalic.woff \
|
|
||||||
assets/font/FiraSans-Italic.eot \
|
|
||||||
assets/font/FiraSans-Regular.eot \
|
|
||||||
assets/font/FiraMono-Bold.woff \
|
|
||||||
assets/font/FiraMono-Regular.woff \
|
|
||||||
assets/font/FiraSans-BoldItalic.eot \
|
|
||||||
assets/font/FiraSans-Bold.woff \
|
|
||||||
assets/font/FiraSans-Italic.woff \
|
|
||||||
assets/font/FiraSans-Regular.woff
|
|
||||||
|
|
||||||
|
|
||||||
EXTRA_DIST = $(nobase_web_DATA)
|
EXTRA_DIST = $(nobase_web_DATA)
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
BIN
web/key.png
BIN
web/key.png
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB |
@ -3,9 +3,10 @@
|
|||||||
<xsl:include href="includes/web-page.xsl"/>
|
<xsl:include href="includes/web-page.xsl"/>
|
||||||
<xsl:variable name="title">Server Information</xsl:variable>
|
<xsl:variable name="title">Server Information</xsl:variable>
|
||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<div class="roundbox">
|
<h2>Version</h2>
|
||||||
<h3>Server Information</h3>
|
<section class="box">
|
||||||
<table class="yellowkeys">
|
<h3 class="box_title">Server Information</h3>
|
||||||
|
<table class="table-keys">
|
||||||
<tbody>
|
<tbody>
|
||||||
<xsl:for-each select="/icestats">
|
<xsl:for-each select="/icestats">
|
||||||
<tr>
|
<tr>
|
||||||
@ -27,26 +28,26 @@
|
|||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Download</td>
|
<td>Download</td>
|
||||||
<td><a href="http://icecast.org/download.php">icecast.org</a></td>
|
<td><a href="https://icecast.org/download/">icecast.org/download/</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Subversion</td>
|
<td>Git</td>
|
||||||
<td><a href="http://icecast.org/svn.php">icecast.org/svn.php</a></td>
|
<td><a href="https://icecast.org/download/#git">icecast.org/download/#git</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Documentation</td>
|
<td>Documentation</td>
|
||||||
<td><a href="http://icecast.org/docs.php">icecast.org/docs.php</a></td>
|
<td><a href="https://icecast.org/docs/">icecast.org/docs/</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Stream Directory</td>
|
<td>Stream Directory</td>
|
||||||
<td><a href="http://dir.xiph.org/index.php">dir.xiph.org</a></td>
|
<td><a href="https://dir.xiph.org/">dir.xiph.org</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Community</td>
|
<td>Community</td>
|
||||||
<td><a href="http://icecast.org/community.php">icecast.org/community.php</a></td>
|
<td><a href="https://icecast.org/contact/">icecast.org/contact/</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</section>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
273
web/status.xsl
273
web/status.xsl
@ -1,6 +1,8 @@
|
|||||||
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns="http://www.w3.org/1999/xhtml">
|
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
|
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" />
|
||||||
<xsl:include href="includes/web-page.xsl"/>
|
<xsl:include href="includes/web-page.xsl"/>
|
||||||
|
<xsl:include href="includes/player.xsl"/>
|
||||||
|
<xsl:include href="includes/playlist.xsl"/>
|
||||||
<xsl:variable name="title">Status</xsl:variable>
|
<xsl:variable name="title">Status</xsl:variable>
|
||||||
<xsl:template name="content">
|
<xsl:template name="content">
|
||||||
<xsl:text disable-output-escaping="yes">
|
<xsl:text disable-output-escaping="yes">
|
||||||
@ -13,157 +15,128 @@
|
|||||||
-->
|
-->
|
||||||
</xsl:text>
|
</xsl:text>
|
||||||
<!--mount point stats-->
|
<!--mount point stats-->
|
||||||
<xsl:for-each select="source">
|
<h2>Status</h2>
|
||||||
<xsl:choose>
|
<xsl:choose>
|
||||||
<xsl:when test="listeners">
|
<xsl:when test="source">
|
||||||
<div class="roundbox">
|
<xsl:for-each select="source">
|
||||||
<div class="mounthead">
|
<xsl:choose>
|
||||||
<h3 class="mount">Mount Point <xsl:value-of select="@mount" /></h3>
|
<xsl:when test="listeners">
|
||||||
<div class="right">
|
<section class="box">
|
||||||
<xsl:choose>
|
<h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
|
||||||
<xsl:when test="authenticator">
|
<xsl:call-template name="player" />
|
||||||
<a class="auth" href="/auth.xsl">Login</a>
|
|
||||||
</xsl:when>
|
<!-- Stream info and stats -->
|
||||||
<xsl:otherwise>
|
<h4>Further information</h4>
|
||||||
<ul class="mountlist">
|
<div class="mountcont">
|
||||||
<li><a class="play" href="{@mount}.m3u">M3U</a></li>
|
<table class="table-keys">
|
||||||
<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
|
<tbody>
|
||||||
<!-- <li><a class="play" href="{@mount}.vclt">VCLT</a></li> -->
|
<xsl:if test="server_name">
|
||||||
</ul>
|
<tr>
|
||||||
</xsl:otherwise>
|
<td>Stream Name:</td>
|
||||||
</xsl:choose>
|
<td><xsl:value-of select="server_name" /></td>
|
||||||
</div>
|
</tr>
|
||||||
</div>
|
</xsl:if>
|
||||||
<div class="mountcont">
|
<xsl:if test="server_description">
|
||||||
<xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg') or (server_type = 'audio/webm'))">
|
<tr>
|
||||||
<div class="audioplayer">
|
<td>Stream Description:</td>
|
||||||
<audio controls="controls" preload="none">
|
<td><xsl:value-of select="server_description" /></td>
|
||||||
<source src="{@mount}" type="{server_type}" />
|
</tr>
|
||||||
</audio>
|
</xsl:if>
|
||||||
</div>
|
<xsl:if test="server_type">
|
||||||
</xsl:if>
|
<tr>
|
||||||
<table class="yellowkeys">
|
<td>Content Type:</td>
|
||||||
<tbody>
|
<td><xsl:value-of select="server_type" /></td>
|
||||||
<xsl:if test="server_name">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Stream Name:</td>
|
<xsl:if test="stream_start">
|
||||||
<td><xsl:value-of select="server_name" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Stream started:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="stream_start" /></td>
|
||||||
<xsl:if test="server_description">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Stream Description:</td>
|
<xsl:if test="bitrate">
|
||||||
<td><xsl:value-of select="server_description" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Bitrate:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="bitrate" /></td>
|
||||||
<xsl:if test="server_type">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Content Type:</td>
|
<xsl:if test="quality">
|
||||||
<td><xsl:value-of select="server_type" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Quality:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="quality" /></td>
|
||||||
<xsl:if test="stream_start">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Stream started:</td>
|
<xsl:if test="video_quality">
|
||||||
<td class="streamstats"><xsl:value-of select="stream_start" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Video Quality:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="video_quality" /></td>
|
||||||
<xsl:if test="bitrate">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Bitrate:</td>
|
<xsl:if test="frame_size">
|
||||||
<td class="streamstats"><xsl:value-of select="bitrate" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Framesize:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="frame_size" /></td>
|
||||||
<xsl:if test="quality">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Quality:</td>
|
<xsl:if test="frame_rate">
|
||||||
<td class="streamstats"><xsl:value-of select="quality" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Framerate:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="frame_rate" /></td>
|
||||||
<xsl:if test="video_quality">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Video Quality:</td>
|
<xsl:if test="listeners">
|
||||||
<td class="streamstats"><xsl:value-of select="video_quality" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Listeners (current):</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="listeners" /></td>
|
||||||
<xsl:if test="frame_size">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Framesize:</td>
|
<xsl:if test="listener_peak">
|
||||||
<td class="streamstats"><xsl:value-of select="frame_size" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Listeners (peak):</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="listener_peak" /></td>
|
||||||
<xsl:if test="frame_rate">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Framerate:</td>
|
<xsl:if test="genre">
|
||||||
<td class="streamstats"><xsl:value-of select="frame_rate" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Genre:</td>
|
||||||
</xsl:if>
|
<td class="streamstats"><xsl:value-of select="genre" /></td>
|
||||||
<xsl:if test="listeners">
|
</tr>
|
||||||
<tr>
|
</xsl:if>
|
||||||
<td>Listeners (current):</td>
|
<xsl:if test="server_url">
|
||||||
<td class="streamstats"><xsl:value-of select="listeners" /></td>
|
<tr>
|
||||||
</tr>
|
<td>Stream URL:</td>
|
||||||
</xsl:if>
|
<td class="streamstats">
|
||||||
<xsl:if test="listener_peak">
|
<a href="{server_url}"><xsl:value-of select="server_url" /></a>
|
||||||
<tr>
|
</td>
|
||||||
<td>Listeners (peak):</td>
|
</tr>
|
||||||
<td class="streamstats"><xsl:value-of select="listener_peak" /></td>
|
</xsl:if>
|
||||||
</tr>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="genre">
|
|
||||||
<tr>
|
|
||||||
<td>Genre:</td>
|
|
||||||
<td class="streamstats"><xsl:value-of select="genre" /></td>
|
|
||||||
</tr>
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:if test="server_url">
|
|
||||||
<tr>
|
|
||||||
<td>Stream URL:</td>
|
|
||||||
<td class="streamstats">
|
|
||||||
<a href="{server_url}"><xsl:value-of select="server_url" /></a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</xsl:if>
|
|
||||||
<tr>
|
|
||||||
<td>Currently playing:</td>
|
|
||||||
<td class="streamstats">
|
|
||||||
<xsl:if test="artist">
|
|
||||||
<xsl:value-of select="artist" /> -
|
|
||||||
</xsl:if>
|
|
||||||
<xsl:value-of select="title" />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<!-- Extra playlist -->
|
|
||||||
<xsl:if test="playlist/*">
|
|
||||||
<h4>Playlist</h4>
|
|
||||||
<table class="table-block">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<th>Album</th>
|
|
||||||
<th>Track</th>
|
|
||||||
<th>Creator</th>
|
|
||||||
<th>Title</th>
|
|
||||||
</tr>
|
|
||||||
<xsl:for-each select="playlist/trackList/track">
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><xsl:value-of select="album" /></td>
|
<td>Currently playing:</td>
|
||||||
<td><xsl:value-of select="trackNum" /></td>
|
<td class="streamstats">
|
||||||
<td><xsl:value-of select="creator" /></td>
|
<xsl:if test="artist">
|
||||||
<td><xsl:value-of select="title" /></td>
|
<xsl:value-of select="artist" /> -
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:value-of select="title" />
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</xsl:for-each>
|
</tbody>
|
||||||
</tbody>
|
</table>
|
||||||
</table>
|
<!-- Extra playlist -->
|
||||||
</xsl:if>
|
<xsl:call-template name="playlist" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
</xsl:when>
|
</xsl:when>
|
||||||
<xsl:otherwise>
|
<xsl:otherwise>
|
||||||
<h3><xsl:value-of select="@mount" /> - Not Connected</h3>
|
<h3><xsl:value-of select="@mount" /> - Not Connected</h3>
|
||||||
</xsl:otherwise>
|
</xsl:otherwise>
|
||||||
</xsl:choose>
|
</xsl:choose>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
|
</xsl:when>
|
||||||
|
<xsl:otherwise>
|
||||||
|
<aside class="info">
|
||||||
|
<strong>No mounts!</strong> There are no active mountpoints.
|
||||||
|
</aside>
|
||||||
|
</xsl:otherwise>
|
||||||
|
</xsl:choose>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
274
web/style.css
274
web/style.css
@ -1,274 +0,0 @@
|
|||||||
html {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
padding: 0 25px 0 50px;
|
|
||||||
background-color: #000;
|
|
||||||
font-family: Verdana, sans-serif;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #f8ef64;
|
|
||||||
text-decoration: none;
|
|
||||||
border-bottom: 1px dotted #f8ef64;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
color: #f8ef64;
|
|
||||||
text-decoration: none;
|
|
||||||
border-bottom: 1px solid #f8ef64;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-family: Verdana, sans-serif;
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 3em;
|
|
||||||
color: #fff;
|
|
||||||
margin-top: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
font-family: Verdana, sans-serif;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 110%;
|
|
||||||
color: #f8ef64;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1#header{
|
|
||||||
padding: 10px 0px 10px 80px;
|
|
||||||
background: transparent url(/icecast.png) no-repeat scroll left center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 small {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 70%;
|
|
||||||
padding-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
form.alignedform label {
|
|
||||||
text-align: right;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
width: 10em;
|
|
||||||
margin: 0 1em 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
form.alignedform input {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
border: 1px solid #f8ef64;
|
|
||||||
background-color: #333;
|
|
||||||
color: #f8ef64;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
border-top: 3px solid #7B96C6;
|
|
||||||
border-bottom: 3px solid #7B96C6;
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 35px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu ul {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu ul li {
|
|
||||||
float: left;
|
|
||||||
padding-left: 25px;
|
|
||||||
padding-right: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu ul li a {
|
|
||||||
font-family: Verdana, sans-serif;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 18px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu ul li a:hover {
|
|
||||||
color: #f8ef64;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox {
|
|
||||||
width: 90%;
|
|
||||||
background-color: #656565;
|
|
||||||
border-radius: 10px;
|
|
||||||
padding: 15px 20px;
|
|
||||||
margin-bottom: 35px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox h3 {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
border-bottom: 1px groove #ACACAC;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox table.yellowkeys tr td:last-child {
|
|
||||||
color: #f8ef64;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.colortable {
|
|
||||||
border-collapse: collapse;
|
|
||||||
padding: 20px 0 20px 0;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.colortable td {
|
|
||||||
border: 1px solid #000;
|
|
||||||
text-align: center;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.colortable thead tr td {
|
|
||||||
color: #656565;
|
|
||||||
background: #f8ef64;
|
|
||||||
border-color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox table.yellowkeys tr td {
|
|
||||||
padding: 5px 5px 0 0;
|
|
||||||
word-wrap: break-word;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right {
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mounthead h3 {
|
|
||||||
float: left;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mountcont {
|
|
||||||
border-top: 1px groove #ACACAC;
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.mountlist {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
list-style: none;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mountlist li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.play {
|
|
||||||
padding-left: 22px;
|
|
||||||
margin-left: 25px;
|
|
||||||
border: none;
|
|
||||||
background: transparent url(/tunein.png) no-repeat scroll left center;
|
|
||||||
background-size: auto 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.auth {
|
|
||||||
padding-left: 22px;
|
|
||||||
margin-left: 25px;
|
|
||||||
border: none;
|
|
||||||
background: transparent url(/key.png) no-repeat scroll left top;
|
|
||||||
background-size: auto 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Admin navigation */
|
|
||||||
|
|
||||||
ul.nav {
|
|
||||||
margin: 0;
|
|
||||||
padding: 5px 0 10px 0;
|
|
||||||
clear: both;
|
|
||||||
list-style: none;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li a {
|
|
||||||
border: none;
|
|
||||||
display: inline-block;
|
|
||||||
padding: .2em .7em;
|
|
||||||
margin-top: .2em;
|
|
||||||
background-color: #333;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li a:hover {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Footer */
|
|
||||||
|
|
||||||
#footer {
|
|
||||||
border-top: 1px groove #ACACAC;
|
|
||||||
margin-top: 20px;
|
|
||||||
font-size: 80%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 800px) {
|
|
||||||
|
|
||||||
body {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox {
|
|
||||||
width: auto;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox table.yellowkeys tr td {
|
|
||||||
display: block;
|
|
||||||
padding: 5px 5px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roundbox table.yellowkeys tr td:last-child {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scrolltable {
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 320px) {
|
|
||||||
|
|
||||||
ul.nav, #menu ul {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li, #menu ul li {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li a, #menu ul li a {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.nav li + li, #menu ul li + li {
|
|
||||||
border-top: 1px solid #ACACAC;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.play {
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
BIN
web/tunein.png
BIN
web/tunein.png
Binary file not shown.
Before Width: | Height: | Size: 2.0 KiB |
Loading…
Reference in New Issue
Block a user