@olegkoval/agent-skills 1.35.3 → 1.37.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.
Files changed (185) hide show
  1. package/.github/copilot-instructions.md +1 -0
  2. package/.github/prompts/music-to-plex.prompt.md +251 -0
  3. package/.kiro/steering/music-to-plex.md +250 -0
  4. package/.windsurf/rules/music-to-plex.md +249 -0
  5. package/README.md +12 -2
  6. package/adapters/claude/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  7. package/adapters/claude/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  8. package/adapters/claude/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  9. package/adapters/claude/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  10. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  11. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  12. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  13. package/adapters/claude/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  14. package/adapters/claude/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  15. package/adapters/claude/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  16. package/adapters/claude/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  17. package/adapters/claude/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  18. package/adapters/claude/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  19. package/adapters/claude/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  20. package/adapters/claude/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  21. package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  22. package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  23. package/adapters/claude/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  24. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  25. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  26. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  27. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  28. package/adapters/claude/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  29. package/adapters/claude/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  30. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  31. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  32. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  33. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  34. package/adapters/claude/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  35. package/adapters/claude/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  36. package/adapters/claude/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  37. package/adapters/claude/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  38. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  39. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  40. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  41. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  42. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  43. package/adapters/claude/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  44. package/adapters/claude/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  45. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  46. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  47. package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  48. package/adapters/codex/olko-creative/README.md +1 -0
  49. package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  50. package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  51. package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  52. package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  53. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  54. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  55. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  56. package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  57. package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  58. package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  59. package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  60. package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  61. package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  62. package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  63. package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  64. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  65. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  66. package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  67. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  68. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  69. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  70. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  71. package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  72. package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  73. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  74. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  75. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  76. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  77. package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  78. package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  79. package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  80. package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  81. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  82. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  83. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  84. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  85. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  86. package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  87. package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  88. package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  89. package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  90. package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  91. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  92. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  93. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  94. package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  95. package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  96. package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  97. package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  98. package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  99. package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  100. package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  101. package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  102. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  103. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  104. package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  105. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  106. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  107. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  108. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  109. package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  110. package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  111. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  112. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  113. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  114. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  115. package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  116. package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  117. package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  118. package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  119. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  120. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  121. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  122. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  123. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  124. package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  125. package/catalog/skills.json +33 -9
  126. package/package.json +1 -1
  127. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  128. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  129. package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
  130. package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  131. package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  132. package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  133. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  134. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  135. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  136. package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  137. package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  138. package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  139. package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  140. package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  141. package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  142. package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  143. package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  144. package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  145. package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  146. package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  147. package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  148. package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  149. package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  150. package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  151. package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  152. package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  153. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  154. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  155. package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  156. package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  157. package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  158. package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  159. package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  160. package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  161. package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  162. package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  163. package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  164. package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  165. package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  166. package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  167. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  168. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  169. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  170. package/plugins/olko-github-pr/skills/lekker-review/README.md +60 -0
  171. package/plugins/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  172. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.html +204 -0
  173. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png +0 -0
  174. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.html +199 -0
  175. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png +0 -0
  176. package/plugins/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  177. package/plugins/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  178. package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  179. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  180. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  181. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  182. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  183. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  184. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  185. 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.