Слушаем радио 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&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, привет :)
- Блог пользователя - Youshi
- Для комментирования войдите или зарегистрируйтесь
Похоже они страницу несколько
Похоже они страницу несколько изменили. Теперь вместо
надо искать
Или это подляна от движка форума, который & на & меняет? :)
Чем больше юзерфрендли, тем сложнее юзать.
Ага. Форум съел спецсимвол,
Ага. Форум съел спецсимвол, зараза такая.
Исправил.
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
Спасибо, попробуем )
Спасибо, попробуем )
....
Попробовал, файлики-то что-то не создаются...
И ошибок не выдает?Запускал
И ошибок не выдает?
Запускал не от рута случаем? (мож не там ищешь? :))
И еще. Скрипт работает довольно долго - может секунд 30-60 висеть. Это нормально.
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
Запускал от рута под рутом )
Запускал от рута под рутом ) файл в папке рута не наблюдаю...
Ну да, оно и верно. Ведь
Ну да, оно и верно. Ведь пишет-то оно файлики в каталог /home/username/ :)
А поскольку папочка рута хранится совсем не в хоме, то и записать оно ничего туды не может. Так что прошу прощения за дезинформацию. ))
Запускай от обычного юзера.
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
coding
у меня так заработало
#!/usr/bin/env python
# -*- coding: utf-8 -*-
SheBang нужен, чтоб запускать
Shebang нужен, чтоб запускать непосредственно скрипт.
Поправил.
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
Привет, Youshi :) Спасибо
Привет, Youshi :) Спасибо огромное что моё предложение нашло отклик у тебя и многих остальных :) Всем спасибо за помощь в этом маленьком проектике! До недавнего времени я совсем не знал BASH, но благодаря этому полезному делу стал немного разбираться :)
Выкладываю оптимизированный скрипт со множеством серверов в списке! Если возникнет необходимость добавить ещё серверы или наоборот, убрать, то думаю это не составит никакого труда, там всё понятно :) Вывод mplayer'a так и не удалось сделать на русском, поэтому я его скинул в конец команды, а в консоль выводится streamripper в котором прекрасно видны русские треки. А какая разница в конце концов? Суть не меняется, треки сохраняются на русском, что нам и нужно :)
Единственный минус, так это невозможность регулировать громкость средствами mplayer'a в консоли, так как хоть его поток и не виден, но программы запущены вместе и накладываются друг на друга...Спиздел! Так было при обратном порядке, не проверил, громкость регулируется! Ну просто идеальный скрипт! :)Приходится открывать второй терминал и там выставлять громкость через alsamixer или горячими клавишами тот же миксер, что не совсем удобно....В остальном супер! :) Youshi, ты меня извини, спасибо конечно за парсер, возможно для кого-то это удобно, но лично мне удобней юзать такой скриптик, независящий ни от чего :) Всем приятного прослушивания!