prunarr


Nameprunarr JSON
Version 1.1.0 PyPI version JSON
download
home_pageNone
SummaryAutomated media library cleanup for Radarr and Sonarr based on Tautulli watch status
upload_time2025-10-17 08:39:02
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseApache-2.0
keywords radarr sonarr tautulli media automation cleanup
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![PyPI version](https://badge.fury.io/py/prunarr.svg)](https://pypi.org/project/prunarr/)
[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)

# PrunArr

**Automatically clean up your Radarr and Sonarr libraries based on what you've actually watched in Plex/Jellyfin (via Tautulli).**

Stop manually managing your media library. PrunArr removes watched content after a configurable period, checks streaming availability, and gives you complete control over what stays and what goes.

---

## Quick Start

```bash
# 1. Install
pip install prunarr

# 2. Configure (create config.yaml with your API keys)
curl -O https://raw.githubusercontent.com/haijeploeg/prunarr/main/config.example.yaml
mv config.example.yaml config.yaml
# Edit config.yaml with your API keys

# 3. Preview what would be removed
prunarr --config config.yaml movies remove --dry-run

# 4. Remove watched content (60+ days old by default)
prunarr --config config.yaml movies remove
prunarr --config config.yaml series remove
```

πŸ“– **[Full Quick Start Guide β†’](docs/QUICK_START.md)**

---

## Why PrunArr?

**The Problem:**
- Your media library keeps growing
- You're running out of storage space
- Manually tracking what's been watched is tedious
- You don't know what's safe to remove
- There are Movies and Shows in your library that are also availble on streaming providers

**The Solution:**
PrunArr automates media cleanup by:
- βœ… Checking Tautulli to see what's been watched
- βœ… Removing content after your specified retention period
- βœ… Checking if content is available on streaming services
- βœ… Supporting user-based tracking for multi-user setups
- βœ… Providing safety features (dry-run, confirmations, previews)

**Perfect for:**
- People with limited storage space
- Multi-user Plex/Jellyfin servers
- Users of Overseerr request management
- Anyone tired of manual library cleanup
- Users who want to prioritize unique content over streamable content

---

## Key Features

### 🎯 User-Based Tracking
Integrates with **Overseerr** to automatically track who requested what. Content is only removed when watched by the original requester.

```bash
prunarr movies remove --username "alice" --days-watched 30
```

πŸ“– **[Tag System Guide β†’](docs/TAG_SYSTEM.md)**

### ⏰ Flexible Retention Periods
Control exactly how long to keep watched content:

```bash
prunarr movies remove --days-watched 60   # Remove after 60 days
prunarr series remove --days-watched 90   # Keep series longer
```

### πŸ“¦ Size-Based Filtering
Target large files to free up space quickly:

```bash
prunarr movies list --min-filesize "5GB" --sort-by filesize --desc
prunarr movies remove --min-filesize "5GB" --days-watched 60
```

### 🏷️ Tag-Based Organization
Filter content by quality, genre, or any custom tags:

```bash
prunarr movies list --tag "4K" --tag "HDR"
prunarr movies remove --tag "Kids" --days-watched 14
prunarr movies remove --exclude-tag "Favorites"
```

### 🎬 Streaming Provider Integration
Check if content is available on your streaming services via JustWatch:

```bash
# Remove watched movies available on streaming
prunarr movies remove --on-streaming --days-watched 30

# Keep unique content longer (not on streaming)
prunarr movies remove --not-on-streaming --days-watched 180
```

πŸ“– **[Streaming Integration Guide β†’](docs/STREAMING.md)**

### πŸ›‘οΈ Safety-First Design
Multiple layers of protection:
- **Dry-run mode** - Preview changes before committing
- **Confirmation prompts** - Review what will be removed
- **User verification** - Only remove content watched by the requester
- **Detailed logging** - Track all operations with `--debug`

### πŸ“Š Rich Console Output
Beautiful, informative tables with:
- 🟒 Color-coded status (Watched, Partial, Unwatched)
- πŸ“ Human-readable file sizes (MB, GB, TB)
- πŸ“… Last watched dates and days ago
- πŸ”„ JSON output option for automation

### ⚑ Performance & Automation
- **Intelligent caching** - Minimize API calls
- **JSON output** - Machine-readable for scripts
- **Cron-ready** - Perfect for scheduled automation
- **Exit codes** - Proper status codes for monitoring

---

## Documentation

### Getting Started
- **[Installation Guide](docs/INSTALLATION.md)** - Install PrunArr via pip or from source
- **[Configuration Guide](docs/CONFIGURATION.md)** - Set up API keys and options
- **[Quick Start Guide](docs/QUICK_START.md)** - Get productive in minutes
- **[Command Reference](docs/COMMANDS.md)** - Complete command documentation

### Core Concepts
- **[Tag System](docs/TAG_SYSTEM.md)** - User tracking and content organization
- **[Streaming Integration](docs/STREAMING.md)** - JustWatch provider integration
- **[Advanced Features](docs/ADVANCED.md)** - Automation, scripting, and optimization
- **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions

---

## Common Use Cases

### Weekly Cleanup Routine
```bash
# Preview and remove watched content
prunarr movies remove --days-watched 60 --dry-run
prunarr movies remove --days-watched 60
prunarr series remove --days-watched 90
```

### Free Up Space Quickly
```bash
# Target large files first
prunarr movies list --min-filesize "10GB" --sort-by filesize --desc
prunarr movies remove --min-filesize "5GB" --days-watched 30
```

### Smart Streaming-Based Cleanup
```bash
# Remove watched movies you can re-stream
prunarr movies remove --on-streaming --days-watched 30

# Keep unique content longer
prunarr movies remove --not-on-streaming --days-watched 180
```

### Multi-User Management
```bash
# List content by user
prunarr movies list --username "alice"

# User-specific cleanup
prunarr movies remove --username "bob" --days-watched 45
```

### Kids Content Fast Rotation
```bash
# Quick cleanup of kids content
prunarr movies remove --tag "Kids" --days-watched 14
prunarr series remove --tag "Kids" --days-watched 14
```

πŸ“– **[More Examples β†’](docs/QUICK_START.md#common-workflows)**

---

## Requirements

- **Python 3.9 or higher**
- **Radarr** (for movies) and/or **Sonarr** (for TV shows)
- **Tautulli** (for watch history tracking)

---

## Deployment Options

### πŸ“¦ PyPI Installation (Recommended)

```bash
pip install prunarr
```

### 🐳 Docker

Run PrunArr in a container for isolated, portable deployments:

```bash
# Pull from GitHub Container Registry
docker pull ghcr.io/hploeg/prunarr:latest

# Run with Docker
docker run --rm \
  -e RADARR_API_KEY="your-api-key" \
  -e RADARR_URL="https://radarr.example.com" \
  -e SONARR_API_KEY="your-api-key" \
  -e SONARR_URL="https://sonarr.example.com" \
  -e TAUTULLI_API_KEY="your-api-key" \
  -e TAUTULLI_URL="https://tautulli.example.com" \
  ghcr.io/hploeg/prunarr:latest movies list --limit 10

# Or use Docker Compose
docker-compose run --rm prunarr movies remove --dry-run
```

πŸ“– **[Docker Deployment Guide β†’](docs/DOCKER.md)**

### ☸️ Kubernetes with Helm

Deploy to Kubernetes for automated, scheduled cleanups:

```bash
# Install from OCI registry
helm install prunarr oci://ghcr.io/hploeg/charts/prunarr \
  --version 1.0.0 \
  --set config.radarr.apiKey="your-api-key" \
  --set config.radarr.url="https://radarr.example.com" \
  --set config.sonarr.apiKey="your-api-key" \
  --set config.sonarr.url="https://sonarr.example.com" \
  --set config.tautulli.apiKey="your-api-key" \
  --set config.tautulli.url="https://tautulli.example.com"

# Default: CronJob mode with daily cleanup at 2 AM (movies) and 3 AM (series)
```

**Features:**
- πŸ• Automated scheduling with Kubernetes CronJobs
- πŸ’Ύ Persistent cache with PVC
- πŸ”’ Secret management for API keys
- πŸ“Š Resource limits and health checks
- πŸ”„ Easy rollbacks and updates

πŸ“– **[Kubernetes Deployment Guide β†’](docs/KUBERNETES.md)**

---

## Installation

### From PyPI (Recommended)
```bash
pip install prunarr
```

### From Source
```bash
git clone https://github.com/haijeploeg/prunarr
cd prunarr
pip install -e .
```

πŸ“– **[Full Installation Guide β†’](docs/INSTALLATION.md)**

---

## Configuration

1. **Create config file:**
   ```bash
   curl -O https://raw.githubusercontent.com/haijeploeg/prunarr/main/config.example.yaml
   mv config.example.yaml config.yaml
   ```

2. **Add your API keys:**
   ```yaml
   radarr_api_key: "your-radarr-api-key"
   radarr_url: "https://radarr.yourdomain.com"
   sonarr_api_key: "your-sonarr-api-key"
   sonarr_url: "https://sonarr.yourdomain.com"
   tautulli_api_key: "your-tautulli-api-key"
   tautulli_url: "https://tautulli.yourdomain.com"
   ```

3. **Test your config:**
   ```bash
   prunarr --config config.yaml movies list --limit 5
   ```

πŸ“– **[Full Configuration Guide β†’](docs/CONFIGURATION.md)**

---

## Overseerr Integration

PrunArr works seamlessly with Overseerr's "Tag Requests" feature:

1. In Overseerr, go to **Settings** β†’ **Radarr/Sonarr**
2. Enable **"Tag Requests"**
3. That's it! PrunArr will automatically track who requested what

When users request content through Overseerr:
- Tags are automatically created (e.g., `"123 - john_doe"`)
- PrunArr matches usernames with Tautulli
- Content is only removed when watched by the original requester

πŸ“– **[Tag System Guide β†’](docs/TAG_SYSTEM.md#automatic-tags-with-overseerr-recommended)**

---

## Command Overview

**Movies:**
```bash
prunarr movies list                      # List all movies
prunarr movies remove --dry-run          # Preview removal
prunarr movies remove --days-watched 60  # Remove watched movies
```

**Series:**
```bash
prunarr series list                      # List all series
prunarr series get "Breaking Bad"        # Get detailed info
prunarr series remove --days-watched 90  # Remove watched series
```

**History:**
```bash
prunarr history list --limit 20          # View watch history
```

**Streaming:**
```bash
prunarr providers list                   # List streaming providers
prunarr providers check "The Matrix"     # Check availability
```

**Cache:**
```bash
prunarr cache init                       # Initialize cache
prunarr cache status                     # View cache stats
```

πŸ“– **[Complete Command Reference β†’](docs/COMMANDS.md)**

---

## Contributing

Contributions are welcome! Please:

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Make your changes
4. Run tests (`make test`)
5. Format code (`make format`)
6. Commit (`git commit -m 'feat: add amazing feature'`)
7. Push (`git push origin feature/amazing-feature`)
8. Open a Pull Request

### Development Setup

```bash
git clone https://github.com/haijeploeg/prunarr
cd prunarr
python -m venv env
source env/bin/activate
pip install -e ".[dev]"

# Run tests
make test

# Format code
make format

# Run linting
make lint
```

---

## Support

- **Documentation**: [docs/](docs/)
- **Issues**: [GitHub Issues](https://github.com/haijeploeg/prunarr/issues)
- **Discussions**: [GitHub Discussions](https://github.com/haijeploeg/prunarr/discussions)

---

## License

Apache-2.0 License - See [LICENSE](LICENSE) file for details.

---

## Links

- **GitHub**: https://github.com/haijeploeg/prunarr
- **PyPI**: https://pypi.org/project/prunarr/
- **Issues**: https://github.com/haijeploeg/prunarr/issues

---

**Made with ❀️ for the Plex/Jellyfin community**

*PrunArr is not affiliated with Radarr, Sonarr, Tautulli, Overseerr, Plex, or Jellyfin.*

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "prunarr",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "radarr, sonarr, tautulli, media, automation, cleanup",
    "author": null,
    "author_email": "Haije Ploeg <ploeg.haije@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/11/04/130d34c336b925b6abcb16f8e29fe0285025b9d75705e96cc877c4c4a7cf/prunarr-1.1.0.tar.gz",
    "platform": null,
    "description": "[![PyPI version](https://badge.fury.io/py/prunarr.svg)](https://pypi.org/project/prunarr/)\n[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)\n\n# PrunArr\n\n**Automatically clean up your Radarr and Sonarr libraries based on what you've actually watched in Plex/Jellyfin (via Tautulli).**\n\nStop manually managing your media library. PrunArr removes watched content after a configurable period, checks streaming availability, and gives you complete control over what stays and what goes.\n\n---\n\n## Quick Start\n\n```bash\n# 1. Install\npip install prunarr\n\n# 2. Configure (create config.yaml with your API keys)\ncurl -O https://raw.githubusercontent.com/haijeploeg/prunarr/main/config.example.yaml\nmv config.example.yaml config.yaml\n# Edit config.yaml with your API keys\n\n# 3. Preview what would be removed\nprunarr --config config.yaml movies remove --dry-run\n\n# 4. Remove watched content (60+ days old by default)\nprunarr --config config.yaml movies remove\nprunarr --config config.yaml series remove\n```\n\n\ud83d\udcd6 **[Full Quick Start Guide \u2192](docs/QUICK_START.md)**\n\n---\n\n## Why PrunArr?\n\n**The Problem:**\n- Your media library keeps growing\n- You're running out of storage space\n- Manually tracking what's been watched is tedious\n- You don't know what's safe to remove\n- There are Movies and Shows in your library that are also availble on streaming providers\n\n**The Solution:**\nPrunArr automates media cleanup by:\n- \u2705 Checking Tautulli to see what's been watched\n- \u2705 Removing content after your specified retention period\n- \u2705 Checking if content is available on streaming services\n- \u2705 Supporting user-based tracking for multi-user setups\n- \u2705 Providing safety features (dry-run, confirmations, previews)\n\n**Perfect for:**\n- People with limited storage space\n- Multi-user Plex/Jellyfin servers\n- Users of Overseerr request management\n- Anyone tired of manual library cleanup\n- Users who want to prioritize unique content over streamable content\n\n---\n\n## Key Features\n\n### \ud83c\udfaf User-Based Tracking\nIntegrates with **Overseerr** to automatically track who requested what. Content is only removed when watched by the original requester.\n\n```bash\nprunarr movies remove --username \"alice\" --days-watched 30\n```\n\n\ud83d\udcd6 **[Tag System Guide \u2192](docs/TAG_SYSTEM.md)**\n\n### \u23f0 Flexible Retention Periods\nControl exactly how long to keep watched content:\n\n```bash\nprunarr movies remove --days-watched 60   # Remove after 60 days\nprunarr series remove --days-watched 90   # Keep series longer\n```\n\n### \ud83d\udce6 Size-Based Filtering\nTarget large files to free up space quickly:\n\n```bash\nprunarr movies list --min-filesize \"5GB\" --sort-by filesize --desc\nprunarr movies remove --min-filesize \"5GB\" --days-watched 60\n```\n\n### \ud83c\udff7\ufe0f Tag-Based Organization\nFilter content by quality, genre, or any custom tags:\n\n```bash\nprunarr movies list --tag \"4K\" --tag \"HDR\"\nprunarr movies remove --tag \"Kids\" --days-watched 14\nprunarr movies remove --exclude-tag \"Favorites\"\n```\n\n### \ud83c\udfac Streaming Provider Integration\nCheck if content is available on your streaming services via JustWatch:\n\n```bash\n# Remove watched movies available on streaming\nprunarr movies remove --on-streaming --days-watched 30\n\n# Keep unique content longer (not on streaming)\nprunarr movies remove --not-on-streaming --days-watched 180\n```\n\n\ud83d\udcd6 **[Streaming Integration Guide \u2192](docs/STREAMING.md)**\n\n### \ud83d\udee1\ufe0f Safety-First Design\nMultiple layers of protection:\n- **Dry-run mode** - Preview changes before committing\n- **Confirmation prompts** - Review what will be removed\n- **User verification** - Only remove content watched by the requester\n- **Detailed logging** - Track all operations with `--debug`\n\n### \ud83d\udcca Rich Console Output\nBeautiful, informative tables with:\n- \ud83d\udfe2 Color-coded status (Watched, Partial, Unwatched)\n- \ud83d\udccf Human-readable file sizes (MB, GB, TB)\n- \ud83d\udcc5 Last watched dates and days ago\n- \ud83d\udd04 JSON output option for automation\n\n### \u26a1 Performance & Automation\n- **Intelligent caching** - Minimize API calls\n- **JSON output** - Machine-readable for scripts\n- **Cron-ready** - Perfect for scheduled automation\n- **Exit codes** - Proper status codes for monitoring\n\n---\n\n## Documentation\n\n### Getting Started\n- **[Installation Guide](docs/INSTALLATION.md)** - Install PrunArr via pip or from source\n- **[Configuration Guide](docs/CONFIGURATION.md)** - Set up API keys and options\n- **[Quick Start Guide](docs/QUICK_START.md)** - Get productive in minutes\n- **[Command Reference](docs/COMMANDS.md)** - Complete command documentation\n\n### Core Concepts\n- **[Tag System](docs/TAG_SYSTEM.md)** - User tracking and content organization\n- **[Streaming Integration](docs/STREAMING.md)** - JustWatch provider integration\n- **[Advanced Features](docs/ADVANCED.md)** - Automation, scripting, and optimization\n- **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions\n\n---\n\n## Common Use Cases\n\n### Weekly Cleanup Routine\n```bash\n# Preview and remove watched content\nprunarr movies remove --days-watched 60 --dry-run\nprunarr movies remove --days-watched 60\nprunarr series remove --days-watched 90\n```\n\n### Free Up Space Quickly\n```bash\n# Target large files first\nprunarr movies list --min-filesize \"10GB\" --sort-by filesize --desc\nprunarr movies remove --min-filesize \"5GB\" --days-watched 30\n```\n\n### Smart Streaming-Based Cleanup\n```bash\n# Remove watched movies you can re-stream\nprunarr movies remove --on-streaming --days-watched 30\n\n# Keep unique content longer\nprunarr movies remove --not-on-streaming --days-watched 180\n```\n\n### Multi-User Management\n```bash\n# List content by user\nprunarr movies list --username \"alice\"\n\n# User-specific cleanup\nprunarr movies remove --username \"bob\" --days-watched 45\n```\n\n### Kids Content Fast Rotation\n```bash\n# Quick cleanup of kids content\nprunarr movies remove --tag \"Kids\" --days-watched 14\nprunarr series remove --tag \"Kids\" --days-watched 14\n```\n\n\ud83d\udcd6 **[More Examples \u2192](docs/QUICK_START.md#common-workflows)**\n\n---\n\n## Requirements\n\n- **Python 3.9 or higher**\n- **Radarr** (for movies) and/or **Sonarr** (for TV shows)\n- **Tautulli** (for watch history tracking)\n\n---\n\n## Deployment Options\n\n### \ud83d\udce6 PyPI Installation (Recommended)\n\n```bash\npip install prunarr\n```\n\n### \ud83d\udc33 Docker\n\nRun PrunArr in a container for isolated, portable deployments:\n\n```bash\n# Pull from GitHub Container Registry\ndocker pull ghcr.io/hploeg/prunarr:latest\n\n# Run with Docker\ndocker run --rm \\\n  -e RADARR_API_KEY=\"your-api-key\" \\\n  -e RADARR_URL=\"https://radarr.example.com\" \\\n  -e SONARR_API_KEY=\"your-api-key\" \\\n  -e SONARR_URL=\"https://sonarr.example.com\" \\\n  -e TAUTULLI_API_KEY=\"your-api-key\" \\\n  -e TAUTULLI_URL=\"https://tautulli.example.com\" \\\n  ghcr.io/hploeg/prunarr:latest movies list --limit 10\n\n# Or use Docker Compose\ndocker-compose run --rm prunarr movies remove --dry-run\n```\n\n\ud83d\udcd6 **[Docker Deployment Guide \u2192](docs/DOCKER.md)**\n\n### \u2638\ufe0f Kubernetes with Helm\n\nDeploy to Kubernetes for automated, scheduled cleanups:\n\n```bash\n# Install from OCI registry\nhelm install prunarr oci://ghcr.io/hploeg/charts/prunarr \\\n  --version 1.0.0 \\\n  --set config.radarr.apiKey=\"your-api-key\" \\\n  --set config.radarr.url=\"https://radarr.example.com\" \\\n  --set config.sonarr.apiKey=\"your-api-key\" \\\n  --set config.sonarr.url=\"https://sonarr.example.com\" \\\n  --set config.tautulli.apiKey=\"your-api-key\" \\\n  --set config.tautulli.url=\"https://tautulli.example.com\"\n\n# Default: CronJob mode with daily cleanup at 2 AM (movies) and 3 AM (series)\n```\n\n**Features:**\n- \ud83d\udd50 Automated scheduling with Kubernetes CronJobs\n- \ud83d\udcbe Persistent cache with PVC\n- \ud83d\udd12 Secret management for API keys\n- \ud83d\udcca Resource limits and health checks\n- \ud83d\udd04 Easy rollbacks and updates\n\n\ud83d\udcd6 **[Kubernetes Deployment Guide \u2192](docs/KUBERNETES.md)**\n\n---\n\n## Installation\n\n### From PyPI (Recommended)\n```bash\npip install prunarr\n```\n\n### From Source\n```bash\ngit clone https://github.com/haijeploeg/prunarr\ncd prunarr\npip install -e .\n```\n\n\ud83d\udcd6 **[Full Installation Guide \u2192](docs/INSTALLATION.md)**\n\n---\n\n## Configuration\n\n1. **Create config file:**\n   ```bash\n   curl -O https://raw.githubusercontent.com/haijeploeg/prunarr/main/config.example.yaml\n   mv config.example.yaml config.yaml\n   ```\n\n2. **Add your API keys:**\n   ```yaml\n   radarr_api_key: \"your-radarr-api-key\"\n   radarr_url: \"https://radarr.yourdomain.com\"\n   sonarr_api_key: \"your-sonarr-api-key\"\n   sonarr_url: \"https://sonarr.yourdomain.com\"\n   tautulli_api_key: \"your-tautulli-api-key\"\n   tautulli_url: \"https://tautulli.yourdomain.com\"\n   ```\n\n3. **Test your config:**\n   ```bash\n   prunarr --config config.yaml movies list --limit 5\n   ```\n\n\ud83d\udcd6 **[Full Configuration Guide \u2192](docs/CONFIGURATION.md)**\n\n---\n\n## Overseerr Integration\n\nPrunArr works seamlessly with Overseerr's \"Tag Requests\" feature:\n\n1. In Overseerr, go to **Settings** \u2192 **Radarr/Sonarr**\n2. Enable **\"Tag Requests\"**\n3. That's it! PrunArr will automatically track who requested what\n\nWhen users request content through Overseerr:\n- Tags are automatically created (e.g., `\"123 - john_doe\"`)\n- PrunArr matches usernames with Tautulli\n- Content is only removed when watched by the original requester\n\n\ud83d\udcd6 **[Tag System Guide \u2192](docs/TAG_SYSTEM.md#automatic-tags-with-overseerr-recommended)**\n\n---\n\n## Command Overview\n\n**Movies:**\n```bash\nprunarr movies list                      # List all movies\nprunarr movies remove --dry-run          # Preview removal\nprunarr movies remove --days-watched 60  # Remove watched movies\n```\n\n**Series:**\n```bash\nprunarr series list                      # List all series\nprunarr series get \"Breaking Bad\"        # Get detailed info\nprunarr series remove --days-watched 90  # Remove watched series\n```\n\n**History:**\n```bash\nprunarr history list --limit 20          # View watch history\n```\n\n**Streaming:**\n```bash\nprunarr providers list                   # List streaming providers\nprunarr providers check \"The Matrix\"     # Check availability\n```\n\n**Cache:**\n```bash\nprunarr cache init                       # Initialize cache\nprunarr cache status                     # View cache stats\n```\n\n\ud83d\udcd6 **[Complete Command Reference \u2192](docs/COMMANDS.md)**\n\n---\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Run tests (`make test`)\n5. Format code (`make format`)\n6. Commit (`git commit -m 'feat: add amazing feature'`)\n7. Push (`git push origin feature/amazing-feature`)\n8. Open a Pull Request\n\n### Development Setup\n\n```bash\ngit clone https://github.com/haijeploeg/prunarr\ncd prunarr\npython -m venv env\nsource env/bin/activate\npip install -e \".[dev]\"\n\n# Run tests\nmake test\n\n# Format code\nmake format\n\n# Run linting\nmake lint\n```\n\n---\n\n## Support\n\n- **Documentation**: [docs/](docs/)\n- **Issues**: [GitHub Issues](https://github.com/haijeploeg/prunarr/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/haijeploeg/prunarr/discussions)\n\n---\n\n## License\n\nApache-2.0 License - See [LICENSE](LICENSE) file for details.\n\n---\n\n## Links\n\n- **GitHub**: https://github.com/haijeploeg/prunarr\n- **PyPI**: https://pypi.org/project/prunarr/\n- **Issues**: https://github.com/haijeploeg/prunarr/issues\n\n---\n\n**Made with \u2764\ufe0f for the Plex/Jellyfin community**\n\n*PrunArr is not affiliated with Radarr, Sonarr, Tautulli, Overseerr, Plex, or Jellyfin.*\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Automated media library cleanup for Radarr and Sonarr based on Tautulli watch status",
    "version": "1.1.0",
    "project_urls": {
        "Bug Reports": "https://github.com/hploeg/prunarr/issues",
        "Documentation": "https://github.com/hploeg/prunarr#readme",
        "Homepage": "https://github.com/hploeg/prunarr",
        "Repository": "https://github.com/hploeg/prunarr"
    },
    "split_keywords": [
        "radarr",
        " sonarr",
        " tautulli",
        " media",
        " automation",
        " cleanup"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c6ff6a7938858cc1db90a139ab1c83de64e27b7a0b6db3d9262d384ee91d7d76",
                "md5": "4efa3db71e585142664f80dd045f39a4",
                "sha256": "93dd2a41fb744df00bd35b9a1cb74f0eac5161671799d1dae87e597f0c438d89"
            },
            "downloads": -1,
            "filename": "prunarr-1.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4efa3db71e585142664f80dd045f39a4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 120806,
            "upload_time": "2025-10-17T08:39:00",
            "upload_time_iso_8601": "2025-10-17T08:39:00.149473Z",
            "url": "https://files.pythonhosted.org/packages/c6/ff/6a7938858cc1db90a139ab1c83de64e27b7a0b6db3d9262d384ee91d7d76/prunarr-1.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1104130d34c336b925b6abcb16f8e29fe0285025b9d75705e96cc877c4c4a7cf",
                "md5": "7214ebf037ef668ccd3e27156a818d0b",
                "sha256": "d26b24bb381776987e78ee61e084ab07e4b4731ee0f99e8edc19b24549bd947d"
            },
            "downloads": -1,
            "filename": "prunarr-1.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "7214ebf037ef668ccd3e27156a818d0b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 102690,
            "upload_time": "2025-10-17T08:39:02",
            "upload_time_iso_8601": "2025-10-17T08:39:02.162159Z",
            "url": "https://files.pythonhosted.org/packages/11/04/130d34c336b925b6abcb16f8e29fe0285025b9d75705e96cc877c4c4a7cf/prunarr-1.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-17 08:39:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "hploeg",
    "github_project": "prunarr",
    "github_not_found": true,
    "lcname": "prunarr"
}
        
Elapsed time: 1.54930s