@olegkoval/agent-skills 1.35.2 → 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.
Files changed (173) 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 +3 -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/codex/olko-creative/README.md +1 -0
  45. package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  46. package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  47. package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  48. package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  49. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  50. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  51. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  52. package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  53. package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  54. package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  55. package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  56. package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  57. package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  58. package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  59. package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  60. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  61. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  62. package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  63. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  64. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  65. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  66. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  67. package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  68. package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  69. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  70. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  71. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  72. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  73. package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  74. package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  75. package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  76. package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  77. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  78. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  79. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  80. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  81. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  82. package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  83. package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  84. package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  85. package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  86. package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  87. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  88. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  89. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  90. package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  91. package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  92. package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  93. package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  94. package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  95. package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  96. package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  97. package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  98. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  99. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  100. package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  101. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  102. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  103. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  104. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  105. package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  106. package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  107. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  108. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  109. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  110. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  111. package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  112. package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  113. package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  114. package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  115. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  116. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  117. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  118. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  119. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  120. package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  121. package/catalog/skills.json +33 -9
  122. package/docs/versioning.md +4 -2
  123. package/package.json +1 -1
  124. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  125. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  126. package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
  127. package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  128. package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  129. package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  130. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  131. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  132. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  133. package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  134. package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  135. package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  136. package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  137. package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  138. package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  139. package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  140. package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  141. package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  142. package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  143. package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  144. package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  145. package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  146. package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  147. package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  148. package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  149. package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  150. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  151. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  152. package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  153. package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  154. package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  155. package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  156. package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  157. package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  158. package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  159. package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  160. package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  161. package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  162. package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  163. package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  164. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  165. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  166. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  167. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  168. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  169. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  170. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  171. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  172. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  173. package/scripts/lib/catalog.mjs +1 -1
