В качестве вступления стоит сказать что я пользуюсь macOS и потому некоторые части:
будут специфичны для этой ОС. Однако, если Вас заинтересует проект, думаю, поменять пару путей и слегка поправить несколько функций, чтобы заставить этот код работать с Вашей системой уведомлений, yaml'ом и, допустим, кроном, не составит труда.
Итак, к делу.
Проверять трекеры на обновления любимых телевизионных шоу, вспоминать в момент когда вышел новый эпизод, смотрел ли ты предыдущий, — надоедает. К тому же, как известно, все что нужно делать больше двух раз, стоит автоматизировать. Проект был начат на скорую руку и, вероятно, будет совершенствоваться.
Что же он содержит?
Так как почти на всех сайтах сериалов есть свои RSS-ленты, было решено для упрощения процесса написания плагинов слепить функцию парсинга, позволяющую автоматически распарсить rss по ссылке и выдать список пар (заголовок, ссылка) с возможностью указания кодировки.
Чуть позже пришла необходимость простого парсинга html, а потом подумалось что некоторые сайты могут отдавать ссылки и через api в формате json.
Так функция превратилась в класс, хранящий сессию (requests Session) для сайтов, требующих авторизации и возвращающий response-объект с методами html(), rss(), json() и auto(). Последний пытается угадать содержимое (xml, html или json) и кодировку по заголовку 'Content-Type'. По умолчанию — 'utf-8' и html.
Предоставляет плагинам методы parse() и download().
Классы, наследующие класс загрузчика, реализующие метод start() в котором надо произвести парсинг и вызвать метод download() с ожидаемыми параметрами.
*.plist
Содержат:
Папка в которую можно положить файлы иконок, которые будут использованы при уведомлении о загрузке/окончании загрузки эпизодов из соответствующих источников. Названия иконок должны соответствовать названиям плагинов, но с расширением jpg/ico/png.
Дергает поочередно метод start() всех плагинов в директории plugins.
Файл install.py сделает это за Вас, но если Вы решили сделать все вручную, то...
Насколько мне известно, launchd ничего не знает о переменных окружения, посему Вам придется самостоятельно заменить в тексте ниже $HOME на путь до домашнего каталога вашего пользователя /Users/Username и, возможно, изменить путь до директории со скриптами, если вы положили их в другое место.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin</string>
</dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>series_downloader</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>$HOME/.NB-series-downloader/main.py</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>900</integer>
<key>WorkingDirectory</key>
<string>$HOME/.NB-series-downloader</string>
</dict>
</plist>
Сам файл с этим содержимым стоит назвать series_downloader.plist и положить в ~/Library/LaunchAgents/.
Загрузить описанные в этом файле задания сразу можно командой
launchctl load ~/Library/LaunchAgents/series_downloader.plist
Иначе задания активируются при следующей загрузке компьютера.
Эти действия заставят main.py, лежащий в директории $HOME/.NB-series-downloader/, запускаться каждые 900 секунд (15 минут).
Честно говоря, первое что я туда выкладываю, так что мог напортачить. Подскажите, если что не так.
Уведомление о начале загрузки:
После загрузки надпись "Загрузка начата" сменится на "Загрузка закончена".
Вот и все что мы увидим в результате работы плагина, а эпизоды будут аккуратненько сложены в папочку и ждать своего часа.
Сериалы в моем случае складываются в Series в том же каталоге (можно указать иное место в self.series_dir класса downloader в core.py).
А для просмотра загруженных серий мною написан workflow для Alfred 3:
После просмотра каждой серии он предлагает:
Но это всё — уже совсем другая история...
К сожалению, не доступен сервер mySQL