{"id":51722867,"url":"https://github.com/theodorosploumis/drupal_news","last_synced_at":"2026-07-17T14:41:59.329Z","repository":{"id":359541648,"uuid":"1083317924","full_name":"theodorosploumis/drupal_news","owner":"theodorosploumis","description":"A Drupal news aggregator as an experiment of using AI on cli","archived":false,"fork":false,"pushed_at":"2026-06-30T18:18:06.000Z","size":433,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-30T20:11:03.612Z","etag":null,"topics":["claude-code","drupal","newsletter","python"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/drupal-news/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theodorosploumis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-25T19:17:47.000Z","updated_at":"2026-06-30T18:13:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/theodorosploumis/drupal_news","commit_stats":null,"previous_names":["theodorosploumis/drupal_news"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/theodorosploumis/drupal_news","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theodorosploumis%2Fdrupal_news","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theodorosploumis%2Fdrupal_news/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theodorosploumis%2Fdrupal_news/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theodorosploumis%2Fdrupal_news/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theodorosploumis","download_url":"https://codeload.github.com/theodorosploumis/drupal_news/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theodorosploumis%2Fdrupal_news/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35585713,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-17T02:00:06.162Z","response_time":116,"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":["claude-code","drupal","newsletter","python"],"created_at":"2026-07-17T14:41:58.372Z","updated_at":"2026-07-17T14:41:59.316Z","avatar_url":"https://github.com/theodorosploumis.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Drupal News Aggregator\n\nAutomated Drupal news aggregation with AI summarization.\n\n## Installation\n\n### From PyPI\n\n```bash\npip install drupal-news\n\n# With AI providers\npip install \"drupal-news[openai]\"\npip install \"drupal-news[anthropic]\"\npip install \"drupal-news[all-providers]\"\n```\n\n### From Source\n\n```bash\n./setup.sh\nsource venv/bin/activate\n```\n\n## Quick Start\n\n```bash\n# Using installed package\ndrupal-news --dry-run\n\n# Or from source\npython3 index.py --dry-run\n```\n\n## Configuration\n\n### Unified Configuration (config.yml)\n\nAll configuration is now in a single `config.yml` file:\n\n```bash\n# Create from example\ncp config.example.yml config.yml\n\n# Edit to customize\nnano config.yml\n```\n\n**Configuration sections:**\n\n- **Core settings**: timeframe, HTTP options, email, markdown\n- **Sources**: RSS feeds and web pages to scrape\n- **AI providers**: Model configurations for summarization\n- **Prompt template**: Customize AI summarization instructions\n- **API keys**: Store or reference environment variables\n\n### Custom Configuration Path\n\n```bash\ndrupal-news --config /path/to/config.yml\n\n# Or from source\npython3 index.py --config /path/to/config.yml\n```\n\n### Environment Variables (.env)\n\nYou can still use `.env` for sensitive data:\n\n```bash\n# .env (optional)\nOPENROUTER_API_KEY=sk-or-v1-...\nANTHROPIC_API_KEY=sk-ant-api03-...\nTIMEZONE=Europe/Athens\nSMTP_HOST=smtp.example.com\nSMTP_PORT=587\nSMTP_USER=user@example.com\nSMTP_PASS=password\nMAIL_TO=recipient@example.com\nMAIL_FROM=sender@example.com\n```\n\nReference them in `config.yml` using `${VAR_NAME}`:\n\n```yaml\napi_keys:\n  OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}  # From .env\n  ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n```\n\n### Configuration Examples\n\nSee `config.example.yml` for comprehensive examples of:\n\n- Multiple AI providers (OpenAI, Anthropic, Gemini, Ollama, etc.)\n- Custom API endpoints and proxies\n- Advanced page scraping with CSS selectors\n- Custom prompt templates\n\n**Migration Guide**: See `MIGRATION.md` if upgrading from old config files\n\n## Usage\n\n### Main Aggregator\n\n```bash\n# Using installed package\ndrupal-news --provider openai --days 7\ndrupal-news --dry-run --verbose\ndrupal-news --provider anthropic --email yes\n\n# Or from source\npython3 index.py --provider openai --days 7\n```\n\n### Scheduler\n\n```bash\n# Using installed package\ndrupal-news-scheduler --every friday --hour 9 --provider openai\ndrupal-news-scheduler --every monday --hour 8 --email yes --days 7\n\n# Or from source\npython3 scheduler.py --every friday --hour 9 --provider openai\n```\n\n### Email Sender\n\n```bash\n# Using installed package\ndrupal-news-email --latest\ndrupal-news-email --run-dir runs/2025-10-29\n\n# Or from source\npython3 -m drupal_news.email_sender --latest\n```\n\n### Cron\n\n```bash\n# Using installed package\n0 9 * * 5 drupal-news --provider openai --email yes\n\n# Or from source\n0 9 * * 5 cd /path \u0026\u0026 python3 index.py --provider openai\n```\n\n## Web Viewer\n\n```bash\n# Using installed package\ndrupal-news-viewer\n# Open http://localhost:5000\n\n# Or from source\npython3 src/viewer.py\n```\n\nFeatures: tabs/split view, run history, metrics, logs\n\n## Providers\n\nBuilt-in: OpenAI, Anthropic, Gemini, Ollama, LMStudio, Qwen, Grok, DeepSeek, OpenRouter\n\n**Generic:** Works with ANY OpenAI-compatible API (OpenRouter, Together AI, Groq, Perplexity, Fireworks, Azure OpenAI, custom endpoints)\n\nSee: [Generic Provider Guide](docs/GENERIC_PROVIDER.md)\n\n## CLI Commands\n\n### drupal-news\n\nMain aggregator command. Fetches, parses, and summarizes Drupal news.\n\n```bash\ndrupal-news [OPTIONS]\n\nOptions:\n  --provider \u003cname\u003e       AI provider (openai, anthropic, gemini, etc.)\n  --model \u003cname\u003e          Override provider's default model\n  --days \u003cn\u003e              Timeframe in days (default: 7)\n  --email yes|no          Send email report\n  --dry-run               Skip AI and email (testing mode)\n  --fetch-only            Only fetch and parse, skip AI\n  --use-sources \u003cdate\u003e    Use cached sources from date (YYYY-MM-DD)\n  --config \u003cpath\u003e         Custom config.yml path\n  --env \u003cpath\u003e            Custom .env path\n  --outdir \u003cpath\u003e         Custom output directory\n  --verbose               Enable debug logging\n```\n\n### drupal-news-scheduler\n\nSchedule recurring aggregator runs.\n\n```bash\ndrupal-news-scheduler --every \u003cday\u003e [OPTIONS]\n\nOptions:\n  --every \u003cday\u003e           Day of week (monday-sunday)\n  --hour \u003cn\u003e              Hour to run (0-23, default: 9)\n  --minute \u003cn\u003e            Minute to run (0-59, default: 0)\n  --provider \u003cname\u003e       AI provider to use\n  --model \u003cname\u003e          Model override\n  --email yes|no          Send email\n  --days \u003cn\u003e              Number of days to aggregate\n```\n\n### drupal-news-email\n\nSend aggregated reports via email.\n\n```bash\ndrupal-news-email [OPTIONS]\n\nOptions:\n  --latest                Send latest report\n  --run-dir \u003cpath\u003e        Send specific run directory\n  --days \u003cn\u003e              Days back to check (default: 7)\n```\n\n### drupal-news-viewer\n\nLaunch web interface to view reports.\n\n```bash\ndrupal-news-viewer\n\nOpens http://localhost:5000\nFeatures: tabs, run history, metrics, logs\n```\n\n## Output\n\n`runs/YYYY-MM-DD/`: parsed.md, summary.md, sources.json, metrics.json, run.log\n\n## Project Structure\n\nWhen using from PyPI, configuration files are in `~/.drupal-news/` or current directory.\n\nWhen using from source:\n\n```\n├── setup.sh        # Setup script\n├── index.py        # Main entry (wrapper)\n├── scheduler.py    # Scheduler (wrapper)\n├── src/            # Source code\n├── src/viewer.py        # Web viewer (wrapper)\n├── venv/                # Virtual env\n├── config.yml           # Unified configuration\n├── config.example.yml   # Configuration examples\n└── .env                 # Optional environment variables\n```\n\n## Exit Codes\n\n- 0:  Success\n- 10: Partial fetch failure\n- 20: Validation failed\n- 30: Summarizer failed\n- 40: Email failure\n- 50: Integrity check failed\n\n## Contributing\n\nContributions welcome! See [docs/RELEASING.md](docs/RELEASING.md) for release process.\n\n### Creating a Release\n\n```bash\n# Patch release (bug fixes)\n./release.sh patch -m \"Bug fixes and improvements\"\n\n# Minor release (new features)\n./release.sh minor -m \"New features\" --push\n\n# Major release (breaking changes)\n./release.sh major -m \"Breaking changes\" --push\n```\n\nThe release script:\n\n- Updates VERSION file\n- Updates RELEASES.md with changelog\n- Creates git commit and tag\n- Optionally pushes to trigger automated PyPI publishing\n\n## License\n\n[GPL-V2](LICENSE.txt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheodorosploumis%2Fdrupal_news","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheodorosploumis%2Fdrupal_news","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheodorosploumis%2Fdrupal_news/lists"}