# ByGoD - The Bible, By God - Bible Gateway Downloader

A comprehensive, truly asynchronous tool for downloading Bible translations from BibleGateway.com in multiple formats (JSON, CSV, YAML, XML) with genuine parallel downloads, retry mechanisms, and flexible output options.

## 🚀 Features

- **True Async HTTP Requests**: Uses `aiohttp` for genuine parallelism, not just threading
- **Direct HTML Parsing**: Bypasses synchronous libraries to directly parse BibleGateway HTML
- **Multiple Translations**: Support for 30+ Bible translations (NIV, KJV, ESV, etc.)
- **Multiple Formats**: Output in JSON, CSV, YAML, and XML formats
- **Intelligent Rate Limiting**: Configurable concurrency with automatic rate limiting
- **Retry Mechanisms**: Exponential backoff with configurable retry attempts
- **Organized Output**: Structured directory organization by translation and format
- **Comprehensive Logging**: Colored, detailed progress tracking
- **Flexible Output Modes**: Download individual books, full Bibles, or both

## 📦 Installation

### Option 1: Install from PyPI (Recommended)

```bash
pip install bygod
```

### Option 2: Install from Source (Using Pipenv)

1. **Clone the repository**:
   ```bash
   git clone git@github.com:Christ-Is-The-King/bygod.git
   cd bygod
   ```

2. **Install pipenv** (if not already installed):
   ```bash
   pip install pipenv
   ```

3. **Install dependencies and activate virtual environment**:
   ```bash
   pipenv install
   pipenv shell
   ```

4. **Install in development mode**:
   ```bash
   pip install -e .
   ```

5. **Run the application**:
   ```bash
   python main.py [options]
   ```

### Option 3: Install from Source (Using pip)

1. **Clone the repository**:
   ```bash
   git clone git@github.com:Christ-Is-The-King/bygod.git
   cd bygod
   ```

2. **Create a virtual environment**:
   ```bash
   python -m venv venv
   source venv/bin/activate  # On Windows: venv\Scripts\activate
   ```

3. **Install dependencies**:
   ```bash
   pip install -r requirements.txt
   ```

4. **Install in development mode**:
   ```bash
   pip install -e .
   ```

### Option 4: Build and Install Package

1. **Build the package**:
   ```bash
   python build_package.py
   ```

2. **Install the built package**:
   ```bash
   pip install dist/bygod-*.whl
   ```

## 🎯 Quick Start

### Basic Usage

Download a single translation in JSON format:
```bash
python main.py -t NIV -f json
```

Download multiple translations in multiple formats:
```bash
python main.py -t NIV,KJV,ESV -f json,csv,xml,yaml
```

Download specific books only:
```bash
python main.py -t NIV -b Genesis,Exodus,Psalms
```

### Advanced Usage

Download with custom concurrency and retry settings:
```bash
python main.py \
  -t NIV,KJV \
  -f json,csv \
  -c 10 \
  --retries 5 \
  -d 3 \
  --timeout 600
```

Download only individual books (no full Bible):
```bash
python main.py -t NIV -m books
```

Download only full Bible (no individual books):
```bash
bygod -t NIV -m book
```

### Verbosity and Logging

Control output verbosity and error logging:

- Use `-v`, `-vv`, or `-vvv` for increasing verbosity
- Use `-q` or `--quiet` to suppress all output except errors
- Use `-e` or `--log-errors` to log errors to a file
- Use `-l` or `--log-level` to set the logging level

**Verbose mode (more detailed output):**

```
bygod -t NIV -m books -v
```

**Log errors to file:**

```
bygod -t NIV --log-errors logs/bible_errors.log
```

**Set specific log level:**

```
bygod -t NIV -ll DEBUG
```

**Combine options:**

```
bygod -t NIV -v --log-errors logs/errors.log -ll WARNING
```

---

## 📋 Sample Log Output

```
12:15:50 - INFO - 🚀 ByGoD
12:15:50 - INFO - 📚 Translations: NIV
12:15:50 - INFO - 📖 Books: Genesis
12:15:50 - INFO - 📄 Formats: json
12:15:50 - INFO - 📁 Output Directory: ./bibles
12:15:50 - INFO - ⚡ Concurrency: 5 concurrent requests
12:15:50 - INFO - 🔄 Retries: 3 (delay: 2s)
12:15:50 - INFO - ⏱️ Timeout: 300s
12:15:50 - INFO - 📖 Processing NIV...
12:15:50 - INFO - 📚 Starting download of Genesis (NIV)
12:15:50 - INFO - 📖 Starting Genesis 1 (NIV)
12:15:50 - INFO - 📖 Starting Genesis 2 (NIV)
...
12:15:57 - INFO - ✅ Downloaded Genesis 1 (NIV): 31 verses
12:15:57 - INFO - ✅ Downloaded Genesis 2 (NIV): 25 verses
12:15:57 - INFO - ✅ Downloaded Genesis 3 (NIV): 24 verses
...
12:16:14 - INFO - 📊 Completed Genesis (NIV): 50/50 chapters, 1,533 total verses in 24.1s
12:16:14 - INFO - ⏱️ Total Time: 24.1s, Successful: NIV, Failed: 0 translations
```

