organize-files · v5 · 2026-08-31 · sha256 8514cff2ae239202

organize-files v5A

Immutable. This exact content is served forever at /api/v1/blob/8514cff2ae239202.

---
name: organize-files
version: 5
description: >-
  Use this skill when the user asks MoviePilot to identify and organize a local
  or downloaded video/music file, season folder, recording, album directory, or
  mixed folder that automatic transfer did not handle. If failed transfer
  history IDs are supplied, use transfer-failed-retry instead.
allowed-tools: moviepilot_api execute_command ask_user_choice send_message
allowed-api-operations: storage.settings storage.list transfer.history transfer.history.delete media.recognize media.search media.detail library.exists transfer.file media.scrape
---

# Organize Files

Use `moviepilot_api` for every MoviePilot business operation. Retired file,
recognition, transfer, and history tools are not available.

## Workflow

1. Establish scope. If the user provides a path, use it. If they identify a
   downloader task, use `downloader-operation` and its fixed
   `scripts/mp-downloader.py` helper to discover the instance and call
   `tasks.list`. If they only name a configured root, call `storage.settings`.
   Use `storage.list` to inspect the selected directory. Do not process a broad
   shared root without an explicit, bounded scope.
2. Classify files into movie, TV, one music recording, one complete album,
   subtitle/sidecar, or unrelated content. Do not group unrelated media merely
   because they share a directory.
3. Call `media.recognize` with the representative title or path. If uncertain,
   call `media.search`; if several exact candidates remain, use
   `ask_user_choice`. Never invent or translate an ID.
4. Preserve the exact `media_source` + `media_id`. For TV, verify season detail
   with `media.detail` when numbering is ambiguous. For music, a recording is one
   track, an album is one multi-track directory, and an artist is browse-only.
5. When duplicate risk matters, call `library.exists`. If an existing transfer
   record affects reorganization, inspect `transfer.history`.
6. Before a state-changing transfer, summarize the source, target identity,
   media type, season/music entity, storage, and mode. Continue only when the
   user's request already authorizes that exact action or after confirmation.
7. Call `transfer.file` once per verified unit. For an album, transfer the album
   directory once only after its supported audio-file count is consistent with
   the selected album detail.
8. If requested, call `media.scrape` after a successful transfer. Report actual
   tag, cover, and lyrics counts; never assume all lyrics were found.

## Structured Calls

- Directory listing: `storage.list` with storage/path/paging/sort in `body`.
- Recognition: `media.recognize` with title/path in `query`.
- Search: `media.search` with title/type/source constraints in `query`.
- Detail: `media.detail` with `path_params.media_id` and identity/type in `query`.
- Library check: `library.exists` with the exact identity in `query`.
- Transfer: `transfer.file` with the manual-transfer request in `body`.
- Scrape: `media.scrape` with `path_params.storage`, file item in `body`, and
  exact identity/type fields in `query`.

Stop and report instead of transferring when the source is missing, directory
configuration is absent, identity remains ambiguous, an album appears mixed or
incomplete, or the requested target would overwrite unrelated media.