{"id":15364121,"url":"https://github.com/psidex/playlist2podcast","last_synced_at":"2025-04-15T07:31:19.541Z","repository":{"id":44588213,"uuid":"408200270","full_name":"psidex/playlist2podcast","owner":"psidex","description":"A self-hosted application that lets you create podcast RSS feeds from YouTube playlists","archived":false,"fork":false,"pushed_at":"2022-02-19T22:54:43.000Z","size":57,"stargazers_count":18,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T18:49:37.899Z","etag":null,"topics":["hosting","podcast","podcasting","rss","self-hosted","youtube","youtube-playlist","youtube-playlists"],"latest_commit_sha":null,"homepage":"https://hub.docker.com/repository/docker/psidex/playlist2podcast","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/psidex.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":"2021-09-19T18:03:40.000Z","updated_at":"2024-04-05T09:42:57.000Z","dependencies_parsed_at":"2022-09-16T14:22:16.911Z","dependency_job_id":null,"html_url":"https://github.com/psidex/playlist2podcast","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/psidex%2Fplaylist2podcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psidex%2Fplaylist2podcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psidex%2Fplaylist2podcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psidex%2Fplaylist2podcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/psidex","download_url":"https://codeload.github.com/psidex/playlist2podcast/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249026780,"owners_count":21200505,"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":["hosting","podcast","podcasting","rss","self-hosted","youtube","youtube-playlist","youtube-playlists"],"created_at":"2024-10-01T13:10:06.455Z","updated_at":"2025-04-15T07:31:19.197Z","avatar_url":"https://github.com/psidex.png","language":"Python","funding_links":["https://www.buymeacoffee.com/psidex"],"categories":[],"sub_categories":[],"readme":"# Playlist2Podcast\n\n[![CI](https://github.com/psidex/playlist2podcast/actions/workflows/main.yml/badge.svg)](https://github.com/psidex/playlist2podcast/actions/workflows/main.yml)\n[![Docker Pulls](https://img.shields.io/docker/pulls/psidex/playlist2podcast)](https://hub.docker.com/repository/docker/psidex/playlist2podcast)\n[![buymeacoffee donate link](https://img.shields.io/badge/Donate-Beer-FFDD00.svg?style=flat\u0026colorA=35383d)](https://www.buymeacoffee.com/psidex)\n\nA self-hosted application that lets you create podcast RSS feeds from YouTube\nplaylists.\n\n## What Does This Do?\n\nTakes a list of YouTube playlists and:\n\n- Downloads all the videos in audio only format (best quality)\n- Generates an RSS XML feed and writes it to a file so that the audio files can\n  be used/read by podcast apps\n\nThe generated RSS XML file is located at\n`podcasts_path/playlist_title/podcast.xml`.\n\nIf the playlist title has special characters, p2p makes the name safe for\nfilesystems, so will change and/or remove special characters from the directory\nname. To get the directory name, the easiest way is to either `ls` your podcast\ndirectory or look in the logs.\n\n## What Does This Not Do?\n\nThis does not actually host the downloaded/created files, you will need a static\nweb server for that, I reccomend [Caddy](https://caddyserver.com/) or\n[nginx](https://www.nginx.com/).\n\nThe directory you want to serve is the same one that you put as the\n`podcasts_path` config variable.\n\nOnce you have that setup you can simply put the URL to each generated\n`podcast.xml` into your chosen podcast app, for example\n`https://podcasts.example.com/test/podcast.xml` where `test` is the name of the\ndirectory that p2p saved a podcasts data to.\n\n## Running \u0026 Config\n\nThe requirements in `requirements.txt` need installing first, you can do this your own way or by doing `pip install -r requirements.txt`.\n\nRun p2p with `python main.py`, or see below for Docker.\n\nOnce running p2p will check for playlist updates once every 24 hours.\n\np2p will look for a `config.yaml` file where it is run, if running in Docker you\nwill want to mount it in `/app`, like so:\n\n```bash\n-v $(pwd)/config.yaml:/app/config.yaml:ro\n```\n\nHere's what the contents should look like:\n\n```yaml\n# The URL that you are going to be hosting the podcast files at.\nhost_base_url: \"https://podcasts.example.com/\"\n\n# The path (either on your system or inside the Docker container) that will contain the podcast data.\npodcasts_path: \"/podcasts\"\n\n# The date since to download videos. Will download only videos uploaded on or after this date. \n# The date can be \"YYYYMMDD\" or in the format \"(now|today)[+-][0-9](day|week|month|year)(s)?\" \n# (see \"dateafter\" on https://github.com/yt-dlp/yt-dlp#general-options for more info).\n# Optional parameter: skip it or set empty to download all videos.\ndateafter: \"today-6months\"\n\n# The list of playlists to download and host. MUST be playlist URLs, NOT video URLs.\npodcasts:\n  - \"https://www.youtube.com/playlist?list=PLTLwdZqDsAvtGmVvJqRS2czLq2YZ_ZHPJ\"\n```\n\n## Docker\n\nExample run command:\n\n```bash\ndocker run -d --name p2p --restart unless-stopped \\\n    -v $(pwd)/config.yaml:/app/config.yaml:ro \\\n    -v $(pwd)/podcasts:/podcasts \\\n    psidex/playlist2podcast\n```\n\nDon't forget if you're using the Docker build, `podcast_path` in `config.yaml`\nshould reference the path _inside_ the container, not outside it.\n\n## Credits\n\nUses [yt-dlp](https://github.com/yt-dlp/yt-dlp) to download the playlists and\n[feedgen](https://feedgen.kiesow.be/) to create the RSS XML.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsidex%2Fplaylist2podcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpsidex%2Fplaylist2podcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsidex%2Fplaylist2podcast/lists"}