# nzbToMedia: on-demand post-processing for download clients

> nzbToMedia is a Python script that runs inside a download client and tells a media manager that a download has finished, so applications like Radarr, Sonarr and CouchPotato stop polling folders on a NAS. Its two selling points are efficiency on weak hardware and failed download handling, and its rough edge is that the packaged Windows builds are gone, so it runs from source now.

**clinton-hall/nzbToMedia** — Provides NZB and Torrent postprocessing To CouchPotatoServer, SickBeard/SickRage, HeadPhones, Mylar and Gamez

- Repository: https://github.com/clinton-hall/nzbToMedia
- Stars: 674 · Forks: 165
- Language: Python
- License: GPL-3.0
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/clinton-hall-nzbtomedia

## The problem is a media manager scanning a download folder

A PVR application, in the sense this project uses the term, needs to know when a download is ready for post-processing. There are two ways to arrange that, and the project's own long description in the manifest lays them out. Either an on-demand post-processing script runs once at the end of the download job in the downloader and notifies the PVR app that the download is complete, or the PVR app continuously polls the download folder for completed downloads. nzbToMedia is the on-demand script, and its origin explains the choice. It was modified from the SickBeard version to allow on-demand renaming and to stop the author's QNAP TS-412 NAS from constantly scanning the download directory. The audience is therefore quite specific: a self-hosted setup with SABnzbd or NZBGet on low performance hardware like a NAS, talking to CouchPotatoServer or SickBeard.

## Seven reasons on-demand beats polling

The manifest enumerates the reasons on-demand is superior, and the list is more convincing than a slogan because each item is a concrete failure mode of continuous scanning. The PVR app is notified only once, exactly when the download is ready. It does not have to wait for the next poll interval before it starts processing, which matters because a poll interval is dead time between the download finishing and the import starting. Continuous polling is less efficient and is more stressful on low performance hardware. Polling a folder for changes can prevent the drive from going to sleep, which on a NAS is both a noise problem and a power problem. Polling may also run into file access and permissions issues, and it may miss a folder change entirely, which leaves the PVR app waiting forever for a download that already arrived. The last reason is the one that makes the script more than a notification: an on-demand script can use additional functionality such as ffprobe media checking to test for corrupt files before handing anything over.

## One entry script per media manager

The mechanism of integration is a family of small entry scripts, one per target application, all living at the repository root. You can see them in the file list: nzbToMedia.py as the general entry, then nzbToCouchPotato.py, nzbToSickBeard.py, nzbToSiCKRAGE.py, nzbToRadarr.py, nzbToLidarr.py, nzbToReadarr.py, nzbToMylar.py, nzbToGamez.py, nzbToHeadPhones.py, nzbToLazyLibrarian.py, nzbToNzbDrone.py and nzbToWatcher3.py, plus TorrentToMedia.py for the torrent path. The naming tells you the coverage: television, music, books, comics and games all have a target, and the script for each one knows that application's API and its configuration file. The shared logic sits in the core/ and libs/ directories, so the per-application scripts are thin wrappers that map a shared post-processing run onto one product's expectations. The application-specific configuration, such as the autoProcessMedia config, is handled by a spec file, autoProcessMedia.cfg.spec, which describes the settings the script reads.

## Failed download handling depends on which fork you run

A later development added failed download handling, and this is the part of the project with the sharpest edges. Failed download handling is provided for SABnzbd by CouchPotatoServer, but the README notes that on arm processors, small NAS systems for instance, this can be unreliable. For SickBeard the feature requires Tolstyak's fork, and the configuration parameter fork is set to failed to use it, where the default is fork=default, which works with the standard version of SickBeard and simply ignores failed downloads. Development of Tolstyak's fork ended in 2013, so the feature rides on unmaintained code, and the README points at newer forks with significant updates, naming Mr-Orange TPB, which is discontinued, plus SickRageTV and SickRage, the latter marked active, with a wiki page listing known forks. Full support is claimed for SickChill, SiCKRAGE, Medusa and SickGear. The honest summary is that failed download handling is the feature most worth having and the one most likely to need a specific fork and a specific config value.

## Torrent extraction needs unpacking tools and ffmpeg

Torrent support was added with contributions from two developers, and it currently supports uTorrent, Transmission, Deluge and possibly more. The cost is a set of external binaries. On Windows you need 7-zip installed, and on unix-like systems the README lists the packages and commands needed:

