{"id":21662869,"url":"https://github.com/ktravis/patreon-podfeed","last_synced_at":"2026-04-12T23:45:27.128Z","repository":{"id":147327811,"uuid":"44494747","full_name":"ktravis/patreon-podfeed","owner":"ktravis","description":"A python script for downloading Patreon podcasts, and a simple Flask app to serve them behind basic-auth","archived":false,"fork":false,"pushed_at":"2015-10-18T20:37:44.000Z","size":144,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-25T07:27:33.746Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ktravis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-10-18T20:16:10.000Z","updated_at":"2022-01-24T23:00:26.000Z","dependencies_parsed_at":"2023-04-24T16:47:56.264Z","dependency_job_id":null,"html_url":"https://github.com/ktravis/patreon-podfeed","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktravis%2Fpatreon-podfeed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktravis%2Fpatreon-podfeed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktravis%2Fpatreon-podfeed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ktravis%2Fpatreon-podfeed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ktravis","download_url":"https://codeload.github.com/ktravis/patreon-podfeed/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244560373,"owners_count":20472219,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-25T10:18:32.851Z","updated_at":"2025-10-17T07:31:42.821Z","avatar_url":"https://github.com/ktravis.png","language":"Python","funding_links":["https://www.patreon.com/comedybutton"],"categories":[],"sub_categories":[],"readme":"# patreon-podfeed\n\nBecause Patreon has yet to provide a private podcast feed for campaign backers,\nI wrote a script to progressively scrape them. This was much more complicated\nbefore the Patreon \"posts\" API was defined, but the script is still useful (to\nme). This was primarily written to make it easier to download [The Comedy\nButton](https://www.patreon.com/comedybutton) automatically each week, and serve\nit to my podcast app of choice.\n\n\n## Downloading\n\nAdd your Patreon email and password separated by a comma to\n`.patreon_credentials`, then add the ID of the campaign you'd like download\n(e.g., `113261`) to the `CAMPAIGN_IDS` list in `patreon.py`.\nThe simplest way I've found to get the campaign ID is by clicking a patron post\non the campaign's page, with the \"Network\" tab of your browser's debug console\nopen - look for an XHR request to \"posts\", which will have the ID in the url\n(something like \"ttps://api.patreon.com/campaigns/113261\").\n\nThen run the script with `./patreon.py`. By default, podcasts are downloaded to\nthe `files/` directory, and the IDs of previously saved posts are written to\n`.saved`, these settings can be configured in the script.\n\n\n## Serving \n\nIn addition I've included a simple Flask application, which serves a directory\nof mp3's as podcasts. To do so it generates an atom XML feed based on scraped\nID3 tags, using the [mutagen](https://pypi.python.org/pypi/mutagen) module.\n\nIn order to provide the *bare minimum* of security, the atom feed and file\ndownloads are protected with HTTP Basic Authentication -- set the username and\npassword to be used in `serve.py`.\n\nTo get started:\n\n```shell\npip install Flask mutagen\n./serve.py\n```\n\nSee the routes defined in `serve.py` for more details. I have this application\nrunning behind nginx on a subdomain of my personal website, I then point my\npodcast app to the `feed.atom` route and supply the username and password\nI defined. Finally, the `patreon.py` script is run every few hours by cron.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fktravis%2Fpatreon-podfeed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fktravis%2Fpatreon-podfeed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fktravis%2Fpatreon-podfeed/lists"}