Skip to content
Conduit

skill

media-manager-skill

Media library naming scanner & organizer — deep scan, old→new preview, rename/move. Local, cloud drives, or any NAS (ZSpace, Synology, QNAP, UGREEN, TerraMaster, TrueNAS...). Chinese (cn) & English/Pl

skyzhao1223/media-manager-skillcommunitylistedunreviewed

Set up

Skills are installed by placing their folder where your agent loads skills.

The download comes from github.com/skyzhao1223/media-manager-skill itself, not from our server, so what you get is exactly what its author published.

Install instructions come from the README

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 25, 2026

media-manager-skill

English · 简体中文

PyPI - Version CI

Media library naming scanner & organizer — deep scan + old→new preview + rename/move. Works on local disks, cloud drives, and any NAS — ZSpace, Synology, QNAP, UGREEN, TerraMaster, ASUSTOR, WD My Cloud, Lenovo, Hikvision, TrueNAS, Unraid, OpenMediaVault, and more. Built for a global audience: Chinese (cn) and English/Plex (plex) naming conventions, localized output, and configurable library folders.

Naming conventions live in media-naming-guide. The core is pure Python and backend-agnostic; NAS access goes through adapters (e.g. ZSpace via zspace-cli).


Supported scenarios

ScenarioSourceNotes
Local media library--source local (default)Pure Python, zero deps
ZSpace NAS--source zspaceReuses the desktop client login via zspace-cli
Other NASmount + localSynology, QNAP, UGREEN, TerraMaster, ASUSTOR, WD My Cloud, Lenovo, Hikvision, TrueNAS, Unraid, OMV… — mount as a local folder, then use --source local
Cloud drivesmount + localrclone / WebDAV mounts work with --source local

Anything that can be listed as {path, name, is_dir} works with the scanner. Mounting as a local folder is the simplest integration.

Naming convention profiles

Pick the ruleset that matches your library:

ProfileDescriptionDefault folders
cn (default)Chinese conventions: Chinese Title English Name (Year) [Quality], censorship-evasion & site-watermark checks电影 / 剧集
plexEnglish/Plex conventions: Name (Year), Season 01/, S01E01Movies / TV Shows

Folders are configurable — use --movie-zone / --series-zone to match your own layout. The cn profile defaults to 电影 and 剧集; the plex profile defaults to Movies and TV Shows.

Install

Requires Python 3.9+ (3.9–3.13 tested).

pip install media-manager-skill            # local mode, zero deps
pip install "media-manager-skill[zspace]"  # ZSpace mode (bundles zspace-cli)

# CLI entry point
mm-scan --source local /path/to/library

No install needed to try it: python scripts/scan.py --source local /path/to/library (this repo ships the full implementation).

Quick start

# Chinese library (default profile cn, folders 电影/剧集)
mm-scan /path/to/library

# English / Plex library
mm-scan --profile plex ~/Movies

# ZSpace NAS
zs check
mm-scan --source zspace /path/to/library

# English output (auto-detected from locale if not set)
mm-scan --lang en /path/to/library

# JSON output (machine-readable problem codes)
mm-scan --json /path/to/library > /tmp/issues.json

# old→new rename suggestions
mm-scan --preview /path/to/library

# Custom folder names
mm-scan --profile plex --movie-zone Films --series-zone Shows ~/Videos

CLI options

OptionMeaning
rootScan root (required for --source local)
--source {local,zspace}Data source; default local
--profile {cn,plex}Naming conventions; default cn
--movie-zone NAMEMovie root folder name (default from profile)
--series-zone NAMESeries root folder name (default from profile)
--lang {auto,zh,en}Output language; auto reads LC_ALL/LANG
--jsonEmit JSON to stdout
--previewShow old→new rename suggestions

What it does

  • Deep-scans a media library (movies / series) against the selected naming convention
  • Detects: invalid folder/file names, watermarks/site tags, censorship-evasion characters (cn), placeholders, folder/file name mismatches, PT/Scene raw names, duplicates
  • Outputs an old→new preview (--preview) before you rename/move in bulk
  • JSON output uses stable problem codes (see below); CLI/terminal output is localized
  • Pluggable sources: local filesystem (default) or ZSpace NAS (--source zspace)

Problem codes (JSON contract)

--json emits a list of issues. Each item: {path, name, is_dir, problems, new_name} where problems is a list of stable machine-readable codes (they never change across locales):

CodeMeaningcnplex
MOVIE_FOLDER_NAMEMovie folder name invalid✓✓
COLLECTION_FOLDERCollection folder; split into single movies✓—
MOVIE_VIDEO_MISMATCHMovie video name ≠ folder name✓✓
MOVIE_LOOSE_FILELoose movie file in the movie root✓✓
SERIES_FOLDER_NAMESeries folder name invalid✓—
SERIES_VIDEO_NAMESeries episode file name invalid✓✓
SERIES_SEASON_FOLDERSeason folder not Season NN—✓
BLACKLIST_CHARCensorship-evasion character (full-width bars 丨|)✓—
LETTER_SUBLetter-for-Chinese substitution✓—
WATERMARKWatermark / site tag✓✓
PLACEHOLDERPlaceholder English name✓✓
JUNK_FILEJunk file (delete it)✓✓
DOWNLOAD_RESIDUEDownload residue (.bt.td)✓✓
PT_SCENE_NAMEPT/Scene raw naming✓✓
FORMAT_RESIDUEFormat-conversion residue✓✓
DUPLICATEPossible duplicate title (see dupe_count)✓✓

For human-readable text, map codes through PROBLEM_MESSAGES[code][lang] (exported by the package) or just run the CLI without --json.

Pairing with other tools

Use before Jellyfin / Emby / MoviePilot / nas-tools / ZSpace media ingesting or scraping to surface naming problems in one pass. See docs/integrations.md.

As an Agent Skill

cp -r SKILL.md scripts ~/your-project/skills/media-manager/

Then ask your agent: "scan naming issues in ~/Movies" (local/plex) or "scan naming issues in /path/to/library" (ZSpace).

Repository layout

media-manager-skill/
├── SKILL.md          # Agent skill entry (workflow + gotchas)
├── scripts/
│   └── scan.py       # Thin wrapper (same core, runnable without install)
├── src/
│   └── media_manager_skill/
│       ├── scan.py   # Core implementation (profiles, i18n, CLI)
│       └── __init__.py
├── tests/            # pytest suite (cn + plex + i18n)
└── docs/
    └── integrations.md

How it works & limitations

  • Core validation is pure Python (regex + rules), backend-agnostic — local, cloud, any NAS
  • ZSpace mode reads the desktop client login via zspace-cli; the macOS client must be online
  • Other NAS / cloud: mount as a local folder, or write a small walker adapter
  • Naming conventions come from media-naming-guide
  • Unofficial project, intended for personal libraries

License

MIT

↑↓ navigate openesc close