Слушаем радио 101.ru в VLC

Я, как и многие, время от времени слушаю интернет-радио.
Недавно поднималась тема по поводу прослушивания в консоли радио 101.ru

Подход автора топика (вручную выяснять адреса радиостанций и вручную же их забивать в скриптик) интересен, но неудобен. Я решил развить его мысль и написал простенький парсер вышеуказанного сайта, который генерит pls-плейлист для всех доступных станций на 101.ru.

Сей плейлист прекрасно понимает замечательный плеер vlc. Не менее замечателен он еще и тем, что имеет неплохой консольный интерфейс - так что проблем с выбором нужной радиостанции тоже не возникнет.

Итак, парсер:

#!/usr/bin/env python
#!coding: utf-8

import time, json, urllib, re, getpass, codecs

#Длина строки с названием радиостанции
variant_length=25
#Каталог, в который streamripper будет складывать файлы
#--если запускать bash-скрипт
rip_dir=u'/home/Music/101ru'

def write_file(name, data):
    f = codecs.open('/home/%s/%s'%(getpass.getuser(),name), 'w', 'utf-8')
    f.write(data)
    f.close()

try:
    s_list = urllib.urlopen('http://101.ru/?an=port_allchannels').read()
except:
    print (u'Не могу загрузить страницу со списком радиостанций. Проверьте подключение')
    exit

result = re.findall(r'<a href="/\?an=port_channel_mp3&amp;channel=([0-9]+)', s_list, re.M | re.S | re.U)
uniq = [int(x) for x in list(set(result))]

                      
playlist = {}

for station in uniq:
    addr = 'http://101.ru/play.m3u?uid=%d&bit=2'%station
    print ('Читаю адрес: %s'%addr)
    st = {}
    try:
        js = urllib.urlopen(addr).read()
        st = json.loads(js)
    except:
        print 'Не смог прочитать... Гы:)'
        continue

    if st.has_key('playlist'):
        cnt = len(st[u'playlist'])

        for server in st[u'playlist']:
            subdomain = re.sub(r'(^http://|\.101\.ru.*$)', u'', server[u'file'])
            if not playlist.has_key(subdomain):
                playlist[subdomain] = {}
            playlist[subdomain][station] = server


    #Чтоб нас не сочли ботом :)
    #Тупая защита...
    time.sleep(1)

bash = u'''#!/bin/sh

while true; do
    echo

    echo "0 Выход"
    echo "{0}"

    read doing
    case $doing in
        0) exit;;
{1}
        *) echo "Нет такой радиостанции. Выберите другую!";;
    esac

    if [ ! -z $URL ]; then
        break
    fi
done

/usr/bin/mplayer "$URL" -cache 5000 -referrer "http://www.101.ru/" & streamripper "$URL" --codeset-filesys=utf-8 --codeset-metadata=cp1251 -u Mozilla/5.0 Gecko/20101209 Firefox/3.6.13 -d {2} &>/dev/null'''


for (server_name, stations) in playlist.iteritems():
    variants, cases, temp, s = [], [], [], [u'[playlist]']

    for station_id, station_info in stations.iteritems():
        station_info[u'id'] = station_id
        station_info[u'comment'] = re.sub(r' -.*$', u'', station_info[u'comment'])
        
        s.append(u'File%(id)d=%(file)s\nTitle%(id)d=%(comment)s\nLength%(id)d=-1'%station_info)
        cases.append(u'\t%d) URL="%s";;'%(station_id,station_info[u'file']))
        
        temp.append(u'%d: %s|'%(station_id,(station_info['comment']+u'.'*(variant_length-3-len(str(station_id))-len(station_info['comment'])))))
        if len(temp) == 3:
            variants.append(u' '.join(temp))
            temp = []
    if temp:
        variants.append(u' '.join(temp))

    bsh = bash.format(u'"\n\techo "'.join(variants), u'\n'.join(cases), rip_dir)
    pls = u'\n'.join(s)
    
    write_file(server_name + '.101.ru.pls', pls)
    write_file(server_name + '.101.ru.sh', bsh)

Кто хоть немного понимает в python, разберется, что делает сие творение. Никакой магии тут нет. Лишь дам кое-какие пояснения:

