PHPackages                             martincamen/laravel-radarr - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. martincamen/laravel-radarr

ActiveLibrary[API Development](/categories/api)

martincamen/laravel-radarr
==========================

Laravel integration for Radarr PHP SDK

0.1.4(3mo ago)04MITPHPPHP ^8.3

Since Jan 4Pushed 3mo agoCompare

[ Source](https://github.com/MartinCamen/laravel-radarr)[ Packagist](https://packagist.org/packages/martincamen/laravel-radarr)[ Docs](https://github.com/martincamen/laravel-radarr)[ RSS](/packages/martincamen-laravel-radarr/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (5)Dependencies (11)Versions (6)Used By (0)

Laravel Radarr
==============

[](#laravel-radarr)

Laravel integration for the [Radarr PHP SDK](https://github.com/martincamen/radarr-php), providing a seamless experience for interacting with Radarr using unified domain models from [php-arr-core](https://github.com/martincamen/php-arr-core).

Important

This project is still being developed and breaking changes might occur even between patch versions.

The aim is to follow semantic versioning as soon as possible.

Ecosystem
---------

[](#ecosystem)

PackageDescription[radarr-php](https://github.com/martincamen/radarr-php)PHP SDK for Radarr[sonarr-php](https://github.com/martincamen/sonarr-php)PHP SDK for Sonarr[jellyseerr-php](https://github.com/martincamen/jellyseerr-php)PHP SDK for Jellyseerr[laravel-radarr](https://github.com/martincamen/laravel-radarr)Laravel integration for Radarr[laravel-sonarr](https://github.com/martincamen/laravel-sonarr)Laravel integration for Sonarr[laravel-jellyseerr](https://github.com/martincamen/laravel-jellyseerr)Laravel integration for JellyseerrFeatures
--------

[](#features)

- Unified API using canonical domain models from `php-arr-core`
- Type-safe interactions with Radarr
- Laravel facade with full IDE autocompletion
- Testing utilities for mocking responses
- Automatic service discovery via Laravel's package auto-discovery

Requirements
------------

[](#requirements)

- PHP 8.3+
- Laravel 10.0+, 11.0+ or 12.0+

Installation
------------

[](#installation)

```
composer require martincamen/laravel-radarr
```

The package will auto-register its service provider in Laravel.

Configuration
-------------

[](#configuration)

Publish the configuration file:

```
php artisan vendor:publish --provider="MartinCamen\LaravelRadarr\RadarrServiceProvider"
```

Add the following environment variables to your `.env` file:

```
RADARR_HOST=localhost
RADARR_PORT=7878
RADARR_API_KEY=your-api-key
RADARR_USE_HTTPS=false
RADARR_TIMEOUT=30
RADARR_URL_BASE=
```

### Configuration Options

[](#configuration-options)

OptionDescriptionDefault`RADARR_HOST`Hostname or IP address of your Radarr server`localhost``RADARR_PORT`Port number for your Radarr server`7878``RADARR_API_KEY`Your Radarr API key (Settings &gt; General &gt; Security)-`RADARR_USE_HTTPS`Use HTTPS for connections`false``RADARR_TIMEOUT`Request timeout in seconds`30``RADARR_URL_BASE`URL base for reverse proxy subpaths (e.g., `/radarr`)-Usage
-----

[](#usage)

### Using the Facade

[](#using-the-facade)

The `Radarr` facade provides access to the SDK client via an action-based API:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;

// Get all active downloads
$downloads = Radarr::downloads()->all();

// Get all movies
$movies = Radarr::movies()->all();

// Get a specific movie by ID
$movie = Radarr::movies()->find(1);

// Get system information
$status = Radarr::system()->status();
```

### Dependency Injection

[](#dependency-injection)

You can also inject `Radarr` directly:

```
use MartinCamen\Radarr\Radarr;

class MovieController
{
    public function __construct(private Radarr $radarr) {}

    public function index()
    {
        return view('movies.index', ['movies' => $this->radarr->movies()->all()]);
    }
}
```

Working with Downloads
----------------------

[](#working-with-downloads)

The `downloads()->all()` method returns a `DownloadPage` containing all active downloads:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;
use MartinCamen\Radarr\Data\Responses\DownloadPage;

/** @var DownloadPage $downloadPage */
$downloadPage = Radarr::downloads()->all();

// Check if there are any downloads
echo "Active downloads: {$downloadPage->totalRecords}";

// Iterate over downloads
foreach ($downloadPage as $download) {
    echo $download->title;
    echo $download->status->value;
    echo $download->sizeleft;
}

// Get a specific download
$download = Radarr::downloads()->find(1);

// Get download status summary
$status = Radarr::downloads()->status();
echo "Total: {$status->totalCount}";
echo "Unknown: {$status->unknownCount}";

// Delete a download
Radarr::downloads()->delete(1);

// Bulk delete downloads
Radarr::downloads()->bulkDelete([1, 2, 3]);
```

Working with Movies
-------------------

[](#working-with-movies)

The `movies()->all()` method returns a `MovieCollection`:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;
use MartinCamen\Radarr\Data\Responses\Movie;
use MartinCamen\Radarr\Data\Responses\MovieCollection;

// Get all movies
/** @var MovieCollection $movies */
$movies = Radarr::movies()->all();

foreach ($movies as $movie) {
    echo "{$movie->title} ({$movie->year})";
    echo $movie->status->value;
    echo $movie->monitored ? 'Monitored' : 'Not monitored';
}

// Get a specific movie by ID
$movie = Radarr::movies()->find(1);
echo $movie->title;

// Search for movies
$results = Radarr::movies()->search('Inception');

// Search by external IDs
$movie = Radarr::movies()->searchByTmdb(27205);
$movie = Radarr::movies()->searchByImdb('tt1375666');

// Add a new movie
$movie = Radarr::movies()->add([
    'title'            => 'Inception',
    'tmdbId'           => 27205,
    'qualityProfileId' => 1,
    'rootFolderPath'   => '/movies/',
]);

// Update a movie
$movie = Radarr::movies()->update(1, ['monitored' => false]);

// Delete a movie
Radarr::movies()->delete(1);
```

System
------

[](#system)

```
use MartinCamen\LaravelRadarr\Facades\Radarr;

// Get system status
$status = Radarr::system()->status();
echo $status->version;
echo $status->osName;

// Get system health
$health = Radarr::system()->health();
foreach ($health->warnings() as $warning) {
    echo $warning->type . ': ' . $warning->message;
}

// Get disk space information
$diskSpace = Radarr::system()->diskSpace();
foreach ($diskSpace as $disk) {
    echo $disk->path . ': ' . $disk->freeSpace;
}

// Get system tasks
$tasks = Radarr::system()->tasks();
$task = Radarr::system()->task(1);

// Get available backups
$backups = Radarr::system()->backups();
```

Response Types
--------------

[](#response-types)

All responses use typed DTOs from the SDK:

TypeDescription`MovieCollection`Collection of movies`Movie`Individual movie with metadata`DownloadPage`Paginated downloads`Download`Individual download item`SystemStatus`System status information`HealthCheckCollection`Collection of health checks`DiskSpaceCollection`Collection of disk space infoTesting
-------

[](#testing)

### Using the Fake

[](#using-the-fake)

The package provides `RadarrFake` for testing:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;

class MovieTest extends TestCase
{
    public function testDisplaysDownloads(): void
    {
        // Create a fake instance
        $fake = Radarr::fake();

        // Make request
        $response = $this->get('/downloads');

        // Assert the method was called
        $fake->assertCalled('downloads');
        $response->assertOk();
    }

    public function testGetsAllMovies(): void
    {
        $fake = Radarr::fake();

        // Make request that calls movies()->all()
        $this->get('/movies');

        // Assert called
        $fake->assertCalled('movies');
    }

    public function testNothingWasCalled(): void
    {
        $fake = Radarr::fake();

        // No API calls made
        $this->get('/about');

        $fake->assertNothingCalled();
    }
}
```

### Custom Responses

[](#custom-responses)

You can provide custom responses to the fake:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;
use MartinCamen\Radarr\Testing\Factories\DownloadFactory;
use MartinCamen\Radarr\Testing\Factories\MovieFactory;
use MartinCamen\Radarr\Testing\Factories\SystemStatusFactory;

public function testWithCustomMovies(): void
{
    Radarr::fake([
        'movies' => MovieFactory::makeMany(10),
    ]);

    $response = $this->get('/movies');

    $response->assertOk();
    $response->assertViewHas('movies');
}

public function testWithCustomDownloads(): void
{
    Radarr::fake([
        'downloads' => [
            'page'         => 1,
            'pageSize'     => 10,
            'totalRecords' => 2,
            'records'      => DownloadFactory::makeMany(2),
        ],
    ]);

    $response = $this->get('/downloads');

    $response->assertOk();
}

public function testWithCustomSystemStatus(): void
{
    Radarr::fake([
        'systemSummary'     => SystemStatusFactory::make([
            'version'      => '5.0.0.0',
            'isProduction' => true,
        ]),
    ]);

    $response = $this->get('/system');

    $response->assertSee('5.0.0.0');
}
```

### Assertion Methods

[](#assertion-methods)

The fake provides several assertion methods:

```
use MartinCamen\LaravelRadarr\Facades\Radarr;

$fake = Radarr::fake();

// Assert a method was called
$fake->assertCalled('downloads');

// Assert a method was not called
$fake->assertNotCalled('movies');

// Assert a method was called with specific parameters
$fake->assertCalledWith('movie', ['id' => 5]);

// Assert a method was called a specific number of times
$fake->assertCalledTimes('downloads', 3);

// Assert nothing was called
$fake->assertNothingCalled();

// Get all recorded calls
$calls = $fake->getCalls();
```

Example: Building a Dashboard
-----------------------------

[](#example-building-a-dashboard)

```
use MartinCamen\LaravelRadarr\Facades\Radarr;

class DashboardController extends Controller
{
    public function index()
    {
        // Get system status
        $status = Radarr::system()->status();
        $health = Radarr::system()->health();

        // Get active downloads
        $downloads = Radarr::downloads()->all();

        // Get all movies
        $movies = Radarr::movies()->all();

        return view('dashboard', [
            'version'       => $status->version,
            'isHealthy'     => $health->isEmpty(),
            'downloads'     => $downloads,
            'downloadCount' => $downloads->totalRecords,
            'movieCount'    => count($movies),
        ]);
    }
}
```

Error Handling
--------------

[](#error-handling)

```
use MartinCamen\LaravelRadarr\Facades\Radarr;
use MartinCamen\ArrCore\Exceptions\AuthenticationException;
use MartinCamen\ArrCore\Exceptions\ConnectionException;
use MartinCamen\ArrCore\Exceptions\NotFoundException;

try {
    $movie = Radarr::movies()->find(999);
} catch (AuthenticationException $e) {
    // Invalid API key
    return back()->with('error', 'Invalid Radarr API key');
} catch (NotFoundException $e) {
    // Movie not found
    abort(404, 'Movie not found');
} catch (ConnectionException $e) {
    // Connection error
    logger()->error('Could not connect to Radarr: ' . $e->getMessage());

    return back()->with('error', 'Radarr server unavailable');
}
```

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Credits
-------

[](#credits)

Built on top of the [Radarr PHP SDK](https://github.com/martincamen/radarr-php) and [php-arr-core](https://github.com/martincamen/php-arr-core).

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance79

Regular maintenance activity

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Total

5

Last Release

112d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/8720813?v=4)[Martin Camen](/maintainers/MartinCamen)[@MartinCamen](https://github.com/MartinCamen)

---

Top Contributors

[![MartinCamen](https://avatars.githubusercontent.com/u/8720813?v=4)](https://github.com/MartinCamen "MartinCamen (10 commits)")

---

Tags

apilaravelsdkmoviesmedia-serverradarr

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/martincamen-laravel-radarr/health.svg)

```
[![Health](https://phpackages.com/badges/martincamen-laravel-radarr/health.svg)](https://phpackages.com/packages/martincamen-laravel-radarr)
```

###  Alternatives

[resend/resend-laravel

Resend for Laravel

1191.4M6](/packages/resend-resend-laravel)[essa/api-tool-kit

set of tools to build an api with laravel

52680.5k](/packages/essa-api-tool-kit)[missael-anda/laravel-whatsapp

A Whatsapp Business Cloud API wrapper for Laravel.

677.5k](/packages/missael-anda-laravel-whatsapp)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
