{"id":25925643,"url":"https://github.com/calebj/podcast_manager","last_synced_at":"2025-10-14T04:27:35.886Z","repository":{"id":280373725,"uuid":"941773341","full_name":"calebj/podcast_manager","owner":"calebj","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-03T03:16:39.000Z","size":41,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-03T04:19:46.317Z","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/calebj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2025-03-03T02:54:47.000Z","updated_at":"2025-03-03T03:16:42.000Z","dependencies_parsed_at":"2025-03-03T04:19:48.423Z","dependency_job_id":"590ab8b9-191e-47b0-bb9a-cb15d2550226","html_url":"https://github.com/calebj/podcast_manager","commit_stats":null,"previous_names":["calebj/podcast_manager"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calebj%2Fpodcast_manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calebj%2Fpodcast_manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calebj%2Fpodcast_manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calebj%2Fpodcast_manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calebj","download_url":"https://codeload.github.com/calebj/podcast_manager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241723812,"owners_count":20009417,"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":"2025-03-03T18:53:10.630Z","updated_at":"2025-10-14T04:27:35.786Z","avatar_url":"https://github.com/calebj.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Podcast Manager\n\nAn application to keep track of RSS feeds and episodes, with plans to build an ad-removing RSS feed proxy.\n\n## Features\n\n- Parse RSS feeds to get podcast metadata\n- Download podcast episodes\n- Store podcast and episode metadata in a database\n- Strip tracking redirects from media URLs\n- Identify and remove ad segments from podcast audio files (in progress)\n\n## Installation\n\n### Install for development\n\n```bash\n# Create .venv in the project folder\nuv venv\nuv sync\n```\n\n### Install as package\n\n```bash\n# Create a virtual environment\npython -m venv .venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\n\n# Install the package\npip install .\n```\n\n## Database Setup\n\nFor now this project uses sqlite. Alembic is set to use `./podcast_manager.db`, which is created automatically with\n\n```bash\nalembic upgrade head\n```\n\n## Usage\n\n```bash\n# Global options\npas --downloads-dir /path/to/downloads  # The directory for all podcast downloads, defaults to ./downloads\n\n# Feed management\npas feed add \"https://example.com/feed.xml\" --short-name \"example_pod\"\npas feed list\npas feed refresh --feed example_pod\n\n# Episode management\npas episode list --feed example_pod\npas episode download --feed example_pod --limit 5  # Only download 5 files\npas episode download --feed example_pod --threads 10  # Concurrent downloads\n\n# Database operations\npas db clean-urls --feed example_pod  # Batch clean media URLs without downloading\n\n# Serve feeds from database\npas serve\n\n# Importing feed and episodes from a podcast-dl archive\npas import podcast-dl import \"downloads/My Podcast\"\n\n# Merge/update episodes from media+meta.json in archive folder\npas import podcast-dl refresh --feed my_podcast\n```\n\nThe global `--downloads-dir` option can be used with any command and sets the base directory where podcasts will be downloaded. Each feed will have its own subdirectory within this base directory, determined by the feed's `download_path` (which defaults to the feed's `short_name`).\n\nAll media files are stored with paths relative to their feed's download folder. Episodes only store the filename part of the path, and the complete path is constructed at runtime by combining:\n- The global downloads directory \n- The feed's download path\n- The episode's download filename\n\nThis approach makes it easy to move or relocate the entire downloads directory while maintaining correct references.\n\n## Development\n\n```bash\n# Check for updates\nuv sync -U\n\n# Run tests (just url cleaning for now)\npytest\n\n# Lint\nruff check\n\n# Type check\nmypy podcast_manager\n```\n\n## Credits\n\nMuch inspiration was taken from @lightpohl's [podcast-dl](https://github.com/lightpohl/podcast-dl).\n\nThis project has been built with the assistance of Claude, Anthropic's AI assistant.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalebj%2Fpodcast_manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalebj%2Fpodcast_manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalebj%2Fpodcast_manager/lists"}