```bash
	"unrar", "unzip", "tar", "7zr"
	note: "7zr" is available from the p7zip package. Available on Optware.
```

Separately, the transcoding option and the corrupt video checking need ffmpeg and ffprobe, with installation details in the wiki. That corrupt video checking is a concrete feature rather than a nicety, because a download that unpacks successfully can still contain a truncated or damaged media file, and detecting that with ffprobe before the media manager imports it avoids a broken import and a failed episode. The same ffmpeg dependency appears in the on-demand argument for using the script rather than polling, since a script that runs once at the right moment can afford to check the file properly, while a poller cannot afford to run ffprobe on every file it notices.

## Windows binaries are gone, so you run it from source

The installation section is blunt about the current state. Support of the compiled versions of this code has ceased, with the reason given as compiling this expanding code becoming very difficult and time-consuming, and the advice is that installing Python and running from source is not too complex, following the wiki instructions. The general instructions are short. Install Python, install pywin32, then clone or copy all the files into a directory wherever you want to keep them, for example a scripts directory in the home directory of your download client, and change the permissions so the download client can access the files. The clone command given is:

```bash
  `git clone git://github.com/clinton-hall/nzbToMedia.git`
```

Configuration is documented on the wiki, and the project asks in the README for configuration pages to be added to the wiki to help others. The repository supports that workflow with the usual development scaffolding, a tests/ directory and tox.ini for test environments, azure-pipelines.yml for continuous integration, and a .bumpversion.cfg for version bumps, plus cleanup.py and eol.py as helper scripts and getffmpeg.sh for fetching the transcoding tools.

## Where the versions and the licence stand

The version story is worth a look before you pin anything. The manifest declares version 12.1.14 and the licence as GPLv3, while the last tagged release listed is nzbToMedia v12.1.13 from 2024-04-26, preceded by 12.1.12 in July 2023 and 12.1.10 at the start of 2022. The manifest is therefore one patch ahead of the newest tag, which is the normal pattern of a project where the version bump lives in setup.py and the tag is cut separately, and the .bumpversion.cfg file at the root is the tool that keeps the two in step. The licence text is in license.txt, and the project describes itself as free software that any modification should lead back to the original repository through pull requests, with the founder listed as clinton-hall and a contributors page for everyone else. The default branch is master and the last push to it was on 2026-08-03, so work continues on the branch, while the release tags have not moved since 2024.

## Conclusion

nzbToMedia suits a home server setup where a download client, a NAS and one or more media managers already run, and where constant folder polling is the part that hurts. It is the wrong tool if you have no download client or no media manager yet, since it is glue between two existing things, and it is a poor fit for a Windows user who wants an installer, because compiled Windows support has been withdrawn. Before deploying, read the wiki page for failed download handling and check the fork parameter, since the default fork setting ignores failed downloads entirely and the fork that supports them is a third party one whose development ended in 2013.

## FAQ

### What does nzbToMedia actually do?

It provides NZB and torrent post-processing for CouchPotatoServer, SickBeard and its forks, HeadPhones, Mylar and Gamez, among others. It runs inside the download client and notifies the media application that a download has finished.

### Why is on-demand post-processing better than letting the media manager poll the folder?

The manifest lists the reasons: the application is notified once and exactly when the download is ready, it does not wait for the next poll interval, polling is less efficient and stresses low performance hardware, it can keep a drive from sleeping, it can hit permission and file access problems, and it can miss a change and leave the application waiting forever.

### What extra tools do I need for torrent support and transcoding?

For torrent extraction you need 7-zip on Windows, or unrar, unzip, tar and 7zr on unix-like systems. The transcoding option and corrupt video checking additionally need ffmpeg and ffprobe.

### Is there still a Windows executable of nzbToMedia?

No. Support of the compiled versions has ceased because compiling the code became very difficult and time-consuming. The project now expects you to install Python, install pywin32, clone or copy the files into a directory the download client can access, and run from source following the wiki instructions.

## Sources

- [clinton-hall/nzbToMedia on GitHub](https://github.com/clinton-hall/nzbToMedia)
- [Issues](https://github.com/clinton-hall/nzbToMedia/issues)
- [License: GPL-3.0](https://github.com/clinton-hall/nzbToMedia/blob/master/LICENSE)
- [README](https://github.com/clinton-hall/nzbToMedia/blob/master/README.md)
- [Releases](https://github.com/clinton-hall/nzbToMedia/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/clinton-hall-nzbtomedia
