This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Domsen update to Shoutcast 2.4.7.256

Support & discussion of released scripts, and announcements of new releases.
r
ricktee76
Voice
Posts: 12
Joined: Tue Jul 12, 2016 2:26 am

Domsen update to Shoutcast 2.4.7.256

Post by ricktee76 »

I've updated the domsen script to work with the latest Shoutcast server v2.4.7.256, I would like to add the kick command to it if anyone could help it's appreciated. I have tried to update the instruction section to reflect the changes and added that I've updated the script.

Code: Select all

# shoutcast.tcl v1.03XXX by domsen <domsen@domsen.org> (c)2o13
#
# comments? bugs? ideas? requests? money? beer?
# plz mail me or visit my homepage @ www.domsen.org
# visit #newsticker@ircnet
#
#
# whats this script all about?
# -----------------------------
#
# this script is for all the online radio admins out there. it announces serveral
# stuff like the status of your radio, the current song, new listener peaks,
# the current listeners and much much more to the channels you want.
# the users can get infos by public and msg command, too, like the stream url,
# stream stats, the last played songs, the current song, the dj... and much much
# more.
# also the bot informs the users about the current dj, whenever he changes or
# a certain command is triggered. the dj name doesnt need to be your nickname,
# so you can also call yourself "goethe mc" even if your irc nickname is
# [gay]michael. the good thing about this is: nobody knows your nickname, so
# you wont get unwanted querys with requestes and greets. the dj can also change
# his nickname and the request- and greet-feature will still work fine.
# only users with the flag +D can be djs, so make sure to give this flag to
# your djs -> .chattr djnick +D in the partyline.
#
# the script also changes the topic when your stream goes on or offline and
# sends a public message, which is fully costumizeable. try it out yourself
# and maybe it suits your needs :)
#
# it was tested with shoutcast 1.9.2 on debian linux.
#
# NOTE 1: make sure youve got a good connection from your shellserver to your
# streamserver - if its the same server then thats very very good. the bot
# checks every minute if something happened, so if the connection is not fast
# the bot will lag like hell or timeout. make sure to change your settings
# for the eggdrop floodprotection.
#
# NOTE 2: read the text here carefully, i get many many emails asking questions
# which are acutally answered in this manual here. dont expect me to answer
# these mails. :P
#
#
# script history:
# ----------------
#
# v1.03 - different variables in the texts/topics possible
#       - possibility to unset the dj
#   - splitted the scripts chans in 'radiochans' and 'adminchans'
#   - 'advertiseonlyifonline'-function
#   - possibility to get a msg if the bot goes down
#   - more regexes
#   - some bugfixes
# v1.02 - added the .listener command, corrected some typos ;>
# v1.01 - fixed a string i forgot to replace
# v1.0  - first public release
#
#
#
# what does what config option mean/do?
# --------------------------------------
#
# radiochans - the channels the tcl is active in, "" for all, or "#chan1 #chan2"
# adminchans - the channels the admin commands work in
#
# streamip - the ip of your radio
# streamport - the port of your radio
# streampass - the admin pass of your radio
#
# scstatstrigger - the trigger for the radio stats
# scplayingtrigger - shows the song the radio is playing now
# sclistenertrigger - shows the current listenercount
# scdjtrigger - shows the current dj name
# scstreamtrigger - shows your stream url -> streamtext
# scsetdjtrigger - sets the current dj name, this doesnt have to be your nickname.
#                  your nick will be saved too and all requestes and greets will be
#                  redirected to this nickname. only availavle for ppl with the +D
#                  flag.
# scunsetdjtrigger - unsets the current dj, needs the +D flag
# screquesttrigger - the command which the users can use if they request a certain song
# scgreettrigger - the command which users can use if the want to greet sb
# sclastsongstrigger - the commands which users can use if they want to see the
#                      songhistory
# schelptrigger - shows the available commands
#
# alertadmin - the userhandle of the user who will get a msg if the server goes down
# doalertadmin - 1 if you want to get a msg if the server goes offline, 0 if you
#       dont. this is done through the bots notes system because its
#       more comfortable and persistent this way.
#
# announce - shall the bot announce any stuff? 1 for yes, 0 for no
# urltopic - shall the bot change the topic everytime the radio goes on or off?
# tellsongs - shall the bot post the songtitle to the channels everytime a
#             new song starts?
# tellusers - shall the bot post the number of current users to the channel
#             everytime it changes or a new user maximum is reached?
# tellbitrate - shall the bot announce bitrate changes?
#
# offlinetext - the reason the bot says when the radio goes offline
# offlinetopic - the topic which is set when the radio goes offline
#
# onlinetext - the reason the bot says when the radio goes online
# onlinetopic - the topic which is set when the radio goes online
#
# streamtext - the text with your stream infos
# advertise - shall the bot advertist the advertisetext?
# advertiseonlyifonline - 1 if the bot only should advertise the radio if the stream
#           is up and running, 0 for all-the-time advertisement
# advertisetext - the text the bot will post once every 10 minutes.
#
#
#
# how do i put variables in the different texts and topics?
# ----------------------------------------------------------
#
# the script knows the following variables which can be used in the offlinetext,
# offlinetopic, onlinetext, onlinetopic, streamtext and advertisetext:
#
# /dj/ - the djnickname
# /sgenre/ - the servers music genre
# /stitle/ - the streamtitle
# /surl/ - the servers url
# /bitrate/ - the current streaming bitrate
# /curlist/ - current listeners
# /curhigh/ - current listener peak
# /cursong/ - the current song
# $streamip - the streams ip
# $streamport - the streams port
#
#
#
# known bugs:
# ------------
#
# -numbers in the songhistory are killed, this is a xml sourcecode problem
# -öäü are not shown correctly in the songtitles, because xml replaces each
#  of them with the same chars, so i cant fix it :( bitnapper told me it
#  would work anyway, but i cant confirm it. maybe my shoutcast version sucks.
#  the string replacements are included, so if it works youre a lucky guy.
#
#
# loser of the day:
# ------------------
#
# loops aka edema for ripping the whole script, removing all of my copyright
# infos and comments and putting his name under it. yeah, thats the open source
# spirit...
#
#
# Updated by RickTee76 for Shoutcast v2.4.7.256
# HTTP 1.1 
#
# changed .playing to .np (now playing)
# changed .wish to .request
# changed .help to .djhelp
# added sid= to sockets default is 1 but change as needed
# removed WEBHITS (deprecated)
# changed REPORTEDLISTENERS (deprecated) to UNIQUELISTENERS
#
#
# config ##########################


