2026-08-30, 08:01 AM
Hi everyone,
I wanted to share a small side project I've been building: movie_renamer.py and series_renamer.py, two Python CLI scripts that rename a movie/TV library to Jellyfin's naming scheme (Title (Year) [imdbid-tt...] / Series (Year) [tvdbid-...], with Season NN folders and SxxEyy episode files).
GitHub: [Jellyfin Movie Renamer]
What it does
This script renames and moves files in place. While it defaults to dry-run, includes an undo log, and tries hard to avoid collisions, there are edge cases where a file could be overwritten or a folder deleted (e.g. the optional Kodi-leftover/release-junk cleanup, which is not undoable, or a naming collision in an unusual folder layout). Always keep a backup before your first --apply run, and review the dry-run output carefully first.
If you want to try it completely risk-free before pointing it at your real library, the repo includes create_dummy_structure.py – it mirrors an existing folder structure into a separate location but creates only empty placeholder files, so you can safely test the renaming logic on a realistic-looking dummy copy of your library without touching a single real media file.
Why another tool, when FileBot / TinyMediaManager / *arr already exist?
Fair question, and I want to be upfront about it: yes, more capable tools already exist, and if you need a full media-management suite with a UI, automatic downloads, or ongoing library monitoring, those are probably the better fit. This isn't trying to compete with them.
I built this because I specifically wanted something minimal: a couple of readable Python files I can run by hand (or via cron) when I feel like it, that only do renaming and nothing else, with no background service and no moving parts I don't understand. If that's also what you're after, it might be useful to you too.
Heads-up: this is a hobby project
This is a personal project I built for my own library and I'm sharing it as-is. It works well for my use case and has been tested reasonably thoroughly, but I can't promise ongoing support or fast turnaround on requests. Use it at your own risk, always keep backups, and start with the dry-run (and ideally create_dummy_structure.py) before ever touching --apply on real data.
Bugs and issues: please report them via GitHub Issues on the repo linked above rather than in comments here – much easier for me to track.
Feedback, PRs, and "this broke on my weird edge case" reports are all welcome. Thanks for reading!
This project was built with heavy use of AI coding assistance (Claude), which I'm mentioning for transparency since the code style/comments may reflect that.
Best regards
BoKu
I wanted to share a small side project I've been building: movie_renamer.py and series_renamer.py, two Python CLI scripts that rename a movie/TV library to Jellyfin's naming scheme (Title (Year) [imdbid-tt...] / Series (Year) [tvdbid-...], with Season NN folders and SxxEyy episode files).
GitHub: [Jellyfin Movie Renamer]
What it does
- Movies via OMDb → TMDB → IMDB, TV series via TheTVDB (Jellyfin's own recommended source for shows)
- Dry-run by default – nothing changes until you pass --apply
- Full undo log for every run (a plain bash script that reverses every rename)
- Batch processing with persistent per-directory progress, so you can work through a huge library a chunk at a time
- Cleans up scene/P2P release junk and old Kodi/XBMC leftover folders (both off by default, opt-in)
- Handles subtitles, multiple cuts/editions ("Directors Cut", etc.), and season-folder name normalization
- Everything self-contained in the project folder – no database, no daemon, no install beyond pip install requests
This script renames and moves files in place. While it defaults to dry-run, includes an undo log, and tries hard to avoid collisions, there are edge cases where a file could be overwritten or a folder deleted (e.g. the optional Kodi-leftover/release-junk cleanup, which is not undoable, or a naming collision in an unusual folder layout). Always keep a backup before your first --apply run, and review the dry-run output carefully first.
If you want to try it completely risk-free before pointing it at your real library, the repo includes create_dummy_structure.py – it mirrors an existing folder structure into a separate location but creates only empty placeholder files, so you can safely test the renaming logic on a realistic-looking dummy copy of your library without touching a single real media file.
Why another tool, when FileBot / TinyMediaManager / *arr already exist?
Fair question, and I want to be upfront about it: yes, more capable tools already exist, and if you need a full media-management suite with a UI, automatic downloads, or ongoing library monitoring, those are probably the better fit. This isn't trying to compete with them.
I built this because I specifically wanted something minimal: a couple of readable Python files I can run by hand (or via cron) when I feel like it, that only do renaming and nothing else, with no background service and no moving parts I don't understand. If that's also what you're after, it might be useful to you too.
Heads-up: this is a hobby project
This is a personal project I built for my own library and I'm sharing it as-is. It works well for my use case and has been tested reasonably thoroughly, but I can't promise ongoing support or fast turnaround on requests. Use it at your own risk, always keep backups, and start with the dry-run (and ideally create_dummy_structure.py) before ever touching --apply on real data.
Bugs and issues: please report them via GitHub Issues on the repo linked above rather than in comments here – much easier for me to track.
Feedback, PRs, and "this broke on my weird edge case" reports are all welcome. Thanks for reading!
This project was built with heavy use of AI coding assistance (Claude), which I'm mentioning for transparency since the code style/comments may reflect that.
Best regards
BoKu

