Configure:
Just set them from the Popping up Dialog and hit Save to apply changes. You can also access Configuration Tool by Right Clicking anywhere RadioBot -> Panel
Features:
Commands:
!song - notices user current song
!tune/!url/!listen - notices user the link to the stream
!listeners - notices the user with current listener amount
!stats/!info/!status - notices user a quick summary of stream info (dj, genre, bitrate, listeners, etc)
Development:
function void fetchData : Fetch Data from the Server using the best method is available (json/xml)
callback function void title_callback : Fired when title changes
function string object_read([XML/JSON Object]/[File]/[URL],XML/JSON,Keys...)[.auth(base64_authstring).nocache()] : Gets from the first argument, an object, and decodes it based on 2nd argument either json or xml, and gets the given keys. Keys are separated with comma (,) and it gets unlimited keys. Auth Property used to trigger a HTTP basic authentication with the given base64_encoded string, and nocache() is used to override the default cache feature of the Mircosoft http object.
HashTable Radio : Contains Listeners,Peak,Max(Listeners),Title,Artist,Bitrate,Genre,URL Fields are getting parsed by fetchData
Changelog:
3.1
Fixed stability.
3.0
Rebuild of the Core
-VBScript Sockets are now used instead of mIRC
-Inner Parsing System Rebuilt
-Dialog Panel Rebuilt
-IRC Auto Connect/Identify Removed
-Kick Stream Removed
-DJ Management System Removed
2.1
Fixed Bug that didn't read data from ShoutCast 2.* Server
2.0 - My Version
-Compatible with ShoutCast 1.
-Compatible With ShoutCast 2.
-Compatible With IceCast
-New XML Parser
-New Socket System
-New Text Management System
-Dialog Panel Added
1.1
Rewrote the XML parser which fixes the song announce loop.
1.0.1
Fixed issue with topic not updating properly.
1.0
Initial version.
; This code is released under the public domain.
;:::::::::::::::::::::
;: Load variables ::
;:::::::::::::::::::::
menu * {
Radio Bot 3.0
.Panel:/dialog -m panel panel
}
alias _radio.init {
if (!%_radio.configured) {
set %_radio.ip 127.0.0.1
set %_radio.port 8000
set %_radio.server SC1
set %_radio.irc.channel #radio
set %_radio.username admin
set %_radio.password admin
set %_radio.sid 1
set %_radio.mount /live
dialog -md Panel panel
}
}
on *:start: {
_radio.init
}
on *:connect:{
.timer[Radio] 0 10 fetchData
}
on *:text:*:%_server.irc.channel:{
elseif ($1 == !info || $1 == !stats || $1 == !status) {
if ($hget(Radio,Listeners)) {
notice $nick Listen URL: $hget(Radio,URL)
notice $nick Title: $hget(Radio,Artist) $hget(Radio,Title) Bitrate: $hget(Radio,Bitrate) $+ kbps Listeners: $hget(Radio,Listeners) $+ / $+ $iif($hget(Radio,Max) == unlimited,oo,$v1) Peak: $hget(Radio,Peak)
}
else { notice $nick Stream is offline or Stream Info is not available. }
}
elseif ($1 == !song) {
if ($hget(Radio,Title)) {
notice $nick Now Playing: $v1
}
else { notice $nick Stream is offline or Song title is not available. }
}
elseif ($1 == !Tune) || ($1 == !url) || ($1 == !listen) { notice $nick Listen at: $hget(Radio,URL) }
elseif ($1 == !listeners) {
if ($hget(Radio,Listeners)) { notice $nick Listeners: $hget(Radio,Listeners) $+ / $+ $iif($hget(Radio,Max) == unlimited,oo,$v1) Peak: $hget(Radio,Peak)
}
else { notice $nick Stream is offline or Stream Info is not available. }
}
}
alias fetchData {
var %url = $+(http://,%_radio.ip,:,%_radio.port)
if (%_radio.server == SC1) {
var %mode = XML
var %Source = $+(%url,/admin.cgi?mode=viewxml)
var %prop = $+(.auth,$chr(40),$encode($+(%_radio.username,:,%_radio.password),m),$chr(41),.nocache,$chr(40),$chr(41))
var %container SHOUTCASTSERVER
var %_lC = CURRENTLISTENERS
var %_lP = PEAKLISTENERS
var %_lM = MAXLISTENERS
var %_TI = SONGTITLE
var %_ST = CONTENT
var %_BR = BITRATE
var %_GE = SERVERGENRE
}
elseif (%_radio.server == SC2) {
var %Source = $+(%url,/statistics?json=1)
var %result = $objet_read(%url,json,totalstreams)
if (%result != null) {
set %_radio.server SC2J
}
else {
set %_radio.server SC2X
}
}
if (%_radio.server == SC2X) {
var %Source = $+(%url,/admin.cgi?sid=,%_radio.sid,&mode=viewxml)
var %mode = XML
var %prop = $+(.auth,$chr(40),$encode($+(%_radio.username,:,%_radio.password),m),$chr(41),.nocache,$chr(40),$chr(41))
var %container SHOUTCASTSERVER
var %_lC = CURRENTLISTENERS
var %_lP = PEAKLISTENERS
var %_lM = MAXLISTENERS
var %_SP = STREAMPATH
var %_TI = SONGTITLE
var %_ST = CONTENT
var %_BR = BITRATE
var %_GE = SERVERGENRE
}
elseif (%_radio.server == SC2J) {
var %Source = $+(%url,/statistics?json=1)
var %x = 0
while ($object_read(%source,json,streams,%x).nocache()) {
if ($nopath($object_read(%source,json,streams,%x,id)) == %_radio.sid) {
var %found = 1
break
}
inc %x
}
if (%found) {
var %container streams, $+ %x
}
var %_lC = currentlisteners
var %_lP = peaklisteners
var %_lM = maxlisteners
var %_SP = streampath
var %_TI = songtitle
var %_ST = content
var %_BR = bitrate
var %_GE = servergenre
var %mode = JSON
}
elseif (%_radio.server == IC) {
var %Source = $+(%url,/status-json.xsl)
var %result = $objet_read(%url,json,icestats)
if (%result) {
set %_radio.server ICJ
}
else {
set %_radio.server ICX
}
}
if (%_radio.server == ICJ) {
var %Source = $+(%url,/status-json.xsl)
var %mode = JSON
var x = 0
while ($object_read(%source,json,icestats,source,%x).nocache()) {
if ($nopath($object_read(%source,json,icestats,source,%x,listenurl)) == %_radio.mount) {
var %found = 1
break
}
inc %x
}
if (%found) {
var %container icestats,source, $+ %x
}
var %_lC = listeners
var %_lP = listener_peak
var %_lM = max_listeners
var %_lU = listenurl
var %_TI = title
var %_AR = artist
var %_ST = server_type
var %_BR = ice-bitrate
var %_GE = genre
}
elseif (%_radio.server == ICX) {
var %Source = $+(%url,/admin/stats)
var %mode = XML
var %prop = $+(.auth,$chr(40),$encode($+(%_radio.username,:,%_radio.password),m),$chr(41),.nocache,$chr(40),$chr(41))
var %container = $+(icestats/source[@mount=[',%_server.mount,'])
var %_lC = listensers
var %_lP = listener_peak
var %_lM = max_listeners
var %_lU = listenurl
var %_TI = title
var %_AR = artist
var %_ST = server_type
var %_BR = ice-bitrate
var %_GE = genre
}
if (%container) {
hadd -m Radio Listeners $object_read(%source,%mode,%container,%_lC) [ $+ [ %prop ] ]
hadd -m Radio Peak $object_read(%source,%mode,%container,%_lP) [ $+ [ %prop ] ]
hadd -m Radio Max $object_read(%source,%mode,%container,%_lM) [ $+ [ %prop ] ]
if (%_AR) {
hadd -m Radio Artist $object_read(%source,%mode,%container,%_AR) [ $+ [ %prop ] ]
}
hadd -m Radio Type $object_read(%source,%mode,%container,%_ST) [ $+ [ %prop ] ]
hadd -m Radio Bitrate $object_read(%source,%mode,%container,%_BR) [ $+ [ %prop ] ]
if (%_lU) {
hadd -m Radio URL $object_read(%source,%mode,%container,%_lU) [ $+ [ %prop ] ]
}
elseif (%_SP) {
var %sp = $object_read(%source,%mode,%container,%_SP) [ $+ [ %prop ] ]
hadd -m Radio URL $+(http://,%_radio.ip,:,%_radio.port,%sp)
}
else {
hadd -m Radio URL $+(http://,%_radio.ip,:,%_radio.port,/listen.pls)
}
var %Title = $object_read(%source,%mode,%container,%_TI) [ $+ [ %prop ] ]
if ($hget(Radio,Title) != %Title && %Title) { title_callback | hadd -m Radio Title %Title }
if (!%Title) {
if ($hget(Radio)) hfree Radio
}
}
}
alias title_callback {
if ($me ison %_radio.irc.channel) msg %_radio.irc.channel Song Playing Now: $hget(Radio,Title)
}
;:::::::::::::::::::::::
;: Dialog functions ::
;:::::::::::::::::::::::
dialog Panel {
title "Radio Bot Config"
size -1 -1 87 137
option dbu
text "mIRC Radio Bot 2.2", 1, 0 0 87 8, center
box "Radio Configuration", 2, 0 9 87 101
text "Server", 4, 2 18 25 8
combo 3, 2 26 82 37, size drop
button "Save", 5, 25 124 37 12
edit "", 6, 30 37 50 10
text "Address", 7, 2 38 25 8
text "Port", 8, 2 50 25 8
edit "", 9, 30 49 50 10
box " Administration Crendentials", 10, 2 63 82 33
edit "", 11, 30 71 50 10
text "Username", 12, 4 72 25 8
text "Password", 13, 4 84 25 8
edit "", 14, 30 83 50 10, password
edit "", 15, 30 97 50 10
text "SID", 16, 2 98 25 8
text "IRC Channel", 17, 0 113 32 8
edit "", 18, 30 111 50 10
}
on *:dialog:Panel:*:*:{
if ($devent == init) {
did -a $dname 3 Shoutcast 1.*
did -a $dname 3 Shoutcast 2.*
did -a $dname 3 Icecast
if (%_radio.server == SC1) {
did -c $dname 3 1
did -h $dname 15,16
did -a $dname 15 %_radio.sid
}
elseif ($left(%_radio.server,3) == SC2) {
did -c $dname 3 2
did -v $dname 15,16
did -a $dname 15 %_radio.sid
}
elseif ($left(%_radio.server,2) == IC) {
did -c $dname 3 3
did -v $dname 15,16
did -ra $dname 16 Mount
did -a $dname 15 %_radio.mount
}
did -a $dname 6 %_radio.ip
did -a $dname 9 %_radio.port
did -a $dname 11 %_radio.username
did -a $dname 14 %_radio.password
did -a $dname 18 %_radio.irc.channel
}
if ($devent == sclick) {
if ($did == 3) {
if ($did($dname,3).sel == 3) { did -ra $dname 16 Mount | did -ra $dname 15 %_radio.mount | did -v $dname 15,16 }
elseif ($did($dname,3).sel == 2) {
did -ra $dname 16 SID | did -ra $dname 15 %_radio.sid | did -v $dname 15,16
}
else {
did -h $dname 15,16
}
}
if ($did == 5) {
if ($verifyFields($dname,6.9.11.14.15.18)) {
if ($did($dname,3).sel == 1) { var %req = /admin.cgi?mode=viewxml | var %check SHOUTCASTSERVER/CURRENTLISTENERS }
elseif ($did($dname,3).sel == 2) { var %req = /admin.cgi?sid= $+ $did($dname,15) $+ &mode=viewxml | var %check SHOUTCASTSERVER/CURRENTLISTENERS }
else { var %req = /admin/stats | var %check icestats/admin }
var %url = $+(http://,$did($dname,6),:,$did($dname,9),%req)
if ($object_read(%url,XML,%check).auth( [ $+ [ $encode($+($did($dname,11),:,$did($dname,14)),m) ] ] [ $+ [ ).nocache() ] ] != $null) {
set %_radio.ip $did($dname,6)
set %_radio.port $did($dname,9)
set %_radio.username $did($dname,11)
set %_radio.password $did($dname,14)
set %_radio.irc.channel $did($dname,18)
set %_radio.configured $true
if ($did($dname,3).sel == 1) {
if ($left(%_radio.server,3) != SC1) {
set %_radio.server SC1
}
set %_radio.sid $did($dname,15)
}
elseif ($did($dname,3).sel == 2) {
if ($left(%_radio.server,3) != SC2) {
set %_radio.server SC2
}
set %_radio.sid $did($dname,15)
}
elseif ($did($dname,3).sel == 3) {
if ($left(%_radio.server,2) != IC) {
set %_radio.server IC
}
set %_radio.mount $did($dname,15)
}
noop $input(Radio Bot Connected successfully to your Server. $+ $crlf $+ Configuration Saved. Configuration Wizard will now close.,oi,Radio Bot 3.0)
.timer[Radio] 0 10 fetchData
dialog -x $dname
}
else {
noop $input(Radio Bot was unable to connect to your Server. $+ $crlf $+ Please check your configuration and try again,ow,Radio Bot 3.0)
}
}
}
}
}
alias verifyFields {
var %i = 1
var %d = $1
var %z = $2
while (%i <= $numtok(%z,46) ) {
if (!$did(%d,$gettok(%z,%i,46))) {
return $false
}
inc %i
}
return $true
}
alias object_read {
if ($isid) {
var %source = $1
var %type = $2
var %handler = utf8_object
var %authKey = "_NULL_"
var %nocache $false
var %i = 1
while (%i <= $numtok($prop,46) ) {
var %prop = $gettok($prop,%i,46)
var %key = $gettok(%prop,1,40)
var %value = $gettok($gettok(%prop,2,40),1,41)
if (%key == nocache) { var %nocache $true }
if (%key == auth) { var %authKey = $qt(%value) }
inc %i
}
if (!$com(%handler)) {
.comopen %handler MSScriptControl.ScriptControl
noop $com(%handler,language,4,bstr*,VBScript)
var %code Function getFile(file) $crlf Dim objStream, strData $crlf Set objStream = CreateObject("ADODB.Stream") $crlf objStream.CharSet = "utf-8" $crlf objStream.Open $crlf objStream.LoadFromFile(file) $crlf strData = objStream.ReadText() $crlf $&
getFile = strData $crlf End Function $crlf Function getURL(url,authKey) $crlf Set http = CreateObject("Microsoft.XmlHttp") $crlf http.open "GET", url, FALSE $crlf if (authUser <> "_NULL_") Then $crlf http.SetRequestHeader "Authorization", "Basic " + authKey $crlf $&
End If $crlf http.send "" $crlf getURL=http.responseText $crlf End Function $crlf Function getValueFromXML(XML,value) $crlf $&
Set objXMLDoc = CreateObject("Microsoft.XMLDOM") $crlf objXMLDoc.async = False $crlf objXMLDoc.loadXML(XML) $crlf Set NodeList = objXMLDoc.selectNodes(value) $crlf For Each objNode in NodeList $crlf getValueFromXML=objNode.text $crlf $&
Next $crlf End Function $crlf Function getValueFromJson(json,value) $crlf Set scriptControl = CreateObject("MSScriptControl.ScriptControl") $crlf scriptControl.Language = "JScript" $crlf scriptControl.AddCode("x="& json & ";") $crlf $&
getValueFromJson= scriptControl.Eval( "x"& value ) $crlf End Function $crlf Function fetchJsonLocal(File,Value) $crlf fetchJsonLocal=getValueFromJson(getFile(File),Value) $crlf End Function $crlf Function fetchJsonURL(URL,Value,authKey) $crlf $&
fetchJsonURL=getValueFromJson(getURL(URL,authKey),Value) $crlf End Function $crlf Function fetchXMLLocal(File,Value) $crlf fetchXMLLocal=getValueFromXML(getFile(File),Value) $crlf End Function $crlf Function fetchXMLURL(URL,Value,authKey) $crlf $&
fetchXMLURL=getValueFromXML(getURL(URL,authKey),Value) $crlf End Function
noop $com(%handler,addcode,1,bstr*,%code)
}
if (%type == json) {
var %x = 3,%str,%p,%v
while (%x <= $0) {
%p = $($+($,%x),2)
if (%p == $null) { noop }
elseif ($chr(44) isin %p) {
var %z = 1
while (%z <= $numtok(%p,44)) {
var %n = $gettok(%p,%z,44)
if (%n isnum || $qt($noqt(%n)) == %n) { %str = $+(%str,[,%n,]) }
else { %str = $+(%str,[',%n,']) }
inc %z
}
}
elseif (%p isnum || $qt($noqt(%p)) == %p) { %str = $+(%str,[,%p,]) }
else { %str = $+(%str,[',%p,']) }
inc %x
}
if ($isfile(%source)) {
var %t $+(fetchJsonLocal,$chr(40),$qt($shortfn($replace($1,\,\\,;,\u003b))),$chr(44),$qt(%str),$chr(41)))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
elseif (http://* iswm $1) {
if (%nocache) { var %url = $1 $+ $iif($chr(63) isin %source,&,?) $+ _ctime_nocache_= $+ $ctime $+ . $+ $ticks }
else { var %url = $1 }
var %t $+(fetchJsonURL,$chr(40),$qt($replace($qt(%url),;,\u003b)),$chr(44),$qt(%str),$chr(44),%authKey,$chr(41)))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
else {
var %t $+(getValueFromJson,$chr(40),$qt($replace($1,",')),$chr(44),$qt(%str),$chr(41))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
}
elseif (%type == xml) {
var %str = $replace($3-,$chr(32),$chr(47))
if ($isfile(%source)) {
var %t $+(fetchXMLLocal,$chr(40),$qt($shortfn($replace($1,\,\\,;,\u003b))),$chr(44),$qt(%str),$chr(41)))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
elseif (http://* iswm $1) {
if (%nocache) { var %url = $1 $+ $iif($chr(63) isin %source,&,?) $+ _ctime_nocache_= $+ $ctime $+ . $+ $ticks }
else { var %url = $1 }
var %t $+(fetchXMLURL,$chr(40),$qt($replace($qt(%url),;,\u003b)),$chr(44),$qt(%str),$chr(44),%authKey,$chr(41)))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
else {
var %t $+(getValueFromXML,$chr(40),$qt($replace($1,",')),$chr(44),$qt(%str),$chr(41))
if ($com(%handler,eval,1,bstr*,%t)) return $com(%handler).result
}
}
}
}
Hi guys, need some serious help, and cookies will be given to those who help :P
So I've copied that script in my remote.ini, I've set my variables:
I've used the IP of the stream url, and the port,
I'm not sure what to use as radio.server tho?
I've set admin, and pwd
I've reloaded the script, ran the initialization commands, etc
when I save my config from the dialog box, it says successfully connected to server.
However, none of the commands work! :((
I try from a different mirc obviously, using !dj !song !url !tune etc but not getting any response..
Help!
(if you feel adventurous, the bot is running on my server irc.atrum.org and in the room #uncutmedia )
Hi,
sorry for the late responce.
I get 1 error from the bot when I reloaded it in mIRC:
Ongeldige server/script opdracht (/_radio.init)
And when I start mIRC there are some errors but they where Always there....windows 8 issue I guess.
I mostly have this working for our channel and radio station. However, when the !listener trigger is executed, it sends send everything! I only expected it to send the user c.listener / m.listeners. I am using a Shoutcast v1 encoder in SAMBC. Here is an example of what a user is getting:
Listeners: 8100021234Varioushttp://myradiostation.com/dreamonDreamOn Radio Michael Jackson - Billie Jean (Dream'R Stream'R)&artist=Michael%20Jackso n&title=Billie%20Jean&album=Thriller&duration=294113&songtype=S&overlay=no&buycd=&website=&picture=3551.jpg#DreamOn-Radio.rNADream'R Stream'R11968469164audio/mpeg1.9.8 A>39611640059150182135800000007659036 D>108.249.90.203WinampMPEG/5.62, Ultravox/2.1010561462108.249.90.203WinampMPEG/5.65, Ultravox/2.1068704 6577.101.66.244WinampMPEG/5.61,Ultravox/2.1067824661376517826Michael Jackson - Billie Jean (Dream'R Stream'R)1376517816Dream On Radio - All The Right Stuff (Dream'R Stream'R)1376517292Nik Kershaw - Wouldn't it be good (Dream'R Stream'R)1376517059Shinedown - Bully (Dream'R Stream'R)1376516830Bryan Adams - Lonely Nights1376516817Dream On Radio - We'll Provide The Beats1376516517Volbeat - Fallen1376516292Foreigner - Feels Like the First Time1376516122Bay City Rollers - Saturday Night1376515899 >The Byrds - Turn Turn Turn/1000 (Dream'R Stream'R) Any ideas, what I might not have done right?hi ty for this.
First , I have no clue in coding mIrc . lol So forgive me.
I am curious if it is possible to make this to where anyone in a certain channel can logon as a DJ just by (!onair $nick ) then have it state $nick has taken control of the DJ Booth. And if they type ( !offair ) it will log them off and state ( $nick has left the booth ) But also start a timer and end the timer at the same time. And have ( !dj show the dj $nick and amount of time onair )
Ok next lol I would like !request ( artist name - song name) open for everyone but sent to the same channel that the dj is in and a pm to that dj. to be available in other channels
And lol I know lot to ask. command !np for next song in quee to be available in other channels
Lastly :) !radio command that will display multiple links to players like : QuickTime ,Real Player, Windows Media Player , Winamp, iTunes and any others.
and a way to add fun commands.
ty for your time
yes the !onair and !offair you are correct. but I need something like a stop watch or clock or timer that starts for that dj when he goes !onair and stops !offair and can display the amount of time the dj has been onair with the !dj. but would like to keep the part that if ni dj is oniar it will state no dj on air.
on *:start: {
dialog -md Panel panel
;; connection command (DO NOT modify this)
if (!%bot.nick) server %irc.server %irc.port -i %bot.nick %bot.anick %bot.user %bot.name
}
->
on *:start: {
dialog -md Panel panel
;; connection command (DO NOT modify this)
if (!%bot.nick) server %irc.server %irc.port %irc.spass -i %bot.nick %bot.anick %bot.user %bot.name
}
And you set into your variables %irc.spass with the password of your server
Example:
/set %irc.spass mypassword
server chat.vaughn.vg 443 -i papertowel shithead href="http://bot.name" target="_blank">bot.name
Find line
alias rd.title { topic %irc.chan 07,01 $+ %cfg.name $+ 15,01 Do you want fries with that? 14,01 $+ $chr(124) 07,01Current DJ14,01:15,01 $iif(%rd.status == 1, %rd.dj, None) 14,01 $+ $chr(124) 07,01Tune14,01:15,01 %cfg.site }
and replace it with
alias rd.title { ;topic %irc.chan 07,01 $+ %cfg.name $+ 15,01 Do you want fries with that? 14,01 $+ $chr(124) 07,01Current DJ14,01:15,01 $iif(%rd.status == 1, %rd.dj, None) 14,01 $+ $chr(124) 07,01Tune14,01:15,01 %cfg.site }
Official Confirmed that is not Working with IceCast 1.*
Reason Unclear Source Code:
http://icecast-server.sourcearchive.com/documentation/1:1.3.12-15/client_8c-source.html
Update.
Issue Detected with ShoutCast 2.* Servers. Fixed...
Official Tested On 3 Servers
IceCast 2.3.1
ShoutCast 1.9.8
ShoutCast 2.0
Working Fine.
JJM you can assign a DJ, by adding an AIM TAG to your streaming INFO. or else i provide for this scrip some variables that you can work with...
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;: %rd.status (0 for offline, 1 for online) | %rd.bitrate (bitrate) ::
;: %rd.clisten (current listeners) | %rd.song (current song) ::
;: %rd.dj (current DJ, pulled from AIM tag) | %cfg.site (website url) ::
;: %rd.plisten (peak listeners) | %rd.genre (genre) ::
;: %rd.mlisten (max listeners) | %rd.type (IceCast/ShoutCast) ::
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
with %rd.dj you can set your dj with your own way. But be noticed you should do that on the "BDATA" alias because it is self updating in there
I'm not really sure what causes this issue. It's and old code and needs further inspection to be able to understand what's wrong. Therefore you have to wait a couple of days, because i'm on my exam period for this season.
The thing you can do to help me is to provide me your Radio Server Branch and Version. To be able to setup an identical Radio Server to test it, unless you want to send me your credentials on a private message to test it live.