set radiochans "#radiochan"
set adminchans "#adminchan"
set streamip "xx.xx.xxx.xxx"
set streamport "8000"
set streampass "adminpassword"
set scstatstrigger ".stats"
set scstreamtrigger ".stream"
set scplayingtrigger ".np"
set sclistenertrigger ".listener"
set scdjtrigger ".dj"
set scsetdjtrigger ".setdj"
set scunsetdjtrigger ".unsetdj"
set screquesttrigger ".request"
set scgreettrigger ".greet"
set sclastsongstrigger ".recent"
set schelptrigger ".djhelp"

set alertadmin ""
set doalertadmin "1"

set announce "1"

set urltopic "0"
set ctodjc "1"
set tellsongs "1"
set tellusers "1"
set tellbitrate "1"

set advertise "0"
set advertiseonlyifonline "1"

set offlinetext "going offline now"
set offlinetopic "visit our website @ www.yoursite.com"

set onlinetext "/stitle/ now online @ /surl/ with /bitrate/kbits"
set onlinetopic "/dj/@/stitle/ @ /surl/ streaming at /bitrate/kbits"

set streamtext "tune in /dj/ @ http://$streamip:$streamport/listen.pls"

set advertisetext "stream @ http://$streamip:$streamport/listen.pls"

# end of config #####################

bind pub - $scstatstrigger  pub_scstat
bind msg - $scstatstrigger  msg_scstat

bind pub - $scplayingtrigger  pub_playing
bind msg - $scplayingtrigger  msg_playing

bind pub - $scdjtrigger  pub_dj
bind msg - $scdjtrigger  msg_dj

bind pub D $scsetdjtrigger  pub_setdj
bind msg D $scsetdjtrigger  msg_setdj

bind pub D $scunsetdjtrigger  pub_unsetdj
bind msg D $scunsetdjtrigger  msg_unsetdj

bind pub D $sckickdjtrigger  pub_kickdj
bind msg D $sckickdjtrigger  msg_kickdj

bind pub - $screquesttrigger  pub_request
bind msg - $screquesttrigger  msg_request

bind pub - $scgreettrigger  pub_greet
bind msg - $scgreettrigger  msg_greet

bind pub - $scstreamtrigger pub_stream
bind msg - $scstreamtrigger msg_stream

bind pub - $sclastsongstrigger pub_lastsongs
bind msg - $sclastsongstrigger msg_lastsongs

bind pub - $sclistenertrigger pub_listener
bind msg - $sclistenertrigger msg_listener

bind pub - $schelptrigger pub_help
bind msg - $schelptrigger msg_help

bind time - "* * * * *" isonline
bind time - "?0 * * * *" advertise
bind nick D * djnickchange


set dj "RadioBot"
set surl ""
set bitrate ""
set stitle ""

if {[file exists dj.txt]} {
   set temp [open "dj.txt" r]
   set dj [gets $temp]
   close $temp
}

proc shrink { calc number string start bl} { return [expr [string first "$string" $bl $start] $calc $number] }


proc status { } {
   global streamip streamport streampass
   if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
      putlog "error: $sockerror"
      return 0 } else {
      puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
      puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
      puts $sock "Host: $streamip"
      puts $sock "Connection: close"
      puts $sock ""
      flush $sock
      while {[eof $sock] != 1} {
         set bl [gets $sock]
         if { [string first "standalone" $bl] != -1 } {
            set streamstatus [string range $bl [shrink + 14 "<STREAMSTATUS>" 0 $bl] [shrink - 1 "</STREAMSTATUS>" 0 $bl]]
         }
      }
      close $sock
   }
   if {[info exists streamstatus]} {
      if { $streamstatus == "1" } { return 1 } else { return 0 }
   } else { return 0 }
}




