Рассылка закрыта
При закрытии подписчики были переданы в рассылку "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 |
Отписаться
Убрать рекламу |
В избранное | ||