- Скрипт выдерает все радиостанции, какие только сможет
- Раскладывает их по серверам (зеркалам)
- Для каждого зеркала создает отдельный плейлист с именем: имя_зеркала.101.ru.pls
- Плейлист сохраняется в домашнем каталоге пользователя, от имени которого скрипт был запущен.

Сохраняем это под именем, ну например, radio.py
Выполняем: python ./radio.py

Вот и все. Теперь остается только запустить vlc с нужным плейлистом. Для этого в консоли даем следующую команду:

vlc -I ncurses --http-user-agent=Mozilla/5.0\ Gecko/20101209\ Firefox/3.6.13 ./mos2.101.ru.pls

PS
Теперь я в случае чего не потеряю скриптик :)

UPD 2011/04/15
Обновил скриптик. Теперь он помимо плейлистов генерит bash-скрипты вот такого вида:

#!/bin/sh

while true; do
    echo

    echo "0 Выход"
    echo "130: 90's Pop...........| 131: NRJ Minimal........| 132: NRJ Electronic.....|"
	echo "133: Leningrad..........| 135: BI-2...............| 136: NRJ DubStep........|"
	echo "137: Alisa..............| 138: Robbie Williams....| 139: Agatha Christy.....|"
	echo "24: Chill Out...........| 25: Cinema Music........|"

    read doing
    case $doing in
        0) exit;;
	130) URL="http://eu1.101.ru:8000/c15_10";;
	131) URL="http://eu1.101.ru:8000/c15_15";;
	132) URL="http://eu1.101.ru:8000/c15_20";;
	133) URL="http://eu1.101.ru:8000/c15_21";;
	135) URL="http://eu1.101.ru:8000/c15_23";;
	136) URL="http://eu1.101.ru:8000/c15_24";;
	137) URL="http://eu1.101.ru:8000/c15_25";;
	138) URL="http://eu1.101.ru:8000/c16_19";;
	139) URL="http://eu1.101.ru:8000/c17_20";;
	24) URL="http://eu1.101.ru:8000/c15_3";;
	25) URL="http://eu1.101.ru:8000/c2_2";;
        *) echo "Нет такой радиостанции. Выберите другую!";;
    esac

    if [ ! -z $URL ]; then
        break
    fi
done

/usr/bin/mplayer "$URL" -cache 5000 -referrer "http://www.101.ru/" & streamripper "$URL" --codeset-filesys=utf-8 --codeset-metadata=cp1251 -u Mozilla/5.0 Gecko/20101209 Firefox/3.6.13 -d /home/Music/101ru &>/dev/null

rootkit, привет :)

Похоже они страницу несколько

Похоже они страницу несколько изменили. Теперь вместо

<a href="/\?an=port_channel_mp3&channel=([0-9]+)

надо искать

<a href="/\?an=port_channel_mp3&amp;channel=([0-9]+)

Или это подляна от движка форума, который &amp; на & меняет? :)

Чем больше юзерфрендли, тем сложнее юзать.

Ага. Форум съел спецсимвол,

Ага. Форум съел спецсимвол, зараза такая.

Исправил.

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

Спасибо, попробуем )

Спасибо, попробуем )
....
Попробовал, файлики-то что-то не создаются...

И ошибок не выдает?Запускал

И ошибок не выдает?

Запускал не от рута случаем? (мож не там ищешь? :))

И еще. Скрипт работает довольно долго - может секунд 30-60 висеть. Это нормально.

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

Запускал от рута под рутом )

Запускал от рута под рутом ) файл в папке рута не наблюдаю...

Ну да, оно и верно. Ведь

Ну да, оно и верно. Ведь пишет-то оно файлики в каталог /home/username/ :)

А поскольку папочка рута хранится совсем не в хоме, то и записать оно ничего туды не может. Так что прошу прощения за дезинформацию. ))

Запускай от обычного юзера.

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

coding

у меня так заработало
#!/usr/bin/env python
# -*- coding: utf-8 -*-

SheBang нужен, чтоб запускать

Shebang нужен, чтоб запускать непосредственно скрипт.
Поправил.

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

Привет, Youshi :) Спасибо

Привет, Youshi :) Спасибо огромное что моё предложение нашло отклик у тебя и многих остальных :) Всем спасибо за помощь в этом маленьком проектике! До недавнего времени я совсем не знал BASH, но благодаря этому полезному делу стал немного разбираться :)