proc poststuff { mode text } {
   global radiochans dj
   set curlist "0"
   set curhigh "0"
   set surl ""
   set cursong ""
   set sgenre ""
   set bitrate "0"
   set stitle ""

   set temp [open "isonline" r]
   while {[eof $temp] != 1} {
      set zeile [gets $temp]
      if {[string first "curlist:" $zeile] != -1 } { set curlist $zeile }
      if {[string first "curhigh:" $zeile] != -1 } { set curhigh $zeile }
      if {[string first "cursong:" $zeile] != -1 } { set cursong [lrange $zeile 1 [llength $zeile]] }
      if {[string first "sgenre:" $zeile] != -1 } { set sgenre [lrange $zeile 1 [llength $zeile]]}
      if {[string first "serverurl:" $zeile] != -1 } { set surl [lindex $zeile 1] }
      if {[string first "bitrate:" $zeile] != -1 } { set bitrate [lindex $zeile 1] }
      if {[string first "stitle:" $zeile] != -1 } { set stitle [lindex $zeile 1] }
   }
   close $temp

   regsub -all "/stitle/" $text "$stitle" text
   regsub -all "/curlist/" $text "$curlist" text
   regsub -all "/curhigh/" $text "$curhigh" text
   regsub -all "/cursong/" $text "$cursong" text
   regsub -all "/sgenre/" $text "$sgenre" text
   regsub -all "/surl/" $text "$surl" text
   regsub -all "/bitrate/" $text "$bitrate" text
   regsub -all "/dj/" $text "$dj" text

   foreach chan [channels] {
      if {$radiochans == "" } { putserv "$mode $chan :$text" }
      if {$radiochans != "" } {
         if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1)} {putserv "$mode $chan :$text"}
      }
   }
}


proc schelp { target } {
   global scstatstrigger scstreamtrigger scplayingtrigger scdjtrigger sclastsongstrigger screquesttrigger scgreettrigger sclistenertrigger
   putserv "notice $target :the following commands are available:"
   putserv "notice $target :$scstatstrigger - $scstreamtrigger - $scplayingtrigger - $scdjtrigger - $sclastsongstrigger - $screquesttrigger - $scgreettrigger - $sclistenertrigger"
   putserv "notice $target : Original Shoutcast Script by Domsen <domsen@domsen.org> updated by RickTee76"
}

proc msg_help {nick uhost hand arg} {
   schelp $nick
}

proc pub_help {nick uhost hand chan arg} {
   global radiochans
   if {$radiochans == "" } { schelp $nick }
   if {$radiochans != "" } {
      if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { schelp $nick}
   }
}

proc advertise { nick uhost hand chan arg } {
   global advertisetext advertise advertiseonlyifonline
   if {$advertise == "1" && $advertiseonlyifonline == "0"} { poststuff privmsg "$advertisetext" }
   if {$advertise == "1" && $advertiseonlyifonline == "1" && [status] == 1} { poststuff privmsg "$advertisetext" }
}


proc setdj {nickname djnickname } {
   if {$djnickname == "" } { set djnickname $nickname }
   global streamip streamport streampass dj
   putlog "shoutcast: new dj: $djnickname ($nickname)"
   set temp [open "dj.txt" w+]
   puts $temp $djnickname
   close $temp
   set temp [open "djnick.txt" w+]
   puts $temp $nickname
   close $temp
   if { [status] == "1" } { poststuff privmsg "$djnickname is now your LIVE DJ!!"
      if { $::ctodjc == "1" } {
         set temp [open "isonline" r]
         while {[eof $temp] != 1} {
            set zeile [gets $temp]
            if {[string first "isonline:" $zeile] != -1 } { set oldisonline $zeile }
            if {[string first "curlist:" $zeile] != -1 } { set oldcurlist $zeile }
            if {[string first "curhigh:" $zeile] != -1 } { set oldcurhigh $zeile }
            if {[string first "cursong:" $zeile] != -1 } { set oldsong $zeile }
            if {[string first "bitrate:" $zeile] != -1 } { set oldbitrate $zeile }
         }
         close $temp
      }
   } else {
      putserv "privmsg $nickname :this has not been announced because the radio is currently offline."
   }
}


proc msg_setdj { nick uhost hand arg } { setdj $nick $arg }
proc pub_setdj { nick uhost hand chan arg } { global adminchans; if {([lsearch -exact [string tolower $adminchans] [string tolower $chan]] != -1) || ($adminchans == "")} { setdj $nick $arg }}

proc unsetdj { nick } {
   global dj
   
if {[file exists dj.txt]} {
   set temp [open "dj.txt" r]
   set dj "RadioBot"
   close $temp
}
#   file delete dj
   putserv "notice $nick :Thank you, you are no longer the Live DJ"
}

proc msg_unsetdj { nick uhost hand arg } { unsetdj $nick }
proc pub_unsetdj { nick uhost hand chan arg } { global adminchans; if {([lsearch -exact [string tolower $adminchans] [string tolower $chan]] != -1) || ($adminchans == "")} { unsetdj $nick }}

proc listener { target } {
   global streamip streamport streampass
   putlog "shoutcast: $target requested listener count"
   if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
      putlog "error: $sockerror"
      return 0 } else {
      puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
      puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
      puts $sock "Host: $streamip"
      puts $sock "Connection: close"
      puts $sock ""
      flush $sock
      while {[eof $sock] != 1} {
         set bl [gets $sock]
         if { [string first "standalone" $bl] != -1 } {
            set repl [string range $bl [shrink + 19 "<UNIQUELISTENERS>" 0 $bl] [shrink - 1 "</UNIQUELISTENERS>" 0 $bl]]
            set curhigh [string range $bl [shrink + 15 "<PEAKLISTENERS>" 0 $bl] [shrink - 1 "</PEAKLISTENERS>" 0 $bl]]
            set maxl [string range $bl [shrink + 14 "<MAXLISTENERS>" 0 $bl] [shrink - 1 "</MAXLISTENERS>" 0 $bl]]
            set avgtime [string range $bl [shrink + 13 "<AVERAGETIME>" 0 $bl] [shrink - 1 "</AVERAGETIME>" 0 $bl]]
         }
      }
      close $sock
      putserv "notice $target :there are currently $repl unique people listening, the listener maximum is $maxl, our user peak was at $curhigh listeners, the listening time average is $avgtime"
   }
}

