How to Prevent Duplicate Jobs or Imports in Jellyfin

Eva Wong is the Technical Writer and resident tinkerer at ZimaSpace. A lifelong geek with a passion for homelabs and open-source software, she specializes in translating complex technical concepts into accessible, hands-on guides. Eva believes that self-hosting should be fun, not intimidating. Through her tutorials, she empowers the community to demystify hardware setups, from building their first NAS to mastering Docker containers.

Prevent duplicate Jellyfin jobs and imports by giving each operation one scheduler, one writer, one watched path, and one completion signal.

Are scans, imports, or metadata jobs duplicated after a restart, container recreation, or a new automation? Record the task name, start time, container ID, scheduler, watched directory, and output before disabling anything. The safe fix removes overlapping ownership rather than hiding a duplicate entry.

Find every scheduler that can start the same work

Check Jellyfin scheduled tasks, container restart hooks, host cron or systemd timers, download-manager post-processing, and any sidecar that calls the API. Compare timestamps and process IDs for two runs. If both tasks start at the same event, disable the secondary trigger and leave the primary task unchanged.

Jellyfin tasks can run periodically or manually, and startup tasks may execute before a network share is ready (task timing reference). Treat mount readiness as a prerequisite instead of allowing a second import to compensate.

Check whether the duplicate appears after startup, a webhook, or a manual retry. The trigger narrows the owner that must be disabled; turning off every scheduled task hides the cause without preventing recurrence.

Give each path one writer and one stable identity

Ensure only one downloader or importer moves files into the library, and ensure every container sees the same canonical path. Two containers with different mappings can import the same file as two identities. Compare inode, checksum, path, and ownership for one duplicate pair before deleting anything.

If the source file is renamed or reformatted, Jellyfin may see a new item rather than an update. Complete a controlled move, scan once, and verify the expected item count before re-enabling automation.

Compare the live container labels and watched paths, not only the configuration file on disk. An old container can keep an obsolete watcher active after a new deployment.

Validate prevention under restart and retry

After changing one trigger, restart the stack and let the scheduled window occur once. Confirm one process, one import event, one database change, and one final file. Then repeat a failed or interrupted run to verify the retry does not launch a second copy.

Escalate when duplicates persist with one scheduler and one path, the database contains conflicting identities, or a plugin repeatedly recreates tasks. Keep the original media and database backup until the cleanup and prevention test pass.

After removing the secondary writer, run one normal import and one interrupted retry. The expected result is one database event and one final file for each source item.

Confirm the Prevention Rule After Restart

Restart the stack and wait through one scheduled window with only the chosen scheduler enabled. Record the process, path, and database event so the ownership boundary is observable.

Keep the configuration when a retry does not launch a second import and the library contains one valid item. Re-enable one automation at a time if another service is required.

Escalate when duplicates return with one writer, when the database contains conflicting identities, or when a plugin recreates disabled tasks.

Support & Tips

More to Read

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.