A small CLI tool to shift season and episode numbers of TV episode files based on configurable offsets.
Project description
Seasonal Shift
A small CLI tool to shift season and episode numbers of TV episode files based on configurable offsets.
This is useful when episodes are downloaded with incorrect season numbering and need to be renamed and moved to the correct season folders.
The tool:
- Renames episode files
- Moves them to the correct season directory
- Shows a preview before applying changes
- Detects rename collisions
- Supports undoing the latest change
- Cleans up empty folders
Features
- Configurable season and episode offsets
- Preview changes before applying
- Collision detection
- Duplicate destination detection
- Undo support
- Automatic cleanup of empty season folders
- Uses XDG directories for config and state
- Written with Typer, Rich, and Pydantic
Installation
Install with pip:
pip install seasonal-shift
Configuration
By default the tool reads the config from:
~/.config/seasonal-shift/config.yaml
(or $XDG_CONFIG_HOME/seasonal-shift/config.yaml)
Example configuration:
shows:
- name: Breaking Bad
path: /media/shows/Breaking Bad
seasons:
1:
season_offset: 2
episode_offset: 0
2:
season_offset: 2
episode_offset: 0
Meaning:
Season 1 → Season 3
Season 2 → Season 4
Episode numbering can also be shifted.
Directory Structure
Expected show layout:
Show Name/
Season 1/
Show Name - S01E01 - Episode Title.mkv
Season 2/
Show Name - S02E01 - Episode Title.mkv
Files must already follow a SxxExx naming pattern.
Usage
Preview and apply changes
seasonal-shift run
The tool will:
- Show a preview of planned renames
- Ask for confirmation
- Rename and move files
- Save an undo file
Use a custom config
seasonal-shift run --config my-config.yaml
Undo the latest change
seasonal-shift undo
Undo files are stored in:
~/.local/state/seasonal-shift/
You can also undo a specific operation:
seasonal-shift undo undo-20260310-032201.json
Run diagnostics
seasonal-shift doctor
This checks:
- Config validity
- Show paths
- Episode detection
- Potential rename collisions
No changes are made.
Example Preview
Breaking Bad
------------
Season 1 → 3
Breaking Bad - S01E01 - Pilot.mkv
→ Breaking Bad - S03E01 - Pilot.mkv
Breaking Bad - S01E02 - Cat's in the Bag.mkv
→ Breaking Bad - S03E02 - Cat's in the Bag.mkv
Undo System
Every run creates an undo file:
~/.local/state/seasonal-shift/undo-YYYYMMDD-HHMMSS.json
This allows reverting renames even after files are moved.
Requirements
- Python 3.11+
- typer
- rich
- pydantic
- pyyaml
License
MIT License.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file seasonal_shift-1.1.1.tar.gz.
File metadata
- Download URL: seasonal_shift-1.1.1.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.2 Linux/6.18.6-arch1-1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59b53b07b5bf64e10070ef8f9cc880995f6b0e30e39a5f6dbe5a32dca4704238
|
|
| MD5 |
50217dc5bb919ee6cde5f3b5c92f3258
|
|
| BLAKE2b-256 |
2027f3db653f1258281d0f2e80ef3cda6a9ab184b0e7f253c5187c5ac1f1ba8d
|
File details
Details for the file seasonal_shift-1.1.1-py3-none-any.whl.
File metadata
- Download URL: seasonal_shift-1.1.1-py3-none-any.whl
- Upload date:
- Size: 15.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.2 Linux/6.18.6-arch1-1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bcf96cda8e5de6bc36cf0e289f0c34af3d16ddf805c5719d39e4ef7c99a6f2f0
|
|
| MD5 |
041ca62acb8a9b46beddc828fa8ed9b3
|
|
| BLAKE2b-256 |
64cae9b9a33bd68053e70bf2d16b27444074fcc07a04b823ab7feaa92bda702c
|