Проект Open Radio
Автор: Mark Nielsen
Перевод: Юрий Прушинский


  1. Вступление
  2. Настройка Apache
  3. Использование Grip
  4. Скрипт на Python
  5. Воспроизведение плей-листа
  6. Заключение
  7. Ссылки

Вступление

Я ненавижу слушать компакт-диски целиком. Половина песен на дисках просто отстой. Мне не нравиться всё время вытаскивать и вставлять диски, чтобы их послушать. Меня тошнит от коммерческих радиостанций с их пожизненным тупым кризисом среднего возраста, которые пытаются привлечь тинейджеров подражая им. Я люблю слушать музыку (в т.ч. с cd) или передачи национального государственного радио (видимо, нечто вроде Радио России - прим.перев.) в качестве фона, который не мешает мне программировать. Поэтому я решил разработать механизм, позволяющий заставить мой компьютер работать как радио, и проигрывать файлы и передачи национального радио. Таким образом я смогу избавиться от cd и коммерческих радиостанций. Ещё мне необходимо, чтобы все треки проигрывались в случайном порядке. Первое с чего я хотел начать, это скопировать треки с дисков и слушать их в случайном порядке. Второе (что не вошло в данную статью), это возможность скачать плей-лист тех передач, которые я люблю слушать по национальному радио (надеюсь, наше государственное радио когда-нибудь сможет предлагать плей-листы своим слушателям - прим.перев.) [присоединяюсь -- прим.ред.].

Всё что я сделал довольно просто. Возможно в будущем я добавлю поддержку плей-листов, учётных записей, отображение размера трека, работу с PostgreSQL и т.п.

А ещё я ленив. Причём ленив настолько, что мне даже лень посмотреть, какие есть веб-органайзеры mp3 вообще. Мне просто нужна простая программа, умеющая воспроизводить 200 треков в произвольном порядке, как будто сетевая радиостанция. Итак, всё что нужно, это скопировать свои любимые треки и написать скрипт на Python который будет формировать плей-лист.

Настройка Apache

Для начала, на вашем Линукс-сервере найдите корневой каталог html сервера httpd. Во многих системах он находится в "/var/www/html". Исходя из этого, выполняем следующее:

cd /var/www/html
mkdir audio

Теперь копируем все свои mp3, rm, wav или другие звуковые файлы в "/var/www/html/audio". ВНИМАНИЕ: Используйте свой веб-сервер только для себя. Только вы имеете право слушать эти файлы, иначе вы можете нарушить авторские права. Проконсультируйтесь у юриста по поводу легальности подобных действий.

(И не забудьте, что для копирования в "/var/www/html" вам нужны соответствующие права. Есть два способа -- воспользоваться учётной записью суперпользователя или добавить себя в группу webmaster. Что выберете -- решайте сами. И ещё -- чтобы Apache слушал запросы только на локальном интерфейсе [localhost], убедитесь, что в /etc/httpd/conf/httpd.conf прописана строка

Listen 127.0.0.1:80
Прим.ред.)

Для запуска обычно используется команда "service httpd start". Если она не срабатывает, то посмотрите документацию к вашему Линукс-дистрибутиву и веб-серверу в частности. В подавляющем большинстве случаев в Линукс-системах веб-сервером по-умолчанию является Apache. (Если же в вашем дистрибутиве нет веб-сервера Apache, то вы, скорее всего, экстремал и в наших советах не нуждаетесь. :-) Прим.ред.)

Использование Grip

Среди прочих программ Grip, наверное, самая удобная программа для копирования треков с cd. К тому же она умеет группировать их по автору и альбому. Я сконфигурировал Grip следующим образом.

  1. Скачал и установил кодировщик "LAME" с http://www.mp3dev.org.
    cd /usr/local/src
    lynx --source http://twtelecom.dl.sourceforge.net/sourceforge/lame/lame-3.93.1.tar.gz > lame-3.93.1.tar.gz
    tar -zxvf lame-3.93.1.tar.gz
    cd lame-3.93.1
     ./configure --prefix=/usr/local/lame
    make install
    ln -s /usr/local/lame/bin/lame /usr/bin/lame
    
    (Круто! Никогда не пробовал закачивать файлы при помощи веб-браузера из командной строки. :-) Прим.ред.)
  2. Запустил Grip.
  3. Сконфигурировал Grip. В меню "Config" надо проделать следующее.
    Нажать Encode, выбрать 'lame' в качестве кодировщика. Там, где написано про "Encode File Format" должен быть указан каталог "/var/www/html/audio" в качестве основного. У меня там получился такой шаблон '/var/www/html/audio/%A/%d/%t_%n.mp3'. (Ещё раз напоминаю о правах доступа к каталогам! Прим.ред.)
  4. Далее в разделе "Tracks" верхнего меню выбрать треки, которые нужно скопировать.
  5. Теперь на вкладке "Rip" осталось нажать на "Rip + Encode".

Скрипт на Python

Этот скрипт надо положить в "/var/www/cgi-bin/playlist.py" и выполнить команду "chmod 755 /var/www/cgi-bin/playlist.py". После того как вы всё это успешно проделали (версия Python должна быть 2.2), можно сменить url со 127.0.0.1 на ip-адрес вашего компьютера, чтобы музыку можно было слушать и с других компьютеров вашей сети. (В этом случае не забудьте сменить опцию Listen в "/etc/httpd/conf/httpd.conf". Прим.ред.)

#!/usr/bin/python
# Скрипт должен начинаться именно с предыдущей строки.

### Copyright under GPL
##  Импортируем все необходимые  модули python.
import os, re, time, random

  ## Задаём переменные. Можете поправить их значения как вам нужно.
Home = "/var/www/html/audio"
Url_Base = "http://127.0.0.1/audio"
Song_Max = 200
List_Type = "mpegurl"

## НЕ ИЗМЕНЯЙТЕ НИЖЕСЛЕДУЮЩИЕ ЗНАЧЕНИЯ В СКРИПТЕ, ЕСЛИ ВЫ НЕ РАЗБИРАЕТЕСЬ В PYTHON'Е.
File_Match = re.compile('[{mp3}{rm}{wav}{ogg}{mpeg}]$')
Home_Re = re.compile('^' + Home)
List_Types = {'smil':'application/smil', 'mpegurl':'audio/x-mpegurl'}

#---------------------------------------
  ##  Данная функция извлечёт все абсолютные пути к нужным файлам. Такой метод называется рекурсией..
def Dir_Contents(Item=""):
  Final_List = []
  if Item == '': return ('')
  elif os.path.isdir(Item):
    List = os.listdir(Item)
    for Item2 in List:
      Item3 = Item + "/" + Item2
      Temp_List = Dir_Contents(Item=Item3)
      for Item4 in Temp_List: Final_List.append(Item4)
  elif os.path.isfile(Item):
    if File_Match.search(Item):   return([Item])
    else:   return([])
  return (Final_List)

#--------------------------

List =  Dir_Contents(Home)
List_Copy = List
  ## Определяем, насколько случайной будет выборка.
Secs = int(time.strftime('%S')) * int(time.strftime('%H')) * int(time.strftime('%M'))
for i in range(0,Secs): random.random()

  ## Получаем случайным образом файл.
New_List = []
while (len(List_Copy) > 0):
  Position = random.randint(0,len(List_Copy) - 1)
  New_List.append(List_Copy[Position])
  del List_Copy[Position]

  ## Перестраиваем url в списке.
Urls = []
for Item in New_List:
    ## Для каждого объекта снимаем префикс каталога Home и добавляем url заново.
  Url = Url_Base + Home_Re.sub('', Item)
  Urls.append(Url)

  ## А что если у вас больше треков чем попало в список?
  ## Надеюсь что всем понятно, сколько треков в массиве, если значение Song_Max = 200?
