summaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md65
1 files changed, 64 insertions, 1 deletions
diff --git a/README.md b/README.md
index 6157744..3cc8265 100644
--- a/README.md
+++ b/README.md
@@ -30,15 +30,64 @@ post-processing, after the bytes are already on disk.
| Command | What it does |
| --- | --- |
-| `podkit fetch <url>` | Download and extract audio |
+| `podkit fetch <url>` | Download and extract audio via yt-dlp |
+| `podkit get <url>` | Download a direct audio URL, or every enclosure in an RSS feed — no yt-dlp, no ffmpeg |
| `podkit tag` | Write ID3 tags derived from filenames |
| `podkit feed` | Generate `feed.xml` |
| `podkit serve` | Host the directory and feed over HTTP |
+| `podkit push` | Upload a local library to a remote `podkit serve --ingest` |
| `podkit all <url>` | fetch → tag → feed |
Each stage runs independently on purpose: the download is the slow part and
shouldn't be repeated while you're adjusting titles or the base URL.
+## Downloading somewhere other than where you host
+
+The download and the hosting do not have to happen on the same machine, and
+usually shouldn't. A server on a datacentre IP is treated very differently from
+a home connection by the larger video sites — YouTube in particular will refuse
+a datacentre request outright with *"Sign in to confirm you're not a bot"* while
+the identical command works fine from a laptop.
+
+So run the download where you actually are, and push the result to the host:
+
+```bash
+# on your own machine
+podkit get "<rss or audio url>" --dir ./audio
+podkit tag --dir ./audio --title "…" --artist "…"
+podkit push --dir ./audio --server https://your-host/podkit --token "$TOKEN"
+```
+
+```bash
+# on the server, once
+podkit serve --dir /srv/podkit/audio --addr 127.0.0.1:8099 \
+ --ingest --token "$TOKEN" \
+ --title "…" --artist "…" \
+ --base-url "https://your-host/podkit/audio/"
+```
+
+`push` asks the server what it already has and uploads only the difference, so
+re-running after adding three episodes to a 200-episode series sends three
+files. `--ingest` regenerates the feed after each upload.
+
+This also means the server never needs credentials for, or a working route to,
+wherever the audio came from.
+
+**`--ingest` is off by default.** A host that accepts writes is a different
+security proposition from one that only reads, and it refuses to start without
+a token.
+
+### Behind a reverse proxy
+
+`serve` expects to be mounted with the path prefix stripped, which is what
+doot's `NewServiceProxy` already does. Give `--base-url` the public path and
+point `push --server` at the same place:
+
+```
+--base-url https://doot.terst.org/podkit/audio/
+--server https://doot.terst.org/podkit
+```
+
## Notes on the things that usually go wrong
These are the parts a hand-rolled version of this pipeline tends to get wrong,
@@ -74,6 +123,15 @@ preserves artwork yt-dlp embedded rather than replacing the tag wholesale.
**ID3 only on MP3.** ID3v2 is an MP3 convention; writing it into `.opus` or
`.m4a` produces something no player reads, so other formats are left alone.
+**The token has to be in the enclosure URLs.** A podcast client fetches the
+feed, then fetches each episode as a plain GET carrying nothing from the first
+request. If the server wants a token and the enclosure URLs don't have one, the
+feed loads, lists every episode, and not one of them will ever download.
+`--token` on `feed` puts it in the URLs; `serve --ingest` does it for you.
+
+**Identifying itself.** Go's default user-agent is rejected outright by several
+podcast CDNs — libsyn returns 403 for it. `get` sends a real one.
+
## "Private"
`--token` means unlisted-and-unguessable, not authenticated. Podcast clients
@@ -90,6 +148,11 @@ For anything beyond a home network, put it behind a reverse proxy with TLS.
may download a given item is between you and whoever published it — check the
source's terms.
+There is deliberately no cookie-jar or sign-in option. Feeding a site your
+logged-in session to get past a check that exists to stop automated downloading
+is a different act from downloading, and this tool doesn't do it. `get` covers
+the sources that don't ask: RSS feeds, archive.org, direct links.
+
## Tests
```