@@ -0,0 +1,34 @@
1
+ # Embedded cover-art repair session notes
2
+
3
+ Use this when a DJ crate or playlist already exists on the NAS and Plexamp shows the gray "no album art" thumbnail on every track.
4
+
5
+ ## What worked
6
+
7
+ - The set was `Deep Lineage Set` and the source folder was:
8
+ `/volume1/video/plex-imports/deep-lineage-set`
9
+ - The tracklist came from a screenshot, so the first pass was image-assisted identification of the set name and sequence.
10
+ - The fixed files were FLACs, so `mutagen.flac.FLAC` was enough to rewrite embedded artwork in place.
11
+ - Each file ended up with exactly one embedded picture after the rewrite.
12
+ - Plex was refreshed with `GET /library/sections/{id}/refresh` on the NAS, not a UI click.
13
+
14
+ ## Practical pattern
15
+
16
+ 1. Identify the exact release for each track before writing tags.
17
+ 2. Pull the release art from Cover Art Archive or another authoritative source.
18
+ 3. Rewrite embedded art in the track files themselves.
19
+ 4. Verify the resulting files have `1` picture each.
20
+ 5. Refresh Plex only after the files are in final NAS path.
21
+
22
+ ## Pitfalls
23
+
24
+ - Folder-level artwork is not enough if the tracks themselves have missing embedded art and Plexamp is reading track thumbnails.
25
+ - Do not assume the Spotify-looking playlist title is the actual release title. Screenshot tracklists often mix track names, artists, and playlist labels.
26
+ - When a release has similarly named variants, resolve by artist + release group, not title alone.
27
+
28
+ ## Verification
29
+
30
+ Check both:
31
+ - file-level art count in each FLAC/MP3
32
+ - Plex refresh on the target section
33
+
34
+ If both are true, the playlist should render with original cover art in Plexamp.
@@ -0,0 +1,23 @@
1
+ # Cover art sourcing session note
2
+
3
+ Use this when the user wants music notes plus actual album art, not just text notes.
4
+
5
+ ## Pattern that worked
6
+ - Create the release note as usual, but do not stop there.
7
+ - Find a reliable source image for the release cover.
8
+ - Prefer an image URL already exposed by the page's image inventory over scraping HTML manually.
9
+ - If Bandcamp page image is available, use that for direct art.
10
+ - If Bandcamp does not expose the needed cover clearly, fall back to a verified artwork image from Wikipedia or another canonical release page.
11
+ - Save the image locally as `cover.jpg` in the artist or release folder.
12
+ - Verify with a filesystem search, not by assuming the download worked.
13
+
14
+ ## Session outcome
15
+ - Fred Everything - Mercyless: cover saved as `cover.jpg` in the artist folder.
16
+ - Ron Trent - Altered States: cover saved as `cover.jpg`.
17
+ - Chez Damier & Ron Trent, M.D. - Hip To Be Disillusioned Vol. 1: cover saved as `cover.jpg`.
18
+ - St Germain - Tourist: cover saved as `cover.jpg`.
19
+ - Larry Heard - Can You Feel It: cover saved as `cover.jpg`.
20
+
21
+ ## Pitfall
22
+ - Do not answer with notes-only completion if the user asked for album art. That is partial work.
23
+ - Treat art placement as part of the deliverable for music-library curation.
@@ -0,0 +1,184 @@
1
+ # DJ tracklist crate ingest to NAS + Plex
2
+
3
+ Use when the user posts a timestamped DJ set tracklist and wants it turned into a DJ-usable folder and Plex/Plexamp listening playlist.
4
+
5
+ ## Scope and legality
6
+
7
+ - Prefer legal/owned sources: Bandcamp, Qobuz, Beatport, Juno Download, artist/label stores, existing NAS library, or user-provided files.
8
+ - YouTube is allowed only for lawful sources: official uploads, artist/label uploads, Creative Commons, public-domain material, or user-confirmed personal-use fallback where local law/account terms permit it.
9
+ - Do not present piracy as the default path. If a track is commercially available, prefer purchase/store source over a random YouTube rip.
10
+ - If source rights are unclear, stage it as `needs_source_confirmation` and ask before download.
11
+
12
+ ## Input format
13
+
14
+ Accept lines like:
15
+
16
+ ```text
17
+ 00:00 Intro - Marc Bianco
18
+ 02:30 Ghetto Opera (Loft Mix) - Nicholas featuring Nikki-O
19
+ 1:19:17 Under The Sun - Fred Everything
20
+ ```
21
+
22
+ Parse into:
23
+
24
+ - original timestamp
25
+ - title
26
+ - mix/version
27
+ - artist(s)
28
+ - original line
29
+ - confidence
30
+ - source URL(s)
31
+ - final file path
32
+ - metadata status
33
+ - Plex ratingKey if indexed
34
+
35
+ ## Target folder structure
36
+
37
+ Create a dedicated crate separate from normal album folders so it is DJ-friendly and easy to copy to Rekordbox/USB later:
38
+
39
+ ```text
40
+ <NAS_MUSIC_ROOT>/DJ Crates/<YYYY-MM-DD> - <Set Name>/
41
+ 00_PLAYLIST.m3u8
42
+ 00_TRACKLIST.md
43
+ 00_MANIFEST.json
44
+ artwork/
45
+ folder.jpg
46
+ 01 - Artist - Title.jpg
47
+ audio/
48
+ 01 - Artist - Title (Version).flac
49
+ 02 - Artist - Title.mp3
50
+ ```
51
+
52
+ Naming rules:
53
+
54
+ - Prefix files with set order: `01`, `02`, `03`.
55
+ - Use `Artist - Title (Mix)` after the prefix.
56
+ - Sanitize `/`, `:`, shell metacharacters, and weird whitespace.
57
+ - Preserve original timestamp in tags/comments and manifest, not in filename.
58
+ - Keep source quality in manifest. Do not put `[YouTube]` in the DJ filename unless quality/source ambiguity matters.
59
+
60
+ ## Acquisition order
61
+
62
+ For each track:
63
+
64
+ 1. Search existing NAS/Plex library first. Reuse existing clean file if present.
65
+ 2. Search official stores/catalog pages for metadata confirmation.
66
+ 3. Search YouTube only after metadata is clear or when no store source exists.
67
+ 4. Prefer official artist/label uploads over user rips.
68
+ 5. Download best audio only when lawful/approved.
69
+ 6. If the track cannot be sourced confidently, create a manifest row with `status=missing` and continue.
70
+
71
+ ## Tool routing pitfall
72
+
73
+ `mtp-bot handle` is for one album/release at a time. Do not feed it a DJ playlist, crate brief, or natural-language list of artists. It can correctly classify that as not an album request and skip it.
74
+
75
+ For crates, parse the tracklist yourself into a manifest, then run per-track acquisition and verification. If you use the plain `mtp` album search path for a release, inspect ranking before adding: the one-shot album auto-pick historically ranked by seeds, not by archival quality. When the user asks for "biggest quality" or "FLAC as possible", prefer this order explicitly: true lossless format (`FLAC`, `WAV`, `ALAC`, `APE`, `WavPack`, `TTA`), then larger release size when it matches the release, then seeds/availability. Never present a lossy YouTube-to-FLAC conversion as real lossless.
76
+
77
+ ## YouTube search and download pattern
78
+
79
+ Use exact queries first:
80
+
81
+ ```bash
82
+ yt-dlp "ytsearch5:<artist> <title> <mix/version>" --dump-json --flat-playlist
83
+ ```
84
+
85
+ Pick using this priority:
86
+
87
+ 1. exact artist + exact title + exact mix/version
88
+ 2. official channel / label channel
89
+ 3. duration close to expected release duration, not the DJ-set timestamp segment
90
+ 4. audio quality / stable upload
91
+ 5. avoid live rips, radio rips, sped-up/slowed/reverb, AI covers, compilations, and low-effort reposts
92
+
93
+ Download pattern:
94
+
95
+ ```bash
96
+ yt-dlp -x --audio-format flac --audio-quality 0 \
97
+ --embed-thumbnail --convert-thumbnails jpg \
98
+ --add-metadata \
99
+ -o "staging/%(title).200B.%(ext)s" "<url>"
100
+ ```
101
+
102
+ If FLAC conversion is wasteful because source is lossy, keep high-quality MP3/M4A and record `source_lossy=true` in manifest. Do not pretend a YouTube FLAC is lossless.
103
+
104
+ ## Metadata repair
105
+
106
+ After every download, rewrite tags from the parsed/canonical metadata, not from uploader title:
107
+
108
+ Required tags:
109
+
110
+ - title
111
+ - artist
112
+ - albumartist = `Various Artists`
113
+ - album = `<Set Name>`
114
+ - tracknumber / tracktotal
115
+ - date/year if known
116
+ - genre = best broad crate genre, e.g. `Deep House`, `Disco House`, `Balearic`
117
+ - comment = `Crate: <Set Name>; Original timestamp: <timestamp>; Source: <url>`
118
+ - compilation = 1 where supported
119
+
120
+ Recommended DJ tags if tools are available:
121
+
122
+ - BPM
123
+ - initial key / Camelot key
124
+ - replaygain / loudness normalization metadata
125
+
126
+ Use `mutagen` for tag writes. Use `ffmpeg` only for conversion/extraction. Validate tags with `ffprobe` or `mutagen` before moving to NAS.
127
+
128
+ ## Cover art
129
+
130
+ Cover hierarchy:
131
+
132
+ 1. official release cover from MusicBrainz/Discogs/Bandcamp/store page
133
+ 2. label/artist upload thumbnail if official
134
+ 3. YouTube thumbnail only as fallback
135
+ 4. crate-level generated or neutral cover if no per-track cover exists
136
+
137
+ Save:
138
+
139
+ - embedded art in each audio file when format supports it
140
+ - `artwork/<track>.jpg`
141
+ - `folder.jpg` for the crate
142
+
143
+ ## Plex integration
144
+
145
+ After final files are copied to the NAS path:
146
+
147
+ 1. Fix permissions so Plex can traverse directories.
148
+ 2. Refresh the relevant Plex music section.
149
+ 3. Search Plex for every imported track and capture ratingKeys.
150
+ 4. Create a Plex audio playlist named `<Set Name> - DJ crate` using ratingKeys in set order.
151
+ 5. Verify playlist item count and order by reading back `/playlists/<id>/items`.
152
+ 6. Report missing/unmatched tracks separately. Do not call the crate done if Plex indexed only part of it.
153
+
154
+ Use `references/plex-playlist-creation.md` for the exact Plex API sequence.
155
+
156
+ ## Outputs to user
157
+
158
+ Return concise status:
159
+
160
+ - crate folder path
161
+ - Plex playlist name / ID
162
+ - total tracks requested
163
+ - imported count
164
+ - Plex-visible count
165
+ - missing/problem tracks
166
+ - source quality warning if any tracks came from lossy YouTube audio
167
+
168
+ Example:
169
+
170
+ ```text
171
+ Crate built: /volume1/music/DJ Crates/2026-07-04 - Deep House Set/audio
172
+ Plex playlist: Deep House Set - DJ crate, 27 tracks
173
+ Imported: 25/27
174
+ Plex visible: 25/25
175
+ Missing: 2 - exact source not found
176
+ Warning: 8 tracks came from YouTube lossy sources; fine for listening/practice, not archival.
177
+ ```
178
+
179
+ ## Verification rules
180
+
181
+ - A downloaded file is not enough. Verify tags, path, Plex visibility, and playlist order.
182
+ - A Plex refresh response is not enough. Read back playlist items.
183
+ - Do not overwrite existing clean library files. Copy/link them into the crate or reference them in M3U.
184
+ - Keep the manifest. It is the audit trail for where each track came from and why a track is missing.
@@ -0,0 +1,19 @@
1
+ # Duplicate torrent handling
2
+
3
+ Session note:
4
+ - The same magnet (`41bfeae4e4edb72b0e4acc1f816cf4c4914965f2`) was submitted repeatedly for The Chemical Brothers - *Push the Button*.
5
+ - Synology Download Station replied with `Duplicate torrent file`.
6
+ - Three task IDs showed the same failed magnet in `list_tasks`: `dbid_807`, `dbid_808`, `dbid_809`.
7
+
8
+ Retry-safe sequence:
9
+ 1. Call `list_tasks` first.
10
+ 2. Search by magnet hash / title.
11
+ 3. If the task already exists, do not add another copy.
12
+ 4. If the task is failed and duplicated, clean the stale entries before trying a fresh add.
13
+ 5. Re-run search with plain artist/album text only. Do not expose magnet URLs back to the user.
14
+
15
+ Session outcome:
16
+ - After cleanup, the only RuTracker hit for this album was topic `3296838`.
17
+ - There was no alternate source in the current index, so the retry used the same text-only release rather than inventing a fallback.
18
+
19
+ This is a Download Station state issue, not a Plex ingest issue.
@@ -0,0 +1,42 @@
1
+ # Manual album fallback: validation and NAS preflight
2
+
3
+ Use this only after the normal `mtp-bot` path has returned a real no-result/fallback outcome, or the user explicitly authorizes a manual recovery path.
4
+
5
+ ## 1. Derive the request and route correctly
6
+
7
+ - A bare `mtp` accompanying cover art is an album request. Read the cover, then confirm the canonical artist, release title, year, official track count, and expected track durations before acquiring anything.
8
+ - `mtp-bot handle` must receive the **originating Telegram chat ID**. For a group, that is the negative group ID from the inbound route, not the user ID and not the configured home-DM ID.
9
+ - Do not call `mtp-bot` with a naked image caption such as `mtp`; it has no album text to parse. After identification, use a clear album-shaped add request only if the workflow permits a resolved-image continuation.
10
+
11
+ ## 2. Preflight NAS while metadata is being confirmed
12
+
13
+ Read-only inspect the exact final parent path first. Verify:
14
+
15
+ ```bash
16
+ ssh <user>@<nas> "test -d '<final-parent>' && test -w '<final-parent>' && test -x '<final-parent>'"
17
+ ```
18
+
19
+ If the artist directory does not exist, verify the transfer account can create it **before** downloading the whole album. A read-only library is a blocker, not a signal to choose an arbitrary alternate directory. Ask the NAS owner for an album-scoped directory plus write/traverse access.
20
+
21
+ ## 3. Track-by-track YouTube staging
22
+
23
+ For every canonical track:
24
+
25
+ 1. Search separately; prefer an official audio upload.
26
+ 2. Reject live, remix, edit, video, and compilation variants unless the canonical release requires one.
27
+ 3. Check normalized title and source duration against the canonical duration before download.
28
+ 4. Tag *every* FLAC and embed the same verified cover art. Never skip tagging merely because a filename already exists—the process may have timed out between conversion and tagging.
29
+
30
+ ## 4. Decode and duration validation are mandatory
31
+
32
+ A successfully created `.flac` may still be truncated after a timeout/interruption. Before NAS transfer:
33
+
34
+ - decode every FLAC to null with FFmpeg (or use another installed lossless decoder);
35
+ - check exact file count, canonical tags, track numbering, and an embedded front-cover picture;
36
+ - compare each decoded duration with MusicBrainz/canonical duration using a tolerance appropriate to the source (normally ±12%; use a tighter bound when directly matching an official upload).
37
+
38
+ If any duration is implausibly short, replace that track from a verified source, re-tag it, and repeat the full per-track check. Do **not** transfer or refresh Plex until all tracks pass.
39
+
40
+ ## 5. Resume safely after interruption
41
+
42
+ Treat a process timeout as an incomplete transaction. Enumerate staged FLACs and validate their tags/art/durations, rather than treating `EXISTS` as success. Re-run idempotent tagging over the complete track set, then validate again.
@@ -0,0 +1,35 @@
1
+ # Cover-art driven identification and verification
2
+
3
+ Use this pattern when the user sends an image instead of a clean text release name.
4
+
5
+ ## What worked in this session
6
+
7
+ - The image was a viewer screenshot, not just artwork.
8
+ - Vision identified the release from cover text: `74 Miles Away - Gear Change`.
9
+ - The tracker exact search did not return a hit for the release title.
10
+ - `yt-dlp` search found the exact YouTube upload:
11
+ - `https://www.youtube.com/watch?v=KDwMTXynA4w`
12
+ - title: `74 Miles Away - Gear Change // Single`
13
+ - The shorter official clip also existed, but the longer `// Single` upload was the better audio source.
14
+
15
+ ## Verification sequence
16
+
17
+ 1. Use the image as primary evidence for the release name.
18
+ 2. Try tracker search on artist and title.
19
+ 3. If tracker search returns nothing, search YouTube exact title.
20
+ 4. Prefer the cleanest full upload over a short clip when both exist.
21
+ 5. Download audio, tag it, write cover art, copy to NAS, then refresh Plex.
22
+ 6. Verify in Plex with the music section search endpoint, not the generic search endpoint.
23
+
24
+ ## Plex check that succeeded
25
+
26
+ - Section search endpoint:
27
+ - `GET /library/sections/2/search?type=10&query=Gear%20Change`
28
+ - The returned track proved the import landed in Plex:
29
+ - track title: `Gear Change`
30
+ - artist: `74 Miles Away`
31
+ - file path: `/volume1/music/library/74 Miles Away/2013 - Gear Change - Single/01 Gear Change.flac`
32
+
33
+ ## Why this matters
34
+
35
+ Image-driven requests are easy to misread if you trust OCR or the user's prose too early. The right flow is image first, tracker second, YouTube fallback third, Plex verification last.
@@ -0,0 +1,19 @@
1
+ # Image-driven album identification and verification
2
+
3
+ Use this when the user gives an attached cover image, a misspelled album title, or only partial artist/release text.
4
+
5
+ ## Pattern
6
+ 1. Treat the image as primary evidence for identifying the release.
7
+ 2. Use text search only to confirm the likely album, not to override the cover art.
8
+ 3. After download/import, verify both:
9
+ - the final NAS folder exists and contains audio files
10
+ - Plex can see the album/track(s) after refresh
11
+ 4. If the album title is uncertain, report the exact release name you actually matched, not the user's misspelling.
12
+
13
+ ## Session example
14
+ - User wrote: "Paul McCrtney (newsest one)" and attached album art.
15
+ - The matched release was `Paul McCartney - The Boys of Dungeon Lane`.
16
+ - Verification succeeded only after checking the final folder and confirming Plex search results returned the album and tracks.
17
+
18
+ ## Why this matters
19
+ Text-only guesses are fragile on new releases and misspellings. Cover art plus post-import verification avoids adding the wrong release or reporting success before Plex has indexed it.
@@ -0,0 +1,22 @@
1
+ # Library repair: folder consolidation and malformed FLAC handling
2
+
3
+ Use this when repairing an existing music library, not just ingesting one album.
4
+
5
+ ## Pattern
6
+ - Normalize artist variants to a canonical display name before deciding folder placement.
7
+ - Apply the same canonical mapping while aggregating batch dominance and while comparing per-file tags.
8
+ - Treat punctuation-only splits as real drift if they create duplicate artist folders in Plex.
9
+ - Sanitize destination folder names before joining paths. `AC/DC` is display text, not a path separator.
10
+ - If a FLAC is malformed (`invalid FLAC header`, `sample rate not set`), skip it, record it, and keep the batch moving.
11
+ - Refresh Plex after files reach their final NAS paths, then refresh again after any later tag or folder rename.
12
+
13
+ ## Session-specific pitfalls observed
14
+ - Safe folder naming must convert `/` to `-` before moving trees.
15
+ - Canonical artist normalization fixed GYBE variants by collapsing them to `Godspeed You! Black Emperor`.
16
+ - The repair pass surfaced two bad Twin Peaks FLACs that should be quarantined or skipped rather than retried as metadata issues.
17
+ - Raw error logs are noisy. Default to concise status unless the user explicitly asks for debug output.
18
+
19
+ ## Verification
20
+ - Spot-check canonical artists that previously split: GYBE, AC/DC, i/dex.
21
+ - Verify one folder per canonical artist on disk.
22
+ - Refresh Plex and confirm the duplicate artist entries disappear after the next scan.
@@ -0,0 +1,11 @@
1
+ # Malformed FLAC fallback notes
2
+
3
+ Session takeaways for bulk music library tag repair:
4
+
5
+ - `ffmpeg` can fail on some legacy FLACs with `sample rate not set` or `invalid FLAC header`.
6
+ - Treat these as file-level salvage failures, not library-wide failures.
7
+ - Prefer `mutagen` for tag writes first. Only fall back to `ffmpeg` when a file is structurally writable.
8
+ - If a FLAC header is invalid, record the path, skip it, and continue the batch. Do not retry indefinitely.
9
+ - After successful writes, refresh Plex only once the files are in their final NAS path.
10
+
11
+ This is a session note, not a general claim about all FLAC files.
@@ -0,0 +1,39 @@
1
+ # Manual fallback: NAS transfer and Plex verification
2
+
3
+ Use after a fully tagged/cover-embedded album is staged locally and the standard bot workflow cannot complete the import.
4
+
5
+ ## 1. Write preflight
6
+
7
+ Inspect the canonical location first: use an existing album by the same artist as the layout guide. Test the **exact final album directory** with a create/remove probe using the same SSH account that will transfer. If its parent is root-owned, ask for an **album-scoped** directory/ACL repair; never change ownership recursively across the library.
8
+
9
+ ## 2. Transfer without fragile rsync assumptions
10
+
11
+ Some bundled macOS `rsync` builds lack newer flags such as `--info=progress2`, and a remote-shell rsync session can behave differently from a standalone SSH probe. If rsync is unsuitable, send the staged directory through a tar stream over SSH:
12
+
13
+ ```bash
14
+ /usr/bin/tar -C "$LOCAL_ALBUM" -cf - . | \
15
+ ssh -i "$SSH_KEY" -o BatchMode=yes "$SSH_USER@$SSH_HOST" \
16
+ "tar -C '$NAS_ALBUM' -xf -"
17
+ ```
18
+
19
+ On macOS, this can create `._*` AppleDouble sidecars on the NAS. Remove only those sidecars from the newly created target folder, then verify that the count of normal `*.flac` files equals the expected track count and that `cover.jpg` exists.
20
+
21
+ ```bash
22
+ ssh -i "$SSH_KEY" -o BatchMode=yes "$SSH_USER@$SSH_HOST" \
23
+ "find '$NAS_ALBUM' -maxdepth 1 -type f -name '._*' -delete; \
24
+ find '$NAS_ALBUM' -maxdepth 1 -type f -name '*.flac' ! -name '._*' | wc -l; \
25
+ test -f '$NAS_ALBUM/cover.jpg'"
26
+ ```
27
+
28
+ ## 3. Refresh and prove Plex visibility
29
+
30
+ Run a targeted refresh first, then a plain section refresh if needed:
31
+
32
+ ```bash
33
+ mtp refresh --path "$NAS_ALBUM"
34
+ mtp refresh
35
+ ```
36
+
37
+ The refresh response only proves Plex accepted the request. Poll the Plex API for the album and verify **album title, artist, year, and track count**. Plex album (`type=9`) metadata uses `parentTitle` for the artist; `grandparentTitle` may be empty. To prove track visibility, request `GET /library/metadata/<ratingKey>/children` and count its metadata entries.
38
+
39
+ Treat an album as complete only after the NAS file count and Plex track count agree with canonical metadata.
@@ -0,0 +1,21 @@
1
+ # mtp-bot bulk import state safety
2
+
3
+ ## Why bulk album requests must be serialized
4
+
5
+ `mtp-bot` is a chat-scoped state machine. A search that needs a numbered choice leaves the chat in `AWAITING_PICK`; a later request is not an independent request. Concurrent handler calls can therefore collide with or overwrite the intended conversational flow.
6
+
7
+ ## Safe procedure
8
+
9
+ 1. Identify the exact artist and release scope before starting (for example, core studio albums vs. live, compilation, collaboration, or solo records).
10
+ 2. Check for an existing picker/state in the destination chat before sending any batch item.
11
+ 3. If a picker exists, preserve it. Only send `cancel` after the user has explicitly authorized cancelling that specific stale request.
12
+ 4. Send exactly one `mtp-bot handle` request.
13
+ 5. Read its reply before the next request:
14
+ - **Accepted/downloading:** record it and proceed to the next album only if the handler has returned to idle.
15
+ - **Numbered picker:** stop and ask the requester to choose; never guess a number.
16
+ - **No results / skipped / malformed parse:** stop the batch. Diagnose the request parser or source integration; do not substitute direct `mtp` search/add commands or claim that an import started.
17
+ 6. Verify the final album only when it is in the library path and visible in Plex/Plexamp.
18
+
19
+ ## Parsing degradation signal
20
+
21
+ If an otherwise clear message is parsed with artist/album words incorrectly divided, the LLM parser may have fallen back to its simplistic token-splitting heuristic. Treat this as a bot integration issue, not a reason to send malformed variants repeatedly. Preserve the chat state and repair or route the parser before continuing.
@@ -0,0 +1,13 @@
1
+ # mtp subprocess wrapper pitfall
2
+
3
+ Session finding:
4
+ - The bot path can accidentally execute the globally installed `mtp` wrapper instead of the checked-out project code.
5
+ - That hid a valid NAS connection behind an old launcher that was not exercising the current tree.
6
+
7
+ Preferred invocation during development:
8
+ - Use `uv run python -m mtp.bot.cli handle "<message>" --chat <chat_id>` to exercise the repo checkout.
9
+ - In `mtp/bot/mtp_client.py`, subprocesses should call `sys.executable -m mtp ...` so child calls stay on the same environment as the parent process.
10
+
11
+ Verification:
12
+ - Confirm the target NAS endpoint with `curl` or a direct Python request before blaming the network.
13
+ - If `mtp-bot` selection still looks wrong, inspect which launcher is being used before assuming the DS API is down.
@@ -0,0 +1,38 @@
1
+ # Music note blurb order
2
+
3
+ Use this exact order for artist/album notes:
4
+
5
+ 1. Artist note
6
+ 2. Album note
7
+ 3. Optional one-line DJ-style summary
8
+
9
+ Style:
10
+ - Write in the lane of WFMU, LDBK / Radio Brussels, and serious classic underground radio: crate-digger intelligence, warm human enthusiasm, sly humour, and a little beautiful weirdness.
11
+ - This is an original radio-DJ voice, not an imitation of any one station or presenter. Never name-drop the style in the note itself.
12
+ - Make listeners feel an invitation to listen: sensory, curious, vivid, and slightly dangerous when the record demands it. Prefer concrete musical images over generic praise.
13
+ - Include juicy, source-backed facts: recording/release context, label and year, collaborators/producers, samples or scene connections when verified, unusual backstory, chart/cultural impact, and one or two specific listening details. Facts should create intrigue, not become a Wikipedia dump.
14
+ - Separate fact from interpretation. If a fact is uncertain or unsourced, omit it or say it is a claim; never invent samples, personnel, labels, dates, or anecdotes.
15
+ - Artist note: establish the artist's lane, history, sound, collaborators, and why this artist matters before discussing the particular album.
16
+ - Album note: give the release year/label, key players and context, then explain what to listen for and why the record still matters.
17
+ - End with an optional one-line DJ cue or listening invitation that is tactile and specific, not promotional copy.
18
+ - Avoid reusable AI-blurb phrases and generic metaphors such as “summer breeze,” “bright telescope,” “one sneaker on the pavement,” “the room needs colour,” “key document,” or “still sounds fresh.” If a sentence could describe twenty unrelated albums, rewrite it.
19
+ - Do not use a fixed artist-note → atmospheric-album-note → generic-DJ-cue template mechanically. Vary the opening: a scene, an odd fact, a collaborator, a production decision, a historical collision, a lyric-level observation, or a listener challenge.
20
+ - Every album note should contain at least two genuinely specific hooks: an unusual verified fact, a named musical relationship explained in context, a concrete production/sample detail, a scene or label connection, or a precise moment to listen for. Names alone are not facts.
21
+ - **Editorial attitude:** WFMU is not merely poetic wording. Make the note feel like a live, adventurous radio segment: playful, eccentric, conversational, anti-commercial, and happy to take a funny detour. Let the host sound delighted by the discovery. Use odd connections, affectionate mischief, sharp asides, mini cliffhangers, and unexpected turns when the facts support them.
22
+ - The prose may be lopsided, funny, slangy, or slightly unruly. It should sound like a person with a crate, a microphone, and genuine excitement—not a critic delivering a verdict or a label polishing a campaign.
23
+ - Facts should enter through personality: “Here’s the strange bit…”, “Listen for what happens after…”, “This is where the record gets gloriously sideways…” Use that energy without forcing these exact phrases every time.
24
+ - Ban commercial-review language and prestige fog: “sonic journey,” “immersive experience,” “genre-defining,” “landmark,” “timeless masterpiece,” “a testament to,” and similar claims unless directly quoted and necessary.
25
+ - Fun does not mean shallow. Keep the juicy verified facts, but let them trigger curiosity, jokes, and listener invitations rather than sit as a dry credits list.
26
+ - Before saving, perform a replaceability test: delete the album and artist names. If most of the note still works for another record, it is too generic and must be rewritten.
27
+
28
+ Recommended note structure in Obsidian:
29
+
30
+ ```md
31
+ # Artist - Album
32
+
33
+ ## Artist note
34
+ ...
35
+
36
+ ## Album note
37
+ ...
38
+ ```
@@ -0,0 +1,16 @@
1
+ # NAS import and Plex refresh note
2
+
3
+ Use this workflow when importing an album into the NAS music library and refreshing Plex afterwards.
4
+
5
+ ## What worked in this session
6
+ - Source can be a chaptered YouTube/vinyl rip when it contains a clean track breakdown.
7
+ - Inspect chapters first to confirm track count and titles before tagging.
8
+ - Stage files locally, tag them, then transfer to the NAS over SSH if direct writes to the library path are blocked by permissions.
9
+ - If the final library path is root-owned, use an interactive SSH `sudo` move on the NAS rather than trying to bypass permissions from the local machine.
10
+ - Expected destination pattern:
11
+ - `/volume1/music/library/<genre>/<Artist>/<Album (Year)>`
12
+ - After the move, refresh the Plex music section so the new album is indexed.
13
+ - Verify the remote album folder contains the expected track count before closing out.
14
+
15
+ ## Output preference
16
+ - Keep user-facing confirmation short. Do not dump command output unless the user asks for it.
@@ -0,0 +1,31 @@
1
+ # NAS library layout and write preflight
2
+
3
+ Use this before transferring a manually staged fallback album. Treat `nas_music` in app configuration as a storage root, **not proof of Plex's scanned folder layout**.
4
+
5
+ ## Preflight
6
+
7
+ 1. Inspect an existing album by the same artist when possible. This reveals the real Plex tree (for example, an artist-first `library/<Artist>/` layout rather than a proposed genre bucket).
8
+ 2. Check that the configured SSH account can create the target directory before staging a large fallback:
9
+
10
+ ```bash
11
+ ssh -i ~/.ssh/id_ed25519 -o BatchMode=yes <user>@<host> \
12
+ "test -d '<parent>' && test -w '<parent>' && printf WRITABLE"
13
+ ```
14
+
15
+ 3. If the artist folder exists but is not writable, do not silently place the album in an arbitrary writable genre folder. Keep the release staged and report the permission blocker.
16
+
17
+ ## Least-privilege repair
18
+
19
+ Have the NAS owner create **only the target album directory**, then grant the transfer account ownership. Avoid recursively changing ownership of the whole music library.
20
+
21
+ ```bash
22
+ sudo mkdir -p "/volume1/music/library/<Artist>/<Album> (<Year>)"
23
+ sudo chown -R <transfer-user>:users "/volume1/music/library/<Artist>/<Album> (<Year>)"
24
+ sudo chmod 755 "/volume1/music/library/<Artist>/<Album> (<Year>)"
25
+ ```
26
+
27
+ The `sudo` password must be entered by the NAS owner in an interactive shell; never ask them to paste it into chat. Afterward, transfer into that album-only directory, verify file count/cover/permissions, then run the Plex refresh.
28
+
29
+ ## Why it matters
30
+
31
+ A successful download and correct tags do not establish Plex readiness. A wrong scanned root or non-writable parent folder can make a genre-based transfer both inaccessible to Plex and inconsistent with the existing library.
@@ -0,0 +1,26 @@
1
+ # NAS permission repair and Plex traversal
2
+
3
+ Use when a staged album cannot be copied into the canonical Plex music library, or Plex is not indexing files after a successful copy.
4
+
5
+ ## Scope the repair narrowly
6
+
7
+ - Do **not** recursively `chown` the broad `/volume1/music` share just to enable one import.
8
+ - If the owner explicitly wants durable managed imports, grant ownership/write access at the configured Plex **library root** (for this environment, `/volume1/music/library`) only.
9
+ - Verify it with a real SSH probe: create a unique temporary directory, write a file inside it, remove both, then inspect ownership/mode.
10
+
11
+ ## Permissions to verify
12
+
13
+ 1. Managed import account can create an artist directory below the library root.
14
+ 2. Every parent from the Plex section root through `Artist/Album` is traversable by the Plex process. Use `755` for artist and album directories unless the Plex service group has been deliberately granted equivalent execute access.
15
+ 3. Do not infer traversal from file readability. A `770` artist directory can prevent scanning even though the account that transferred the FLACs can read the album.
16
+
17
+ ## Transfer fallback
18
+
19
+ If the NAS rsync implementation cannot support the desired safe flags or preservation semantics, stream the already-validated album using `tar` over SSH into the final directory. On macOS-originated sources, remove `._*` AppleDouble sidecars afterward and verify the exact FLAC count on NAS before triggering Plex refresh.
20
+
21
+ ## Plex evidence order
22
+
23
+ 1. Refresh the music section after permissions and copy are final.
24
+ 2. Query the Plex DB for `media_parts` at the final path.
25
+ 3. Read album metadata and track children through Plex API/DB; do not rely only on a fuzzy library-search query.
26
+ 4. Compare the returned track count and sequence with the canonical release tracklist.
@@ -0,0 +1,22 @@
1
+ # NAS routing and Plex refresh
2
+
3
+ Session takeaway:
4
+ - For albums that must land in a genre bucket, the final Plex path matters more than the download origin.
5
+ - If the intended genre bucket does not exist or cannot be written by the organizer, create a writable bucket first and move the album there instead of leaving it in `unsorted`.
6
+ - After moving files into the final NAS music folder, trigger a Plex music library refresh for the correct section.
7
+ - If tags are corrected after the move, refresh again. Plex refresh does not retroactively fix a wrong folder placement; it only re-indexes what is already on disk.
8
+
9
+ Case study from this session:
10
+ - Iron Maiden albums ended up in `/volume1/music/metal/Iron Maiden/...` after the metal bucket was made writable.
11
+ - A later metadata correction from `Pop` to `Heavy Metal` required another Plex refresh.
12
+
13
+ Reusable order of operations:
14
+ 1. Confirm the album's real tags.
15
+ 2. Ensure the target NAS bucket exists and is writable.
16
+ 3. Move the album into the final Plex-rooted path.
17
+ 4. Refresh Plex section 2.
18
+ 5. Verify PlexAmp can actually see the album after the refresh. If it cannot, re-check the on-disk path before assuming the scan succeeded.
19
+ 6. If tags changed, refresh Plex again.
20
+
21
+ Session note:
22
+ - In one follow-up, Plex was refreshed successfully but PlexAmp still showed nothing. The fix path was to re-verify the album's final library location instead of trusting the refresh alone.