1
0
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:
Philipp Schafft 2020-10-02 11:39:04 +00:00
commit b419a500ac
40 changed files with 711 additions and 1604 deletions

View File

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

View File

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

View File

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

View File

@ -2,12 +2,13 @@
<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>

View File

@ -16,10 +16,14 @@
<!-- Header/Menu --> <!-- Header/Menu -->
<xsl:call-template name="header" /> <xsl:call-template name="header" />
<main role="main">
<xsl:call-template name="content" /> <xsl:call-template name="content" />
</main>
<!-- Footer --> <!-- Footer -->
<footer>
<xsl:call-template name="footer" /> <xsl:call-template name="footer" />
</footer>
</body> </body>
</html> </html>

24
admin/includes/player.xsl Normal file
View 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>

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

View File

@ -5,25 +5,42 @@
<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>
<link rel="stylesheet" type="text/css" href="/assets/css/style.css" media="screen, print" />
<meta name="theme-color" content="#001826" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="description" content="Icecast is free server software for streaming multimedia." />
</head> </head>
<body> <body>
<h1 id="header">Icecast <xsl:value-of select="$title"/></h1> <!-- Header and menu -->
<!--index header menu --> <header>
<div id="menu"> <nav id="main-nav" role="primary">
<a href="/" id="branding">
<img src="/assets/img/icecast.png" alt="Logo" />
<h1>Icecast Server</h1>
</a>
<ul> <ul>
<li><a href="admin/">Administration</a></li> <li><a href="/status.xsl">Status</a></li>
<li><a href="status.xsl">Server Status</a></li> <li><a href="/server_version.xsl">Version</a></li>
<li><a href="server_version.xsl">Version</a></li> <li class="right adminlink"><a href="/admin/">Administration</a></li>
</ul> </ul>
</div> </nav>
<!--end index header menu --> </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" /> <xsl:call-template name="content" namespace="http://www.w3.org/1999/xhtml" />
<div id="footer"> </main>
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> <!-- Footer -->
<footer>
<p>Support icecast development at <a href="http://icecast.org">icecast.org</a></p>
</footer>
</body> </body>
</html> </html>
</xsl:template> </xsl:template>

View File

@ -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}&amp;id={id}">Kick</a> <a class="critical" href="killclient.xsl?mount={../@mount}&amp;id={id}">Kick</a>
&#160;
<a href="moveclients.xsl?mount={../@mount}&amp;id={id}">Move</a> <a href="moveclients.xsl?mount={../@mount}&amp;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>

View File

@ -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">&#9658; <span>M3U</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.xspf">&#9658; <span>XSPF</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.vclt">&#9658; <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>

View File

@ -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}&amp;username={username}&amp;action=delete">Delete</a> <a class="critical" href="manageauth.xsl?id={../../@id}&amp;username={username}&amp;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" />
&#160;
<label for="password" class="hidden">Password: </label>
<input type="password" id="password" name="password" value="" placeholder="Password" required="required" />
&#160;
<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>

View File

@ -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}" />
&#160;
<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>

View File

@ -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">
<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="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>
</div> </section>
</xsl:for-each> </xsl:for-each>
</div>
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -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">&#9658; <span>M3U</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.xspf">&#9658; <span>XSPF</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.vclt">&#9658; <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>

View File

@ -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" />
&#160;
<input type="submit" value="Update Metadata" /> <input type="submit" value="Update Metadata" />
</form> </form>
</div> </section>
</xsl:for-each> </xsl:for-each>
</div> </div>

View File

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

View File

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

View File

@ -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);

View File

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

View File

@ -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);

View File

@ -4,28 +4,13 @@ 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.

View File

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

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

View File

@ -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,36 +15,20 @@
--> -->
</xsl:text> </xsl:text>
<!--mount point stats--> <!--mount point stats-->
<h2>Status</h2>
<xsl:choose>
<xsl:when test="source">
<xsl:for-each select="source"> <xsl:for-each select="source">
<xsl:choose> <xsl:choose>
<xsl:when test="listeners"> <xsl:when test="listeners">
<div class="roundbox"> <section class="box">
<div class="mounthead"> <h3 class="box_title">Mountpoint <code><xsl:value-of select="@mount" /></code></h3>
<h3 class="mount">Mount Point <xsl:value-of select="@mount" /></h3> <xsl:call-template name="player" />
<div class="right">
<xsl:choose> <!-- Stream info and stats -->
<xsl:when test="authenticator"> <h4>Further information</h4>
<a class="auth" href="/auth.xsl">Login</a>
</xsl:when>
<xsl:otherwise>
<ul class="mountlist">
<li><a class="play" href="{@mount}.m3u">M3U</a></li>
<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
<!-- <li><a class="play" href="{@mount}.vclt">VCLT</a></li> -->
</ul>
</xsl:otherwise>
</xsl:choose>
</div>
</div>
<div class="mountcont"> <div class="mountcont">
<xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg') or (server_type = 'audio/webm'))"> <table class="table-keys">
<div class="audioplayer">
<audio controls="controls" preload="none">
<source src="{@mount}" type="{server_type}" />
</audio>
</div>
</xsl:if>
<table class="yellowkeys">
<tbody> <tbody>
<xsl:if test="server_name"> <xsl:if test="server_name">
<tr> <tr>
@ -136,34 +122,21 @@
</tbody> </tbody>
</table> </table>
<!-- 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>
</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>

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB