{"id":26973081,"url":"https://github.com/madeofpendletonwool/chopchoprss","last_synced_at":"2025-07-29T01:36:03.944Z","repository":{"id":283476662,"uuid":"951877115","full_name":"madeofpendletonwool/ChopChopRSS","owner":"madeofpendletonwool","description":"A cli tool to create a subscribable an rss feed. I just needed this to generate rss feeds for testing. Feel free to use it!","archived":false,"fork":false,"pushed_at":"2025-07-02T15:49:02.000Z","size":131,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-19T06:45:56.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/madeofpendletonwool.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-20T11:38:43.000Z","updated_at":"2025-07-02T15:49:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"cbeff434-16a1-4d92-9b5a-2eaf060688ee","html_url":"https://github.com/madeofpendletonwool/ChopChopRSS","commit_stats":null,"previous_names":["madeofpendletonwool/chopchoprss"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/madeofpendletonwool/ChopChopRSS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeofpendletonwool%2FChopChopRSS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeofpendletonwool%2FChopChopRSS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeofpendletonwool%2FChopChopRSS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeofpendletonwool%2FChopChopRSS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/madeofpendletonwool","download_url":"https://codeload.github.com/madeofpendletonwool/ChopChopRSS/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/madeofpendletonwool%2FChopChopRSS/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267616728,"owners_count":24116162,"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","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-04-03T09:28:23.374Z","updated_at":"2025-07-29T01:36:03.938Z","avatar_url":"https://github.com/madeofpendletonwool.png","language":"Go","readme":"# ChopChopRSS\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./chopchop.png\" alt=\"ChopChopRSS Logo\" width=\"200\"\u003e\n\u003c/p\u003e\n\nA fast and simple CLI tool for generating and managing RSS feeds and podcast feeds from audio directories. This is a great little tool for deploying your own podcast feeds.\n\n## Features\n\n### RSS Feeds\n- Create and manage multiple RSS feeds\n- Quickly add new entries to feeds\n- Support for images in feed entries\n- Customizable feed metadata\n- Serves feeds via HTTP\n\n### Podcast Feeds\n- **Automatic podcast generation** from audio directories\n- **Audio metadata extraction** from MP3, M4A, WAV, FLAC, and OGG files\n- **iTunes-compatible RSS** with podcast extensions\n- **Episode management** with automatic file discovery\n- **Multi-podcast support** with isolated feeds\n- **Docker-ready** for hosting multiple podcast archives\n\n### General\n- HTTP server for feed and audio file serving\n- Docker and Docker Compose support\n- Shell completion (bash, zsh, fish, powershell)\n- Persistent configuration and state\n\n## Installation\n\n### Quick Install (Linux/macOS)\n\n```bash\n# Install latest version\ncurl -fsSL https://raw.githubusercontent.com/madeofpendletonwool/chopchoprss/main/install.sh | bash\n```\n\nThe installer will:\n- Download the appropriate binary for your OS and architecture\n- Install it to `~/.local/bin/` (ensure this is in your PATH)\n- Set up shell completion for your detected shell (bash, zsh, or fish)\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew tap madeofpendletonwool/chopchoprss\nbrew install chopchoprss\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/madeofpendletonwool/chopchoprss.git\ncd chopchoprss\ngo build -o chopchoprss\n```\n\n### Using Docker\n\n```bash\n# Pull the latest image from GitHub Container Registry\ndocker pull ghcr.io/madeofpendletonwool/chopchoprss:latest\n\n# Or build it locally\ndocker build -t chopchoprss .\n\n# Run the server (default behavior)\ndocker run -p 8090:8090 -v chopchoprss-data:/data ghcr.io/madeofpendletonwool/chopchoprss:latest\n\n# Create a feed\ndocker run -v chopchoprss-data:/data ghcr.io/madeofpendletonwool/chopchoprss:latest create-feed -n blog -t \"My Blog\" -d \"My awesome blog\"\n\n# Add an entry\ndocker run -v chopchoprss-data:/data ghcr.io/madeofpendletonwool/chopchoprss:latest create-entry -f blog -t \"First Post\" -c \"Hello world!\"\n\n# List feeds\ndocker run -v chopchoprss-data:/data ghcr.io/madeofpendletonwool/chopchoprss:latest list-feeds\n\n# For convenience, you can create an alias\nalias chopchoprss-docker=\"docker run -v chopchoprss-data:/data ghcr.io/madeofpendletonwool/chopchoprss:latest\"\n\n# Then use it like the normal CLI\nchopchoprss-docker create-entry -f blog -t \"Second Post\" -c \"Another post!\"\n```\n\n#### Using Docker Compose\n\n```bash\n# Start the server\ndocker-compose up -d\n\n# Run commands\ndocker-compose exec chopchoprss create-feed -n blog -t \"My Blog\"\ndocker-compose exec chopchoprss create-entry -f blog -t \"First Post\" -c \"Content here\"\ndocker-compose exec chopchoprss list-feeds\n```\n\n## Installation\n\n### From Source\n\n```bash\ngit clone https://github.com/madeofpendletonwool/chopchoprss.git\ncd chopchoprss\ngo build -o chopchoprss\n```\n\n### Using Docker\n\n```bash\n# Build the Docker image\ndocker build -t chopchoprss .\n\n# Run the container\ndocker run -p 8090:8090 chopchoprss\n```\n\n## Shell Completion\n\nChopChopRSS provides shell completion for Bash, Zsh, Fish, and PowerShell.\n\n### Bash\n\n```bash\n# Generate the completion script\nsource \u003c(chopchoprss completion bash)\n\n# To load completions for each session, execute once:\n# Linux:\nchopchoprss completion bash \u003e /etc/bash_completion.d/chopchoprss\n# macOS:\nchopchoprss completion bash \u003e $(brew --prefix)/etc/bash_completion.d/chopchoprss\n```\n\n### Zsh\n\n```bash\n# If shell completion is not already enabled, you need to enable it:\necho \"autoload -U compinit; compinit\" \u003e\u003e ~/.zshrc\n\n# Generate and install the completion script\nchopchoprss completion zsh \u003e \"${fpath[1]}/_chopchoprss\"\n\n# Start a new shell for this to take effect\n```\n\n### Fish\n\n```bash\nchopchoprss completion fish \u003e ~/.config/fish/completions/chopchoprss.fish\n```\n\n### PowerShell\n\n```powershell\n# For current session\nchopchoprss completion powershell | Out-String | Invoke-Expression\n\n# For all sessions (add to profile)\nchopchoprss completion powershell \u003e chopchoprss.ps1\n```\n\n## Usage\n\nChopChopRSS supports two main use cases: **RSS feeds** for traditional content syndication and **podcast feeds** for serving audio content with proper podcast metadata.\n\n## RSS Feeds\n\n### Creating and Managing RSS Feeds\n\n```bash\n# Create a basic RSS feed\nchopchoprss create-feed -n blog -t \"My Blog\" -d \"Personal thoughts and updates\"\n\n# Create a comprehensive feed with all metadata\nchopchoprss create-feed \\\n  -n tech-news \\\n  -t \"Tech News Daily\" \\\n  -d \"Latest technology news and updates\" \\\n  -l \"https://example.com\" \\\n  -a \"John Doe\" \\\n  -e \"john@example.com\"\n\n# Add entries to feeds\nchopchoprss create-entry \\\n  -f tech-news \\\n  -t \"New Golang Release\" \\\n  -c \"Go 1.21 has been released with exciting new features including improved performance and new standard library additions.\" \\\n  -l \"https://example.com/golang-release\" \\\n  -i \"https://example.com/golang-logo.png\"\n\n# List all feeds and their entries\nchopchoprss list-feeds\nchopchoprss list-entries -f tech-news\n\n# Delete entries or entire feeds\nchopchoprss delete-entry -f tech-news -i 0\nchopchoprss delete-feed -n old-feed\n```\n\n## Podcast Feeds\n\n### Creating Podcasts from Audio Directories\n\nChopChopRSS can automatically generate podcast feeds by scanning directories containing audio files and extracting metadata.\n\n```bash\n# Create a podcast from an audio directory\nchopchoprss create-podcast \\\n  -n \"my-podcast\" \\\n  -t \"My Amazing Podcast\" \\\n  -d \"Weekly discussions about technology, life, and everything in between\" \\\n  -a \"Host Name\" \\\n  -e \"host@example.com\" \\\n  -u \"http://localhost:8090/my-podcast\" \\\n  -r \"/path/to/audio/episodes\" \\\n  -c \"Technology\" \\\n  -i \"https://example.com/podcast-cover.jpg\" \\\n  --language \"en\" \\\n  --copyright \"© 2024 My Podcast\"\n\n# Refresh podcast when new episodes are added\nchopchoprss refresh-podcast -n \"my-podcast\"\n\n# List all podcasts\nchopchoprss list-podcasts\n\n# Delete a podcast\nchopchoprss delete-podcast -n \"old-podcast\"\n```\n\n#### Supported Audio Formats\n- **MP3** (.mp3) - Most common podcast format\n- **M4A** (.m4a) - Apple's AAC format\n- **WAV** (.wav) - Uncompressed audio\n- **FLAC** (.flac) - Lossless compression\n- **OGG** (.ogg) - Open source format\n\n#### Automatic Metadata Extraction\nChopChopRSS automatically extracts episode information from audio file metadata:\n- **Episode title** from ID3 title tag (or filename if missing)\n- **Episode description** from ID3 comment tag\n- **Episode number** from track number\n- **Season number** from disc number\n- **File size** for proper podcast client handling\n- **MIME type** for audio format compatibility\n\n## Server Management\n\n### Starting the Server\n\n```bash\n# Start server on default port (8090)\nchopchoprss serve\n\n# Start server on custom port\nchopchoprss serve -p 3000\n\n# Server will display all available feeds and podcasts:\n# Starting server on http://localhost:8090\n# Available RSS feeds:\n# - http://localhost:8090/tech-news\n# Available podcast feeds:\n# - http://localhost:8090/my-podcast\n```\n\n### Accessing Content\n\n**RSS Feeds:**\n```\nhttp://localhost:8090/[feedname]\n```\n\n**Podcast Feeds:**\n```\nhttp://localhost:8090/[podcastname]        # RSS feed\nhttp://localhost:8090/[podcastname]/audio/ # Audio files\n```\n\n## Use Cases and Workflows\n\n### 1. Testing and Development\n\n**Quick RSS Feed Testing:**\n```bash\n# Create test feed and content\nchopchoprss create-feed -n test -t \"Test Feed\"\nchopchoprss create-entry -f test -t \"Test Entry\" -c \"This is a test\"\n\n# Start server for testing\nchopchoprss serve\n\n# Test in another terminal\ncurl http://localhost:8090/test\n```\n\n**Podcast Development Testing:**\n```bash\n# Create test podcast with sample audio directory\nchopchoprss create-podcast \\\n  -n test-podcast \\\n  -t \"Test Podcast\" \\\n  -d \"Testing podcast functionality\" \\\n  -u \"http://localhost:8090/test-podcast\" \\\n  -r \"./test-audio\"\n\n# Verify podcast feed\ncurl http://localhost:8090/test-podcast\n\n# Test audio file serving\ncurl -I http://localhost:8090/test-podcast/audio/episode1.mp3\n```\n\n### 2. Production Deployment with Docker\n\n**Single Podcast Archive:**\n```bash\n# Create docker-compose.yml\ncat \u003e docker-compose.yml \u003c\u003c EOF\nversion: \"3\"\nservices:\n  chopchoprss:\n    build: .\n    ports:\n      - \"8090:8090\"\n    volumes:\n      - chopchoprss-data:/data\n      - ./my-podcast-archive:/audio/my-podcast:ro\n    restart: unless-stopped\n\nvolumes:\n  chopchoprss-data:\nEOF\n\n# Build and start\ndocker-compose up -d\n\n# Create podcast configuration\ndocker-compose exec chopchoprss create-podcast \\\n  -n my-podcast \\\n  -t \"My Archived Podcast\" \\\n  -d \"Historical episodes from my podcast\" \\\n  -u \"http://your-domain.com:8090/my-podcast\" \\\n  -r \"/audio/my-podcast\"\n\n# Podcast available at http://your-domain.com:8090/my-podcast\n```\n\n**Multiple Podcast Archives (Automatic Setup):**\n```bash\n# Use the provided sample configuration\ncp docker-compose.podcasts.yml docker-compose.override.yml\n\n# Create startup configuration for automatic podcast setup\ncp startup.json.example startup.json\n\n# Edit startup.json to match your podcasts:\n{\n  \"podcasts\": [\n    {\n      \"name\": \"show1\",\n      \"title\": \"My First Show\",\n      \"description\": \"Description of my show\",\n      \"author\": \"Host Name\",\n      \"email\": \"host@example.com\",\n      \"baseUrl\": \"http://localhost:8090/show1\",\n      \"audioDir\": \"/audio/show1\",\n      \"categories\": [\"Technology\"]\n    },\n    {\n      \"name\": \"show2\", \n      \"title\": \"My Second Show\",\n      \"description\": \"Another great show\",\n      \"baseUrl\": \"http://localhost:8090/show2\",\n      \"audioDir\": \"/audio/show2\"\n    }\n  ]\n}\n\n# Edit docker-compose.override.yml volumes to match:\n# volumes:\n#   - ./podcasts/show1:/audio/show1:ro\n#   - ./podcasts/show2:/audio/show2:ro\n#   - ./startup.json:/data/startup.json:ro\n\n# Start services - podcasts will be created automatically!\ndocker-compose up -d\n\n# All podcasts available immediately at:\n# http://localhost:8090/show1\n# http://localhost:8090/show2\n# http://localhost:8090 (homepage showing all feeds)\n```\n\n**Multiple Podcast Archives (Manual Setup):**\n```bash\n# Alternative manual approach (if you prefer docker exec commands)\ncp docker-compose.podcasts.yml docker-compose.override.yml\n\n# Edit docker-compose.override.yml volumes...\ndocker-compose up -d\n\n# Configure each podcast manually\ndocker-compose exec chopchoprss create-podcast \\\n  -n show1 -t \"Show 1\" -d \"Description\" \\\n  -u \"http://localhost:8090/show1\" -r \"/audio/show1\"\n\ndocker-compose exec chopchoprss create-podcast \\\n  -n show2 -t \"Show 2\" -d \"Description\" \\\n  -u \"http://localhost:8090/show2\" -r \"/audio/show2\"\n```\n\n### 3. Continuous Integration / Automated Updates\n\n**Script for Regular Updates:**\n```bash\n#!/bin/bash\n# update-podcasts.sh - Run this when new episodes are added\n\n# Refresh all podcasts\nfor podcast in $(chopchoprss list-podcasts | grep \"^- \" | cut -d: -f1 | cut -d' ' -f2); do\n    echo \"Refreshing $podcast...\"\n    chopchoprss refresh-podcast -n \"$podcast\"\ndone\n\necho \"All podcasts updated!\"\n```\n\n**Cron Job for Automatic Updates:**\n```bash\n# Add to crontab (crontab -e) to check for new episodes daily at 6 AM\n0 6 * * * /path/to/update-podcasts.sh\n```\n\n### 4. Behind Reverse Proxy (Production)\n\n**Nginx Configuration:**\n```nginx\nserver {\n    listen 80;\n    server_name podcasts.example.com;\n\n    location / {\n        proxy_pass http://localhost:8090;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n\n    # Optional: Add caching for audio files\n    location ~* \\.(mp3|m4a|wav|flac|ogg)$ {\n        proxy_pass http://localhost:8090;\n        proxy_cache_valid 200 1d;\n        add_header X-Cache-Status $upstream_cache_status;\n    }\n}\n```\n\n## Configuration\n\nChopChopRSS stores its configuration in JSON format:\n\n**Default Location:** `~/.chopchoprss/config.json`\n\n**Docker Location:** `/data/config.json` (set via `CHOPCHOP_CONFIG_DIR`)\n\n**Startup Configuration:** `~/.chopchoprss/startup.json` or `/data/startup.json` (Docker)\n\n**Sample Startup Configuration (startup.json):**\n```json\n{\n  \"podcasts\": [\n    {\n      \"name\": \"my-podcast\",\n      \"title\": \"My Amazing Podcast\", \n      \"description\": \"Weekly discussions about amazing topics\",\n      \"author\": \"Host Name\",\n      \"email\": \"host@example.com\",\n      \"baseUrl\": \"http://localhost:8090/my-podcast\",\n      \"audioDir\": \"/audio/my-podcast\",\n      \"categories\": [\"Technology\"],\n      \"language\": \"en\",\n      \"imageUrl\": \"https://example.com/cover.jpg\",\n      \"explicit\": false\n    }\n  ]\n}\n```\n\n**Sample Runtime Configuration Structure (config.json):**\n```json\n{\n  \"feeds\": {\n    \"tech-news\": {\n      \"title\": \"Tech News\",\n      \"description\": \"Latest technology news\",\n      \"items\": [...]\n    }\n  },\n  \"podcasts\": {\n    \"my-podcast\": {\n      \"title\": \"My Podcast\",\n      \"description\": \"Weekly discussions\",\n      \"audioDir\": \"/audio/my-podcast\",\n      \"baseURL\": \"http://localhost:8090/my-podcast\",\n      \"episodes\": [...]\n    }\n  }\n}\n```\n\n## Troubleshooting\n\n**Common Issues:**\n\n1. **Audio files not found:**\n   ```bash\n   # Check directory permissions and paths\n   ls -la /path/to/audio\n   chopchoprss refresh-podcast -n podcast-name\n   ```\n\n2. **Podcast feed not updating:**\n   ```bash\n   # Manually refresh the podcast\n   chopchoprss refresh-podcast -n podcast-name\n   ```\n\n3. **Docker volume issues:**\n   ```bash\n   # Check volume mounts\n   docker-compose exec chopchoprss ls -la /audio/\n   ```\n\n4. **Port conflicts:**\n   ```bash\n   # Use different port\n   chopchoprss serve -p 3000\n   ```\n\n## License\n\nGPL3\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeofpendletonwool%2Fchopchoprss","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmadeofpendletonwool%2Fchopchoprss","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmadeofpendletonwool%2Fchopchoprss/lists"}