if len(New_List) > Song_Max:  New_List = New_List[0:Song_Max]

  ## На всякий случай, если кто-нибудь не понял какого типа должен быть список....
if not List_Types.has_key(List_Type): List_Type = 'mpegurl'
Content_Type = List_Types[List_Type]

  ### Теперь выводим содержимое .
print "Content-Type: " + Content_Type + "\n\n"

if List_Type == 'mpegurl':
  for Url in Urls: print Url
elif List_Type == 'smil':
  print "\n<smil>\n   <body>\n"
  for Item in Urls:  print "      <audio src='" + Url+ "'/>"
  print "   </body>\n</smil>\n"
else:
  for Url in Urls: print Url


#------------------------------------------------------------------------
#                          Open Radio version 1.0

#                       Copyright 2003, Mark Nielsen
#                            All rights reserved.
#    This Copyright notice was copied and modified from the Perl
#    Copyright notice.
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of either:

#        a) the GNU General Public License as published by the Free
#        Software Foundation; either version 1, or (at your option) any
#        later version, or

#        b) the "Artistic License" which comes with this Kit.

#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
#    the GNU General Public License or the Artistic License for more details.

#    You should have received a copy of the Artistic License with this
#    Kit, in the file named "Artistic".  If not, I'll be glad to provide one.
#    You can look at http://www.perl.com for the Artistic License.

#    You should also have received a copy of the GNU General Public License
#   along with this program in the file named "Copying". If not, write to the
#   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
#    02111-1307, USA or visit their web page on the internet at
#    http://www.gnu.org/copyleft/gpl.html.

Воспроизведение плей-листа

Чем можно слушать этот плей-лист? Лично я пользуюсь Real Player, он понимает списки типа smil и mpegurl. Я пробовал xmms, но по непонятным причинам он отказался проигрывать mpegurl. Надеюсь, что скоро перейду на какой-нибудь плейер под GPL.

Для запуска нужно просто набрать в своём браузере, Real Player'e или другом плейере строку "http://127.0.0.1/cgi-bin/playlist.py". (127.0.0.1 указываете в том случае, если пытаетесь получит доступ к веб-серверу, расположенному на локальной машине. Иначе укажите ip-адрес того компьютера, на котором расположен веб-сервер и где вы разместили свои треки для проигрывания. Прим.ред.)

Заключение

Подобный небольшой скрипт меня пока вполне устраивает. Позднее я добавлю ещё немного всяких полезных функций, но пока я займусь составлением плей-листа моих любимых радиопередач.

У меня полно идей о том, куда всё это может завести. Я пробовал заняться Flash, Real Player, Windows Media Player и Javascript, но это был не очень удачный опыт, зато в области подобного радио можно многого достичь. Я много чего слышал об интернет-радиостанциях, и такое ощущение, что ни одна из них ещё не добилась успеха на рынке. Они как-будто замерли на ранней стадии, хотя им надо развиваться вопреки притеснениям медиа гигантов. Кажется, что интернет-радиостанции слабо представляют себе всю ситуацию. Так что с этих пор я буду развивать своё собственное маленькое радио для себя, глядишь, в будущем оно и перерастёт в нечто стоящее.

Ссылки

  1. http://www.nostatic.org/grip/
  2. http://www.apache.org
  3. http://www.python.org
  4. http://service.real.com/help/library/earlier.html
  5. Последующие версии этого документа будут доступны по адресу http://www.tcu-inc.com/Articles/34/open_radio.html

Mark Nielsen

Mark Nielsen работает в Crisp Hughes Evans. В свободное время пишет статьи о Free Software (GPL) и Free Literature (FDL). Пожалуйста, если будете писать ему письма на адрес articles@tcu-inc.com, указывайте тему в поле subject "ARTICLE:" а то иначе письмо будет удалено без прочтения -- таковы санкции против спамеров.


Copyright (c) 2003, Mark Nielsen.

Hosted by uCoz