
Podsync — маленький проектик на go, который преобразует каналы с YouTube или Vimeo в обычные подкаст-фиды (RSS). Идея проста: у меня есть каналы, которые я больше слушаю, чем смотрю, и мне хотелось бы делать это в моём подкаст-приёмнике. Гайд будет на Debian-based системы.
Как это работает Link to heading
Принцип работы Podsync довольно простой:
- В конфиге прописываем каналы
- Podsync по расписанию проверяет обновления
- Скачивает новые видео через yt-dlp и конвертирует их в аудио в MP3 через ffmpeg или оставляет видео. Тут уж как хотите.
- Генерирует RSS-фид, доступный по HTTP/HTTPS
Вы просто добавляете ссылку вида https://your-domain.com/feed_id.xml в подкаст-клиент — и всё работает.
Установка зависимостей Link to heading
Для работы Podsync нужны yt-dlp, ffmpeg и deno (как JS runtime для yt-dlp на всякий случай):
apt update && apt install -y yt-dlp ffmpeg curl
Deno устанавливается через официальный скрипт:
curl -fsSL https://deno.land/install.sh | sh
Также понадобится Go, если планируете собирать из исходников:
apt install -y golang
Установка Podsync Link to heading
Вариант A: Сборка из исходников Link to heading
git clone https://github.com/mxpv/podsync /mnt/dietpi_userdata/podsync
cd /mnt/dietpi_userdata/podsync
make
Вариант Бэ: Готовый бинарь Link to heading
Скачиваем с GitHub Releases:
cd /mnt/dietpi_userdata/podsync
curl -L -o podsync "https://github.com/mxpv/podsync/releases/download/v2.8.0/podsync-v2.8.0-linux-amd64"
chmod +x podsync
Вариант Цэ: Docker Link to heading
Если предпочитаете контейнеры:
services:
podsync:
image: ghcr.io/mxpv/podsync
container_name: podsync
volumes:
- ./data:/app/data/
- ./db:/app/db/
- ./config.toml:/app/config.toml
ports:
- 8181:8080
Запуск:
docker compose up -d
YouTube Data API v3 ключ Link to heading
Ключевой момент — для работы Podsync нужен YouTube Data API v3 ключ. Без него парсинг каналов не работает.
Получить ключ можно здесь: https://developers.google.com/youtube/registering_an_application
В конфиге нужно указать ключ в секции:
[tokens]
youtube = "YOUR_YOUTUBE_API_KEY"
Или даже несколько для ротации:
youtube = ["KEY1", "KEY2", "KEY3"]
Настройка конфигурации Link to heading
Собственно и сам конфиг. Создаём файл config.toml на основе примера:
cp /mnt/dietpi_userdata/podsync/config.toml.example /mnt/dietpi_userdata/podsync/config.toml
nano /mnt/dietpi_userdata/podsync/config.toml
Для примера:
[server]
port = 8181
hostname = "https://poddown.tatarinovlovesbeaver.su"
[cleanup]
keep_last = 2
[storage]
[storage.local]
data_dir = "/mnt/dietpi_userdata/podsync/data"
[tokens]
youtube = "тут ваш ключ из пункта выше"
[feeds]
[feeds.MaximTatarinov]
url = "https://www.youtube.com/@MaximTatarinov"
format = "video"
update_period = "8h"
page_size = 5
youtube_dl_args = ["--js-runtimes", "deno:/root/.deno/bin/deno"]
[log]
filename = "podsync.log"
max_size = 50
max_age = 30
max_backups = 1
compress = true
debug = false
Конфиг готов.
Запуск как systemd-сервис Link to heading
Чтобы Podsync работал в фоне и запускался автоматически, создаём сервис:
nano /etc/systemd/system/podsync.service
[Unit]
Description=Podsync
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/mnt/dietpi_userdata/podsync/bin/podsync
WorkingDirectory=/mnt/dietpi_userdata/podsync
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment="PATH=/root/.deno/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
[Install]
WantedBy=multi-user.target
Активируем и запускаем:
systemctl daemon-reload
systemctl enable podsync
systemctl start podsync
Проверить статус:
systemctl status podsync
journalctl -u podsync -f
Reverse proxy через nginx Link to heading
Podsync у меня работает без TLS, поэтому HTTPS у нас будет обрабатывать nginx. Конфиг для сайта:
server {
listen 80;
listen [::]:80;
server_name poddown.tatarinovlovesbeaver.su;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
listen 443 quic;
listen [::]:443 quic;
quic_retry on;
quic_gso on;
add_header Alt-Svc 'h3=":443"; ma=86400' always;
server_name poddown.tatarinovlovesbeaver.su;
ssl_certificate /etc/letsencrypt/live/poddown.tatarinovlovesbeaver.su/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/poddown.tatarinovlovesbeaver.su/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:8181;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Применить:
nginx -t && systemctl reload nginx
Фильтры и тонкая настройка Link to heading
Podsync позволяет не просто скачивать всё подряд, а выбирать контент по правилам. Например, скачивать только эпизоды, содержащие «обзор» и длительностью до 2 часов:
[feeds]
[feeds.ID1]
url = "https://www.youtube.com/@channel"
format = "audio"
filters = { title = "обзор", max_duration = 7200, max_age = 30 }
Доступные фильтры:
| Параметр | Описание |
|---|---|
title | Regex для совпадения в заголовке |
not_title | Regex для исключения по заголовку |
description | Regex для совпадения в описании |
not_description | Regex для исключения по описанию |
min_duration | Минимальная длительность (секунды) |
max_duration | Максимальная длительность (секунды) |
min_age | Минимальный возраст (дни) |
max_age | Максимальный возраст (дни) |
Также можно задать кастомный формат видео:
[feeds]
[feeds.MaximTatarinov]
format = "custom"
custom_format = { youtube_dl_format = "bestaudio[ext=m4a]", extension = "m4a" }
Итог Link to heading
RSS-лента доступна по адресу:
https://poddown.tatarinovlovesbeaver.su/MaximTatarinov.xml
Подставляем её в ваш подкаст-клиент и вуаля!