Podsync — маленький проектик на go, который преобразует каналы с YouTube или Vimeo в обычные подкаст-фиды (RSS). Идея проста: у меня есть каналы, которые я больше слушаю, чем смотрю, и мне хотелось бы делать это в моём подкаст-приёмнике. Гайд будет на Debian-based системы.

Как это работает Link to heading

Принцип работы Podsync довольно простой:

  1. В конфиге прописываем каналы
  2. Podsync по расписанию проверяет обновления
  3. Скачивает новые видео через yt-dlp и конвертирует их в аудио в MP3 через ffmpeg или оставляет видео. Тут уж как хотите.
  4. Генерирует 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 }

Доступные фильтры:

ПараметрОписание
titleRegex для совпадения в заголовке
not_titleRegex для исключения по заголовку
descriptionRegex для совпадения в описании
not_descriptionRegex для исключения по описанию
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

Подставляем её в ваш подкаст-клиент и вуаля!