Jump to content
chain

Now playing Radio Station (shoutcast based)

Recommended Posts

  • Administrators
 
Now Playing script for internet radio stations. It uses a SHOUTcast admin page for a given station.
Just Played. Will show up to the last 9 songs played on the given station.

Commands:

!np or !nowplaying will show current song

!np [station name] [c,count,l,listner]
Shows current listner count.

!np [station name] url
will show the url of said site.

!np [station name] status
will show the current status of the stream [Online or Offline]

!jp or !justplayed or !lp or !lastplayed will show previous 3 songs

!jp [1-9]
will show previous 1 or up to 9 previous songs. Default settings allow normal/voice to call up to 5 previous songs. Op/Owners can call up all 9 previous songs. Flood protection is added in to keep a user from calling up the history list more than once in a short period of time.

!np [help]

Code may look long and complicated, I just have added a lot of notes and comments for future modifications and so I remember what I did.

2012-05-08 - v2.1 Original creation Released to the public.
2012-05-24 - v3.0 Released. Merged personal Just playing script with Now Playing script to create a full feature script.

See bottom of script for Version history

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Now Playing ;;;;;;;;;;;;via SHOUTcast ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;ft JustPlayed;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eqrunner;;;;;;;;;;;;v 3.0;;;;;;;;;;;;;;;;;;;;;

/*
!nowplaying
!nowplaying [station name] [s|c|L]
!nowplaying [help|?]
!justplayed
!justplayed [1-9]

*/

;alias np {
on $*:TEXT:/^[!](nowplaying|np|justplayed|jp|justheard|lastplayed|lastplay|lp|previous|previousplay|previousplayed|history|played)/Si:#:{

  ;=== Set up the station Information: ===
  set %np_station SHOUTdrive
  set %np_ip sanjose.oontz.shoutdrive.com
  set %np_port 80
  set %np_url http://www.shoutdrive.com
  ;=== End station Information ===

  ; === Nothing below needs to be modified, unless you wish to modify the output, in which case, go down to the sockclose alias. ===

  set %np_nick $nick
  set %np_chan $chan
  set %np_network $network  

  ;-- Merges multiple commands down to two commands !nowplaying and !justplayed --;
  ;- Nowplaying merge
  var %np_np_list !nowplaying !np
  if ($1 isin %np_np_list) set %np_command !nowplaying
  ;- Justplayed merge
  var %np_jp_list !justplayed !jp !justheard !lastplayed !lastplay !lp !previous !previousplay !previousplayed !played !history
  if ($1 isin %np_jp_list) set %np_command !justplayed

  ;--- Help Parameters
  if ($2 == ?) || ($2 == help) { nowplaying_help | halt }

  ;--- !nowplaying Parameters ---
  if (%np_command == !nowplaying) {
    set %np_sock_GET /7.html HTTP/1.0
  }

  ;--- Variable $3 Parameters ---
  if ($3 != $null) { 
    if ($3 == s) || ($3 == status) set %np_3 status
    if ($3 == url) set %np_3 url
    if ($3 == c) || ($3 == count) || ($3 == listner) || ($3 == l) set %np_3 count
  }

  ;--- !justplayed Parameters ---
  ;- Limits voice and normal to only seeing a max of 5. Allows OPS a max of 10 --
  ;-- Helps prevent standard user flooding
  ;- IF no number is givin, then set to the default amount of 3

  if (%np_command == !justplayed) {
    set %np_sock_GET /played.html HTTP/1.0
    if ($2 isnum 1-9) {
      var %np_oplist isop ishop isowner
      if (%np_nick isop %np_chan) || (%np_nick isowner %np_chan) { 
        set %np_2 $2
      }
      if (%np_nick isvoice %np_chan) || (%np_nick isreg %np_chan) {
        if ($2 > 5) { set %np_2 5 }
        if ($2 <= 5) { set %np_2 $2 }

      }
    }
    if ($2 == $null) { set %np_2 3 }
  }

  ;--- Flood Protection
  if (%np_command == !justplayed) && (%npdelay > 0) { .notice $nick Previous songs already listed. See above. | unset %np_* | halt }

  ;--- Socket Preperation 
  sockclose nowplaying
  sockopen nowplaying %np_ip %np_port
}

;========== SOCK OPEN ==========

on *:SOCKOPEN:nowplaying:{
  sockwrite -n $sockname GET %np_sock_GET
  sockwrite -n $sockname User-Agent: Mozilla
  sockwrite -n $sockname $crlf
}

;========== SOCK READ ==========