Выкладываю оптимизированный скрипт со множеством серверов в списке! Если возникнет необходимость добавить ещё серверы или наоборот, убрать, то думаю это не составит никакого труда, там всё понятно :) Вывод mplayer'a так и не удалось сделать на русском, поэтому я его скинул в конец команды, а в консоль выводится streamripper в котором прекрасно видны русские треки. А какая разница в конце концов? Суть не меняется, треки сохраняются на русском, что нам и нужно :) Единственный минус, так это невозможность регулировать громкость средствами mplayer'a в консоли, так как хоть его поток и не виден, но программы запущены вместе и накладываются друг на друга... Спиздел! Так было при обратном порядке, не проверил, громкость регулируется! Ну просто идеальный скрипт! :) Приходится открывать второй терминал и там выставлять громкость через alsamixer или горячими клавишами тот же миксер, что не совсем удобно.... В остальном супер! :) Youshi, ты меня извини, спасибо конечно за парсер, возможно для кого-то это удобно, но лично мне удобней юзать такой скриптик, независящий ни от чего :) Всем приятного прослушивания!

#!/bin/bash
# Написан rootkit'ом при поддержке форумчан www.gentoo.ru :)
# Оптимизирован коллективно :) Теперь он сперва стартует streamripper, а после mplayer, благодаря чему
# в консоли мы видим названия треков на русском языке :) Если у кого-то другая кодировка на компе, то
# просто смените её ниже...
# 15.04.2011
# Первый скрипт на BASH

# SPECIAL CODE

RFR="http://www.101.ru/"
QUICKLY="--codeset-filesys=utf-8 --codeset-metadata=cp1251 -u Mozilla/5.0 Gecko/20101209 Firefox/3.6.13 -d /home/Music/Radio101Ru/"

while true; do
    echo
    echo "Вы запустили скрипт радиостанций www.101.ru. Выберите Сервер из списка"