proc msg_listener { nick uhost hand arg } { listener $nick }
proc pub_listener { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { listener $nick  }}

proc request { nick arg } {
   if {$arg == ""} { putserv "notice $nick :you forgot to add your request"; return 0}
   if { [status] == "1" } {
      set temp [open "djnick.txt" r]
      set djnick [gets $temp]
      close $temp
      putserv "privmsg $djnick :(Request) - $nick - $arg"
   } else {
      putserv "notice $nick :Sorry the radio is currently offline"
   }
}


proc msg_request { nick uhost hand arg } { request $nick $arg }
proc pub_request { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { request $nick $arg }}




proc sclastsongs { target } {
   global streamip streamport streampass
   putlog "shoutcast: $target requested songhistory"
   if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
      putlog "error: $sockerror"
      return 0 } else {
      puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
      puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
      puts $sock "Host: $streamip"
      puts $sock "Connection: close"
      puts $sock ""
      flush $sock
      while {[eof $sock] != 1} {
         set bl [gets $sock]
         if { [string first "standalone" $bl] != -1 } {
            set songs [string range $bl [string first "<TITLE>" $bl] [expr {[string last "</TITLE>" $bl] + 7}]]

            regsub -all "<" $songs "<" songs
            regsub -all ">" $songs ">" songs
            regsub -all "&" $songs "+" songs
            regsub -all """ $songs "\"" songs
            regsub -all "'" $songs "'" songs
            regsub -all "ÿ" $songs "" songs
            regsub -all "<TITLE>" $songs "(" songs
            regsub -all "</TITLE>" $songs ")" songs
            regsub -all "<SONG>" $songs "" songs
            regsub -all "</SONG>" $songs " - " songs
            regsub -all "<PLAYEDAT>" $songs "" songs
            regsub -all "</PLAYEDAT>" $songs "" songs
            regsub -all {\d} $songs "" songs

            regsub -all "´" $songs "´" songs
            regsub -all "&#x96;" $songs "-" songs
            regsub -all "ö" $songs "ö" songs
            regsub -all "ä" $songs "ä" songs
            regsub -all "ü" $songs "ü" songs
            regsub -all "Ö" $songs "Ö" songs
            regsub -all "Ä" $songs "Ä" songs
            regsub -all "Ü" $songs "Ü" songs
            regsub -all "ß" $songs "ß" songs
         }
      }
      close $sock
      putserv "notice $target :$songs"
   }
}

proc msg_lastsongs { nick uhost hand arg } { sclastsongs $nick }
proc pub_lastsongs { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { sclastsongs $nick }}

proc scstream { target } {
   global streamip streamport streamtext
   putlog "shoutcast: streaminfo requested by $target"
   putserv "notice $target :$streamtext"
}

proc msg_stream { nick uhost hand arg } { scstream $nick }
proc pub_stream { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { scstream $nick }}

proc scgreet { nick arg } {
   if {$arg == ""} { putserv "notice $nick :you forgot to add your message"; return 0}
   if { [status] == "1" } {
      set temp [open "djnick" r]
      set djnick [gets $temp]
      close $temp
      putserv "privmsg $djnick :(GREET) - $nick - $arg"
   } else {
      putserv "notice $nick :sorry radio is currently offline"
   }
}


proc msg_greet { nick uhost hand arg } { scgreet $nick $arg }
proc pub_greet { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { scgreet $nick $arg }}



proc djnickchange { oldnick uhost hand chan newnick } {
   set temp [open "djnick" r]
   set djnick [gets $temp]
   close $temp
   if {$oldnick == $djnick} {
      putlog "shoutcast: dj nickchange $oldnick -> $newnick"
      set temp [open "djnick" w+]
      puts $temp $newnick
      close $temp
   }
}


  
proc dj { target } {
   global streamip streamport streampass dj
   putlog "shoutcast: $target asked for dj info"
   if {[status] == 1} {
      if {[file exists dj.txt]} {
         set temp [open "dj.txt" r]
         set dj [gets $temp]
         close $temp
         putserv "privmsg $target :$dj is at the turntables!"
      } else { putserv "privmsg $target :sorry, no dj name available" }
   } else { putserv "privmsg $target :sorry radio is currently offline" }
}

proc msg_dj { nick uhost hand arg } { dj $nick}
proc pub_dj { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { dj $nick  }}

proc scstat {target} {
   global streamip streamport streampass
   putlog "shoutcast: $target asked for serverstats"
   if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
      putlog "error: $sockerror"
      return 0 } else {
      puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
      puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
      puts $sock "Host: $streamip"
      puts $sock "Connection: close"
      puts $sock ""
      flush $sock
      while {[eof $sock] != 1} {
         set bl [gets $sock]
         if { [string first "standalone" $bl] != -1 } {
            set streamstatus [string range $bl [shrink + 14 "<STREAMSTATUS>" 0 $bl] [shrink - 1 "</STREAMSTATUS>" 0 $bl]]
            set repl [string range $bl [shrink + 19 "<UNIQUELISTENERS>" 0 $bl] [shrink - 1 "</UNIQUELISTENERS>" 0 $bl]]
            set curhigh [string range $bl [shrink + 15 "<PEAKLISTENERS>" 0 $bl] [shrink - 1 "</PEAKLISTENERS>" 0 $bl]]
            set currentl [string range $bl [shrink + 18 "<CURRENTLISTENERS>" 0 $bl] [shrink - 1 "</CURRENTLISTENERS>" 0 $bl]]
            set surl [string range $bl [shrink + 11 "<SERVERURL>" 0 $bl] [shrink - 1 "</SERVERURL>" 0 $bl]]
            set maxl [string range $bl [shrink + 14 "<MAXLISTENERS>" 0 $bl] [shrink - 1 "</MAXLISTENERS>" 0 $bl]]
            set bitrate [string range $bl [shrink + 9 "<BITRATE>" 0 $bl] [shrink - 1 "</BITRATE>" 0 $bl]]
            set stitle [string range $bl [shrink + 13 "<SERVERTITLE>" 0 $bl] [shrink - 1 "</SERVERTITLE>" 0 $bl]]
            set sgenre [string range $bl [shrink + 13 "<SERVERGENRE>" 0 $bl] [shrink - 1 "</SERVERGENRE>" 0 $bl]]
            if {$sgenre != ""} {set sgenre " ($sgenre)"}
            set avgtime [string range $bl [shrink + 13 "<AVERAGETIME>" 0 $bl] [shrink - 1 "</AVERAGETIME>" 0 $bl]]
            set irc [string range $bl [shrink + 5 "<IRC>" 0 $bl] [shrink - 1 "</IRC>" 0 $bl]]
            set icq [string range $bl [shrink + 5 "<ICQ>" 0 $bl] [shrink - 1 "</ICQ>" 0 $bl]]
            if {$icq == 0} { set icq "N/A" }
            set aim [string range $bl [shrink + 5 "<AIM>" 0 $bl] [shrink - 1 "</AIM>" 0 $bl]]
            set streamhits [string range $bl [shrink + 12 "<STREAMHITS>" 0 $bl] [shrink - 1 "</STREAMHITS>" 0 $bl]]
            set version [string range $bl [shrink + 9 "<VERSION>" 0 $bl] [shrink - 1 "</VERSION>" 0 $bl]]
            if {$streamstatus == 1} {
               if {[file exists dj.txt]} {
                  set temp [open "dj.txt" r]
                  set dj [gets $temp]
                  close $temp
               } else { set dj "" }
               putserv "notice $target :$stitle$sgenre is online, running shoutcast $version and streaming at $bitrate kbps,  your dj is $dj."
            } else {
               putserv "notice $target :$stitle$sgenre is currenty offline, running shoutcast $version and streaming at $bitrate kbps, check out $surl" }
            putserv "notice $target :there are currently $repl unique people listening, the listener maximum is $maxl, our user peak was at $curhigh listeners."
            putserv "notice $target :the average user is listening $avgtime seconds, our stream had $webhits webhits and $streamhits streamhits."
            putserv "notice $target :you can contact the team by irc on $irc, via aim at $aim and with icq by the uin $icq."
         }
      }
      close $sock
   }
}

proc msg_scstat { nick uhost hand arg } { scstat $nick}
proc pub_scstat { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { scstat $nick  }}

proc playing {target} {
   global streamip streamport streampass dj
   putlog "shoutcast: $target asked for current song"
   if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
      putlog "error: $sockerror"
      return 0 } else {
      puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
      puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
      puts $sock "Host: $streamip"
      puts $sock "Connection: close"
      puts $sock ""
      flush $sock
      while {[eof $sock] != 1} {
         set bl [gets $sock]
         if { [string first "standalone" $bl] != -1 } {
            set streamstatus [string range $bl [shrink + 14 "<STREAMSTATUS>" 0 $bl] [shrink - 1 "</STREAMSTATUS>" 0 $bl]]
            set songtitle [string range $bl [shrink + 11 "<SONGTITLE" 0 $bl] [shrink - 1 "</SONGTITLE>" 0 $bl]]
            set songurl [string range $bl [shrink + 9 "<SONGURL>" 0 $bl] [shrink - 1 "</SONGURL>" 0 $bl]]
            if {$songurl != ""} { set songurl " ($songurl)"}
            regsub -all "<" $songtitle "<" songtitle
            regsub -all ">" $songtitle ">" songtitle
            regsub -all "&" $songtitle "+" songtitle
            regsub -all """ $songtitle "\"" songtitle
            regsub -all "'" $songtitle "'" songtitle
            regsub -all "ÿ" $songtitle "" songtitle
            regsub -all "´" $songtitle "´" songtitle
            regsub -all "&#x96;" $songtitle "-" songtitle
            regsub -all "ö" $songtitle "ö" songtitle
            regsub -all "ä" $songtitle "ä" songtitle
            regsub -all "ü" $songtitle "ü" songtitle
            regsub -all "Ö" $songtitle "Ö" songtitle
            regsub -all "Ä" $songtitle "Ä" songtitle
            regsub -all "Ü" $songtitle "Ü" songtitle
            regsub -all "ß" $songtitle "ß" songtitle
            regsub -all "&apos;" $songtitle "'" songtitle
            if {[info exists streamstatus]} {
               if {$streamstatus == 1} {
               #replace &apos in titles
                  putserv "notice $target :\007Now Playing\007 $songtitle $songurl"
               } else {
                  putserv "notice $target :server is currently offline, sorry"
               }
            } else { putserv "notice $target :server is currently offline, sorry" }
         }
      }
      close $sock
   }
}