## 📋 Command Line Options

| Option | Description | Default |
|--------|-------------|---------|
| `-t, --translations` | Comma-separated list of Bible translations | `NIV` |
| `-b, --books` | Comma-separated list of specific books | All books |
| `-f, --formats` | Output formats: json, csv, xml, yaml | `json` |
| `-m, --mode` | Output mode: book, books, all | `all` |
| `-o, --output` | Directory to save downloaded Bibles | `./bibles` |
| `--combined` | Generate combined file for multiple translations | `False` |
| `-c, --concurrency` | Maximum concurrent requests | `5` |
| `--retries` | Maximum retry attempts | `3` |
| `-d, --delay` | Delay between retries (seconds) | `2` |
| `--timeout` | Request timeout (seconds) | `300` |
| `-v, --verbose` | Increase verbosity level (-v: INFO, -vv: DEBUG, -vvv: TRACE) | `0` |
| `-q, --quiet` | Suppress all output except errors | `False` |
| `-ll, --log-level` | Set logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) | `INFO` |
| `--log-errors` | Log errors to specified file | `None` |
| `-dr, --dry-run` | Show what would be downloaded without downloading | `False` |
| `-r, --resume` | Resume interrupted downloads by skipping existing files | `False` |
| `--force` | Force re-download even if files already exist | `False` |

## 📚 Supported Translations

The downloader supports 32 Bible translations:

- **AMP** - Amplified Bible
- **ASV** - American Standard Version
- **AKJV** - Authorized King James Version
- **BRG** - BRG Bible
- **CSB** - Christian Standard Bible
- **EHV** - Evangelical Heritage Version
- **ESV** - English Standard Version
- **ESVUK** - English Standard Version UK
- **GNV** - Geneva Bible
- **GW** - God's Word Translation
- **ISV** - International Standard Version
- **JUB** - Jubilee Bible
- **KJV** - King James Version
- **KJ21** - 21st Century King James Version
- **LEB** - Lexham English Bible
- **LSB** - Legacy Standard Bible
- **MEV** - Modern English Version
- **NASB** - New American Standard Bible
- **NASB1995** - New American Standard Bible 1995
- **NET** - New English Translation
- **NIV** - New International Version
- **NIVUK** - New International Version UK
- **NKJV** - New King James Version
- **NLT** - New Living Translation
- **NLV** - New Life Version
- **NMB** - New Matthew Bible (New Testament only)
- **NOG** - Names of God Bible
- **NRSV** - New Revised Standard Version
- **NRSVUE** - New Revised Standard Version Updated Edition
- **RSV** - Revised Standard Version
- **WEB** - World English Bible
- **YLT** - Young's Literal Translation

## 📁 Output Structure

The downloader creates a well-organized directory structure:

```
bibles/
├── NIV/
│   ├── bible.json        # Full Bible in JSON
│   ├── bible.csv         # Full Bible in CSV
│   ├── bible.xml         # Full Bible in XML
│   ├── bible.yml         # Full Bible in YAML
│   └── books/
│       ├── Genesis.json  # Individual book in JSON
│       ├── Genesis.csv   # Individual book in CSV
│       ├── Genesis.xml   # Individual book in XML
│       ├── Genesis.yml   # Individual book in YAML
│       └── ...
├── KJV/
│   ├── bible.json
│   ├── bible.csv
│   └── books/
│       └── ...
└── ...
```

## 🏗️ Project Structure

The project has been refactored into a clean, modular structure:

```
bible-gateway-downloader/
├── main.py                    # Main entry point
├── src/                       # Source code package
│   ├── __init__.py
│   ├── constants/             # Bible translations and books data
│   │   ├── translations.py    # BIBLE_TRANSLATIONS dictionary
│   │   ├── books.py          # BOOKS list
│   │   ├── chapters.py       # Chapter counts
│   │   └── cli.py            # CLI constants
│   ├── core/                  # Core downloader functionality
│   │   └── downloader.py      # AsyncBibleDownloader class
│   ├── utils/                 # Utility functions
│   │   ├── formatting.py      # Duration and number formatting
│   │   └── logging.py         # Logging setup and configuration
│   ├── cli/                   # Command line interface
│   │   └── parser.py          # Argument parsing and validation
│   ├── processors/            # Processing logic
│   │   ├── bible_processor.py # Bible download processing
│   │   └── master_processor.py # Master file processing
│   ├── formatters/            # Output format handlers
│   │   ├── json.py           # JSON formatting
│   │   ├── csv.py            # CSV formatting
│   │   ├── xml.py            # XML formatting
│   │   └── yaml.py           # YAML formatting
│   └── tests/                 # Test suite
│       ├── test_constants.py  # Constants tests
│       ├── test_core.py       # Core functionality tests
│       └── test_utils.py      # Utility tests
├── pyproject.toml             # Project configuration
├── README.md                  # This file
└── ... (other files)
```

