# ytpodgen - turns YouTube live streams into podcasts

## prerequisite
- python3 and pip
- docker(for `dropcaster` and `yt-dlp`)
- rclone

## first time setup
```
pip3 install --user ytpodgen
```

Set environment variable `SLACK_WEBHOOK_URL`, if you want Slack notification.

If you want to upload files as well, don't forget to configure `rclone` remote for Cloudflare R2. For now, remote name must be `cloudflare` and bucket name must be `podcast`.

## examples
### wait for new livestream, and once on the air, record it and generate podcast RSS in background
```
TITLE=<title>
LIVEURL=<liveurl> #youtube live url
HOSTNAME=<hostname> #hostname to serve files from
screen -dmS ${TITLE} ytpodgen --liveurl ${LIVEURL} --title ${TITLE} --hostname ${HOSTNAME}
```

When completed, `ytpodgen` will wait for another livestream. Since all the waiting might take a while, I prefer running this in background using `screen`.

### Why not upload them as well!?
You can pass `--upload-r2` argument to enable file uploadig to Cloudflare R2. By enabling it, mp3s/RSS are uploaded to Cloudflare R2.

For example, by running the commands below , you create a screen session that waits for YouTube livestream on the given URL and saves the data under current directory if there is a livestream.

```
TITLE=<title>
LIVEURL=<liveurl> #youtube live url
HOSTNAME=<hostname> #hostname to serve files from
screen -dmS ${TITLE} ytpodgen --upload-r2 --liveurl ${LIVEURL} --title ${TITLE} --hostname ${HOSTNAME}
```

### I just want to generate RSS from mp3 files, no download/upload needed
```
TITLE=<title>
HOSTNAME=<hostname> #hostname to serve files from
ytpodgen --title ${TITLE} --hostname ${HOSTNAME}
```

This generates `index.rss` file under current directory and exits.

## Why only Cloudflare R2, and not other S3-compatible cloud storage?
Because:

- It offers free tier for up to 10GB of storage space per month
- With Cloudflare Worker, basic auth can be applied to the uploaded files that are made public


## TODO
- [x] use `boto3` for uploading files in order to remove `rclone`
- [ ] generate rss feed with python code in order to remove `dropcaster`
- [x] embed `yt-dlp` into ytpodgen, instead of calling it via docker
- [x] use `--live-from-start` option for yt-dlp if the stream has already started
- [x] package this app using `poetry` so that I can install this using `pip`
- [x] introduce [Click](https://click.palletsprojects.com/en/8.0.x/) for this project