пятница, 4 марта 2011 г.

listen, exaile и shoutcast

Хочется слушать онлайн радио в нормальном плеере и с удобством.

Когда-то я делал это через vlc, но в последних версиях их заставили убрать встроенную поддержку shoutcast :(.

Пытался довести до ума плеер Listen, но к сожалению до конца не удалось, хотя плеер очень даже нравится. Удалось добиться получения каталога музыки и ссылки на плейлист радиостанции на сайте shoutcast, а вот переходить (редиректить) с сайта shoutcast на саму радиостанцию не хочет.

Оба плеера написаны на python.



Т.е. Listen получает ссылку вида http://yp.shoutcast.com/sbin/tunein-station.pls?id=7678 и на этом все. А вот скачать по этой ссылке плейлист tunein-station.pls в виде
[playlist]
numberofentries=3
File1=http://67.213.220.36:80
Title1=(#1 - 93/800) 80s Planet.com::80sPlanet.com, the 80s!
Length1=-1
File2=http://67.228.177.199:80
Title2=(#2 - 19/150) 80s Planet.com::80sPlanet.com, the 80s!
Length1=-1
File3=http://67.213.220.36:8080
Title3=(#3 - 100/400) 80s Planet.com::80sPlanet.com, the 80s!
Length1=-1
Version=2

и обработать его, вытащив значения File1,File2 и т.д. и уже их проигрывать он не хочет.

Хочу предупредить все делалось на Alt Linux 5, все пакеты из стандартного репозитария.

Ставим Listen #apt-get install listen.

Идем в /usr/lib/listen/plugins/webradio переносим куда-либо компилированные файлы shoutcast.pyc и shoutcast.pyo и правим файл shoutcast.py:

в самом начале добавляем строчку import urllib2
чуть ниже меняем
# with genre= return station list
SHOUTCAST_URL_QUERY = "http://www.shoutcast.com/sbin/newxml.phtml"
# Use id= to select stream
SHOUTCAST_URL_STREAM = "http://www.shoutcast.com/sbin/tunein-station.pls"
на
# with genre= return station list
SHOUTCAST_URL_QUERY = "http://yp.shoutcast.com/sbin/newxml.phtml"
# Use id= to select stream
SHOUTCAST_URL_STREAM = "http://yp.shoutcast.com/sbin/tunein-station.pls"

и чуть ниже меняем:
try: 
                handle_read = urlopen(url)

на

try: 
  opener = urllib2.build_opener()
  opener.addheaders = [('User-agent', 'winamp')]
  handle_read = opener.open(url)

С другим User-agent плейлист shoutcast не отдает :(.
После этого начинает показывать список радиостанций и добавлять их в список воспроизведения.

Осталось заставить его проигрывать радиостанции. Если кто знает как его заставить сделать это, напишите.

Перейдем к Exaile.

Устанавливаем #apt-get install exaile

Идем в /usr/share/exaile/plugins/shoutcast переносим куда-либо файлы __init__.pyc и __init__.pyo и правим файл __init__.py:

Меняем строку
#_USERAGENT = "Exaile Shoutcast Plugin/%s +http://www.exaile.org"
на
_USERAGENT = "winamp"
Опять же по причине того, что shoutcast не отдает плейлист с другим user agent. Возможно есть еще какие-то варианты и наверняка есть, но это сейчас не важно. Нас вполне устраивает winamp как user agent.

Еще чуть ниже комментируем строчку
_USERAGENT = _USERAGENT % _PLUGINVERSION
и меняем все строчки
c = httplib.HTTPConnection(hostinfo.netloc, timeout=20)
на
c = httplib.HTTPConnection(hostinfo.netloc)
Сохраняем, запускаем и радуемся!!!

Очень хочется допилить Listen, он мне больше понравился, чем Exaile, хотя и сильно тормознее.

У кого есть какие идеи как допилить Listen?

5 комментариев:

  1. Только вот где теперь найти старую версию exaile или плагин shoutcast

    ОтветитьУдалить
  2. Здравствуйте. Исходники Exaile можно скачать здесь https://launchpad.net/exaile/+download включая старые релизы. Вот здесь разработчики отказались от дальнейшей поддержки shoutcast https://bugs.launchpad.net/exaile/+bug/694680

    ОтветитьУдалить
  3. Я разбирался с версией exaile 0.3.0.1

    ОтветитьУдалить
  4. Что на 0.3.0.1 что на других версиях пока ничего путного не выходит.
    Если делать точь-точь как описано то получаем следующее
    Could not enable plugin: not all arguments converted during string formatting
    Может где-то я косячу. Не знаю. Если у вас все работает, можете ли вы файл __init__.py выложить?

    ОтветитьУдалить
  5. К сожалению у меня сейчас нет ALT Linux 5. Дома у меня arch linux, но там нет ни exaile, ни listen. На работе ALT Linux 6, попробую на нем. О результатах отпишусь. Язык Python я к сожалению толком не знаю.

    ОтветитьУдалить