# Скрипт выдает информацио о последних прозвучавших треках с сайта 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*?
\s*?(.*?)(.*?)\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." }