Вступление
Я ненавижу слушать компакт-диски целиком. Половина песен на дисках просто отстой. Мне не нравиться всё время вытаскивать и вставлять диски, чтобы их послушать. Меня тошнит от коммерческих радиостанций с их пожизненным тупым кризисом среднего возраста, которые пытаются привлечь тинейджеров подражая им. Я люблю слушать музыку (в т.ч. с 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 прописана строка
Для запуска обычно используется команда "service httpd start". Если она не срабатывает, то посмотрите документацию к вашему Линукс-дистрибутиву и веб-серверу в частности. В подавляющем большинстве случаев в Линукс-системах веб-сервером по-умолчанию является Apache. (Если же в вашем дистрибутиве нет веб-сервера Apache, то вы, скорее всего, экстремал и в наших советах не нуждаетесь. :-) Прим.ред.)
Использование Grip
Среди прочих программ Grip, наверное, самая удобная программа для копирования треков с cd. К тому же она умеет группировать их по автору и альбому. Я сконфигурировал Grip следующим образом.
- Скачал и установил кодировщик "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
(Круто! Никогда не пробовал закачивать файлы при помощи веб-браузера из командной строки. :-) Прим.ред.) - Запустил Grip.
- Сконфигурировал Grip. В меню "Config" надо проделать следующее.
Нажать Encode, выбрать 'lame' в качестве кодировщика. Там, где написано про "Encode File Format" должен быть указан каталог "/var/www/html/audio" в качестве основного. У меня там получился такой шаблон '/var/www/html/audio/%A/%d/%t_%n.mp3'. (Ещё раз напоминаю о правах доступа к каталогам! Прим.ред.) - Далее в разделе "Tracks" верхнего меню выбрать треки, которые нужно скопировать.
- Теперь на вкладке "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\n \n" for Item in Urls: print " " print " \n \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, но это был не очень удачный опыт, зато в области подобного радио можно многого достичь. Я много чего слышал об интернет-радиостанциях, и такое ощущение, что ни одна из них ещё не добилась успеха на рынке. Они как-будто замерли на ранней стадии, хотя им надо развиваться вопреки притеснениям медиа гигантов. Кажется, что интернет-радиостанции слабо представляют себе всю ситуацию. Так что с этих пор я буду развивать своё собственное маленькое радио для себя, глядишь, в будущем оно и перерастёт в нечто стоящее.
Ссылки
- http://www.nostatic.org/grip/
- http://www.apache.org
- http://www.python.org
- http://service.real.com/help/library/earlier.html
- Последующие версии этого документа будут доступны по адресу http://www.tcu-inc.com/Articles/34/open_radio.html
Mark Nielsen работает в Crisp Hughes Evans. В свободное время пишет статьи о Free Software (GPL) и Free Literature (FDL). Пожалуйста, если будете писать ему письма на адрес [email protected], указывайте тему в поле subject "ARTICLE:" а то иначе письмо будет удалено без прочтения -- таковы санкции против спамеров
Listen 127.0.0.1:80Прим.ред.)