echo -----------EN----------- ---------ROCK--------- -----------RU-----------
echo
echo "01 NRJ Hot traxx........|" "28 Pink Floyd........|" "36 NRJ Russian Dance..|"
echo "02 NRJ ClubDance........|" "29 Queen.............|" "37 Russia Top 50......|"
echo "03 NRJ In The Mix.......|" "30 NRJ Rock..........|" "38 Русский Рэп........|"
echo "04 NRJ House............|" "31 Rock Guitar.......|" "39 Дискотека 80х......|"
echo "05 Chill Out............|" "32 Rock..............|" "40 Russia 90’s........|"
echo "06 NRJ trance...........|" "33 Rock Remakes......|" "41 Высоцкий...........|"
echo "07 NRJ Electro..........|" "34 Rock-Koleso.......|" "42 Шансон.............|"
echo "08 NRJ Progressive......|" "35 Русский Рок.......|" "43 Русское Регги......|"
echo "09 NRJ Psy/Goa trance...|" "53 Ленинград.........|" "44 Парад Пародий......|"
echo "10 RJ Gangsta/Hip-Hop...|......................|" "45 Юмор Non-Stop  ....|"
echo "11 NRJ breakbeat........|......................|" "46 Анекдот............|"
echo "12 Funk & Soul..........|......................|" "47 СССР 30-50.........|"
echo "13 NRJ Drum & Bass......|......................|" "48 СССР 50-70.........|"
echo "14 NRJ Jump.............|......................|" "54 BI-2...............|"
echo "15 NRJ Techno...........|......................|" "55 Agatha Christy.....|"
echo "16 NRJ R&B..............|"
echo "49 NRJ Minimal..........|"
echo "50 NRJ Electronic.......|"
echo "51 NRJ DubStep..........|"
echo "52 Chill Out........... |"
echo "17 Jazz.................|" 
echo "18 Live Hits............|" 
echo "19 Euro Hits............|"
echo "57 Robbie Williams......|"
echo "20 Depeche Mode.........|" 
echo "21 Michael Jackson......|" 
echo "22 U2...................|" 
echo "23 Love Songs...........|" 
echo "24 Erotic...............|" 
echo "25 France...............|" 
echo "26 90's Dance...........|" 
echo "27 90's Gold............|"
echo "56 90's Pop.............|"
echo "0: ............ВЫХОД....|"
echo 
    read doing
    case $doing in
        0) exit;;
	1) URL="http://eu1.101.ru:8000/4_4";;
	2) URL="http://eu1.101.ru:8000/4_2";;
	3) URL="http://eu1.101.ru:8000/14_3";;
	4) URL="http://eu1.101.ru:8000/6_5";;
	5) URL="http://eu1.101.ru:8000/15_3";;
	6) URL="http://eu1.101.ru:8000/13_3";;
	7) URL="http://eu1.101.ru:8000/6_3";;
	8) URL="http://eu1.101.ru:8000/8_4";;
	9) URL="http://eu1.101.ru:8000/16_22";;
	10) URL="http://eu1.101.ru:8000/14_11";;
	11) URL="http://eu1.101.ru:8000/16_11";;
	12) URL="http://eu1.101.ru:8000/9_4";;
	13) URL="http://eu1.101.ru:8000/12_3";;
	14) URL="http://eu1.101.ru:8000/14_17";;
	15) URL="http://eu1.101.ru:8000/17_3";;
	16) URL="http://eu1.101.ru:8000/4_3";;
	17) URL="http://eu1.101.ru:8000/10_5";;
	18) URL="http://eu1.101.ru:8000/15_5";;
	19) URL="http://eu1.101.ru:8000/16_13";;
	20) URL="http://eu1.101.ru:8000/13_14";;
	21) URL="http://eu1.101.ru:8000/10_2";;
	22) URL="http://eu1.101.ru:8000/13_18";;
	23) URL="http://eu1.101.ru:8000/9_1";;
	24) URL="http://eu1.101.ru:8000/14_13";;
	25) URL="http://eu1.101.ru:8000/16_17";;
	26) URL="http://eu1.101.ru:8000/7_8";;
	27) URL="http://eu1.101.ru:8000/6_2";;
	28) URL="http://eu1.101.ru:8000/8_2";;
	29) URL="http://eu1.101.ru:8000/13_1";;
	30) URL="http://eu1.101.ru:8000/11_1";;
	31) URL="http://eu1.101.ru:8000/15_1";;
	32) URL="http://eu1.101.ru:8000/1_4";;
	33) URL="http://eu1.101.ru:8000/7_9";;
	34) URL="http://eu1.101.ru:8000/7_5";;
	35) URL="http://eu1.101.ru:8000/1_2";;
	36) URL="http://eu1.101.ru:8000/4_6";;
	37) URL="http://eu1.101.ru:8000/4_5";;
	38) URL="http://eu1.101.ru:8000/1_3";;
	39) URL="http://eu1.101.ru:8000/7_3";;
	40) URL="http://eu1.101.ru:8000/6_1";;
	41) URL="http://eu1.101.ru:8000/11_3";;
	42) URL="http://eu1.101.ru:8000/9_2";;
	43) URL="http://eu1.101.ru:8000/14_4";;
	44) URL="http://eu1.101.ru:8000/5_3";;
	45) URL="http://eu1.101.ru:8000/2_4";;
	46) URL="http://eu1.101.ru:8000/3_5";;
	47) URL="http://eu1.101.ru:8000/14_59";;
	48) URL="http://eu1.101.ru:8000/12_1";;
	49) URL="http://eu1.101.ru:8000/15_15";;
	50) URL="http://eu1.101.ru:8000/c15_20";;		
	51) URL="http://eu1.101.ru:8000/c15_24";;
	52) URL="http://eu1.101.ru:8000/c15_3";;
	53) URL="http://eu1.101.ru:8000/c15_21";;
	54) URL="http://eu1.101.ru:8000/c15_23";;
	55) URL="http://eu1.101.ru:8000/c17_20";;
	56) URL="http://eu1.101.ru:8000/c15_10";;
	57) URL="http://eu1.101.ru:8000/c16_19";;
	
		*) echo "Нет такой радиостанции. Выберите другую!";;
    esac

    if [ ! -z $URL ]; then
        break
    fi
done

streamripper "$URL" $QUICKLY & mplayer "$URL" -cache 5000 -referrer $RFR &>/dev/null

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".