on *:sockread:nowplaying:{
  ;--- !nowplaying Sock Read ----
  if (%np_command == !nowplaying) {
    if ($sockerr > 0) {
      notice %np_nick %tegn.1 $+ %radio.navn $+ %tegn.2 %tegn.midt %tegn.1 Stream Is Offline %tegn.2 NOTE1
      return
    }
    :nextread
    sockread -f %scasttemp1
    if ($sockbr == 0) return
    if (%scasttemp1 == $null) %scasttemp1 = empty
    set %scasttemp1 $remove(%scasttemp1,<HTML><meta http-equiv="Pragma" content="no-cache"></head><body>,</body></html>)
    if ((HTTP/1.* !iswm %scasttemp1) && (content-type* !iswm %scasttemp1) && (%scasttemp1 != empty)) {
      set %np_listeners1 $gettok(%scasttemp1,1,44)
      set %np_status1 $gettok(%scasttemp1,2,44) 
      set %np_peak1 $gettok(%scasttemp1,3,44)
      set %np_max1 $gettok(%scasttemp1,4,44)
      set %np_ulistners1 $gettok(%scasttemp1,5,44)
      set %np_kbps $gettok(%scasttemp1,6,44)
      set %np_asong1 $gettok(%scasttemp1,7-,44)
      set %np_song1 $replace(%np_asong1,&,$chr(38),',$chr(39))
    }
    goto nextread
  }
  ;--- !justplayed Sock Read ----
  if (%np_command == !justplayed) {
    sockread -f %jp_temp
    if ($regex(%jp_temp,/(?i)<td>(.+)<\/td>/)) {
      ;echo -s $regml(1)

      ;--- Strips down the code
      /*
      Strips down the code down to the needed info with § seperators to be
      used by the $gettok.
      Yes, I could of combined this in to one or two lines. But I kept it 
      seperate to help keep it understandable and easy to trouble shoot.
      -Removes all close tags in the code </*>
      -Removes all <tr> and <b> tags from the code
      -Replaces all <td> and <br> with § character
      -Counts total § characters to be referenced below in the while loop.
      */
      var %jp_stripped $regsubex($regml(1),/</[^>]*>/g,$chr(0))
      var %jp_stripped $replace(%jp_stripped,<tr>,$chr(0),<b>,$chr(0))
      var %jp_stripped $replace(%jp_stripped,<td>,$chr(167),<br>,$chr(167))
      set %jp_167count $count(%jp_stripped,$chr(167))

      ;----Sets the first song (current song) 
      /*
      Have to as the 'Current song' at the end, screws up 
      the count for the remainder. (Song 1 time and song is at 3 and 4 (odd then even), as 
      the rest are at 6 and 7 (even than odd) 
      */
      set %jp_time1 $gettok(%jp_stripped,3,167)
      set %jp_song1 $gettok(%jp_stripped,4,167)
      var %jp_line_var = 6
      var %jp_songline_var = 2

      ;---Sets the remainder of the songs, plus extra junk.
      /*
      =While the line_var is less than the total number of § characters
      -Sets the time variable
      -Increases the token count number
      -Sets the Song Varible
      -Increases the token count and song line count
      */
      while (%jp_line_var < %jp_167count) {
        set $+(%,jp_time,%jp_songline_var) $gettok(%jp_stripped,%jp_line_var,167)
        inc %jp_line_var
        set $+(%,jp_song,%jp_songline_var) $gettok(%jp_stripped,%jp_line_var,167)
        inc %jp_line_var
        inc %jp_songline_var
      }
      ;set %jp_stripped3 $regsubex($regml(1),/§[^>]*§/g,$chr(167))
    }
  }
}

;========== SOCK CLOSE ==========

on *:sockclose:nowplaying:{
  ;=== Station Fail ====
  ;-- If station is offline then:
  if (%np_status1 == 0) {
    msg %np_chan %np_station $+ : Stream Is Offline 
    goto np_end
  }

  ;=== User had added a 3rd parameter to their message. Aka !nowplaying [station] [s,status,url,c,count,listern]
  ;-- If user has added an S or Status as the 3rd parameter. Then the status of station will show.
  if (%np_3 == status) {
    if (%np_status1 == 0) { var %np_status2 = Offline }
    elseif (%np_status1 == 1) { var %np_status2 = Online }
    msg %np_chan %np_station Status: %np_status2 
    ;msg %np_chan %np_station Status: %np_status2 $chr(124) Listeners: %np_listeners1 $chr(124) Peak: %np_peak1 $chr(124) Limit: $+ %np_max1 $chr(124) Stream: $+ %np_kbps $+ kbps
  }

  ;-- If user has URL as 3rd parameter, then url of site will show.
  if (%np_3 == url) {
    msg %np_chan %np_station $+ : %np_url
  }

  ;-- If user has C, Count, or L, then listener count will show.
  if (%np_3 == count) {
    msg %np_chan %np_station listener count: %np_listeners1 ( %np_ulistners1 unique )
  }

  ;-- IF user has only asked for !np, or !np [station], then the current song will show.
  if (%np_3 == $null) {
    ;--- IF !nowplaying 
    if (%np_command == !nowplaying) {
      msg %np_chan %np_station $+ : %np_song1 
    }
    ;--- IF !justplayed
    if (%np_command == !justplayed) {
      inc -z %npdelay $calc(%np_2 * 10)
      var %jp_t = 1
      var %jp_list2_var = 2
      while (%jp_t <= %np_2) {
        .timer 1 %jp_t msg %np_chan %jp_list_var : $($+(%,jp_time,%jp_list2_var),2) : $($+(%,jp_song,%jp_list2_var),2)
        inc %jp_t
        inc %jp_list2_var
      }
    }
  }
  :np_end
  unset %np_*
  unset %jp_*
}

;============================
;=== Help Section ===========
;============================

alias nowplaying_help {
  .timer 1 0 .msg %np_nick --- Now Playing HELP ---
  .timer 1 1 .msg %np_nick Use command: !nowplaying to see what is currently playing.
  .timer 1 3 .msg %np_nick Use commands: !justplayed or !lastplayed to see the previous 3 songs
  .timer 1 4 .msg %np_nick You can add a number on the end to see a specific amount of previous songs. Limit 5 for users, 10 for ops
  .timer 1 5 .msg %np_nick EX: !justplayed 5 = will give you previous 5 songs.
  .timer 1 6 .msg %np_nick --- END of Now Playing Help ---
  %np_tunage_cleanup
}

/*
====================================
v 2.1 Released to public. Fully working Nowplaying
v 3.0 Rewrittin, Now includes Playlist history and HELP
====================================

Notes:
Two actions read from seperate pages, but use the same common SOCKOPEN/SOCKREAD. 
!nowplaying GET's from /7.html
!justplayed GET's from /playe

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


×
×
  • Create New...