@olegkoval/agent-skills 1.35.3 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +1 -0
- package/.github/prompts/music-to-plex.prompt.md +251 -0
- package/.kiro/steering/music-to-plex.md +250 -0
- package/.windsurf/rules/music-to-plex.md +249 -0
- package/README.md +3 -2
- package/adapters/claude/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/adapters/codex/olko-creative/README.md +1 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/catalog/skills.json +33 -9
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
- package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
- package/scripts/lib/catalog.mjs +1 -1
|
@@ -49,6 +49,7 @@ Available reusable prompt files:
|
|
|
49
49
|
- garmin-watchface: .github/prompts/garmin-watchface.prompt.md
|
|
50
50
|
- gallery: .github/prompts/gallery.prompt.md
|
|
51
51
|
- fill-music-player: .github/prompts/fill-music-player.prompt.md
|
|
52
|
+
- music-to-plex: .github/prompts/music-to-plex.prompt.md
|
|
52
53
|
- vinted-listing: .github/prompts/vinted-listing.prompt.md
|
|
53
54
|
- wikipedia-uk-editor: .github/prompts/wikipedia-uk-editor.prompt.md
|
|
54
55
|
- cloudflare-block-countries: .github/prompts/cloudflare-block-countries.prompt.md
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
description: "Acquire music and make it playable in Plex/Plexamp: single albums, DJ crates, and YouTube playlists, with verified NAS/Plex delivery and source-backed Obsidian radio notes."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use the olko:music-to-plex skill.
|
|
8
|
+
|
|
9
|
+
# Music to Plex
|
|
10
|
+
|
|
11
|
+
Acquire music and surface it in Plex/Plexamp. Three flows: **album** (one-shot
|
|
12
|
+
via `mtp-bot`), **DJ tracklist/crate**, and **YouTube playlist**. Pick the flow,
|
|
13
|
+
run it, verify, post notes.
|
|
14
|
+
|
|
15
|
+
## Operating rules (non-negotiable)
|
|
16
|
+
|
|
17
|
+
- **One command per album.** For a single album/release, call `mtp-bot handle`
|
|
18
|
+
once and post its output. Do **not** run `mtp search`/`add`/`status` yourself,
|
|
19
|
+
do **not** pick a version (auto-pick is automatic), do **not** poll for
|
|
20
|
+
download status (the notifier streams it).
|
|
21
|
+
- **Serialize multi-album imports.** `mtp-bot` keeps a state machine per chat;
|
|
22
|
+
never dispatch album handler calls in parallel. Send one request, inspect its
|
|
23
|
+
reply, and proceed only after it has accepted the release or returned to idle.
|
|
24
|
+
If it opens a numbered picker, stop the batch and preserve that picker until
|
|
25
|
+
its owner chooses or explicitly authorizes cancellation. Do not send a bare
|
|
26
|
+
number, `cancel`, or a new request into an existing picker on behalf of a
|
|
27
|
+
different request. **Exception:** when the user explicitly says to ignore or
|
|
28
|
+
override an active download and names the replacement, treat that as direct
|
|
29
|
+
cancellation authority: dispatch the resolved replacement once, without a
|
|
30
|
+
redundant confirmation loop, and state that the earlier job may be abandoned.
|
|
31
|
+
- **Route by shape.** Album → `mtp-bot handle`. DJ tracklist/crate → the crate
|
|
32
|
+
ingest reference. YouTube playlist or plain track list → the YouTube flow.
|
|
33
|
+
Never pass a crate or multi-track prose to `mtp-bot handle` (album-shaped
|
|
34
|
+
parser; it will reply `⏭️ Not a music album request — skipped.`).
|
|
35
|
+
- **Cover-art requests need resolution before dispatch.** A bare `mtp` with an
|
|
36
|
+
album image is an explicit album request, but `mtp` alone is not handler-ready.
|
|
37
|
+
Transcribe/identify the cover, verify the canonical release and track count,
|
|
38
|
+
then proceed through the resolved-image continuation. Never expect the album
|
|
39
|
+
parser to infer a title from an image caption. When invoking `mtp-bot`, use the
|
|
40
|
+
**originating Telegram chat ID** from the inbound route; a group ID, user ID,
|
|
41
|
+
and configured home-chat ID are different things.
|
|
42
|
+
- **Never claim done without verification.** A "Downloading…" or a successful Plex refresh is a *start* signal, not proof. The album is done only when the files exist under the configured Plex library path **and** are visible in Plexamp. Read back playlist items before saying a playlist is updated.
|
|
43
|
+
- **Show the user the checklist.** For every album ingest, post/update this exact evidence-led checklist in order. Mark `✅` only after tool evidence; use `⏳` while active, `⚠️` for a verified blocker, and never silently omit a step:
|
|
44
|
+
```text
|
|
45
|
+
⏳ Canonical release metadata / tracklist verified
|
|
46
|
+
⏳ Audio acquired and locally staged
|
|
47
|
+
⏳ Track count, tags, embedded art, and file integrity verified
|
|
48
|
+
⏳ NAS artist-path and write-permission preflight verified
|
|
49
|
+
⏳ Files copied to the final Plex-scanned NAS folder
|
|
50
|
+
⏳ NAS count/art/folder traversal verified; transfer sidecars cleaned
|
|
51
|
+
⏳ Plex refresh triggered and album + full track count read back from Plex
|
|
52
|
+
⏳ Obsidian note written: Artist note → Album note → DJ summary
|
|
53
|
+
```
|
|
54
|
+
The final response must retain this checklist with concrete proof values (final path, counts, Plex result, and note path). If a fallback bypasses the normal handler, say so explicitly and still keep the checklist.
|
|
55
|
+
- **Never fabricate facts.** In DJ notes, if unsure of a musician/label/year, say less. Do not invent files, APIs, env vars, or NAS paths.
|
|
56
|
+
- **Obsidian note voice and substance.** Notes must use the full enrichment standard in `references/music-note-blurb-order.md`: original WFMU / LDBK / Radio Brussels / classic-underground-radio energy, vivid sensory language, and juicy source-backed facts that make listeners curious and emotionally engaged. Include verified recording/release context, label/year, collaborators/producers, samples or scene links, unusual backstory, cultural impact, and concrete listening cues when available. Never imitate a named presenter, write generic promo copy, or pad the note with unsourced trivia. Run the replaceability test before saving: if the note would mostly work after swapping the album name, rewrite it.
|
|
57
|
+
- **Obsidian vault path.** Write music notes to `/Users/olegkoval/Documents/opus/Music/`, the visible Music folder used by the existing notes (not `Documents/opus/Obsidian/Hermes/Music/`). Verify the exact note path by reading it back after writing.
|
|
58
|
+
- **Secrets live in `~/.config/music-to-plex/.env`** (loaded automatically by
|
|
59
|
+
`Config.load`), never in `config.toml`. If a check says "PLEX_TOKEN not set",
|
|
60
|
+
fix the `.env`. See `references/plex-token-source.md`.
|
|
61
|
+
- **Hand off repair.** Album on disk but not visible, wrong folder/tags after
|
|
62
|
+
the fact, bulk library cleanup, permission problems, or Plex scanner/DB
|
|
63
|
+
crashes → this is **plex-music-ingest**'s job, not this skill's.
|
|
64
|
+
|
|
65
|
+
## One-shot album flow
|
|
66
|
+
|
|
67
|
+
The user posts once ("add <album>") and gets a status stream back. The mechanics
|
|
68
|
+
(auto-pick best version, download, organize, Plex refresh, staged status
|
|
69
|
+
messages) are handled by the tool chain. **Your only creative job is the DJ
|
|
70
|
+
blurb.**
|
|
71
|
+
|
|
72
|
+
### Step 1 — Run the handler once
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
mtp-bot handle "<exact user message>" --chat <chat_id>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`<exact user message>` = what the user said; `<chat_id>` = the Telegram chat ID.
|
|
79
|
+
This auto-picks the highest-seed release, starts the download, and spawns a
|
|
80
|
+
background notifier. It returns:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
✅ Accepted: <Artist> — <Album>
|
|
84
|
+
⏳ Downloading [FORMAT] SIZE, N seeds — status updates to follow.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Post that result as-is.
|
|
88
|
+
|
|
89
|
+
### Step 2 — Write the notes in strict order
|
|
90
|
+
|
|
91
|
+
Immediately after posting "Accepted", while the download runs in the background,
|
|
92
|
+
write one enrichment package, in this order:
|
|
93
|
+
|
|
94
|
+
1. **Artist note** — a specific, substantial paragraph in the original WFMU / LDBK / Radio Brussels / classic-underground-radio lane: the artist's broader sound, history, scene, collaborators, and lane. Include at least one verified fact that gives the listener a reason to care.
|
|
95
|
+
2. **Album note** — a separate, juicy paragraph: year, label, recording/release context, key players, unusual backstory, samples or scene connections, cultural impact, and two or three concrete things to listen for. Use only facts verified from authoritative sources; turn them into a human invitation rather than a database dump.
|
|
96
|
+
3. Optional one-line DJ summary or recommendation — tactile, specific, curious, and emotionally inviting.
|
|
97
|
+
|
|
98
|
+
Keep artist note first and album note second — never merge them into one generic promo paragraph. Sound like a great late-night radio host with a crate-digger’s memory, not a press release or a Wikipedia entry. See
|
|
99
|
+
`references/music-note-blurb-order.md`. Optional extras: 🎵 YouTube link,
|
|
100
|
+
`🎶 You might also like:` + 2 short recommendations.
|
|
101
|
+
|
|
102
|
+
### Step 3 — Let the notifier stream the rest
|
|
103
|
+
|
|
104
|
+
The background notifier posts these on its own — **do not poll or re-run**:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
📥 Downloaded → 📂 Moving to library folder → 🔄 Rescanning Plex → ✅ Ready in Plexamp
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
After "Ready", mirror the notes into the canonical visible Music vault at
|
|
111
|
+
`/Users/olegkoval/Documents/opus/Music/` as a music note for that release
|
|
112
|
+
(append if it exists), artist note above album note, followed by DJ summary and
|
|
113
|
+
source links. Read the exact file back before reporting the note complete. If
|
|
114
|
+
the user asked for album art, save the release image as `cover.jpg` in the
|
|
115
|
+
artist/release folder and verify it exists. See
|
|
116
|
+
`references/cover-art-sourcing-session.md`.
|
|
117
|
+
|
|
118
|
+
### Step 4 — Follow-up replies (stuck downloads)
|
|
119
|
+
|
|
120
|
+
If a download stalls, the notifier posts a "stuck" message with 4 numbered
|
|
121
|
+
options (wait 1h / wait N hours / next release / YouTube). When the user replies
|
|
122
|
+
— a bare number `1`–`4`, a count of hours, or "next" / "youtube" — **pass the
|
|
123
|
+
reply verbatim to `mtp-bot handle`**, exactly like an add request. Post whatever
|
|
124
|
+
it returns.
|
|
125
|
+
|
|
126
|
+
**YouTube handoff:** if `mtp-bot handle` returns a line starting with
|
|
127
|
+
`__YOUTUBE_FALLBACK__`, strip it and run the YouTube flow yourself (download
|
|
128
|
+
highest-quality audio with `yt-dlp`, fix tags, move into the library, refresh
|
|
129
|
+
Plex), then post the blurb. If `rsync` or `scp` is unsuitable for a release transfer, use the verified tar-over-SSH fallback, remove any macOS AppleDouble sidecars, and compare NAS/Plex track counts with canonical metadata. See `references/manual-fallback-transfer-and-plex-verification.md`, `references/youtube-403-fallbacks.md`, and `references/youtube-full-album-fallback.md`.
|
|
130
|
+
|
|
131
|
+
**No-result continuation:** if the bot returns an actual no-results outcome and
|
|
132
|
+
the user asks to continue, do not stop at a blocker report. Resolve canonical
|
|
133
|
+
MusicBrainz metadata, then run the fail-closed track-by-track YouTube fallback:
|
|
134
|
+
match each track by normalized title and duration, reject videos/remixes/live
|
|
135
|
+
versions unless canonical, tag and cover-embed every file, stage it, transfer,
|
|
136
|
+
and verify in Plex. A file's existence is not evidence it completed: fully decode
|
|
137
|
+
all staged files and compare each actual duration to canonical metadata before
|
|
138
|
+
NAS transfer; re-tag the full set after any interrupted run. Prefer separately
|
|
139
|
+
sourced tracks over slicing a continuous full-album upload; only split a full
|
|
140
|
+
upload using validated cues and boundary checks. Clearly distinguish local
|
|
141
|
+
staging, NAS transfer, and Plex visibility. See
|
|
142
|
+
`references/no-result-album-fallback.md` and
|
|
143
|
+
`references/fallback-audio-validation-and-nas-preflight.md`.
|
|
144
|
+
|
|
145
|
+
### Manual-fallback NAS preflight
|
|
146
|
+
|
|
147
|
+
Resolve the canonical release first, then preflight the exact NAS destination
|
|
148
|
+
**in parallel with source selection and before substantial fallback downloading**.
|
|
149
|
+
Inspect the NAS layout and an existing album by the same artist. `nas_music` is a
|
|
150
|
+
storage root, not proof that a new artist directory is inside the Plex-scanned
|
|
151
|
+
library. Confirm the originating transfer account can write and traverse the
|
|
152
|
+
exact final parent; if a new artist directory is required, confirm it can create
|
|
153
|
+
that directory too. If the parent is root-owned or read-only, do not spend the
|
|
154
|
+
whole fallback download hoping the copy will work and do not invent an alternate
|
|
155
|
+
writable folder. Keep any already-staged release local and request an
|
|
156
|
+
album-scoped permission repair from the NAS owner.
|
|
157
|
+
|
|
158
|
+
**Durable access repair:** when the user explicitly wants future managed imports
|
|
159
|
+
to work, repair the *Plex library root* (for this setup,
|
|
160
|
+
`/volume1/music/library`) rather than recursively changing ownership of the
|
|
161
|
+
whole `/volume1/music` share. A safe target is managed-account ownership and
|
|
162
|
+
library-root group write (for example `beheerder:users`, `775`), then verify by
|
|
163
|
+
creating and removing a uniquely named probe directory over SSH. New artist and
|
|
164
|
+
album parents must still be Plex-traversable (`755`); an artist directory left
|
|
165
|
+
at `770` can block scanner traversal even when the release directory and FLACs
|
|
166
|
+
are readable. Never widen ownership/permissions above the Plex library root
|
|
167
|
+
without explicit user approval. See
|
|
168
|
+
`references/nas-library-layout-and-write-preflight.md`,
|
|
169
|
+
`references/fallback-audio-validation-and-nas-preflight.md`, and
|
|
170
|
+
`references/nas-permissions-and-plex-traversal.md`.
|
|
171
|
+
|
|
172
|
+
## DJ tracklist / crate flow
|
|
173
|
+
|
|
174
|
+
A timestamped DJ set or a themed crate brief is **not** an album request. Parse
|
|
175
|
+
the list, find lawful sources, acquire audio when allowed, fix metadata/artwork,
|
|
176
|
+
store a separate DJ-friendly folder on NAS, and create/refresh a Plex playlist.
|
|
177
|
+
Creation is incomplete until Plex shows a visible playlist **and** the crate has
|
|
178
|
+
proper cover art. If the user says the set is for DJ practice, treat it as a
|
|
179
|
+
**practice crate**: rebuild/trim for mixability, don't just append tracks. Full
|
|
180
|
+
procedure: `references/dj-tracklist-crate-ingest.md`.
|
|
181
|
+
|
|
182
|
+
## YouTube playlist flow
|
|
183
|
+
|
|
184
|
+
Use when the user wants a YouTube playlist (not a timestamped DJ set, not a
|
|
185
|
+
single album) turned into a normal Plex listening playlist. Two inputs: a
|
|
186
|
+
ready-made playlist URL, or a plain list of `Artist - Title` lines. Do not route
|
|
187
|
+
through `mtp-bot handle` or the crate flow. Full download/tagging/placement/
|
|
188
|
+
verification steps: `references/youtube-playlist-import.md`.
|
|
189
|
+
|
|
190
|
+
## Verification pitfalls (hard-won)
|
|
191
|
+
|
|
192
|
+
- **File exists ≠ visible.** After refresh, if Plexamp shows nothing, re-verify
|
|
193
|
+
the album landed under the configured Plex-rooted library path (not a staging/
|
|
194
|
+
download dir or a bucket Plex doesn't scan). See `references/plex-visibility-check.md`.
|
|
195
|
+
- **Permissions.** Root-owned `700` directories are invisible to Plex traversal
|
|
196
|
+
even if the audio is readable. Verify the final folder is traversable and fix
|
|
197
|
+
to `755` before every refresh.
|
|
198
|
+
- **Refresh verb.** On this Plex install, `/library/sections/{id}/refresh` must
|
|
199
|
+
be **GET**; PUT returns 404, and a targeted `path=` refresh may also 404 - fall
|
|
200
|
+
back to a plain section refresh. Refresh only after files are in their final
|
|
201
|
+
NAS path; refresh again after any later tag/rename change.
|
|
202
|
+
- **Targeted refresh exists in the CLI.** `mtp refresh --path <final NAS path>`
|
|
203
|
+
is the preferred completion check when the release lands cleanly. Treat
|
|
204
|
+
`{"refreshed": true, "section_id": ...}` as a real success signal.
|
|
205
|
+
|
|
206
|
+
- **Target layout beats generic configuration.** Before creating a genre bucket, inspect where Plex stores an existing album from the same artist and confirm the transfer account can write that parent. Do not redirect a release to an unrelated writable folder or `unsorted` solely to make the copy succeed; repair access to the canonical target instead. See `references/nas-library-layout-and-write-preflight.md`.
|
|
207
|
+
- **Corrupt source ≠ Plex problem.** If a chapter-based rip yields a zero-byte or
|
|
208
|
+
corrupt final track, switch source first, then tag and move — don't just
|
|
209
|
+
re-refresh. See `references/malformed-flac-fallbacks.md`.
|
|
210
|
+
- **NAS codec tools may be unavailable.** Some NAS images ship neither `ffprobe`
|
|
211
|
+
nor an AAC decoder in `ffmpeg`. In that case, fully decode each staged source
|
|
212
|
+
locally before transfer, then use NAS file count/art/sidecar/traversal checks
|
|
213
|
+
plus Plex’s album-and-track read-back as the remote verification receipt. Do
|
|
214
|
+
not describe a remote decode as passed when the NAS tool cannot decode it.
|
|
215
|
+
- **Duplicate torrent.** On Synology `Duplicate torrent file`, do not retry
|
|
216
|
+
blindly — `list_tasks` first; repeated attempts stack failed tasks. Clean stale
|
|
217
|
+
tasks, then re-search with plain artist/album text (no magnet URLs in replies).
|
|
218
|
+
See `references/duplicate-torrent-handling.md`.
|
|
219
|
+
- **Image/typo identification.** If the user sends cover art or a misspelled/clip
|
|
220
|
+
title (`Single`, `Official clip`, `teaser`), use it as a *clue* — confirm the
|
|
221
|
+
real release name and track count on the store/release page before importing.
|
|
222
|
+
See `references/image-driven-identification-and-verification.md` and
|
|
223
|
+
`references/bandcamp-album-identification.md`.
|
|
224
|
+
- **Lesson (scanner health):** when an album repeatedly "won't ingest" after the
|
|
225
|
+
files are correctly placed, stop re-moving files. The cause is usually scanner/
|
|
226
|
+
DB state, not placement — a direct scanner probe can crash with `DB::Exception`
|
|
227
|
+
while a plain refresh succeeds. At that point the album is a **plex-music-ingest**
|
|
228
|
+
case: check scanner health, DB state, and crash cause before touching tags again.
|
|
229
|
+
(Real example: an album sat correctly at `/volume1/music/Various Artists/…`
|
|
230
|
+
yet stayed invisible; extra nested `library/pop` layers never helped.)
|
|
231
|
+
|
|
232
|
+
## References
|
|
233
|
+
|
|
234
|
+
- Notes & enrichment: `music-note-blurb-order.md`, `cover-art-sourcing-session.md`
|
|
235
|
+
- Album ID & verification: `image-driven-identification-and-verification.md`,
|
|
236
|
+
`gear-change-image-identification.md`, `bandcamp-album-identification.md`,
|
|
237
|
+
`plex-visibility-check.md`, `verification-and-pitfalls.md`
|
|
238
|
+
- DJ crates: `dj-tracklist-crate-ingest.md`, `cover-art-repair-session.md`,
|
|
239
|
+
`per-track-album-art-split.md`, `youtube-lineage-playlist-fallback.md`
|
|
240
|
+
- YouTube: `youtube-playlist-import.md`, `youtube-403-fallbacks.md`,
|
|
241
|
+
`youtube-full-album-fallback.md`, `fallback-audio-validation-and-nas-preflight.md`
|
|
242
|
+
- Playlists: `plex-playlist-creation.md`, `plex-playlist-append-and-verify.md`,
|
|
243
|
+
`zero-track-playlist-recovery.md`
|
|
244
|
+
- Plex/NAS plumbing: `plex-token-source.md`, `nas-routing-and-refresh.md`,
|
|
245
|
+
`batch-import-staging.md`, `mtp-subprocess-wrapper.md`,
|
|
246
|
+
`mtp-bot-bulk-state-safety.md`, `session-2026-06-17-synology-probe.md`
|
|
247
|
+
- Repair/forensics (mostly owned by **plex-music-ingest**):
|
|
248
|
+
`library-repair-folders.md`, `canonical-artist-normalization.md`,
|
|
249
|
+
`cover-art-and-plexamp.md`
|
|
250
|
+
|
|
251
|
+
That is the skill. Pick the flow, run it, verify, post notes. Silence if no output.
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
inclusion: manual
|
|
5
|
+
description: "Acquire music and make it playable in Plex/Plexamp: single albums, DJ crates, and YouTube playlists, with verified NAS/Plex delivery and source-backed Obsidian radio notes."
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Music to Plex
|
|
9
|
+
|
|
10
|
+
Acquire music and surface it in Plex/Plexamp. Three flows: **album** (one-shot
|
|
11
|
+
via `mtp-bot`), **DJ tracklist/crate**, and **YouTube playlist**. Pick the flow,
|
|
12
|
+
run it, verify, post notes.
|
|
13
|
+
|
|
14
|
+
## Operating rules (non-negotiable)
|
|
15
|
+
|
|
16
|
+
- **One command per album.** For a single album/release, call `mtp-bot handle`
|
|
17
|
+
once and post its output. Do **not** run `mtp search`/`add`/`status` yourself,
|
|
18
|
+
do **not** pick a version (auto-pick is automatic), do **not** poll for
|
|
19
|
+
download status (the notifier streams it).
|
|
20
|
+
- **Serialize multi-album imports.** `mtp-bot` keeps a state machine per chat;
|
|
21
|
+
never dispatch album handler calls in parallel. Send one request, inspect its
|
|
22
|
+
reply, and proceed only after it has accepted the release or returned to idle.
|
|
23
|
+
If it opens a numbered picker, stop the batch and preserve that picker until
|
|
24
|
+
its owner chooses or explicitly authorizes cancellation. Do not send a bare
|
|
25
|
+
number, `cancel`, or a new request into an existing picker on behalf of a
|
|
26
|
+
different request. **Exception:** when the user explicitly says to ignore or
|
|
27
|
+
override an active download and names the replacement, treat that as direct
|
|
28
|
+
cancellation authority: dispatch the resolved replacement once, without a
|
|
29
|
+
redundant confirmation loop, and state that the earlier job may be abandoned.
|
|
30
|
+
- **Route by shape.** Album → `mtp-bot handle`. DJ tracklist/crate → the crate
|
|
31
|
+
ingest reference. YouTube playlist or plain track list → the YouTube flow.
|
|
32
|
+
Never pass a crate or multi-track prose to `mtp-bot handle` (album-shaped
|
|
33
|
+
parser; it will reply `⏭️ Not a music album request — skipped.`).
|
|
34
|
+
- **Cover-art requests need resolution before dispatch.** A bare `mtp` with an
|
|
35
|
+
album image is an explicit album request, but `mtp` alone is not handler-ready.
|
|
36
|
+
Transcribe/identify the cover, verify the canonical release and track count,
|
|
37
|
+
then proceed through the resolved-image continuation. Never expect the album
|
|
38
|
+
parser to infer a title from an image caption. When invoking `mtp-bot`, use the
|
|
39
|
+
**originating Telegram chat ID** from the inbound route; a group ID, user ID,
|
|
40
|
+
and configured home-chat ID are different things.
|
|
41
|
+
- **Never claim done without verification.** A "Downloading…" or a successful Plex refresh is a *start* signal, not proof. The album is done only when the files exist under the configured Plex library path **and** are visible in Plexamp. Read back playlist items before saying a playlist is updated.
|
|
42
|
+
- **Show the user the checklist.** For every album ingest, post/update this exact evidence-led checklist in order. Mark `✅` only after tool evidence; use `⏳` while active, `⚠️` for a verified blocker, and never silently omit a step:
|
|
43
|
+
```text
|
|
44
|
+
⏳ Canonical release metadata / tracklist verified
|
|
45
|
+
⏳ Audio acquired and locally staged
|
|
46
|
+
⏳ Track count, tags, embedded art, and file integrity verified
|
|
47
|
+
⏳ NAS artist-path and write-permission preflight verified
|
|
48
|
+
⏳ Files copied to the final Plex-scanned NAS folder
|
|
49
|
+
⏳ NAS count/art/folder traversal verified; transfer sidecars cleaned
|
|
50
|
+
⏳ Plex refresh triggered and album + full track count read back from Plex
|
|
51
|
+
⏳ Obsidian note written: Artist note → Album note → DJ summary
|
|
52
|
+
```
|
|
53
|
+
The final response must retain this checklist with concrete proof values (final path, counts, Plex result, and note path). If a fallback bypasses the normal handler, say so explicitly and still keep the checklist.
|
|
54
|
+
- **Never fabricate facts.** In DJ notes, if unsure of a musician/label/year, say less. Do not invent files, APIs, env vars, or NAS paths.
|
|
55
|
+
- **Obsidian note voice and substance.** Notes must use the full enrichment standard in `references/music-note-blurb-order.md`: original WFMU / LDBK / Radio Brussels / classic-underground-radio energy, vivid sensory language, and juicy source-backed facts that make listeners curious and emotionally engaged. Include verified recording/release context, label/year, collaborators/producers, samples or scene links, unusual backstory, cultural impact, and concrete listening cues when available. Never imitate a named presenter, write generic promo copy, or pad the note with unsourced trivia. Run the replaceability test before saving: if the note would mostly work after swapping the album name, rewrite it.
|
|
56
|
+
- **Obsidian vault path.** Write music notes to `/Users/olegkoval/Documents/opus/Music/`, the visible Music folder used by the existing notes (not `Documents/opus/Obsidian/Hermes/Music/`). Verify the exact note path by reading it back after writing.
|
|
57
|
+
- **Secrets live in `~/.config/music-to-plex/.env`** (loaded automatically by
|
|
58
|
+
`Config.load`), never in `config.toml`. If a check says "PLEX_TOKEN not set",
|
|
59
|
+
fix the `.env`. See `references/plex-token-source.md`.
|
|
60
|
+
- **Hand off repair.** Album on disk but not visible, wrong folder/tags after
|
|
61
|
+
the fact, bulk library cleanup, permission problems, or Plex scanner/DB
|
|
62
|
+
crashes → this is **plex-music-ingest**'s job, not this skill's.
|
|
63
|
+
|
|
64
|
+
## One-shot album flow
|
|
65
|
+
|
|
66
|
+
The user posts once ("add <album>") and gets a status stream back. The mechanics
|
|
67
|
+
(auto-pick best version, download, organize, Plex refresh, staged status
|
|
68
|
+
messages) are handled by the tool chain. **Your only creative job is the DJ
|
|
69
|
+
blurb.**
|
|
70
|
+
|
|
71
|
+
### Step 1 — Run the handler once
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
mtp-bot handle "<exact user message>" --chat <chat_id>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`<exact user message>` = what the user said; `<chat_id>` = the Telegram chat ID.
|
|
78
|
+
This auto-picks the highest-seed release, starts the download, and spawns a
|
|
79
|
+
background notifier. It returns:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
✅ Accepted: <Artist> — <Album>
|
|
83
|
+
⏳ Downloading [FORMAT] SIZE, N seeds — status updates to follow.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Post that result as-is.
|
|
87
|
+
|
|
88
|
+
### Step 2 — Write the notes in strict order
|
|
89
|
+
|
|
90
|
+
Immediately after posting "Accepted", while the download runs in the background,
|
|
91
|
+
write one enrichment package, in this order:
|
|
92
|
+
|
|
93
|
+
1. **Artist note** — a specific, substantial paragraph in the original WFMU / LDBK / Radio Brussels / classic-underground-radio lane: the artist's broader sound, history, scene, collaborators, and lane. Include at least one verified fact that gives the listener a reason to care.
|
|
94
|
+
2. **Album note** — a separate, juicy paragraph: year, label, recording/release context, key players, unusual backstory, samples or scene connections, cultural impact, and two or three concrete things to listen for. Use only facts verified from authoritative sources; turn them into a human invitation rather than a database dump.
|
|
95
|
+
3. Optional one-line DJ summary or recommendation — tactile, specific, curious, and emotionally inviting.
|
|
96
|
+
|
|
97
|
+
Keep artist note first and album note second — never merge them into one generic promo paragraph. Sound like a great late-night radio host with a crate-digger’s memory, not a press release or a Wikipedia entry. See
|
|
98
|
+
`references/music-note-blurb-order.md`. Optional extras: 🎵 YouTube link,
|
|
99
|
+
`🎶 You might also like:` + 2 short recommendations.
|
|
100
|
+
|
|
101
|
+
### Step 3 — Let the notifier stream the rest
|
|
102
|
+
|
|
103
|
+
The background notifier posts these on its own — **do not poll or re-run**:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
📥 Downloaded → 📂 Moving to library folder → 🔄 Rescanning Plex → ✅ Ready in Plexamp
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
After "Ready", mirror the notes into the canonical visible Music vault at
|
|
110
|
+
`/Users/olegkoval/Documents/opus/Music/` as a music note for that release
|
|
111
|
+
(append if it exists), artist note above album note, followed by DJ summary and
|
|
112
|
+
source links. Read the exact file back before reporting the note complete. If
|
|
113
|
+
the user asked for album art, save the release image as `cover.jpg` in the
|
|
114
|
+
artist/release folder and verify it exists. See
|
|
115
|
+
`references/cover-art-sourcing-session.md`.
|
|
116
|
+
|
|
117
|
+
### Step 4 — Follow-up replies (stuck downloads)
|
|
118
|
+
|
|
119
|
+
If a download stalls, the notifier posts a "stuck" message with 4 numbered
|
|
120
|
+
options (wait 1h / wait N hours / next release / YouTube). When the user replies
|
|
121
|
+
— a bare number `1`–`4`, a count of hours, or "next" / "youtube" — **pass the
|
|
122
|
+
reply verbatim to `mtp-bot handle`**, exactly like an add request. Post whatever
|
|
123
|
+
it returns.
|
|
124
|
+
|
|
125
|
+
**YouTube handoff:** if `mtp-bot handle` returns a line starting with
|
|
126
|
+
`__YOUTUBE_FALLBACK__`, strip it and run the YouTube flow yourself (download
|
|
127
|
+
highest-quality audio with `yt-dlp`, fix tags, move into the library, refresh
|
|
128
|
+
Plex), then post the blurb. If `rsync` or `scp` is unsuitable for a release transfer, use the verified tar-over-SSH fallback, remove any macOS AppleDouble sidecars, and compare NAS/Plex track counts with canonical metadata. See `references/manual-fallback-transfer-and-plex-verification.md`, `references/youtube-403-fallbacks.md`, and `references/youtube-full-album-fallback.md`.
|
|
129
|
+
|
|
130
|
+
**No-result continuation:** if the bot returns an actual no-results outcome and
|
|
131
|
+
the user asks to continue, do not stop at a blocker report. Resolve canonical
|
|
132
|
+
MusicBrainz metadata, then run the fail-closed track-by-track YouTube fallback:
|
|
133
|
+
match each track by normalized title and duration, reject videos/remixes/live
|
|
134
|
+
versions unless canonical, tag and cover-embed every file, stage it, transfer,
|
|
135
|
+
and verify in Plex. A file's existence is not evidence it completed: fully decode
|
|
136
|
+
all staged files and compare each actual duration to canonical metadata before
|
|
137
|
+
NAS transfer; re-tag the full set after any interrupted run. Prefer separately
|
|
138
|
+
sourced tracks over slicing a continuous full-album upload; only split a full
|
|
139
|
+
upload using validated cues and boundary checks. Clearly distinguish local
|
|
140
|
+
staging, NAS transfer, and Plex visibility. See
|
|
141
|
+
`references/no-result-album-fallback.md` and
|
|
142
|
+
`references/fallback-audio-validation-and-nas-preflight.md`.
|
|
143
|
+
|
|
144
|
+
### Manual-fallback NAS preflight
|
|
145
|
+
|
|
146
|
+
Resolve the canonical release first, then preflight the exact NAS destination
|
|
147
|
+
**in parallel with source selection and before substantial fallback downloading**.
|
|
148
|
+
Inspect the NAS layout and an existing album by the same artist. `nas_music` is a
|
|
149
|
+
storage root, not proof that a new artist directory is inside the Plex-scanned
|
|
150
|
+
library. Confirm the originating transfer account can write and traverse the
|
|
151
|
+
exact final parent; if a new artist directory is required, confirm it can create
|
|
152
|
+
that directory too. If the parent is root-owned or read-only, do not spend the
|
|
153
|
+
whole fallback download hoping the copy will work and do not invent an alternate
|
|
154
|
+
writable folder. Keep any already-staged release local and request an
|
|
155
|
+
album-scoped permission repair from the NAS owner.
|
|
156
|
+
|
|
157
|
+
**Durable access repair:** when the user explicitly wants future managed imports
|
|
158
|
+
to work, repair the *Plex library root* (for this setup,
|
|
159
|
+
`/volume1/music/library`) rather than recursively changing ownership of the
|
|
160
|
+
whole `/volume1/music` share. A safe target is managed-account ownership and
|
|
161
|
+
library-root group write (for example `beheerder:users`, `775`), then verify by
|
|
162
|
+
creating and removing a uniquely named probe directory over SSH. New artist and
|
|
163
|
+
album parents must still be Plex-traversable (`755`); an artist directory left
|
|
164
|
+
at `770` can block scanner traversal even when the release directory and FLACs
|
|
165
|
+
are readable. Never widen ownership/permissions above the Plex library root
|
|
166
|
+
without explicit user approval. See
|
|
167
|
+
`references/nas-library-layout-and-write-preflight.md`,
|
|
168
|
+
`references/fallback-audio-validation-and-nas-preflight.md`, and
|
|
169
|
+
`references/nas-permissions-and-plex-traversal.md`.
|
|
170
|
+
|
|
171
|
+
## DJ tracklist / crate flow
|
|
172
|
+
|
|
173
|
+
A timestamped DJ set or a themed crate brief is **not** an album request. Parse
|
|
174
|
+
the list, find lawful sources, acquire audio when allowed, fix metadata/artwork,
|
|
175
|
+
store a separate DJ-friendly folder on NAS, and create/refresh a Plex playlist.
|
|
176
|
+
Creation is incomplete until Plex shows a visible playlist **and** the crate has
|
|
177
|
+
proper cover art. If the user says the set is for DJ practice, treat it as a
|
|
178
|
+
**practice crate**: rebuild/trim for mixability, don't just append tracks. Full
|
|
179
|
+
procedure: `references/dj-tracklist-crate-ingest.md`.
|
|
180
|
+
|
|
181
|
+
## YouTube playlist flow
|
|
182
|
+
|
|
183
|
+
Use when the user wants a YouTube playlist (not a timestamped DJ set, not a
|
|
184
|
+
single album) turned into a normal Plex listening playlist. Two inputs: a
|
|
185
|
+
ready-made playlist URL, or a plain list of `Artist - Title` lines. Do not route
|
|
186
|
+
through `mtp-bot handle` or the crate flow. Full download/tagging/placement/
|
|
187
|
+
verification steps: `references/youtube-playlist-import.md`.
|
|
188
|
+
|
|
189
|
+
## Verification pitfalls (hard-won)
|
|
190
|
+
|
|
191
|
+
- **File exists ≠ visible.** After refresh, if Plexamp shows nothing, re-verify
|
|
192
|
+
the album landed under the configured Plex-rooted library path (not a staging/
|
|
193
|
+
download dir or a bucket Plex doesn't scan). See `references/plex-visibility-check.md`.
|
|
194
|
+
- **Permissions.** Root-owned `700` directories are invisible to Plex traversal
|
|
195
|
+
even if the audio is readable. Verify the final folder is traversable and fix
|
|
196
|
+
to `755` before every refresh.
|
|
197
|
+
- **Refresh verb.** On this Plex install, `/library/sections/{id}/refresh` must
|
|
198
|
+
be **GET**; PUT returns 404, and a targeted `path=` refresh may also 404 - fall
|
|
199
|
+
back to a plain section refresh. Refresh only after files are in their final
|
|
200
|
+
NAS path; refresh again after any later tag/rename change.
|
|
201
|
+
- **Targeted refresh exists in the CLI.** `mtp refresh --path <final NAS path>`
|
|
202
|
+
is the preferred completion check when the release lands cleanly. Treat
|
|
203
|
+
`{"refreshed": true, "section_id": ...}` as a real success signal.
|
|
204
|
+
|
|
205
|
+
- **Target layout beats generic configuration.** Before creating a genre bucket, inspect where Plex stores an existing album from the same artist and confirm the transfer account can write that parent. Do not redirect a release to an unrelated writable folder or `unsorted` solely to make the copy succeed; repair access to the canonical target instead. See `references/nas-library-layout-and-write-preflight.md`.
|
|
206
|
+
- **Corrupt source ≠ Plex problem.** If a chapter-based rip yields a zero-byte or
|
|
207
|
+
corrupt final track, switch source first, then tag and move — don't just
|
|
208
|
+
re-refresh. See `references/malformed-flac-fallbacks.md`.
|
|
209
|
+
- **NAS codec tools may be unavailable.** Some NAS images ship neither `ffprobe`
|
|
210
|
+
nor an AAC decoder in `ffmpeg`. In that case, fully decode each staged source
|
|
211
|
+
locally before transfer, then use NAS file count/art/sidecar/traversal checks
|
|
212
|
+
plus Plex’s album-and-track read-back as the remote verification receipt. Do
|
|
213
|
+
not describe a remote decode as passed when the NAS tool cannot decode it.
|
|
214
|
+
- **Duplicate torrent.** On Synology `Duplicate torrent file`, do not retry
|
|
215
|
+
blindly — `list_tasks` first; repeated attempts stack failed tasks. Clean stale
|
|
216
|
+
tasks, then re-search with plain artist/album text (no magnet URLs in replies).
|
|
217
|
+
See `references/duplicate-torrent-handling.md`.
|
|
218
|
+
- **Image/typo identification.** If the user sends cover art or a misspelled/clip
|
|
219
|
+
title (`Single`, `Official clip`, `teaser`), use it as a *clue* — confirm the
|
|
220
|
+
real release name and track count on the store/release page before importing.
|
|
221
|
+
See `references/image-driven-identification-and-verification.md` and
|
|
222
|
+
`references/bandcamp-album-identification.md`.
|
|
223
|
+
- **Lesson (scanner health):** when an album repeatedly "won't ingest" after the
|
|
224
|
+
files are correctly placed, stop re-moving files. The cause is usually scanner/
|
|
225
|
+
DB state, not placement — a direct scanner probe can crash with `DB::Exception`
|
|
226
|
+
while a plain refresh succeeds. At that point the album is a **plex-music-ingest**
|
|
227
|
+
case: check scanner health, DB state, and crash cause before touching tags again.
|
|
228
|
+
(Real example: an album sat correctly at `/volume1/music/Various Artists/…`
|
|
229
|
+
yet stayed invisible; extra nested `library/pop` layers never helped.)
|
|
230
|
+
|
|
231
|
+
## References
|
|
232
|
+
|
|
233
|
+
- Notes & enrichment: `music-note-blurb-order.md`, `cover-art-sourcing-session.md`
|
|
234
|
+
- Album ID & verification: `image-driven-identification-and-verification.md`,
|
|
235
|
+
`gear-change-image-identification.md`, `bandcamp-album-identification.md`,
|
|
236
|
+
`plex-visibility-check.md`, `verification-and-pitfalls.md`
|
|
237
|
+
- DJ crates: `dj-tracklist-crate-ingest.md`, `cover-art-repair-session.md`,
|
|
238
|
+
`per-track-album-art-split.md`, `youtube-lineage-playlist-fallback.md`
|
|
239
|
+
- YouTube: `youtube-playlist-import.md`, `youtube-403-fallbacks.md`,
|
|
240
|
+
`youtube-full-album-fallback.md`, `fallback-audio-validation-and-nas-preflight.md`
|
|
241
|
+
- Playlists: `plex-playlist-creation.md`, `plex-playlist-append-and-verify.md`,
|
|
242
|
+
`zero-track-playlist-recovery.md`
|
|
243
|
+
- Plex/NAS plumbing: `plex-token-source.md`, `nas-routing-and-refresh.md`,
|
|
244
|
+
`batch-import-staging.md`, `mtp-subprocess-wrapper.md`,
|
|
245
|
+
`mtp-bot-bulk-state-safety.md`, `session-2026-06-17-synology-probe.md`
|
|
246
|
+
- Repair/forensics (mostly owned by **plex-music-ingest**):
|
|
247
|
+
`library-repair-folders.md`, `canonical-artist-normalization.md`,
|
|
248
|
+
`cover-art-and-plexamp.md`
|
|
249
|
+
|
|
250
|
+
That is the skill. Pick the flow, run it, verify, post notes. Silence if no output.
|