@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.
- package/.github/copilot-instructions.md +1 -0
- package/.github/prompts/music-to-plex.prompt.md +251 -0
- package/.kiro/steering/music-to-plex.md +250 -0
- package/.windsurf/rules/music-to-plex.md +249 -0
- package/README.md +3 -2
- package/adapters/claude/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/claude/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/adapters/codex/olko-creative/README.md +1 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/catalog/skills.json +33 -9
- package/docs/versioning.md +4 -2
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
- package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
- package/scripts/lib/catalog.mjs +1 -1
package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/library-repair-folders.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md
ADDED
|
@@ -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
|
+
```
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md
ADDED
|
@@ -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.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md
ADDED
|
@@ -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.
|