{"id":13475509,"url":"https://github.com/mxpv/podsync","last_synced_at":"2025-05-14T01:03:52.727Z","repository":{"id":37335872,"uuid":"69797810","full_name":"mxpv/podsync","owner":"mxpv","description":"Turn YouTube or Vimeo channels, users, or playlists into podcast feeds","archived":false,"fork":false,"pushed_at":"2025-03-26T01:57:11.000Z","size":4189,"stargazers_count":1618,"open_issues_count":77,"forks_count":269,"subscribers_count":36,"default_branch":"main","last_synced_at":"2025-04-03T06:06:03.476Z","etag":null,"topics":["cron-expression","docker","golang","playlists","podcast","podcast-fetcher","podcast-generator","podcast-manager","podcasting","podsync","soundcloud","vimeo","youtube"],"latest_commit_sha":null,"homepage":"","language":"Go","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/mxpv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"mxpv","patreon":"podsync"}},"created_at":"2016-10-02T13:10:28.000Z","updated_at":"2025-04-02T01:42:32.000Z","dependencies_parsed_at":"2024-03-31T22:25:47.043Z","dependency_job_id":"5715df62-7cca-49ef-b613-fcea14416e32","html_url":"https://github.com/mxpv/podsync","commit_stats":{"total_commits":764,"total_committers":41,"mean_commits":"18.634146341463413","dds":"0.24083769633507857","last_synced_commit":"0dfc8f15ab6f7d4d91872fa1a202d4984c26866e"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxpv%2Fpodsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxpv%2Fpodsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxpv%2Fpodsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mxpv%2Fpodsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mxpv","download_url":"https://codeload.github.com/mxpv/podsync/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248202041,"owners_count":21064250,"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":["cron-expression","docker","golang","playlists","podcast","podcast-fetcher","podcast-generator","podcast-manager","podcasting","podsync","soundcloud","vimeo","youtube"],"created_at":"2024-07-31T16:01:21.032Z","updated_at":"2025-04-10T10:47:51.166Z","avatar_url":"https://github.com/mxpv.png","language":"Go","readme":"# Podsync\n\n![Podsync](docs/img/logo.png)\n\n[![](https://github.com/mxpv/podsync/workflows/CI/badge.svg)](https://github.com/mxpv/podsync/actions?query=workflow%3ACI)\n[![Nightly](https://github.com/mxpv/podsync/actions/workflows/nightly.yml/badge.svg)](https://github.com/mxpv/podsync/actions/workflows/nightly.yml)\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/mxpv/podsync)](https://github.com/mxpv/podsync/releases)\n[![Go Report Card](https://goreportcard.com/badge/github.com/mxpv/podsync)](https://goreportcard.com/report/github.com/mxpv/podsync)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/mxpv)](https://github.com/sponsors/mxpv)\n[![Patreon](https://img.shields.io/badge/support-patreon-E6461A.svg)](https://www.patreon.com/podsync)\n[![Twitter Follow](https://img.shields.io/twitter/follow/pod_sync?style=social)](https://twitter.com/pod_sync)\n\nPodsync - is a simple, free service that lets you listen to any YouTube / Vimeo channels, playlists or user videos in\npodcast format.\n\nPodcast applications have a rich functionality for content delivery - automatic download of new episodes,\nremembering last played position, sync between devices and offline listening. This functionality is not available\non YouTube and Vimeo. So the aim of Podsync is to make your life easier and enable you to view/listen to content on\nany device in podcast client.\n\n## Features\n\n- Works with YouTube and Vimeo.\n- Supports feeds configuration: video/audio, high/low quality, max video height, etc.\n- mp3 encoding\n- Update scheduler supports cron expressions\n- Episodes filtering (match by title, duration).\n- Feeds customizations (custom artwork, category, language, etc).\n- OPML export.\n- Supports episodes cleanup (keep last X episodes).\n- One-click deployment for AWS.\n- Runs on Windows, Mac OS, Linux, and Docker.\n- Supports ARM.\n- Automatic youtube-dl self update.\n- Supports API keys rotation.\n\n## Dependencies\n\nIf you're running the CLI as binary (e.g. not via Docker), you need to make sure that dependencies are available on\nyour system. Currently, Podsync depends on `youtube-dl` ,  `ffmpeg`, and `go`.\n\nOn Mac you can install those with `brew`:\n```\nbrew install youtube-dl ffmpeg go\n```\n\n## Documentation\n\n- [How to get Vimeo API token](./docs/how_to_get_vimeo_token.md)\n- [How to get YouTube API Key](./docs/how_to_get_youtube_api_key.md)\n- [Podsync on QNAP NAS Guide](./docs/how_to_setup_podsync_on_qnap_nas.md)\n- [Schedule updates with cron](./docs/cron.md)\n\n## Nightly builds\n\nNightly builds uploaded every midnight from the `main` branch and available for testing:\n\n```bash\n$ docker run -it --rm ghcr.io/mxpv/podsync:nightly\n```\n\n### Access tokens\n\nIn order to query YouTube or Vimeo API you have to obtain an API token first.\n\n- [How to get YouTube API key](https://elfsight.com/blog/2016/12/how-to-get-youtube-api-key-tutorial/)\n- [Generate an access token for Vimeo](https://developer.vimeo.com/api/guides/start#generate-access-token)\n\n## Configuration\n\nYou need to create a configuration file (for instance `config.toml`) and specify the list of feeds that you're going to host.\nSee [config.toml.example](./config.toml.example) for all possible configuration keys available in Podsync.\n\nMinimal configuration would look like this:\n\n```toml\n[server]\nport = 8080\n\n[storage]\n  [storage.local]\n  # Don't change if you run podsync via docker\n  data_dir = \"/app/data/\"\n\n[tokens]\nyoutube = \"PASTE YOUR API KEY HERE\"\n\n[feeds]\n    [feeds.ID1]\n    url = \"https://www.youtube.com/channel/UCxC5Ls6DwqV0e-CYcAKkExQ\"\n```\n\nIf you want to hide Podsync behind reverse proxy like nginx, you can use `hostname` field:\n\n```toml\n[server]\nport = 8080\nhostname = \"https://my.test.host:4443\"\n\n[feeds]\n  [feeds.ID1]\n  ...\n```\n\nServer will be accessible from `http://localhost:8080`, but episode links will point to `https://my.test.host:4443/ID1/...`\n\n## One click deployment\n\n[![Deploy to AWS](https://s3.amazonaws.com/cloudformation-examples/cloudformation-launch-stack.png)](https://console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/new?stackName=Podsync\u0026templateURL=https://podsync-cf.s3.amazonaws.com/cloud_formation.yml)\n\n## How to run\n\n\n### Build and run as binary:\n\nMake sure you have created the file `config.toml`. Also note the location of the `data_dir`. Depending on the operating system, you may have to choose a different location since `/app/data` might be not writable. \n\n```\n$ git clone https://github.com/mxpv/podsync\n$ cd podsync\n$ make\n$ ./bin/podsync --config config.toml\n```\n\n### How to debug\n\nUse the editor [Visual Studio Code](https://code.visualstudio.com/) and install the official [Go](https://marketplace.visualstudio.com/items?itemName=golang.go) extension. Afterwards you can execute \"Run \u0026 Debug\" ▶︎ \"Debug Podsync\" to debug the application. The required configuration is already prepared (see `.vscode/launch.json`).\n\n\n### Run via Docker:\n```\n$ docker pull ghcr.io/mxpv/podsync:latest\n$ docker run \\\n    -p 8080:8080 \\\n    -v $(pwd)/data:/app/data/ \\\n    -v $(pwd)/config.toml:/app/config.toml \\\n    ghcr.io/mxpv/podsync:latest\n```\n\n### Run via Docker Compose:\n```\n$ cat docker-compose.yml \nservices:\n  podsync:\n    image: ghcr.io/mxpv/podsync\n    container_name: podsync\n    volumes:\n      - ./data:/app/data/\n      - ./config.toml:/app/config.toml\n    ports:\n      - 8080:8080\n\n$ docker compose up\n```\n\n## How to make a release\n\nJust push a git tag. CI will do the rest.\n\n","funding_links":["https://github.com/sponsors/mxpv","https://patreon.com/podsync","https://www.patreon.com/podsync"],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmxpv%2Fpodsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmxpv%2Fpodsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmxpv%2Fpodsync/lists"}