Как стать автором
Обновить

Podcast-downloader на Python своими руками

Время на прочтение2 мин
Количество просмотров765
Так уж вышло, что мое внимание привлекла надпись: «Подкасты правильно слушать по подписке». Особого трепета перед прослушиванием чужих диа(моно)логов я не испытываю, а вот поковыряться в схеме работы rss и xml под Питоном был весьма непрочь.
Стоит, наверное, сразу отметить, что прилагаемый код находится в стадии альфы, однако уже сейчас им можно пользоваться (я скачал себе 17 выпусков хабракаста), а благодаря семантике Питона исходники легко читаются без дополнительной документации. Предполагается, что данная статья поможет в первую очередь людям, осваивающим Питон, и лишь во вторую тем, кому требуется функционал прогаммы (благо, на сколько я знаю, подобного софта хватает).
Изначально программа задумывалась как демон, скачивающий свежие подкасты до того, как их захочется прослушать. Соответственно, никакого GUI ей не требовалось. А требовалось только тихо выполнять свою работу с определенной гибкостью и легкостью настройки.
Я представил, как подкасты скачиваются во время завтрака, а во время поездки на работу прослушиваются, и приступил к программированию.

Матчасть

Ссылки на mp3-файлы (подкасты) хранятся в XML-файле подписки внутри аттрибутов одного из тэгов: media:content или enclosure, для каждого item'а (выпуска). Так что забрать это добро в Питоне не составляет труда:
<code>item_node = file_xml.getElementsByTagName("item")
for item in item_node:
   title = self.get_tag_content(item, "title")
   description = self.get_tag_content(item, "itunes:summary")
   media_content = self.get_tag_content(item, "media:content", "url")
   enclosure = self.get_tag_content(item, "enclosure", "url" )
# Здесь self.get_tag_content() — небольшая самописная функция, не вызывающая исключений при ошибке.

Осталось только аккуратно сложить подкасты на жесткий диск. Здесь я под влиянием FlashGet'а понадеялся, что получится реализовать скачивание в несколько потоков, однако, как впоследствии оказалось, подкаст-сервера не поддерживают в полной мере нужного HTTP-заголовка Range.

Практика

Я разбил задачу на 4 части:
1. Скачка и выуживание информации из rss-feed'а.
2. Синхронизация подкастов с сервером.
3. Скачка требуемого файла.
4. Координирование предыдущих трех пунктов.
В приложенном архиве вы найдете их реализацию в файлах rss.py, keeper.py, dnld.py и main.pyw, соответственно. В каждой реализации класса есть свойство verbose, отвечающее за вывод в консольном режиме отладочной информации. Последний файл имеет расширение pyw, акцентируя этим предназначение программы — делать дело тихо, однако сейчас об этом говорить рано, поэтому verbose везде равно True. Также вы найдете файл go.bat — он удаляет скомпиллированные файлы прошлого запуска и оставляет окно консоли открытым после завершения работы программы, чтобы можно было посмотреть вывод.
Это моя первая статья на Хабре, и я не уверен, что вписываюсь в тематику… Надеюсь, труды трех моих дней помогут кому-то на пути изучения самого красивого кросс-платформенного языка.Скачать проект
Теги:
Хабы:
Всего голосов 1: ↑1 и ↓0+1
Комментарии3

Публикации