Skip to main content

Rename movie folders and files with TMDB-sourced IMDB-style formatting

Project description

Media Renamer

A Python tool for renaming movie folders and files with proper IMDB-style formatting using The Movie Database (TMDB) API.

What it does

Media Renamer takes movie folders with inconsistent naming and renames them (and all files within) to a standardised format that includes IMDB identifiers. This is particularly useful for media server applications like Plex that benefit from consistent, metadata-rich file naming.

Example transformation

Before:

Beverly Hills Cop Axel F (2024)/
├── Beverly Hills Cop Axel F (2024).mkv
├── Beverly Hills Cop Axel F (2024).1208527.srt
├── Beverly Hills Cop Axel F (2024).1208528.srt
└── Beverly Hills Cop Axel F (2024).1208529.srt

After:

Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016}/
├── Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016}.mkv
├── Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016}.1208527.srt
├── Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016}.1208528.srt
└── Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016}.1208529.srt

Features

  • Interactive search: Presents multiple options from TMDB with cast information
  • Fuzzy folder name parsing: Handles torrent-style names with quality/codec tags and group identifiers (e.g. Aniara (2019) (1080p BluRay x265 HEVC 10bit DTS 5.1 Qman) [UTR])
  • Tolerant year matching: Year is used as a soft ranking signal rather than a hard filter — results for the right film ranked by year proximity, so an off-by-one label won't discard correct matches
  • Intelligent filename sanitisation: Replaces problematic characters (: becomes --, / becomes or, etc.)
  • Comprehensive renaming: Renames both folders and all files within them
  • Flexible input: Accepts custom rename strings or skips items entirely
  • Safe operation: Checks for existing target folders to prevent conflicts
  • Comprehensive test suite: Includes pytest-based tests with mocked API calls

Installation

Via pipx (recommended)

pipx install media-renamer

Then save your TMDB API key:

media-renamer --set-api-key your_api_key_here

This writes the key to ~/.media-renamer.conf and you're ready to go. As a fallback, the TMDB_API_KEY environment variable is also accepted.

From source

  1. Clone the repository:

    git clone <repository-url>
    cd media-renamer
    
  2. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  3. Install dependencies:

    pip install -r requirements.txt
    
  4. Make scripts executable:

    chmod +x media-renamer
    chmod +x replace-structure
    

Setup

Get a TMDB API Key

  1. Create a free account at The Movie Database
  2. Go to API Settings and request an API key
  3. Save it:
    media-renamer --set-api-key your_api_key_here
    
    This writes the key to ~/.media-renamer.conf.

Usage

Basic usage

./media-renamer <folder_pattern>

Examples

Rename all movie folders in current directory:

./media-renamer "*"

Rename specific folders:

./media-renamer "Beverly Hills Cop*" "Bridget Jones*"

Supported folder name formats

The tool handles a range of naming conventions:

Format Example
Clean with year Beverly Hills Cop Axel F (2024)
Torrent with quality/group tags Aniara (2019) (1080p BluRay x265 HEVC 10bit DTS 5.1 Qman) [UTR]
Underscore separators The_Dark_Knight_(2008)
No year Some Movie [YTS]

Year mismatches of one or two years are tolerated — the correct film will still appear in the results, ranked by proximity to the folder's year.

Interactive process

When you run the tool, it will:

  1. Parse each folder name to extract title and year (stripping torrent noise)

  2. Search TMDB for matching movies, ranked by year proximity

  3. Present up to 3 options with cast information:

    Looking up Beverly Hills Cop Axel F (2024)...
    1) Beverly Hills Cop -- Axel F (2024) {imdb-tt3083016} (Beverly Hills Cop: Axel F; 2024; Eddie Murphy, Joseph Gordon-Levitt, Taylour Paige)
    2) Beverly Hills Cop -- Axel F (2024) {imdb-tt8874500} (Beverly Hills Cop: Axel F; 2024; Behind the Scenes)
    3) Beverly Hills Cop -- Axel F (2024) {imdb-tt9876543} (Beverly Hills Cop: Axel F; 2024; Documentary)
    Choose 1-3, or enter a new rename string, or nothing to skip:
    >
    
  4. You can:

    • Enter a number (1-3) to select one of the options
    • Type a custom rename string
    • Press Enter to skip this folder

Filename formatting rules

The tool follows these character replacement rules for safe filenames:

Character Replacement Reason
: -- Subtitle separator
/ or Alternative indicator
\ or Alternative indicator
<> () Bracket substitution
" ' Quote substitution
| , List separator
? ! Question to exclamation
* x Wildcard to letter

Testing

The project includes a comprehensive test suite using pytest.

Run tests

python test_media_renamer.py

Create test data

Use the included replace-structure script to create a test directory structure:

./replace-structure /path/to/your/movies ./test-data

This creates a copy of your directory structure with empty files, perfect for testing without risking your actual media files.

Test coverage

The test suite covers:

  • Folder name parsing
  • Filename sanitisation
  • Movie name formatting
  • TMDB API integration (mocked)
  • Complete renaming workflows
  • Edge cases and error handling

File structure

media-renamer/
├── media-renamer           # Main script
├── replace-structure       # Test data generator
├── test_media_renamer.py   # Test suite
├── requirements.txt        # Python dependencies
├── .env                    # API key (create this)
├── .gitignore             # Git ignore file
└── README.md              # This file

Requirements

  • Python 3.7+
  • requests - For TMDB API calls
  • python-dotenv - For environment variable management
  • pytest - For running tests
  • pytest-mock - For test mocking

Compatibility

This tool is designed to work with:

  • Plex Media Server - The naming format is optimised for Plex's metadata agents
  • Other media servers - The standardised format should work with most media management tools
  • General file organisation - Useful for anyone wanting consistent movie file naming

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run the test suite
  5. Submit a pull request

Acknowledgements

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

media_renamer-1.1.0.tar.gz (7.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

media_renamer-1.1.0-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file media_renamer-1.1.0.tar.gz.

File metadata

  • Download URL: media_renamer-1.1.0.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for media_renamer-1.1.0.tar.gz
Algorithm Hash digest
SHA256 76d7f2c65391a19318e4536c0f9feb6d23b2f8fc59ed6d05ae53f717a62208cd
MD5 6693c468d76a0d80dcb2297ee116eef0
BLAKE2b-256 12173c86754056e37300b04bfbb7a238e6ea89b5986b717ea8c0280c8f267e2a

See more details on using hashes here.

File details

Details for the file media_renamer-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: media_renamer-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.13

File hashes

Hashes for media_renamer-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 32be810179adead5b0c5580322704545fae3ec5f78034a64a13d56f895004c15
MD5 3e3fc33b9109157076126c4ae668658e
BLAKE2b-256 8e2463bdfcaeb3fbc86ecfd2e0e66e4503a65e683141284995dc05960d84aeef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page