# Скрипт выдает информацио о последних прозвучавших треках с сайта moskva.fm
# by Sergio
# version 0.2 @ 04-Jul-2013
# включение на канале: .chanset #chan +radioonline
package require http 2.7
namespace eval radioonline {
bind pub - !radio [namespace current]::pub
bind msg - !radio [namespace current]::msg
bind pub - !radiolist [namespace current]::rlist
bind msg - !radiolist [namespace current]::rlist_msg
variable timeout "30" ;# таймаут соединения в секундах
variable flood "10" ;# настройка антифлуда в секундах
variable numsongs "3" ;# сколько последних песен выводить (не стоит ставить большие значения)
variable songformat "1";# как выводить список песен. в одну строку (1) или построчно (0)
variable version "0.2"
setudef flag radioonline
variable stations [list "Радио России" ЮFM Радонеж "Бизнес FM" Сити-FM "Ретро FM" "Юмор FM" "Радио Jazz" \
"Мегаполис FM" "Кекс FM" Авторадио "Relax FM" "Эхо Москвы" "Радио Культура" "Говорит Москва" "Радио Дача" \
"Радио Карнавал" "Радио Спорт" КоммерсантъFM "Восток FM" "Добрые Песни" RU.FM "ROCK FM" \
"Радио Звезда" "Дорожное Радио" "Такси FM" "Детское Радио" "Комсомольская правда" "Вести FM" "Радио Шоколад" \
"Рекорд" "Радио Romantika" "Радио Орфей" "Финам FM" "Серебряный дождь" "Best FM" "Радио Classic" \
DFM "Наше Радио" Монте-Карло "Первое Популярное" Шансон "Радио Маяк" Maximum NRJ "Радио 7" "Moscow FM" \
"Русское Радио" "Европа Плюс" "Love Radio" "Русская Служба Новостей" "Хит FM" "Милицейская волна"]
proc msg {nick uhost hand text} {
pub $nick $uhost $hand $nick $text
return
}
proc pub {nick uhost hand chan text} {
variable flood
if {[validchan $chan] && ![channel get $chan radioonline]} {return 1}
if {[info exists [namespace current]::lastreq] && [set diff [expr [clock seconds] - $[namespace current]::lastreq]] < $flood} {
putserv "NOTICE $nick :Команда запрашивалась недавно. Повторите попытку через [expr $flood - $diff] сек."
return
}
set [namespace current]::lastreq [clock seconds]
regsub -all -- {[^a-zа-яA-ZА-ЯёЁ0-9\x20\_\-]} $text "" text
if {[string is space $text]} {
putserv "NOTICE $nick :Используйте $::lastbind \<радиостанция\> - попытка узнать послдние песни, прозвучавшие на указанной радиостанции (эфир Москвы с сайта moskva.fm). Список станций доступен по команде !radiolist"
return 1
}
if {[set station [selectstation $text]] eq "none"} {
putserv "NOTICE $nick :Такой станции '$text' в списке нет. Уточните список станций по команде !radiolist"
return 1
}
::http::config -urlencoding utf-8 -useragent {Opera/9.80 (Windows NT 6.1; U; en) Presto/2.7.39 Version/11.00}
variable timeout
if {[catch {
set token [::http::geturl \
"http://m.moskva.fm/stations/$station" \
-timeout [expr $timeout * 1000] \
-binary false \
-command [list [namespace current]::data $nick $chan $text]]
} err]} {
putserv "NOTICE $nick :Очень жаль, но я не могу подключиться к серверу."
putlog "::radioonline::connect error: $err"
return
}
putserv "NOTICE $nick :Ваш запрос принят."
}
proc data {nick chan text token} {
set status [::http::status $token]
set ncode [::http::ncode $token]
if {$status ne "ok"} {
::http::cleanup $token
putserv "PRIVMSG $chan :Сервер не отвечает, попробуйте увеличить таймаут или повторить попытку позже."
return
}
if {$ncode != "200"} {
::http::cleanup $token
putserv "PRIVMSG $chan :Сервер вернул неверный ответ ($ncode). Возможно повезет в другой раз."
return
}
set data [::http::data $token]
::http::cleanup $token
if {![regexp -nocase -- {
(.+?)(.*?FM)
\s*
} $data - st_name st_freq]} {
set station $text
} else {
set station "[string trim $st_name] ([string trim $st_freq])"
}
regsub -all -- "\n|\r|\t" $data "" data
if {[string match -nocase "*В эфире песен не было*" $data]} {
putserv "PRIVMSG $chan :Для радиостанции \"$station\" нет данных о прозвучавших песнях"
unset -nocomplain data
return
}
set data [string map -nocase {{} \n {} \n} $data]
set songs [list]
foreach _ [split $data \n] {
if {[regexp -nocase -- {(\d+\:\d+).*?class="artist">(.*?).*?class="song">(.*?).*?} $_ - time artist title] \
|| [regexp -nocase -- {
\s*?(\d+\:\d+)\s*?
} $_ - time artist title]} {
lappend songs "\002$artist\002 - \00314[string trim $title]\003 \00312(\00303играла в\00306 $time\00312)\003"
}
}
if {![llength $songs]} {
unset -nocomplain data
putserv "NOTICE $nick :Ошибка при обработке списка песен."
return
}
variable numsongs
variable songformat
if {$songformat == "1"} {
putserv "PRIVMSG $chan :\00314В последний раз на радиостанции \00304\"\00305$station\00304\"\00314 играли следующие песни: \017[join [lrange $songs 0 [expr $numsongs - 1]] " \017| "]"
} else {
putserv "PRIVMSG $chan :\00314В последний раз на радиостанции \00304\"\00305$station\00304\"\00314 играли следующие песни:
foreach _ [lrange $songs 0 [expr $numsongs - 1]] {
putserv "PRIVMSG $chan :$_"
}
}
unset -nocomplain data songs
}
proc rlist_msg {nick uhost hand text} {
rlist $nick $uhost $hand $nick $text
return
}
proc rlist {nick uhost hand chan text} {
variable flood
variable stations
if {[validchan $chan] && ![channel get $chan radioonline]} {return}
if {[info exists [namespace current]::lastreq] && [set diff [expr [clock seconds] - $[namespace current]::lastreq]] < $flood} {
putserv "NOTICE $nick :Команда запрашивалась недавно. Повторите попытку через [expr $flood - $diff] сек."
return
}
set [namespace current]::lastreq [clock seconds]
putserv "NOTICE $nick :[join [lrange $stations 0 19] ", "]"
putserv "NOTICE $nick :[join [lrange $stations 20 39] ", "]"
putserv "NOTICE $nick :[join [lrange $stations 40 end] ", "]."
return 1
}
proc selectstation {name} {
switch -glob [string tolower $name] {
"радио россии" {return "FM_66.44"}
"юfm" -
"юность" {return "FM_68.84"}
"радонеж" {return "FM_72.92"}
"бизнес*" {return "FM_87.5"}
"сити*" {return "FM_87.9"}
"ретро*" {return "FM_88.3"}
"юмор*" {return "FM_88.7"}
"*jazz" -
"*джаз" {return "FM_89.1"}
"мегаполис*" {return "FM_89.5"}
"кекс*" {return "FM_89.9"}
"авторадио" {return "FM_90.3"}
"relax*" {return "FM_90.8"}
"эхо москвы" {return "FM_91.2"}
"*культура" {return "FM_91.6"}
"говорит москва" {return "FM_92.0"}
"*дача" {return "FM_92.4"}
"*карнавал" {return "FM_92.8"}
"*спорт*" {return "FM_93.2"}
"коммерсант*" {return "FM_93.6"}
"восток*" -
"пионер*" -
"не очень взрослое*" {return "FM_94.0"}
"добрые песни" {return "FM_94.4"}
"ru.fm" {return "FM_94.8"}
"rock*" {return "FM_95.2"}
"*звезда" {return "FM_95.6"}
"дорожное*" {return "FM_96.0"}
"такси*" {return "FM_96.4"}
"детское*" {return "FM_96.8"}
"комсомольская правда" {return "FM_97.2"}
"вести*" {return "FM_97.6"}
"*шоколад" {return "FM_98.0"}
"рекорд*" -
"record*" -
"свежее*" {return "FM_98.4"}
"*романтика" -
"*romantika" {return "FM_98.8"}
"*орфей" {return "FM_99.2"}
"финам*" {return "FM_99.6"}
"серебряный дождь" {return "FM_100.1"}
"best*" {return "FM_100.5"}
"*классик" -
"*classic" {return "FM_100.9"}
"dfm" -
"динамит*" {return "FM_101.2"}
"наше*" {return "FM_101.7"}
"монте*" {return "FM_102.1"}
"первое популярное*" {return "FM_102.5"}
"*шансон" {return "FM_103.0"}
"*маяк" {return "FM_103.4"}
"*maximum" -
"*максимум" {return "FM_103.7"}
"nrj" -
"*энергия*" {return "FM_104.2"}
"радио 7" {return "FM_104.7"}
"moscow*" -
"москва*" -
"next*" {return "FM_105.2"}
"русское*" {return "FM_105.7"}
"европа*" {return "FM_106.2"}
"love*" {return "FM_106.6"}
"русская служба*" {return "FM_107.0"}
"хит*" {return "FM_107.4"}
"милицейская волна" {return "FM_107.8"}
default {return none}
}
}
return "[file tail [info script]] v$version by Vertigo loaded."
}