## 🔧 Technical Details

### True Async Architecture

Unlike traditional threading approaches, this downloader uses:

- **`asyncio`**: Python's native async/await framework
- **`aiohttp`**: True async HTTP client for concurrent requests
- **Semaphores**: Rate limiting with configurable concurrency
- **`asyncio.gather()`**: Parallel execution of multiple downloads

### HTML Parsing

The downloader directly parses BibleGateway HTML using:

- **BeautifulSoup**: HTML parsing and navigation
- **CSS Selectors**: Multiple fallback selectors for verse extraction
- **Regex Patterns**: Chapter discovery and verse number detection

### Modular Architecture

The codebase has been refactored into a clean, modular structure:

- **Separation of Concerns**: Each module has a specific responsibility
- **Maintainability**: Easy to understand and modify individual components
- **Testability**: Each module can be tested independently
- **Reusability**: Core downloader can be imported and used in other projects
- **Code Quality**: Comprehensive linting and formatting standards

### Code Quality Standards

The project maintains high code quality through automated tools:

- **Formatting**: Black for consistent code style, isort for import organization
- **Linting**: Flake8 for style guide enforcement, Pylint for code analysis
- **Type Checking**: MyPy for static type analysis
- **Security**: Bandit for security vulnerability detection, Safety for dependency scanning
- **Documentation**: Pydocstyle for docstring standards
- **Complexity**: Vulture for dead code detection, Radon for complexity analysis

All code is automatically formatted and follows PEP 8 standards.

### Error Handling

- **Exponential Backoff**: Intelligent retry with increasing delays
- **Rate Limit Detection**: Automatic handling of 429 responses
- **Graceful Degradation**: Continues processing even if some downloads fail
- **Detailed Logging**: Comprehensive error reporting and progress tracking

## 🧪 Testing

Run the test suite to verify functionality:

```bash
# Using pipenv
pipenv run python -m pytest src/tests/ -v

# Run specific test categories
pipenv run python -m pytest src/tests/test_constants.py -v
pipenv run python -m pytest src/tests/test_utils.py -v
pipenv run python -m pytest src/tests/test_core.py -v

# Run with coverage
pipenv run python -m pytest src/tests/ --cov=src --cov-report=html
```

The test suite includes:
- **Core Functionality**: Downloader initialization, context management, request handling
- **Constants Validation**: Bible translations, books, and chapter counts
- **Utilities**: Formatting functions and logging setup
- **Integration Tests**: End-to-end download scenarios

### Test Results
- **47 tests passed** ✅
- **1 test skipped** ⏭️ (complex async mocking)
- **0 tests failed** ❌
- **Clean test suite**: Removed problematic network simulation tests

## 📊 Performance

The true async architecture provides significant performance improvements:

- **Genuine Parallelism**: Multiple HTTP requests execute simultaneously
- **Efficient Resource Usage**: No thread overhead, uses event loop
- **Scalable Concurrency**: Configurable rate limits prevent server overload
- **Memory Efficient**: Streams responses without loading entire files into memory

## 🤝 Contributing

1. Fork the repository
2. Create a feature branch
3. Install dependencies using pipenv:
   ```bash
   pipenv install
   pipenv install --dev
   ```
4. Make your changes
5. Add tests for new functionality
6. Ensure all tests pass:
   ```bash
   pipenv run python tests.py
   ```
7. Run the linter to ensure code quality:
   ```bash
   # Run all code quality checks
   ./scripts/code-checker.sh --all
   
   # Or run specific checks
   ./scripts/code-checker.sh --format  # Black + isort
   ./scripts/code-checker.sh --lint    # Flake8 + Pylint
   ./scripts/code-checker.sh --type    # MyPy type checking
   ./scripts/code-checker.sh --security # Bandit + Safety
   ```
8. Submit a pull request

## 📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

## 🙏 Acknowledgments

- BibleGateway.com for providing Bible content
- The Python async community for excellent tools and documentation
- Contributors and users who provide feedback and improvements

## 🆘 Troubleshooting

### Common Issues

**Rate Limiting**: If you encounter 429 errors, reduce the `--concurrency` value.

**Timeout Errors**: Increase the `--timeout` value for slower connections.

**Missing Verses**: Some translations may have different HTML structures. The parser includes multiple fallback methods.

**Memory Usage**: For large downloads, consider downloading fewer books at once or using a lower rate limit.

### Getting Help

- Check the logs for detailed error messages
- Try with a single translation and book first
- Ensure your internet connection is stable
- Verify that BibleGateway.com is accessible from your location 