alvassin/nodejs-icecast-monitor

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Quickstart
[![Build Status](https://travis-ci.org/alvassin/nodejs-icecast-monitor.svg?branch=master)](https://travis-ci.org/alvassin/nodejs-icecast-monitor) [![Code Climate](https://codeclimate.com/github/alvassin/nodejs-icecast-monitor/badges/gpa.svg)](https://codeclimate.com/github/alvassin/nodejs-icecast-monitor) [![Test Coverage](https://codeclimate.com/github/alvassin/nodejs-icecast-monitor/badges/coverage.svg)](https://codeclimate.com/github/alvassin/nodejs-icecast-monitor/coverage)

Powerful & handy interface for icecast-kh monitoring & statistics collection (admin access is required).

* Able to collect icecast stats in realtime;
* Provides easy access to all stats, available in web admin;
* Can deal with very large amounts of data in memory-effective way;
* Has only one npm dependency.

To install latest stable version use `npm install icecast-monitor` command.

* [Options](#options)
* [Methods](#methods)
  * [createFeed](#monitorcreatefeed)
  * [getServerInfo](#monitorgetserverinfo)
  * [getSources](#monitorgetsources)
  * [getSource](#monitorgetsource)
  * [getListeners](#monitorgetlisteners)
  * [createStatsXmlStream](#monitorcreatestatsxmlstream)
* [Feed](#feed)
  * [Events](#events)
  * [Methods](#methods-1)
* [XmlStreamParser](#xmlstreamparser)
  * [Events](#events-1)

# Options

To access icecast monitor features create `Monitor` instance:
```js
var Monitor = require('icecast-monitor');
var monitor = new Monitor({
  host: 'icecast.dev',
  port: 80,
  user: 'admin',
  password: 'hackme'
});
```
Following constructor parameters are available:

Parameter  | Type    | Required | Description
-----------|---------|----------|------------
`host`     | String  | Yes      | IP or DNS name
`port`     | Integer | No       | Port number (defaults to `80`)
`user`     | String  | Yes      | Admin username
`password` | String  | Yes      | Admin password

# Methods
#### monitor.createFeed
Creates [Monitor.Feed](#feed) instance, which establishes persistent connection with icecast & processes its events feed.

```js
monitor.createFeed(function(err, feed) {
  if (err) throw err;
  
  // Handle wildcard events
  feed.on('*', function(event, data, raw) {
    console.log(event, data, raw);
  });

  // Handle usual events
  feed.on('mount.listeners', function(listeners, raw) {
    console.log(listeners, raw);
  });
});
```

#### monitor.getServerInfo
Returns information about icecast server. Please see [Monitor.XmlStreamParser `server` event](#server) data for details.

```js
monitor.getServerInfo(function(err, server) {
  if (err) throw err;
  console.log(server);
});
```

#### monitor.getSources
Returns array with all audio sources (without detailed listeners information). Please see [Monitor.XmlStreamParser `source` event](#source) for data provided about every source.

```js
monitor.getSources(function(err, sources) {
  if (err) throw err;
  console.log(sources);
});
```

#### monitor.getSource
Provides detailed information about specified source & its listeners.

```js
monitor.getSource('/some-mountpoint', function(err, source) {
  if (err) throw err;
  console.log(source);
});
```
Returns same data as [Monitor.XmlStreamParser `source` event](#source), with one difference: `listeners` parameter will contain `array` with [information about every listener](#listener).

#### monitor.getListeners
Returns array with all listeners, connected to icecast server. Please see [Monitor.XmlStreamParser `listener` event](#listener) data for details. *Can produce huge amounts of data, use wisely.*

```js
monitor.getListeners(function(err, listeners) {
  if (err) throw err;
  console.log(listeners);
});
```

#### monitor.createStatsXmlStream
Performs HTTP request to given icecast url path and returns stream for further processing. Can be useful to process large icecast XML output using [Monitor.XmlStreamParser](#xmlstreamparser).

We use following icecast url paths:
* `/admin/stats`
  * icecast server information
  * sources detailed information
  * no detailed listeners information
* `/admin/stats?mount=/$mount`
  * icecast server information
  * specified source information
  * detailed information about connected listeners
* `/admin/listmounts?with_listeners`
  * no information about icecast server
  * minimal information about sources
  * and detailed information about all icecast listeners

```js
// Collect sources without storing them in a memory
monitor.createStatsXmlStream('/admin/stats', function(err, xmlStream) {
  if (err) throw err;
  
  var xmlParser = new Monitor.XmlStreamParser();
 
  xmlParser.on('error', function(err) {
    console.log('error', err); 
  });
  
  xmlParser.on('source', function(source) {
    // Do work with received source
    console.log('source', source);
  });

  // Finish event is being piped from xmlStream
  xmlParser.on('finish', function() {
    console.log('all sources are processed');
  });

  xmlStream.pipe(xmlParser);
});
```

# Feed
Establishes persistent connection with icecast using STATS HTTP method & processes events feed in realtime. Best way to create is to use [monitor.createFeed](#createfeed) method, which injects all necessary parameters.

## Events

For mount.* and server.* events user-callback is provided with following parameters: 

Parameter | Type   | Description
----------|--------|------------
`event`   | String | Event name (present only for wildcard events)
`data`    | Mixed  | Parsed parameter(s), is described for each event below
`raw`     | String | Raw message received from icecast

* **Internal events**
  * `connect`: connection with icecast is established
  * `disconnect`: connection with icecast is closed

* **Wildcard events**
  * `*`: groups absolutely all supported events, produces lots of calls
  * `mount.*`: groups all mount-related events
  * `server.*`: groups all server-related events
   
* **Mounts events**
  * [`mount.audioCodecId`](#mountaudiocodecid)
  * [`mount.audioInfo`](#mountaudioinfo)
  * [`mount.authenticator`](#mountauthenticator)
  * [`mount.bitrate`](#mountbitrate)
  * [`mount.connected`](#mountconnected)
  * [`mount.delete`](#mountdelete)
  * [`mount.flush`](#mountflush)
  * [`mount.genre`](#mountgenre)
  * [`mount.incomingBitrate`](#mountincomingbitrate)
  * [`mount.listenerConnections`](#mountlistenerconnections)
  * [`mount.listenerPeak`](#mountlistenerpeak)
  * [`mount.listeners`](#mountlisteners)
  * [`mount.listenUrl`](#mountlistenurl)
  * [`mount.maxListeners`](#mountmaxlisteners)
  * [`mount.metadataUpdated`](#mountmetadataupdated)
  * [`mount.mpegChannels`](#mountmpegchannels)
  * [`mount.mpegSampleRate`](#mountmpegsamplerate)
  * [`mount.new`](#mountnew)
  * [`mount.outgoingKBitrate`](#mountoutgoingkbitrate)
  * [`mount.public`](#mountpublic)
  * [`mount.queueSize`](#mountqueuesize)
  * [`mount.serverDescription`](#mountserverdescription)
  * [`mount.serverName`](#mountservername)
  * [`mount.serverType`](#mountservertype)
  * [`mount.serverUrl`](#mountserverurl)
  * [`mount.slowListeners`](#mountslowlisteners)
  * [`mount.sourceIp`](#mountsourceip)
  * [`mount.streamStart`](#mountstreamstart)
  * [`mount.title`](#mounttitle)
  * [`mount.totalBytesRead`](#mounttotalbytesread)
  * [`mount.totalBytesSent`](#mounttotalbytessent)
  * [`mount.totalMBytesSent`](#mounttotalmbytessent)
  * [`mount.ypCurrentlyPlaying`](#mountypcurrentlyplaying)
   
* **Server events**
  * [`server.admin`](#serveradmin)
  * [`server.bannedIPs`](#serverbannedips)
  * [`server.build`](#serverbuild)
  * [`server.clientConnections`](#serverclientconnections)
  * [`server.clients`](#serverclients)
  * [`server.connections`](#serverconnections)
  * [`server.fileConnections`](#serverfileconnections)
  * [`server.host`](#serverhost)
  * [`server.info`](#serverinfo)
  * [`server.listenerConnections`](#serverlistenerconnections)
  * [`server.listeners`](#serverlisteners)
  * [`server.location`](#serverlocation)
  * [`server.outgoingKBitrate`](#serveroutgoingkbitrate)
  * [`server.serverId`](#serverserverid)
  * [`server.serverStart`](#serverserverstart)
  * [`server.sourceClientConnections`](#serversourceclientconnections)
  * [`server.sourceRelayConnections`](#serversourcerelayconnections)
  * [`server.sources`](#serversources)
  * [`server.sourceTotalConnections`](#serversourcetotalconnections)
  * [`server.stats`](#serverstats)
  * [`server.statsConnections`](#serverstatsconnections)
  * [`server.streamKBytesRead`](#serverstreamkbytesread)
  * [`server.streamKBytesSent`](#serverstreamkbytessent)

#### mount.audioCodecId
```
EVENT /test.mp3 audio_codecid 2
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Audio codec id: 2 for mp3, 10 for aac

#### mount.audioInfo
Displays audio encoding information.
```
EVENT /test.mp3 audio_info channels=2;samplerate=44100;bitrate=64
```

Parameter         | Type    | Description
------------------|---------|------------
`mount`           | String  | Mountpoint name
`data`            | Object  | Audio channel info
`data.channels`   | Integer | Number of channels
`data.sampleRate` | Integer | Sample rate
`data.bitrate`    | Integer | Bitrate (kbps)

#### mount.authenticator
```
EVENT /test.mp3 authenticator command
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Authenticator type

#### mount.bitrate
```
EVENT /test.mp3 bitrate 64
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Bitrate (kbps), used for stats & YP

#### mount.connected
```
EVENT /test.mp3 connected 180423
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Connection duration in seconds

#### mount.delete
Emitted when mount is deleted. Allows to notify relays about deleted source immediately (rather than wait for polling by the slaves).
```
DELETE /test.mp3
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Deleted mountpoint name

#### mount.flush
```
FLUSH /test.mp3
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Flushed mountpoint name

#### mount.genre
```
EVENT /test.mp3 genre Misc
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Genre name, used for stats & YP

#### mount.incomingBitrate
```
EVENT /test.mp3 incoming_bitrate 127064
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Source bitrate (bps)

#### mount.listenerConnections
```
EVENT /test.mp3 listener_connections 4
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Connections number

#### mount.listenerPeak
```
EVENT /test.mp3 listener_peak 2
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Max detected number of simultaneous listeners

#### mount.listeners
```
EVENT /test.mp3 listeners 2
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Current listeners number

#### mount.listenUrl
```
EVENT /11-31.mp3 listenurl http://icecast.dev:80/test.mp3
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Audio stream url

#### mount.maxListeners
```
EVENT /11-31.mp3 max_listeners -1
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Simultanious listeners limit 

#### mount.metadataUpdated

Is emitted when track is updated.
```
EVENT /test.mp3 metadata_updated 06/Aug/2015:14:05:05 +0300
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Date when metadata was updated

#### mount.mpegChannels
```
EVENT /test.mp3 mpeg_channels 2
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Number of audio channels

#### mount.mpegSampleRate
```
EVENT /test.mp3 mpeg_samplerate 44100
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Sample rate

#### mount.new
Emitted when new mount is created. Allows to notify relays about new source immediately (rather than wait for polling by the slaves).
```
NEW audio/mpeg /229-682.mp3
```

Parameter    | Type   | Description
-------------|--------|------------
`mount`      | String | Mountpoint
`data`       | String | Mime type

#### mount.outgoingKBitrate
```
EVENT /test.mp3 outgoing_kbitrate 0
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Outgoing bitrate (kbps)

#### mount.public
Displays mount visibility (advertisement) setting.
```
EVENT /test.mp3 public 1
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Possible values: `-1` (up to source client / relay) , `0` (disable), `1` (force advertisement)

#### mount.queueSize
```
EVENT /test.mp3 queue_size 65828
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Queue size

#### mount.serverDescription
```
EVENT /test.mp3 server_description My station description
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | User-defined station description

#### mount.serverName
```
EVENT /test.mp3 server_name TestFM
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | User-defined station name

#### mount.serverType
```
EVENT /test.mp3 server_type audio/mpeg
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Mime type

#### mount.serverUrl
```
EVENT /test.mp3 server_url http://example.com/
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | User-defined url

#### mount.slowListeners
```
EVENT /test.mp3 slow_listeners 0
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Slow listeners number

#### mount.sourceIp
```
EVENT /test.mp3 source_ip icecast.dev
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Mounpoint stream source host or ip address 

#### mount.streamStart
```
EVENT /test.mp3 stream_start 04/Aug/2015:12:00:31 +0300
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Date, when mount started streaming

#### mount.title
```
EVENT /test.mp3 title Werkdiscs - Helena Hauff - 'Sworn To Secrecy Part II'
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Track name

#### mount.totalBytesRead
```
EVENT /test.mp3 total_bytes_read 1443575627
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Source (incoming) traffic in bytes

#### mount.totalBytesSent
```
EVENT /test.mp3 total_bytes_sent 256000
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Source (outgoing) traffic in bytes

#### mount.totalMBytesSent
```
EVENT /test.mp3 total_mbytes_sent 0
```

Parameter | Type    | Description
----------|---------|------------
`mount`   | String  | Mountpoint name
`data`    | Integer | Source (outgoing) traffic in bytes

#### mount.ypCurrentlyPlaying
```
EVENT /test.mp3 yp_currently_playing Nickelback - How You Remind Me
```

Parameter | Type   | Description
----------|--------|------------
`mount`   | String | Mountpoint name
`data`    | String | Track, that is displayed in YP

#### server.admin
Displays administrator's email.
```
EVENT global admin email@example.com
```

Parameter | Type   | Description
----------|--------|------------
`data`    | String | Administrator email

#### server.bannedIPs
```
EVENT global banned_IPs 0
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Banned ip addresses number

#### server.build
```
EVENT global build 20150616004931
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Build number

#### server.clientConnections
```
EVENT global client_connections 1029675
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Client connections number

#### server.clients
```
EVENT global clients 62
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Connected clients

#### server.connections
```
EVENT global connections 1178553
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Connections number

#### server.fileConnections
```
EVENT global file_connections 3534
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | File connections number

#### server.host
Configuration icecast.hostname setting value. Is used for the stream directory lookups or playlist generation possibily if a Host header is not provided. 
```
EVENT global host icecast.dev
```

Parameter | Type   | Description
----------|--------|------------
`data`    | String | Server DNS name or IP address

#### server.info
Identifies the end of the big list at the beginning. When initially connected, you get a snapshot (a blast of content), and this just marks the end of it. After this then the stats are generated since the snapshot.
```
INFO full list end
```

#### server.listenerConnections
```
EVENT global listener_connections 220589
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Listener connections number

#### server.listeners
```
EVENT global listeners 16
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Current listeners number

#### server.location
Configuration icecast.location setting value, is also displayed in web interface.
```
EVENT global location RU
```

Parameter | Type   | Description
----------|--------|------------
`data`    | String | Server location

#### server.outgoingKBitrate
```
EVENT global outgoing_kbitrate 4411
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Outgoing bitrate (kbps)

#### server.serverId
Icecast server identifier. Can be overrided in config file.
```
EVENT global server_id Icecast 2.4.0-kh1
```

Parameter | Type   | Description
----------|--------|------------
`data`    | String | Server identifier (icecast followed by a version number or user-defined value)

#### server.serverStart
```
EVENT global server_start 06/Jul/2015:00:19:34 +0300
```

Parameter | Type   | Description
----------|--------|------------
`data`    | String | Server start date

#### server.sourceClientConnections
```
EVENT global source_client_connections 0
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Source client connections number

#### server.sourceRelayConnections
```
EVENT global source_relay_connections 1317
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Source relay connections number

#### server.sources
```
EVENT global sources 45
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Sources number

#### server.sourceTotalConnections
```
EVENT global source_total_connections 1318
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Source total connections number

#### server.stats
```
EVENT global stats 0
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | ?

#### server.statsConnections
```
EVENT global stats_connections 2
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | ?

#### server.streamKBytesRead
```
EVENT global stream_kbytes_read 2414225600
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Stream incoming traffic (kbytes)

#### server.streamKBytesSent
```
EVENT global stream_kbytes_sent 1102687068
```

Parameter | Type    | Description
----------|---------|------------
`data`    | Integer | Stream outgoing traffic (kbytes)

## Methods

#### feed.connect
Establishes connection, once connected emits `connect` event. If you use [createFeed](#monitorcreatefeed) method, it will call `feed.connect` automatically, so this method can be used to handle disconnects like shown below:
```js
monitor.createFeed(function(err, feed) {
  if (err) throw err;
  
  // Handle disconnects
  feed.on('disconnect', function() {
    feed.connect();
  });
});
```

#### feed.disconnect
Closes icecast connection, once disconnected emits `disconnect` event.
```js
monitor.createFeed(function(err, feed) {
  if (err) throw err;
  feed.on('connect', function() {
    
    // Disconnect with 5 seconds delay
    setTimeout(feed.disconnect, 5000);
  });
});
```

# XmlStreamParser
[Writeable stream](https://nodejs.org/api/stream.html#stream_class_stream_writable), that allows to retrieve sources, listeners & server information from icecast xml stream. Icecast xml stream can be retrieved using [monitor.createStatsXmlStream](#monitorcreatestatsxmlstream) method.

Using XmlStreamParser directly can be more memory-effective when dealing with large icecast output, then using [monitor.getServerInfo](#monitorgetserverinfo), [monitor.getSources](#monitorgetsources), [monitor.getSource](#monitorgetsource) and [monitor.getListeners](#monitorgetlisteners) methods, because those methods have to store information in memory before it is returned in callback.

```js
// Collect sources without storing them in a memory
monitor.createStatsXmlStream('/admin/stats', function(err, xmlStream) {
  if (err) throw err;

  var xmlParser = new Monitor.XmlStreamParser();

  // Handle errors
  xmlParser.on('error', function(err) {
    console.log('error', err); 
  });
  
  // Handle server info
  xmlParser.on('server', function(server) {
    console.log('server', server);
  });
  
  // Handle sources
  xmlParser.on('source', function(source) {
    console.log('source', source);
  });

  // Handle listeners
  xmlParser.on('listener', function(listener) {
    console.log('listener', listener);
  });

  // Xml stream finished
  xmlParser.on('finish', function() {
    console.log('data is finished');
  });

  xmlStream.pipe(xmlParser);
});
```

## Events
* [`error`](#error)
* [`server`](#server)
* [`source`](#source)
* [`listener`](#listener)
* [`finish`](https://nodejs.org/api/stream.html#stream_event_finish)

#### error
Represents error, that happened while parsing xml stream.

#### server
Is emitted when xml stream processing is finished. Returns following information about icecast server:

Parameter                 | Type    | Description
--------------------------|---------|------------
`admin`                   | String  | Administrator's email
`bannedIPs`               | Integer | Banned ip addresses number
`build`                   | Integer | Build number
`clientConnections`       | Integer | Total client (sources, listeners, web requests, etc) connections number
`clients`                 | Integer | Current clients (sources, listeners, web requests, etc) number
`connections`             | Integer | ?
`fileConnections`         | Integer | File connections number
`host`                    | String  | Host DNS or IP address (is defined by `hostname` setting in icecast config)
`listenerConnections`     | Integer | Listeners connections number
`listeners`               | Integer | Listeners number
`location`                | String  | Server location (is defined by `location` setting in icecast config)
`outgoingKBitrate`        | Integer | Outgoing bitrate in Kbps
`serverId`                | String  | Server identifier (is defined by `server-id` setting in icecast config)
`serverStart`             | String  | Server start date
`sourceClientConnections` | Integer | Source clients connections number
`sourceRelayConnections`  | Integer | Source relays connections number
`sources`                 | Integer | Sources (mountpoints) number
`sourceTotalConnections`  | Integer | Total connections number
`stats`                   | Integer | Number currently connected clients using STATS HTTP method (like [Monitor.Feed](#feed)
`statsConnections`        | Integer | STATS HTTP method total connections number
`streamKBytesRead`        | Integer | Streaming incoming traffic (KB)
`streamKBytesSent`        | Integer | Streaming outgoing traffic (KB)

#### source
Is emitted when source processing is finished. Returns following information for every source:

Parameter             | Type    | Description
----------------------|---------|------------
`mount`               | String  | Mountpoint
`audioCodecId`        | Integer | Audio codec id: 2 for mp3, 10 for aac
`audioInfo`           | String  | Audio encoding information
`authenticator`       | String  | Authentication scheme
`bitrate`             | Integer | User-defined bitrate (Kbps)
`connected`           | Integer | Connected time in seconds
`genre`               | String  | User-defined genre
`incomingBitrate`     | Integer | Source stream bitrate (bps)
`listenerConnections` | Integer | Listener connections number
`listenerPeak`        | Integer | Maximum detected number of simultaneous users 
`listeners`           | Integer | Current listeners number
`listenUrl`           | String  | Audio stream url
`maxListeners`        | Integer | Listeners limit
`metadataUpdated`     | String  | Last metadata update date
`mpegChannels`        | Integer | Mpeg channels number
`mpegSampleRate`      | Integer | Mpeg sample rate
`outputKBitrate`      | Integer | Outgoing bitrate for all listeners (Kbps)
`public`              | Integer | Source advertisement: `-1` - source client or relay determines if mountpoint should be advertised, `0` - disables advertisement, `1` - forces advertisement
`queueSize`           | Integer | Can vary (typically) because lagging clients cause the size to increase until they either get kicked off or they catch up
`serverDescription`   | String  | User-defined description
`serverName`          | String  | User-defined name
`serverType`          | String  | Mime type
`serverUrl`           | String  | User-defined url
`slowListeners`       | Integer | Slow listeners number
`sourceIp`            | String  | Source ip address
`streamStart`         | String  | Date, when stream started
`title`               | String  | Track name
`totalBytesRead`      | Integer | Incoming traffic
`totalBytesSent`      | Integer | Outgoing traffic (Bytes)
`totalMBytesSent`     | Integer | Outgoing traffic (MBytes)
`ypCurrentlyPlaying`  | String  | YP track title

#### listener
Is emitted when listener processing is finished. Returns following information for every listener:

Parameter   | Type    | Description
------------|---------|------------
`id`        | Integer | Icecast internal id, can be used to kick listeners, move them between mounts, etc.
`ip`        | String  | Listener's ip address
`userAgent` | String  | Listener's user agent
`referrer`  | String  | Url, where listener came from
`lag`       | Integer | ?
`connected` | Integer | Connected time in seconds
`mount`     | String  | Source mounpoint