proc msg_playing { nick uhost hand arg } { playing $nick}
proc pub_playing { nick uhost hand chan arg } { global radiochans; if {([lsearch -exact [string tolower $radiochans] [string tolower $chan]] != -1) || ($radiochans == "")} { playing $nick  }}

proc isonline { nick uhost hand chan arg } {
   global radiochans announce tellusers tellsongs tellbitrate urltopic dj
   global offlinetext offlinetopic onlinetext onlinetopic
   global streamip streampass streamport dj
   global doalertadmin alertadmin

   if {$announce == 1 || $tellsongs == 1 || $tellusers == 1 || $tellbitrate == 1} {
      set isonlinefile "isonline.txt"
      set oldisonline "isonline: 0"
      set oldcurlist "curlist: 0"
      set oldcurhigh "curhigh: 0"
      set oldsong "cursong: 0"
      set oldbitrate "bitrate: 0"
      if {[file exists $isonlinefile]} {
         putlog "shoutcast: checking if stream is online"
         set temp [open "isonline.txt" r]
         while {[eof $temp] != 1} {
            set zeile [gets $temp]
            if {[string first "isonline:" $zeile] != -1 } { set oldisonline $zeile }
            if {[string first "curlist:" $zeile] != -1 } { set oldcurlist $zeile }
            if {[string first "curhigh:" $zeile] != -1 } { set oldcurhigh $zeile }
            if {[string first "cursong:" $zeile] != -1 } { set oldsong $zeile }
            if {[string first "bitrate:" $zeile] != -1 } { set oldbitrate $zeile }
         }
         close $temp
      }
      if {[catch {set sock [socket $streamip $streamport] } sockerror]} {
         putlog "error: $sockerror"
         return 0} else {
         puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
         puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)"
         puts $sock "Host: $streamip"
         puts $sock "Connection: close"
         puts $sock ""
         flush $sock
         while {[eof $sock] != 1} {
            set bl [gets $sock]
            if { [string first "standalone" $bl] != -1 } {
               set streamstatus "isonline: [string range $bl [shrink + 14 "<STREAMSTATUS>" 0 $bl] [shrink - 1 "</STREAMSTATUS>" 0 $bl]]"
               set repl "curlist: [string range $bl [shrink + 19 "<UNIQUELISTENERS>" 0 $bl] [shrink - 1 "</UNIQUELISTENERS>" 0 $bl]]"
               set curhigh "curhigh: [string range $bl [shrink + 15 "<PEAKLISTENERS>" 0 $bl] [shrink - 1 "</PEAKLISTENERS>" 0 $bl]]"
               set currentl [string range $bl [shrink + 18 "<CURRENTLISTENERS>" 0 $bl] [shrink - 1 "</CURRENTLISTENERS>" 0 $bl]]
               set surl "serverurl: [string range $bl [shrink + 11 "<SERVERURL>" 0 $bl] [shrink - 1 "</SERVERURL>" 0 $bl]]"
               set cursong "cursong: [string range $bl [shrink + 11 "<SONGTITLE" 0 $bl] [shrink - 1 "</SONGTITLE>" 0 $bl]]"
               set songurl [string range $bl [shrink + 9 "<SONGURL>" 0 $bl] [shrink - 1 "</SONGURL>" 0 $bl]]
               set bitrate "bitrate: [string range $bl [shrink + 9 "<BITRATE>" 0 $bl] [shrink - 1 "</BITRATE>" 0 $bl]]"
               set stitle "stitle: [string range $bl [shrink + 13 "<SERVERTITLE>" 0 $bl] [shrink - 1 "</SERVERTITLE>" 0 $bl]]"
               set sgenre "sgenre: [string range $bl [shrink + 13 "<SERVERGENRE>" 0 $bl] [shrink - 1 "</SERVERGENRE>" 0 $bl]]"
            }
         }
         close $sock
      }
      set temp [open "isonline.txt" w+]
      puts $temp "$streamstatus\n$repl\n$curhigh\n$cursong\n$bitrate\n$stitle\n$sgenre\n$surl"
      close $temp
      if {$announce == 1 } {
         if {![info exists streamstatus]} { poststuff privmsg $offlinetext }
         if {$streamstatus == "isonline: 0" && $oldisonline == "isonline: 1"} {
            poststuff privmsg $offlinetext
            if {$doalertadmin == "1"} { sendnote domsen $alertadmin "radio is now offline" }
            if {$urltopic == 1} { poststuff topic $offlinetopic }
         }
         if {$streamstatus == "isonline: 1" && $oldisonline == "isonline: 0" } {
            if {$sgenre != ""} {
               set sgenre " ([lrange $sgenre 1 [llength $sgenre]] )"
            }
            poststuff privmsg "$onlinetext"
            if {$urltopic == 1} { poststuff topic "$onlinetopic" }
         }
      }
      if {($tellusers == 1) && ($streamstatus == "isonline: 1") && ($oldcurhigh != "curhigh: 0") } {
         if {$oldcurhigh != $curhigh} {
            poststuff privmsg "new listener peak: [lindex $curhigh 1]"
         }
         if {$oldcurlist != $repl} {
            poststuff privmsg "there are currently [lindex $repl 1] ($currentl) people listening"
         }
      }
      if {($tellsongs == 1) && ($oldsong != $cursong) && ($streamstatus == "isonline: 1") } {
         if {$songurl != ""} { set songurl " ($songurl)"}
         regsub -all "<" $cursong "<" cursong
         regsub -all ">" $cursong ">" cursong
         regsub -all "&" $cursong "+" cursong
         regsub -all """ $cursong "\"" cursong
         regsub -all "'" $cursong "'" cursong
         regsub -all "ÿ" $cursong "" cursong
         regsub -all "´" $cursong "´" cursong
         regsub -all "&#x96;" $cursong "-" cursong
         regsub -all "ö" $cursong "ö" cursong
         regsub -all "ä" $cursong "ä" cursong
         regsub -all "ü" $cursong "ü" cursong
         regsub -all "Ö" $cursong "Ö" cursong
         regsub -all "Ä" $cursong "Ä" cursong
         regsub -all "Ü" $cursong "Ü" cursong
         regsub -all "ß" $cursong "ß" cursong
         regsub -all "&apos;" $cursong "'" cursong
         putlog $cursong
         poststuff privmsg "\007Now Playing\007: [lrange $cursong 1 [llength $cursong]]$songurl"
      }

      if {($tellbitrate == 1) && ($oldbitrate != $bitrate) && ($streamstatus == "isonline: 1") && ($oldbitrate != "bitrate: 0")} {
         poststuff privmsg "bitrate switched to [lindex $bitrate 1]kbps"
      }
   }
}

putlog "*** shoutcast.tcl v1.03XXX by Domsen updated by RickTee76 <domsen@domsen.org> succesfully loaded. turn it up baby."
Last edited by ricktee76 on Sat Jul 23, 2016 3:10 pm, edited 1 time in total.
r
ricktee76
Voice
Posts: 12
Joined: Tue Jul 12, 2016 2:26 am

Post by ricktee76 »

I managed to figure out on my own how to kick the source. Here is the basic code.
I have mine set so that another DJ cant kick if someone is logged in as the live DJ but here's the basics.

Code: Select all

set sckickdjtrigger "!kickdj"

Code: Select all

bind pub D $sckickdjtrigger  kickdj
bind msg D $sckickdjtrigger  kickdj

Code: Select all

proc kickdj { nick uhost handle chan args } {
global streamip streamport streampass
        putlog "shoutcast: $nick tried do kick the DJ"
        set args [lindex $args 0]
     
     if {[file exists dj.txt]} {
   set temp [open "dj.txt" r]
   set dj $nick
   close $temp
    }
    
       
     	
		    set sock [socket $streamip $streamport]
       		    puts $sock "GET /admin.cgi?pass=$streampass&sid=1&mode=kicksrc HTTP/1.1"
		    puts $sock "User-Agent:Mozilla"
		    puts $sock "Host: $streamip"
		   # puts $sock "Authorization: Basic $streampass"
		    puts $sock ""
		    flush $sock
        
		poststuff privmsg "\002\00315AUTODJ\003\002 is now \00304\002OFF AIR\003\002  your Live DJ is \002\00303$nick\002\003 "
        set dj $nick
     putserv "privmsg shoutcast :DJ kicked from primary server."
	    }
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Post by Arnold_X-P »

its update has internal mistakes .... in line 663 .... check please

[01:13:47] ? botradio ¦ [01:14:00] shoutcast: checking if stream is online
[01:13:47] ? botradio ¦ [01:14:00] Tcl error [isonline]: can't read "streamstatus": no such variable
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
r
ricktee76
Voice
Posts: 12
Joined: Tue Jul 12, 2016 2:26 am

Post by ricktee76 »

i also use 3 txt files maybe thats the error? not being able to write/read
  • dj.txt
    djnick.txt
    isonline.txt
these are one level up in the main folder with the .conf file etc.
M
Mrkivi
Voice
Posts: 2
Joined: Fri Sep 16, 2016 7:57 pm
Location: Sweden

Post by Mrkivi »

Thx for updating but i have a problem with this the output/response on .np is
like this
Now Playing Erasure - Always (trance-dance-mix) (5) - Always (Techno Dance Remix) (&artist=Erasure%20-%20Always%20(trance-dance-mix)%20(5)&title=Always%20(Techno%20Dance%20Remix)&album=&duration=277856&songtype=S&overlay=no&buycd=&website=&picture=)

suggestions??

EDIT solved cleaned up a bit removing some code so it just post artist title ...
d
disneyboy
Voice
Posts: 1
Joined: Wed Dec 27, 2017 5:58 am
Location: karachi

Post by disneyboy »

i have shoutcast 2.4.7 vesion and i load this script and get this error can anyone please help i used all the script of this post too still gets it
shoutcast: checking if stream is online
[05:00:00] Tcl error [isonline]: can't read "streamstatus": no such variable

thanks
r
ricktee76
Voice
Posts: 12
Joined: Tue Jul 12, 2016 2:26 am

Post by ricktee76 »

Make sure you have a file called isonline.txt
If you don't the create one with one line

Code: Select all

1
This will set it as online. The script should then change it to 0 (offline) or leave it set to 1 (online)
User avatar
Arnold_X-P
Master
Posts: 226
Joined: Mon Oct 30, 2006 12:19 am
Location: DALnet - Trinidad - Beni - Bolivia
Contact:

Post by Arnold_X-P »

error in partyline;
[21:23:21] error: couldn't open socket: connection timed out
.:an ideal world:. www.geocities.ws/chateo/yo.htm
my programming place /server ix.scay.net:7005
User avatar
flink
Halfop
Posts: 83
Joined: Sun Feb 21, 2021 9:27 am
Location: Canarias

Post by flink »

hello good , I know it's an old topic, I use this script for a shoutcast v1 stream server and it goes great, but when I use it on a new shoutcast v2 stream server I don't get the songs, I should say that this server uses DJ / User ID for the live streams. which in the script is not mentioned:

Code: Select all

puts $sock "GET /admin.cgi?sid=1&pass=$streampass&mode=viewxml&page=0 HTTP/1.1"
maybe that is the error that I get in the partyline :
Tcl error [isonline]: can't read "streamstatus": no such variable
if someone could help thank you very much
Mi ingles: no es el mejor, Manda el traductor... :)
User avatar
CrazyCat
Revered One
Posts: 1304
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Post by CrazyCat »

Probably that the feed changed between V1 and V2, so the script must be changed to get the good values.

Can you give us an example of the content given by stream V2 ? (xml file)
BTW, if a json version exists, it's better
User avatar
flink
Halfop
Posts: 83
Joined: Sun Feb 21, 2021 9:27 am
Location: Canarias

Post by flink »

hello CrazyCat , I didn't understand you or the translator doesn't express itself so that I can understand it.
I don't know if you are referring to what the stream server gives me:
Server address :
Port :
DJ / User ID :
Mount password :
Stream ID :
Can you give us an example of the content given by stream V2 ? (xml file)
BTW, if a json version exists, it's better
Mi ingles: no es el mejor, Manda el traductor... :)
User avatar
mabrook
Halfop
Posts: 60
Joined: Mon Jun 14, 2021 9:41 am

Post by mabrook »

am trying to help it out.. hopefully it helps..

Code: Select all


<user> .stats
-testbot- Radio Atacama Nuevo Mundo (Varios) is online, running shoutcast 2.6.0.753 (posix(linux x64)) and streaming at 128 kbps,  your dj is .
-testbot- there are currently  unique people listening, the listener maximum is 2, our user peak was at 2 listeners.

<user> .np
-testbot- Now Playingg Conexion Radio Nuevo Mundo De Santiago 

<user> .stream
-testbot- tune in /dj/ @ http://144.217.65.220:8000/listen.pls

<user> .listener
-testbot- there are currently  unique people listening, the listener maximum is 2, our user peak was at 2 listeners, the listening time average is 0

<user> .dj
replied in pvt <testbot> sorry, no dj name available

<user> .greet
-testbot- you forgot to add your message

<user> .greet test
-testbot- [BT] For more information check: .man greet

<user> .djhelp
-testbot- the following commands are available:
-testbot- .stats - .stream - .np - .dj - .recent - .request - .greet - .listener
-testbot-  Original Shoutcast Script by Domsen <domsen@domsen.org> updated by RickTee76



this is the demo radio im testing in the script https://www.rcast.net/demo-account using Shoutcast v2

Code: Select all

set streamip "144.217.65.220"
set streamport "8000"
set streampass "2222222"



a suggestion, maybe you need to review the setup and logins from your radio host.


:P :P :P
User avatar
flink
Halfop
Posts: 83
Joined: Sun Feb 21, 2021 9:27 am
Location: Canarias

Post by flink »

hi mabrook thanks for the input. i'm not saying it doesn't work for you, for me there is no way with server stream zeno.fm.
I stream with radioboss and if I don't put the DJ / user ID I don't connect to the zeno.fm server. it says:
Server connection closed (output 1) Restarting...
only with ip, port, and server pass zeno.fm doesn't read me anything.
this server already says so in your control panel * We only support Shoutcast v2

as I always say sorry if my english is not correct and some word is not the one I interpret but I don't speak english at all and the translators know how to translate.
Mi ingles: no es el mejor, Manda el traductor... :)
User avatar
mabrook
Halfop
Posts: 60
Joined: Mon Jun 14, 2021 9:41 am

Post by mabrook »

flink, do you have a paid plan for zeno.fm or a free plan?

i'm creating a free account from zeno.fm. so that i can test from myself.

:P :P :P


i've tried it, and this is what i got. this is a free plan from zeno.fm

Code: Select all


<user> .errorInfo
<testbot> [12:00:20] ----------------
<testbot> [12:00:20] can't read "streamstatus": no such variable
<testbot>     while executing
<testbot> "puts $temp "$streamstatus\n$repl\n$curhigh\n$cursong\n$bitrate\n$stitle\n$sgenre\n$surl""
<testbot>     (procedure "isonline" line 54)
<testbot>     invoked from within
<testbot> "isonline $_time1 $_time2 $_time3 $_time4 $_time5"
<testbot> [12:00:20] errorCode : TCL READ VARNAME
<testbot> [12:00:20] ----------------
and

Code: Select all

<testbot> [12:05:00] shoutcast: checking if stream is online
<testbot> [12:05:00] Tcl error [isonline]: can't read "streamstatus": no such variable

this is both icecast and shoutcast script.

this is my main stream url

Code: Select all

http://stream.zeno.fm/6q5uz7vw868uv

and yes, you are right flink,

Code: Select all

https://www.imgpaste.net/image/KdkFQS
Last edited by mabrook on Wed Sep 22, 2021 8:44 am, edited 1 time in total.
User avatar
flink
Halfop
Posts: 83
Joined: Sun Feb 21, 2021 9:27 am
Location: Canarias

Post by flink »

mabrook hi

thank you for answering my account on zeno.fm is free
I broadcast in shoutcast format and the widget that they offer reads the songs but the egg with this script does not.
that error is the one that gives me this script:
shoutcast: checking if the broadcast is online.
Tcl error [isonline]: can't read "streamstatus": no such variable exists


CrazyCat made me a small script with json and the api of the web that works very well and quite grateful I am , passes the songs when it is in autodj as live.
what is my problem only passes the songs does not do the same this script that we talked about, when my friends come to broadcast to my radio the json is not integrated, which does not announce the changes of dj, if you are in auto, live, request songs etc..
it jumps messages that the radio is off.


SpiKe^^ a fix so that no more than two requests can be requested in a given time.
Mi ingles: no es el mejor, Manda el traductor... :)
Post Reply