Drupal News Aggregator
Automated Drupal news aggregation with AI summarization.
Installation
From PyPI
pip install drupal-news
# With AI providers
pip install "drupal-news[openai]"
pip install "drupal-news[anthropic]"
pip install "drupal-news[all-providers]"
From Source
./setup.sh
source venv/bin/activate
Quick Start
# Using installed package
drupal-news --dry-run
# Or from source
python3 index.py --dry-run
Configuration
Unified Configuration (config.yml)
All configuration is now in a single config.yml file:
# Create from example
cp config.example.yml config.yml
# Edit to customize
nano config.yml
Configuration sections:
- Core settings: timeframe, HTTP options, email, markdown
- Sources: RSS feeds and web pages to scrape
- AI providers: Model configurations for summarization
- Prompt template: Customize AI summarization instructions
- API keys: Store or reference environment variables
Custom Configuration Path
drupal-news --config /path/to/config.yml
# Or from source
python3 index.py --config /path/to/config.yml
Environment Variables (.env)
You can still use .env for sensitive data:
# .env (optional)
OPENROUTER_API_KEY=sk-or-v1-...
ANTHROPIC_API_KEY=sk-ant-api03-...
TIMEZONE=Europe/Athens
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=user@example.com
SMTP_PASS=password
MAIL_TO=recipient@example.com
MAIL_FROM=sender@example.com
Reference them in config.yml using ${VAR_NAME}:
api_keys:
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY} # From .env
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
Configuration Examples
See config.example.yml for comprehensive examples of:
- Multiple AI providers (OpenAI, Anthropic, Gemini, Ollama, etc.)
- Custom API endpoints and proxies
- Advanced page scraping with CSS selectors
- Custom prompt templates
Migration Guide: See MIGRATION.md if upgrading from old config files
Usage
Main Aggregator
# Using installed package
drupal-news --provider openai --days 7
drupal-news --dry-run --verbose
drupal-news --provider anthropic --email yes
# Or from source
python3 index.py --provider openai --days 7
Scheduler
# Using installed package
drupal-news-scheduler --every friday --hour 9 --provider openai
drupal-news-scheduler --every monday --hour 8 --email yes --days 7
# Or from source
python3 scheduler.py --every friday --hour 9 --provider openai
Email Sender
# Using installed package
drupal-news-email --latest
drupal-news-email --run-dir runs/2025-10-29
# Or from source
python3 -m drupal_news.email_sender --latest
Cron
# Using installed package
0 9 * * 5 drupal-news --provider openai --email yes
# Or from source
0 9 * * 5 cd /path && python3 index.py --provider openai
Web Viewer
# Using installed package
drupal-news-viewer
# Open http://localhost:5000
# Or from source
python3 src/viewer.py
Features: tabs/split view, run history, metrics, logs
Providers
Built-in: OpenAI, Anthropic, Gemini, Ollama, LMStudio, Qwen, Grok, DeepSeek, OpenRouter
Generic: Works with ANY OpenAI-compatible API (OpenRouter, Together AI, Groq, Perplexity, Fireworks, Azure OpenAI, custom endpoints)
CLI Commands
drupal-news
Main aggregator command. Fetches, parses, and summarizes Drupal news.
drupal-news [OPTIONS]
Options:
--provider <name> AI provider (openai, anthropic, gemini, etc.)
--model <name> Override provider's default model
--days <n> Timeframe in days (default: 7)
--email yes|no Send email report
--dry-run Skip AI and email (testing mode)
--fetch-only Only fetch and parse, skip AI
--use-sources <date> Use cached sources from date (YYYY-MM-DD)
--config <path> Custom config.yml path
--env <path> Custom .env path
--outdir <path> Custom output directory
--verbose Enable debug logging
drupal-news-scheduler
Schedule recurring aggregator runs.
drupal-news-scheduler --every <day> [OPTIONS]
Options:
--every <day> Day of week (monday-sunday)
--hour <n> Hour to run (0-23, default: 9)
--minute <n> Minute to run (0-59, default: 0)
--provider <name> AI provider to use
--model <name> Model override
--email yes|no Send email
--days <n> Number of days to aggregate
drupal-news-email
Send aggregated reports via email.
drupal-news-email [OPTIONS]
Options:
--latest Send latest report
--run-dir <path> Send specific run directory
--days <n> Days back to check (default: 7)
drupal-news-viewer
Launch web interface to view reports.
drupal-news-viewer
Opens http://localhost:5000
Features: tabs, run history, metrics, logs
Output
runs/YYYY-MM-DD/: parsed.md, summary.md, sources.json, metrics.json, run.log
Project Structure
When using from PyPI, configuration files are in ~/.drupal-news/ or current directory.
When using from source:
├── setup.sh # Setup script
├── index.py # Main entry (wrapper)
├── scheduler.py # Scheduler (wrapper)
├── src/ # Source code
├── src/viewer.py # Web viewer (wrapper)
├── venv/ # Virtual env
├── config.yml # Unified configuration
├── config.example.yml # Configuration examples
└── .env # Optional environment variables
Exit Codes
- 0: Success
- 10: Partial fetch failure
- 20: Validation failed
- 30: Summarizer failed
- 40: Email failure
- 50: Integrity check failed
Contributing
Contributions welcome! See docs/RELEASING.md for release process.
Creating a Release
# Patch release (bug fixes)
./release.sh patch -m "Bug fixes and improvements"
# Minor release (new features)
./release.sh minor -m "New features" --push
# Major release (breaking changes)
./release.sh major -m "Breaking changes" --push
The release script:
- Updates VERSION file
- Updates RELEASES.md with changelog
- Creates git commit and tag
- Optionally pushes to trigger automated PyPI publishing
License
Metadata
Release files for drupal-news 0.0.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| drupal_news-0.0.15.tar.gz | 94.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| drupal_news-0.0.15-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 171.4 kB
Release files / drupal_news-0.0.15.tar.gz
| Download URL | drupal_news-0.0.15.tar.gz |
|---|---|
| Size | 94.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
153fb11f3b22889affa35f934e4d8a6d81691c13d8dd09778585e6ff7b658d88
|
|
BLAKE2b-256 checksum How to use checksums |
bf1e9ef14806cff7fbb64dddaa5dbbc4e299b67ecbb6e81cc8ac77784125c9d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Release files / drupal_news-0.0.15-py3-none-any.whl
| Download URL | drupal_news-0.0.15-py3-none-any.whl |
|---|---|
| Size | 77.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cea9713e7aff80b9db5e95d66eed1fdcde62dd7bcfda9c313d2bb6076aef74d6
|
|
BLAKE2b-256 checksum How to use checksums |
cc0c0b3ac58dbf5973d065557a4bce50f3620fb5cd96d06847c514de2dc79d3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|