Рассылка закрыта
При закрытии подписчики были переданы в рассылку "LinuxCenter News Channel: новости Linux" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Linux Gazette на русском
| Информационный Канал Subscribe.Ru |
Linux Gazette на русском | Выпуск #133 | Тираж 8654 экз.
"London! Good evening, London!"
Здравствуйте! Вашему вниманию предлагается статья, в которой Mark Nielsen
поделился своим опытом по созданию домашней интернет-радиостанции, построенной
на базе веб-сервера Apache.
Спасибо за перевод Юрию Прушинскому!
А теперь разбор полётов. Статья "Работаем с XSLT." Своими мысялми решил поделится Alex M. (shurick_a at mail.ru):
Хотелось бы высказать свое мнение по поводу этого:
>
> <xsl:choose>
> <xsl:when test="$even = 1">
> <![CDATA[<table width="100%" bgcolor="#cccccc">]]>
> </xsl:when>
> <xsl:when test="$even = 0">
> <![CDATA[<table width="100%" bgcolor="#99b0bf">]]>
> </xsl:when>
> <xsl:otherwise>
> <![CDATA[<table width="100%" bgcolor="#ffffff">]]>
> </xsl:otherwise>
> </xsl:choose>
>
Конструкций подобного рода следует избегать, и использовать лишь в
крайних случаях. Почему?
Во-первых, это противоречит идеологии XML. Ведь XSLT-шаблон это, по
сути, тот же XML документ, а в XML документе не может быть незакрытых тэгов.
Во-вторых, с таким кодом неудобно работать. В редакторах, с подсветкой
открывающих и закрывающих тэгов и функцией быстрого перемещения по ним,
данный случай не будет корректно обработан.
В-третьих, это попытка взять часть обязанностей XSLT-процессора (по
слежению за корректностью документа) на себя. Если перевести эту
конструкцию на нормальный язык :-) , она будет звучать примерно так: -
"Я знаю, что все это неправильно, но не надо ругаться. В нужный момент я
не забуду (может быть :-) ) сгенерить таким же способом закрывающий тэг".
Правильней в данном случае было бы воспользоваться элементом xsl:attribute
<table width="100%">
<xsl:attribute name="bgcolor">
<xsl:choose>
<xsl:when test="$even = 1">#cccccc</xsl:when>
<xsl:when test="$even = 0">#99b0bf</xsl:when>
<xsl:otherwise>#ffffff</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
..
..
..
</table>
Или переменной:
<xsl:variable name="color">
<xsl:choose>
<xsl:when test="$even = 1">#cccccc</xsl:when>
<xsl:when test="$even = 0">#99b0bf</xsl:when>
<xsl:otherwise>#ffffff</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<table width="100%" bgcolor="{$color}">
..
..
..
</table>
Вообще, практика использования [CDATA[...]] в написании
XSLT-преобразований сродни использованию оператора GOTO из Basic'а. ;-)
Спасибо за комментарии.
Александр Куприн
Проект Open
Radio
Автор: Mark Nielsen
Перевод: Юрий Прушинский
- Вступление
- Настройка Apache
- Использование Grip
- Скрипт на Python
- Воспроизведение плей-листа
- Заключение
- Ссылки
Вступление
Я ненавижу слушать компакт-диски целиком. Половина песен на дисках просто отстой. Мне не нравиться всё время вытаскивать и вставлять диски, чтобы их послушать. Меня тошнит от коммерческих радиостанций с их пожизненным тупым кризисом среднего возраста, которые пытаются привлечь тинейджеров подражая им. Я люблю слушать музыку (в т.ч. с 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 следующим образом.
-
Скачал и установил кодировщик "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<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, но это был не очень удачный опыт, зато в области подобного радио можно многого достичь. Я много чего слышал об интернет-радиостанциях, и такое ощущение, что ни одна из них ещё не добилась успеха на рынке. Они как-будто замерли на ранней стадии, хотя им надо развиваться вопреки притеснениям медиа гигантов. Кажется, что интернет-радиостанции слабо представляют себе всю ситуацию. Так что с этих пор я буду развивать своё собственное маленькое радио для себя, глядишь, в будущем оно и перерастёт в нечто стоящее.
Ссылки
- 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). Пожалуйста, если будете писать ему письма на
адрес articles@tcu-inc.com, указывайте тему в поле subject
"ARTICLE:" а то иначе письмо будет удалено без прочтения -- таковы
санкции против спамеров.
Copyright (c) 2003, Mark Nielsen.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 92 of Linux Gazette, July
2003
Команда переводчиков:
Александр Куприн, Андрей Киселев, Александр Михайлов, Александр Саввин,
Владимир Меренков, Иван Песин, Игорь Яровинский, Павел Соколов, Роман Шумихин,
Сергей Скороходов, Юрий Прушинский
Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну (ru_classic at mail.ru). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.
Сайт рассылки: http://gazette.linux.ru.net
Эту статью можно взять здесь: http://gazette.linux.ru.net/lg92/nielsen.html
Архивы выпусков находятся здесь: http://gazette.linux.ru.net/archive/
| http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
| В избранное | ||
