@olegkoval/agent-skills 1.35.3 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +12 -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/claude/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
- package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
- package/adapters/codex/olko-creative/README.md +1 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/catalog/skills.json +33 -9
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
- package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
- package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
- package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
- package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
- package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
- package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
- package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
- package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
- package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
- package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
- package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
- package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
- package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
- package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
- package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
- package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/skills/lekker-review/README.md +60 -0
- package/plugins/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.html +204 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png +0 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.html +199 -0
- package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png +0 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
- package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
- 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/no-result-album-fallback.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Album fallback when `mtp-bot` has no release result
|
|
2
|
+
|
|
3
|
+
Use this only after the album handler returns an actual no-result outcome and the user has explicitly asked to continue the import. A bot/provider parsing or source-search failure is not a reason to end the job with a status report.
|
|
4
|
+
|
|
5
|
+
## Fail-closed, track-by-track fallback
|
|
6
|
+
|
|
7
|
+
1. Resolve an original official release in MusicBrainz. Record its release ID, release year, ordered tracks, and canonical durations.
|
|
8
|
+
2. Prefer separate source audio per track over a single full-album upload. This produces real track boundaries and avoids cumulative timing drift when an upload has missing/extra intro or outro seconds.
|
|
9
|
+
3. For each track, query using artist + track title + album. Accept a source only if:
|
|
10
|
+
- normalized source title contains the canonical track title;
|
|
11
|
+
- duration is plausibly close to the canonical duration;
|
|
12
|
+
- it is not visibly a video, remix, live take, or edit unless that is the canonical track.
|
|
13
|
+
Search normalization is only a first pass: canonical punctuation and wording often differ (`Parts` vs `Pts`, curly apostrophes, or ellipses). For a missed title, manually compare candidate title and MusicBrainz duration, record the chosen URL as an explicit override in the source manifest, then resume only the missing track — never relax the filter globally.
|
|
14
|
+
4. Resolve the canonical genre from MusicBrainz (or another authoritative release source) before final tagging. Convert, then tag every output with artist, album artist, album, title, release year, **genre**, track number/total, and MusicBrainz release ID. Embed a verified front-cover image in every FLAC. Use that same genre value to build the final Plex library path, so the tag and `Genre/Artist/Album (Year)` folder agree.
|
|
15
|
+
5. Verify the output file opens, has the required tags and embedded art, and is in the final artist/album folder structure before transfer.
|
|
16
|
+
6. Transfer to the NAS Plex root only when the NAS is reachable. Then refresh Plex, inspect the album/track count in Plex/Plexamp, and only then report completion.
|
|
17
|
+
|
|
18
|
+
## Full-album uploads
|
|
19
|
+
|
|
20
|
+
Only use a continuous full-album upload if individual tracks are unavailable. Split against a canonical cue/timing sheet, inspect boundaries with silence detection and waveform/listening checks, and do not rely on proportional timestamps alone. A duration mismatch between the upload and the canonical release is a red flag for a different master, gap structure, or intro/outro.
|
|
21
|
+
|
|
22
|
+
## Communication rule
|
|
23
|
+
|
|
24
|
+
Do not stop at “the source returned zero results” when the user has asked for the music. State the fallback being launched, make real progress, and distinguish:
|
|
25
|
+
|
|
26
|
+
- **staged locally** from
|
|
27
|
+
- **transferred to NAS** from
|
|
28
|
+
- **verified visible in Plex/Plexamp**.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Per-track album-art split
|
|
2
|
+
|
|
3
|
+
Use this when a DJ crate or batch import shows the same cover for every track, but each track actually belongs to a different release.
|
|
4
|
+
|
|
5
|
+
## Pattern
|
|
6
|
+
- If tracks are from different albums, do not try to force one shared album folder.
|
|
7
|
+
- Split files into one folder per release before Plex refresh.
|
|
8
|
+
- Keep embedded art on each file, but make the folder path match the release so Plex reads the right parent album.
|
|
9
|
+
- Refresh the Plex audio section only after the files are in their final per-album locations.
|
|
10
|
+
|
|
11
|
+
## Session note
|
|
12
|
+
In the Deep Lineage Set case, the tracks were moved from one staging folder into release-specific folders like `Washing Machine/`, `Altered States/`, and `Tourist/`, then Plex was refreshed. That was the right fix for the "same art for every track" symptom.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Plex playlist append and verification
|
|
2
|
+
|
|
3
|
+
Use this when a playlist already exists and needs more items added.
|
|
4
|
+
|
|
5
|
+
## What worked in this session
|
|
6
|
+
|
|
7
|
+
- Read the playlist shell first: `GET /playlists/{playlist_id}`.
|
|
8
|
+
- Read the current contents back with: `GET /playlists/{playlist_id}/items`.
|
|
9
|
+
- Append library tracks with: `PUT /playlists/{playlist_id}/items?uri=server://{machineIdentifier}/com.plexapp.plugins.library/library/metadata/{ratingKey}`.
|
|
10
|
+
- For multiple tracks, repeat the `uri` param once per item in the same request or loop one-by-one when order matters.
|
|
11
|
+
- Verify by reading back `leafCount` and the returned `Metadata` item list.
|
|
12
|
+
|
|
13
|
+
## Pitfalls
|
|
14
|
+
|
|
15
|
+
- A successful PUT response is not enough. Always confirm the playlist item list changed.
|
|
16
|
+
- If Plex returns a shell with `leafCount: 0`, do not assume creation failed. It may just need item appends.
|
|
17
|
+
- Use the Plex server's `machineIdentifier` from `/identity` when building `server://...` URIs for library items.
|
|
18
|
+
- If a requested track does not move the count, the add may have been a duplicate or the URI may be wrong. Re-read the item list before retrying.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Plex playlist creation from existing library tracks
|
|
2
|
+
|
|
3
|
+
Session finding:
|
|
4
|
+
- The Plex server accepted playlist creation through the standard library API, not through the app UI.
|
|
5
|
+
- Tracks can be resolved by section search using `type=10`, `title`, and `artist`, then referenced by `ratingKey`.
|
|
6
|
+
- Playlist creation used a `server://<machineIdentifier>/com.plexapp.plugins.library/library/metadata/<comma-separated ratingKeys>` URI.
|
|
7
|
+
|
|
8
|
+
Working sequence:
|
|
9
|
+
1. Read `/identity` with the Plex token to get `machineIdentifier`.
|
|
10
|
+
2. Search the music section for each track and capture the track `ratingKey`.
|
|
11
|
+
3. POST to `/playlists` with:
|
|
12
|
+
- `title=<playlist name>`
|
|
13
|
+
- `type=audio`
|
|
14
|
+
- `smart=0`
|
|
15
|
+
- `uri=server://<machineIdentifier>/com.plexapp.plugins.library/library/metadata/<ratingKey1>,<ratingKey2>,...`
|
|
16
|
+
4. Verify by GETting `/playlists/<id>/items` and checking leaf count / order.
|
|
17
|
+
|
|
18
|
+
Pitfalls:
|
|
19
|
+
- Track search can 400 if you use the wrong query shape. `type=10&title=...&artist=...` worked here.
|
|
20
|
+
- Do not assume `search?query=` works for music tracks.
|
|
21
|
+
- Verify the playlist contents after create, not just the create response.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Plex token source
|
|
2
|
+
|
|
3
|
+
Session note:
|
|
4
|
+
- Secrets (`PLEX_TOKEN`, `SYNO_USER/PASS`, `RUTRACKER_USER/PASS`, `TELEGRAM_BOT_TOKEN`)
|
|
5
|
+
live in `~/.config/music-to-plex/.env`, NOT in `config.toml`. `config.toml` holds
|
|
6
|
+
only non-secret structure (URLs, `music_section_id`, paths).
|
|
7
|
+
- `Config.load()` sources that `.env` automatically (via `load_env()`), so every
|
|
8
|
+
entrypoint — `mtp`, `mtp-bot`, `mtp doctor` — sees the token without the shell
|
|
9
|
+
having to `export` anything. If a check says "PLEX_TOKEN not set", the fix is the
|
|
10
|
+
`.env` file, not the shell env and not `config.toml`.
|
|
11
|
+
- Verify quickly with: `mtp doctor` (look for "PLEX_TOKEN set" and
|
|
12
|
+
"Plex reachable + token valid").
|
|
13
|
+
- Do not echo the token in chat or logs; use it only for local verification.
|
|
14
|
+
|
|
15
|
+
If the token is missing from `.env`, fetch it from the NAS Preferences.xml:
|
|
16
|
+
|
|
17
|
+
ssh beheerder@192.168.178.245 'grep -oE "PlexOnlineToken=\"[^\"]+" \
|
|
18
|
+
"/volume1/PlexMediaServer/AppData/Plex Media Server/Preferences.xml"'
|
|
19
|
+
|
|
20
|
+
then add `PLEX_TOKEN=<value>` to `~/.config/music-to-plex/.env`.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-visibility-check.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Plex visibility check when PlexAmp shows nothing
|
|
2
|
+
|
|
3
|
+
Use this when the album was supposedly imported, a refresh was triggered, but PlexAmp still returns no results.
|
|
4
|
+
|
|
5
|
+
## Check order
|
|
6
|
+
|
|
7
|
+
1. Verify the album is on the NAS in the final Plex-rooted music path, not a staging/download directory.
|
|
8
|
+
2. Verify the final folder name matches the canonical album/artist/year structure that Plex scans.
|
|
9
|
+
3. Refresh Plex *after* the files are in the final path.
|
|
10
|
+
4. Query Plex by track or album title and artist. If search size is 0, Plex has not indexed the content yet.
|
|
11
|
+
5. If the content exists on disk but Plex still sees 0 results, treat it as a path/layout problem first, not a rescan problem.
|
|
12
|
+
|
|
13
|
+
## Practical rule
|
|
14
|
+
|
|
15
|
+
A successful refresh is not proof of visibility. The only reliable proof is:
|
|
16
|
+
- audio files exist in the final library path, and
|
|
17
|
+
- Plex search returns matching tracks/albums.
|
|
18
|
+
|
|
19
|
+
Use Plex's own search endpoint with the album title and at least one track title. If the album appears but tracks do not, the folder landed but indexing is incomplete.
|
|
20
|
+
|
|
21
|
+
## Failure mode now covered
|
|
22
|
+
|
|
23
|
+
If Plex search stays at `size=0` after refresh and the scanner later crashes, treat the scanner crash as the root signal. Do not keep retagging or re-refreshing the album until the log or crash report explains why Plex never indexed it.
|
|
24
|
+
|
|
25
|
+
## Pitfalls from this session
|
|
26
|
+
|
|
27
|
+
- A root-owned `700` album folder blocked Plex traversal even though the files were present. Fix the directory to `755` before refresh so Plex can traverse it on first scan.
|
|
28
|
+
- An album folder existed on disk under the expected `Various Artists/...` tree, but Plex search still returned `size=0` for title and track queries until the final path was re-verified and refresh was repeated.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# DJ practice crate playlist notes
|
|
2
|
+
|
|
3
|
+
Session lesson:
|
|
4
|
+
- When the user says the playlist is for DJ practice, treat it as a **practice crate**, not a general listening set.
|
|
5
|
+
- Tighten the set by favoring steady, mix-friendly tracks over vibes alone.
|
|
6
|
+
|
|
7
|
+
Selection heuristics:
|
|
8
|
+
- Keep tracks with stable tempo and phrasing.
|
|
9
|
+
- Prefer long intros/outros, clean drum passages, and predictable transitions.
|
|
10
|
+
- Favor instrumental or sparse-vocal tracks for controller drills.
|
|
11
|
+
- Remove tracks that are too short, too busy, or better as listening-only picks.
|
|
12
|
+
|
|
13
|
+
Playlist update pattern:
|
|
14
|
+
- If an existing playlist has drifted, **replace/trim** it instead of only appending more tracks.
|
|
15
|
+
- After edits, verify final contents by reading back the Plex playlist items.
|
|
16
|
+
- For bulk adds/removals in Plex, use the playlist items endpoint and confirm the resulting leaf count.
|
|
17
|
+
|
|
18
|
+
This file is intentionally narrow and session-derived. The umbrella skill should stay class-level; use this reference for the exact practice-crate curation pattern.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Session note: Synology probe and mtp-bot mismatch
|
|
2
|
+
|
|
3
|
+
When `mtp-bot handle "add <album>"` reported `No route to host` against `192.168.178.245:5000`, direct network probes showed the NAS was reachable and the Synology API responded.
|
|
4
|
+
|
|
5
|
+
Observed checks:
|
|
6
|
+
- `curl http://192.168.178.245:5000/webapi/query.cgi?...` returned `{"success":true}` for `SYNO.API.Auth`.
|
|
7
|
+
- `/usr/bin/python3` socket connect to `192.168.178.245:5000` and `:5001` succeeded.
|
|
8
|
+
- `curl --cookie ~/.config/music-to-plex/cookies.txt https://rutracker.org/forum/dl.php?t=3296838` downloaded the torrent.
|
|
9
|
+
- Direct Synology API calls with `curl` succeeded and `task.cgi?method=create` returned `{"success":true}`.
|
|
10
|
+
- The created task showed up in Download Station as `dbid_806` with status `downloading`.
|
|
11
|
+
|
|
12
|
+
Takeaway:
|
|
13
|
+
- If the bot path fails but direct curl/API probes succeed, treat it as a bot runtime/context issue and verify the Synology call sequence with curl before changing album selection or torrent handling.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Torrent Stall & YouTube Fallback Pattern
|
|
2
|
+
|
|
3
|
+
**Context:** May 2026 session adding "Dexter Gordon — Go" to Plex revealed a reliability pattern in RuTracker sourcing.
|
|
4
|
+
|
|
5
|
+
## The Pattern
|
|
6
|
+
|
|
7
|
+
RuTracker torrent searches often succeed (find 5–10 versions), but the selected torrent may:
|
|
8
|
+
- Have low/stalled seeders
|
|
9
|
+
- Stall at 0% or low % for 5+ minutes
|
|
10
|
+
- Eventually timeout or fail silently
|
|
11
|
+
|
|
12
|
+
Rather than wait indefinitely, the workflow should detect stall within 5 minutes and pivot to YouTube + MP3.
|
|
13
|
+
|
|
14
|
+
## Dexter Gordon — Go (Case Study)
|
|
15
|
+
|
|
16
|
+
Search returned multiple FLAC versions:
|
|
17
|
+
- `[SACD-R][OF] Dexter Gordon – Go - 2010` (9 seeds, 1 GB)
|
|
18
|
+
- `[TR24][OF] Dexter Gordon - Go - 1962/2013` (8 seeds, 1 GB)
|
|
19
|
+
- `(Bop, Hard Bop) [CD] Dexter Gordon - Go! - 1962 (1989 Japan Edition), FLAC` (7 seeds, 254 MB) ← often a safe choice: smaller, older, established peers
|
|
20
|
+
- `[CD] Dexter Gordon - GO-RVG Edition - 1962 {1998 Blue Note RVG}` (5 seeds, 307 MB) ← audiophile remaster
|
|
21
|
+
|
|
22
|
+
**Watch for:** even 7–9 seeds may not mean fast peers. Seed count ≠ reachability.
|
|
23
|
+
|
|
24
|
+
## 5-Minute Timeout Rationale
|
|
25
|
+
|
|
26
|
+
- 30 seconds: too aggressive, may give up on legitimate slow starts
|
|
27
|
+
- 5 minutes: Oleg's preference — balances hope vs. pragmatism
|
|
28
|
+
- 10+ minutes: frustrating UX; YouTube is known-good
|
|
29
|
+
|
|
30
|
+
## YouTube Fallback Quality
|
|
31
|
+
|
|
32
|
+
When switching to YouTube, the skill currently:
|
|
33
|
+
1. Fetches full album via `yt-dlp`
|
|
34
|
+
2. Extracts audio to `.opus` or `.mp3`
|
|
35
|
+
3. Rewrites ID3 tags (artist, album, genre)
|
|
36
|
+
4. Moves to NAS via SSH
|
|
37
|
+
5. Refreshes Plex
|
|
38
|
+
|
|
39
|
+
Result: playable album in Plexamp. Quality is typically 128–320 kbps MP3 (YT limits). Not lossless, but reliable and fast.
|
|
40
|
+
|
|
41
|
+
## Detection & Automation (current behavior — June 2026)
|
|
42
|
+
|
|
43
|
+
This is now **automated and interactive**. The background notifier
|
|
44
|
+
(`mtp-notify`) polls `mtp status <task_id>` every 30s. If percent-done stays
|
|
45
|
+
flat for the stuck window (default 10 min; `stuck_timeout` in the chat-state
|
|
46
|
+
blob), it flips the chat to the `STUCK` state and posts a message with **four
|
|
47
|
+
numbered options** — it does NOT auto-pivot to YouTube:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
1️⃣ Wait 1 more hour
|
|
51
|
+
2️⃣ Wait N hours (asks how many)
|
|
52
|
+
3️⃣ Try the next release in the list ← deletes stuck task, auto-picks next by seeds
|
|
53
|
+
4️⃣ Grab it from YouTube in highest quality
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The user's reply (`1`–`4`, a count of hours, or "next"/"youtube") is passed
|
|
57
|
+
verbatim to `mtp-bot handle`, which routes it through the `STUCK` /
|
|
58
|
+
`STUCK_WAIT_INPUT` handlers in `mtp/bot/machine.py`. Option 4 returns the
|
|
59
|
+
`__YOUTUBE_FALLBACK__` signal that hands the YouTube acquisition to Hermes.
|
|
60
|
+
|
|
61
|
+
Operator choice is preserved by design — the user decides per-stall, rather than
|
|
62
|
+
the tool silently switching sources.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Verification and pitfalls
|
|
2
|
+
|
|
3
|
+
Session takeaway:
|
|
4
|
+
- The bot can print a successful download-start message even if the follow-up notification step fails.
|
|
5
|
+
- In this case, the started download later showed a local album folder at `/Volumes/home/downloads/Fear Of The Dark` containing the FLAC tracks.
|
|
6
|
+
- `mtp-notify` originally failed with `album required` because the bot passed `task_id` + `chat_id` and the notifier expected full metadata. The durable fix was to resolve `artist` and `album` from `~/.config/music-to-plex/bot-state.db` when they are omitted.
|
|
7
|
+
- The downloaded FLAC also had a bad `genre` tag (`Pop`), which can misroute the album during organize. Verify tags before moving anything into the Plex library.
|
|
8
|
+
|
|
9
|
+
Verification pattern:
|
|
10
|
+
1. Treat the bot's "Downloading ..." output as a start signal, not proof of completion.
|
|
11
|
+
2. Check the configured mount download directory for the album folder.
|
|
12
|
+
3. Confirm actual audio files exist inside the folder before telling the user the album is ready.
|
|
13
|
+
4. If the notification helper errors, report that separately from download state.
|
|
14
|
+
5. If tags look wrong, fix or override them before organize, otherwise Plex refresh will not correct the folder placement.
|
|
15
|
+
|
|
16
|
+
Known local path from this session:
|
|
17
|
+
- `/Volumes/home/downloads/Fear Of The Dark`
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# YouTube download fallback for music-to-plex
|
|
2
|
+
|
|
3
|
+
When a track rip fails with `HTTP Error 403: Forbidden` or `unable to download video data`, retry `yt-dlp` with a different YouTube client before abandoning the source.
|
|
4
|
+
|
|
5
|
+
## Proven retry order
|
|
6
|
+
|
|
7
|
+
1. Standard extraction.
|
|
8
|
+
2. Retry the same verified URL with `--extractor-args 'youtube:player_client=android'`.
|
|
9
|
+
3. If it still fails, use the next **already verified** candidate from the album source manifest (same canonical title and duration). Do not restart or discard the successfully staged tracks.
|
|
10
|
+
4. If no verified alternative remains, leave only that track unresolved and report the exact gap; do not fill it with an unverified remix, live take, or unrelated upload.
|
|
11
|
+
|
|
12
|
+
## Practical notes
|
|
13
|
+
|
|
14
|
+
- The Android client can surface working media URLs when the default client gets blocked.
|
|
15
|
+
- This is a retry pattern, not a guarantee. If it still 403s, stop burning time on the same URL.
|
|
16
|
+
- Keep the exact album folder and cover placement workflow separate from track acquisition. Cover art can usually be finalized even when the rip path is blocked.
|
|
17
|
+
- When the final import succeeds, remember to verify the NAS folder permissions too. A `700` directory owned by root can make Plex ignore the album even though the files download cleanly.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# YouTube full-album fallback salvage
|
|
2
|
+
|
|
3
|
+
Use this when RuTracker / Download Station fails and the only practical source is a YouTube full-album upload.
|
|
4
|
+
|
|
5
|
+
## Pattern observed
|
|
6
|
+
|
|
7
|
+
- `yt-dlp` can pull a clean album source, but uploader metadata is often garbage.
|
|
8
|
+
- Treat the first download as a source artifact, not Plex-ready media.
|
|
9
|
+
- Validate tags with `ffprobe` or `mutagen` before any organize step.
|
|
10
|
+
|
|
11
|
+
## Repair flow
|
|
12
|
+
|
|
13
|
+
1. Download the upload at highest audio quality.
|
|
14
|
+
2. Inspect embedded metadata immediately.
|
|
15
|
+
3. If the output is one long FLAC, split it into tracks using album track timings.
|
|
16
|
+
4. Retag each track with canonical artist, album, year, tracknumber, and tracktotal.
|
|
17
|
+
5. Embed official cover art, not the YouTube thumbnail.
|
|
18
|
+
6. Move the repaired album into the final NAS music path.
|
|
19
|
+
7. Refresh Plex only after the final path exists.
|
|
20
|
+
8. Verify the album appears in Plex search.
|
|
21
|
+
|
|
22
|
+
## NAS transfer workaround
|
|
23
|
+
|
|
24
|
+
When `rsync` or `scp` fights remote path quoting, use a tar pipe instead:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd /local/staging && tar -cf - *.flac | ssh user@nas 'cd "/volume1/music/.../Release" && tar -xf -'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If macOS leaves AppleDouble sidecar files on the NAS, remove `._*` before refresh.
|
|
31
|
+
|
|
32
|
+
## Session note
|
|
33
|
+
|
|
34
|
+
For `Ozzy Osbourne - Diary Of A Madman (1981)`, the fallback source was a YouTube full-album upload. The tracks were downloaded to FLAC, retagged, cover art embedded, copied into `/volume1/music/metal/Ozzy Osbourne/Diary Of A Madman (1981)`, AppleDouble files removed, and Plex refreshed with `mtp refresh --path`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# YouTube-only lineage playlist fallback
|
|
2
|
+
|
|
3
|
+
Use when the user wants a new DJ crate or playlist based on mood/lineage rather than a formal release request, and the intended path is YouTube track finding/downloading only.
|
|
4
|
+
|
|
5
|
+
## Trigger
|
|
6
|
+
|
|
7
|
+
- The user says things like "check this message and create new playlist" and provides lane/feeling language instead of a single album.
|
|
8
|
+
- The brief is built from references, influences, or lineage tags such as "classic deep house DNA", "modern disco/deep house revival", "jazzy/warm cuts", or a left-field closer.
|
|
9
|
+
- The task is explicitly on the YouTube branch, not a tracker or store purchase flow.
|
|
10
|
+
|
|
11
|
+
## Pattern
|
|
12
|
+
|
|
13
|
+
1. Convert the message into a small set of lanes first.
|
|
14
|
+
2. Pick 1-3 anchor artists or canonical tracks per lane.
|
|
15
|
+
3. Search exact titles with `yt-dlp`/YouTube query strings before broadening the search.
|
|
16
|
+
4. Prefer official or Topic uploads, then the cleanest stable upload with the closest duration and metadata match.
|
|
17
|
+
5. Assemble a local crate manifest, tracklist, and playlist file.
|
|
18
|
+
6. Verify the files exist and the playlist content matches the intended lane order.
|
|
19
|
+
|
|
20
|
+
## Curation notes
|
|
21
|
+
|
|
22
|
+
- Keep the middle of the set mix-friendly.
|
|
23
|
+
- Use the final lane for the emotional curveball or taste-flex closer.
|
|
24
|
+
- If the user explicitly says the branch is YouTube-only, do not route through tracker/search paths for acquisition.
|
|
25
|
+
- If Spotify or another catalog route is unavailable, skip it and continue with the YouTube branch instead of stalling.
|
|
26
|
+
|
|
27
|
+
## File outputs
|
|
28
|
+
|
|
29
|
+
- `00_MANIFEST.json`
|
|
30
|
+
- `00_TRACKLIST.md`
|
|
31
|
+
- `00_PLAYLIST.m3u8`
|
|
32
|
+
|
|
33
|
+
This reference is session-derived but the pattern is reusable for future YouTube-only crate builds.
|
package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# YouTube-first playlist import for MTP
|
|
2
|
+
|
|
3
|
+
Use this flow when the user gives a YouTube playlist URL or a plain track list and wants it landed in Plex.
|
|
4
|
+
|
|
5
|
+
## Input shapes
|
|
6
|
+
- Playlist URL
|
|
7
|
+
- Plain list of `Artist - Title` lines
|
|
8
|
+
|
|
9
|
+
If only a track list is provided, resolve each track on YouTube first, then download in album/sequence order.
|
|
10
|
+
|
|
11
|
+
## Download + staging
|
|
12
|
+
Use max-quality audio extraction and preserve ordering with explicit numbering:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
yt-dlp -x --audio-format flac --audio-quality 0 \
|
|
16
|
+
--write-thumbnail --convert-thumbnails jpg --embed-thumbnail \
|
|
17
|
+
--add-metadata \
|
|
18
|
+
-o "/tmp/mtp_youtube_crates/<crate>/work/raw/%(playlist_index)02d - %(title)s.%(ext)s" \
|
|
19
|
+
"<youtube-url>"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Notes:
|
|
23
|
+
- Keep a manifest with index, source URL, resolved artist/title, and final filename.
|
|
24
|
+
- For VA / DJ-style sets, keep track order stable even if metadata is messy.
|
|
25
|
+
- If a title needs cleanup, fix it in tags, not by renaming out of sequence.
|
|
26
|
+
|
|
27
|
+
## Import into Plex
|
|
28
|
+
- Copy the finalized files into the NAS import path that Plex scans for the music section.
|
|
29
|
+
- Trigger a library scan after the copy.
|
|
30
|
+
- Create a normal Plex playlist from the imported track rating keys in the exact source order.
|
|
31
|
+
|
|
32
|
+
## Verification
|
|
33
|
+
Prefer proof over assumptions:
|
|
34
|
+
- Check Plex scanner logs for `Added new metadata item` / `Loaded metadata for ...` on each track.
|
|
35
|
+
- Confirm the imported track by querying Plex search directly and inspecting the returned `ratingKey`, `title`, `originalTitle`, and `parentTitle`.
|
|
36
|
+
- For playlist verification, read the playlist back and enumerate items in order.
|
|
37
|
+
|
|
38
|
+
## Plex metadata quirks
|
|
39
|
+
- For compilation-style sets, Plex often shows `grandparentTitle=Various Artists`.
|
|
40
|
+
- The displayed `title` may be the track title, while `originalTitle` carries the artist.
|
|
41
|
+
- Search by both artist and title when matching imported tracks.
|
|
42
|
+
- If a search query misses a track, try the cleaned title and artist separately.
|
|
43
|
+
|
|
44
|
+
## Session-proven pattern
|
|
45
|
+
The Deep Lineage Set import worked by:
|
|
46
|
+
1. staging 8 FLAC tracks from YouTube,
|
|
47
|
+
2. copying the final files into a Plex-scanned NAS import directory,
|
|
48
|
+
3. refreshing Plex,
|
|
49
|
+
4. creating a playlist in the source order,
|
|
50
|
+
5. verifying all 8 items and their order.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# YouTube track resolution heuristics
|
|
2
|
+
|
|
3
|
+
Use this when a user gives a plain `Artist - Title` list and wants it turned into a Plex playlist.
|
|
4
|
+
|
|
5
|
+
## Search pattern
|
|
6
|
+
- Run `yt-dlp --flat-playlist --dump-json "ytsearch5:<artist> <title>"` for each line.
|
|
7
|
+
- Keep the source order from the user list. Never reorder by search result rank.
|
|
8
|
+
|
|
9
|
+
## Scoring
|
|
10
|
+
Prefer results with:
|
|
11
|
+
1. exact title match,
|
|
12
|
+
2. artist match in the channel/uploader name,
|
|
13
|
+
3. `Topic` channel or official upload,
|
|
14
|
+
4. clean metadata over remix/edit clutter.
|
|
15
|
+
|
|
16
|
+
## Pitfalls
|
|
17
|
+
- The first search hit is often wrong for house/disco catalog cuts.
|
|
18
|
+
- If the user only gives a vibe list and not a playlist name, derive a short title from the theme, then ask once before creating the Plex playlist.
|
|
19
|
+
- For compilation-style uploads, check both title and channel before deciding.
|
|
20
|
+
|
|
21
|
+
## Verification
|
|
22
|
+
- After download, confirm each track title still maps to the intended line.
|
|
23
|
+
- When building the Plex playlist, read it back and verify item order matches the source list.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Zero-track playlist recovery
|
|
2
|
+
|
|
3
|
+
Use this when Plex shows a playlist shell but the track list is empty or `0 tracks`.
|
|
4
|
+
|
|
5
|
+
## What it means
|
|
6
|
+
|
|
7
|
+
- The playlist object exists.
|
|
8
|
+
- The import likely failed to attach playable items, or the items have not been indexed yet.
|
|
9
|
+
- Do not treat the playlist as done until Plex returns leaf items.
|
|
10
|
+
|
|
11
|
+
## Recovery order
|
|
12
|
+
|
|
13
|
+
1. Read back the playlist with `GET /playlists/<id>/items`.
|
|
14
|
+
2. Confirm the returned leaf count matches the source track count.
|
|
15
|
+
3. Compare the returned order with the intended playlist order.
|
|
16
|
+
4. If the playlist is still empty, re-check the source track `ratingKey` list before trying another create.
|
|
17
|
+
5. If the UI says `0 tracks` but the API returns items, trust the API and let PlexAmp refresh.
|
|
18
|
+
|
|
19
|
+
## Rule
|
|
20
|
+
|
|
21
|
+
A playlist is only imported when the API read-back shows the expected number of items and order. The UI tile alone is not proof.
|
|
@@ -330,6 +330,50 @@ anchors. Apply your own judgment to every finding.
|
|
|
330
330
|
- Pre-existing code not touched by this diff
|
|
331
331
|
- Anything you are not confident about - omit rather than hedge
|
|
332
332
|
|
|
333
|
+
**Approval standard.** The verdict answers "does this definitely improve the
|
|
334
|
+
codebase's health", not "is this how I would have written it". Perfect code does
|
|
335
|
+
not exist. `✅ LGTM - ship it` is the right call for a change that improves
|
|
336
|
+
health and violates no hard rule, even with open Observations or Idiomatic
|
|
337
|
+
findings. Reserve `🚫 Needs work` for an unfixed Critical, a hard-rule
|
|
338
|
+
violation, or an Important finding that changes external behaviour or data
|
|
339
|
+
shape. Never manufacture a Critical to justify a verdict, and never block on
|
|
340
|
+
taste.
|
|
341
|
+
|
|
342
|
+
**PR sizing.** Judge how much a reviewer must hold at once, not the raw diff
|
|
343
|
+
count:
|
|
344
|
+
- Under ~300 changed lines, or larger but one logical change: no finding.
|
|
345
|
+
- Over ~800 changed lines spanning more than one logical change: `important`,
|
|
346
|
+
and name the split. Pick the strategy that fits - stack (sequential
|
|
347
|
+
dependencies), by file group (different reviewers), horizontal (shared code
|
|
348
|
+
and stubs first, then consumers), vertical (smaller full-stack slices).
|
|
349
|
+
- A diff that both refactors existing code and adds new behaviour: `important`
|
|
350
|
+
at any size. Those are two PRs, and bundling them hides the real change.
|
|
351
|
+
- A change that pushes a single file past ~1000 total lines with no
|
|
352
|
+
decomposition: `observation`. Ask for the extraction first, then the feature.
|
|
353
|
+
Exempt: whole-file deletions and mechanical or automated refactors, where the
|
|
354
|
+
reviewer verifies intent rather than every line.
|
|
355
|
+
|
|
356
|
+
**Verify the verification.** Read the PR body for the author's verification
|
|
357
|
+
story: which tests were run, whether the build passed, whether it was exercised
|
|
358
|
+
manually, screenshots for a UI change, a before/after for a behaviour or
|
|
359
|
+
performance change. A non-trivial PR whose body claims nothing about
|
|
360
|
+
verification is an `observation` naming the evidence that is missing. `CI: ✅
|
|
361
|
+
All passing` is not a verification story - it only says the suite that already
|
|
362
|
+
existed still runs.
|
|
363
|
+
|
|
364
|
+
**Rationalizations to reject.** If one of these is the reason a finding is about
|
|
365
|
+
to be dropped or softened, keep the finding:
|
|
366
|
+
|
|
367
|
+
| Rationalization | Reality |
|
|
368
|
+
|---|---|
|
|
369
|
+
| "The tests pass, so it's fine" | Tests do not catch architecture, security, or data-shape problems. |
|
|
370
|
+
| "It works, that's good enough" | Working code that is unreadable or insecure is debt that compounds. |
|
|
371
|
+
| "The refactor makes it cleaner" | Relocating complexity is not reducing it. Count the concepts a reader holds. |
|
|
372
|
+
| "It's only a small addition to this file" | Judge the resulting structure, not the diff size. |
|
|
373
|
+
| "It's just a version bump" | A bump is a behaviour change nobody in the PR wrote. |
|
|
374
|
+
| "They'll clean it up later" | Later does not come. Require it now, or require a ticket. |
|
|
375
|
+
| "An agent wrote it, so it's probably fine" | Generated code needs more scrutiny, not less: it is confident and plausible when wrong. |
|
|
376
|
+
|
|
333
377
|
**Idiomatic & Consistency exception:** the conventions agent raises non-blocking
|
|
334
378
|
suggestions ONLY when a concrete better pattern provably already exists in the
|
|
335
379
|
codebase. Never on taste alone. These land in their own section, not in
|
|
@@ -36,6 +36,24 @@ Axes to cover:
|
|
|
36
36
|
- No JavaScript files (TS-2): if the diff adds any `.js` file to a non-Liquid
|
|
37
37
|
theme repo, flag as Critical — must be `.ts`. Set `rule: "TS-2"` on the
|
|
38
38
|
finding.
|
|
39
|
+
- Dependency changes. Skip this axis entirely unless the diff touches
|
|
40
|
+
`package.json`, a lockfile, or a vendored dependency. Where it applies:
|
|
41
|
+
(a) A version bump is a behaviour change nobody in this PR wrote. If neither
|
|
42
|
+
the PR body nor a commit message cites the changelog or migration notes,
|
|
43
|
+
that is `important`: semver is a promise the maintainer may not have kept,
|
|
44
|
+
and a "patch" can carry a behavioural change.
|
|
45
|
+
(b) A bulk bump of several unrelated packages in one PR is `important`. When
|
|
46
|
+
it breaks the build you have lost which package did it. The `fix` is to
|
|
47
|
+
split it per package, or per genuinely related group.
|
|
48
|
+
(c) When the repository tracks a committed lockfile, a `package.json`
|
|
49
|
+
dependency change with no matching lockfile change in the same diff is
|
|
50
|
+
`critical`: the lockfile is what actually ships. A lockfile change with no
|
|
51
|
+
`package.json` change and no explanation is also `critical`. Do not require
|
|
52
|
+
a lockfile from a repository that intentionally does not commit one.
|
|
53
|
+
(d) A new direct dependency that duplicates something already in the stack is
|
|
54
|
+
`important`. Name the existing thing that already solves it.
|
|
55
|
+
Raise NO naming, comment, complexity, or hard-rule finding inside a lockfile
|
|
56
|
+
or a `node_modules` path.
|
|
39
57
|
|
|
40
58
|
Setting rule tags the finding as a house hard rule: it keeps its Critical
|
|
41
59
|
severity and skips adversarial verification. Only set it for a genuine
|
package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md
CHANGED
|
@@ -20,10 +20,39 @@ Look for:
|
|
|
20
20
|
anti-pattern (handler → service → repo with no logic in any layer).
|
|
21
21
|
- Feature flags always on/off, fallback that can never trigger, dual
|
|
22
22
|
implementations where old has no callers.
|
|
23
|
+
- Relocated complexity: a refactor that moves code without reducing the number
|
|
24
|
+
of concepts a reader must hold to follow it. Count them before and after, but
|
|
25
|
+
an unchanged count alone is not a finding. Flag only when the move leaves a
|
|
26
|
+
concrete residual coupling, duplication, branch, or bug-surface maintenance
|
|
27
|
+
risk, and name both that risk and the cheaper move available (deleting a
|
|
28
|
+
branch, a mode, or a layer outright, rather than re-centralising the same
|
|
29
|
+
logic). `important` when the PR is sold as a cleanup or refactor,
|
|
30
|
+
`observation` otherwise.
|
|
31
|
+
- Feature logic in a shared module: feature-specific behaviour added to a
|
|
32
|
+
general-purpose util, a shared client, or a base class. The branch belongs in
|
|
33
|
+
the package that owns the concept. Name the owning layer in the `fix`.
|
|
34
|
+
- Dead code this diff orphans: when the diff replaces or reroutes something,
|
|
35
|
+
grep the worktree for remaining callers of what it superseded (the old helper,
|
|
36
|
+
the old component, a now-unreferenced constant, a flag that can no longer be
|
|
37
|
+
false). Enumerate what is now unreachable. NEVER propose a silent deletion:
|
|
38
|
+
the `fix` lists the orphans and asks the author to confirm removal.
|
|
39
|
+
`observation`, or `important` when the dead path is still reachable from
|
|
40
|
+
production code. When WORKTREE_PATH is null in scan mode, do not infer absent
|
|
41
|
+
callers from the diff: mark orphan analysis unverified and request
|
|
42
|
+
worktree-backed verification instead.
|
|
23
43
|
|
|
24
44
|
Only flag where duplication or complexity creates a real maintenance risk or
|
|
25
45
|
bug surface — not aesthetic preference.
|
|
26
46
|
|
|
47
|
+
When you flag a structural problem, name the move, not just the smell: replace a
|
|
48
|
+
chain of conditionals with a typed model or an explicit dispatcher, collapse
|
|
49
|
+
duplicate branches into one flow, separate orchestration from business logic,
|
|
50
|
+
move feature logic into the package that owns it, reuse the canonical helper
|
|
51
|
+
instead of a near-duplicate, delete a pass-through wrapper. Prefer the remedy
|
|
52
|
+
that removes moving pieces over one that spreads the same complexity around. A
|
|
53
|
+
finding that says "this is complex" without naming the restructuring is not
|
|
54
|
+
actionable: name the move or drop the finding.
|
|
55
|
+
|
|
27
56
|
EXISTING_REVIEWS: read key "existingReviews" from CONTEXT_FILE (awareness only — skip findings already raised)
|
|
28
57
|
|
|
29
58
|
PROJECT_RULES to verify: read key "projectRules" from CONTEXT_FILE.
|
|
@@ -140,6 +140,36 @@ proof inline.>
|
|
|
140
140
|
|
|
141
141
|
---
|
|
142
142
|
|
|
143
|
+
## 📋 PR-level findings
|
|
144
|
+
|
|
145
|
+
PR-level findings have no single file:line. Render them with this dedicated
|
|
146
|
+
contract instead of demoting them to Observations because a location is absent:
|
|
147
|
+
|
|
148
|
+
For an `important` sizing finding:
|
|
149
|
+
|
|
150
|
+
### #N — Sizing
|
|
151
|
+
|
|
152
|
+
**Scope:** PR-level · **Severity:** Important
|
|
153
|
+
|
|
154
|
+
**Risk:** <why the PR cannot be reviewed safely as presented>
|
|
155
|
+
|
|
156
|
+
**Action:** <the recommended split and strategy>
|
|
157
|
+
|
|
158
|
+
For a missing verification story:
|
|
159
|
+
|
|
160
|
+
### Verification story — action required
|
|
161
|
+
|
|
162
|
+
**Missing evidence:** <tests run, manual exercise, screenshots for UI, or
|
|
163
|
+
before/after for behaviour or performance>
|
|
164
|
+
|
|
165
|
+
**Action:** <exactly what the author must add to the PR description>
|
|
166
|
+
|
|
167
|
+
An `important` sizing finding counts toward the Important total and continues
|
|
168
|
+
the finding-number sequence. Missing verification evidence is an explicit
|
|
169
|
+
action, not a no-action Observation.
|
|
170
|
+
|
|
171
|
+
*(Omit section entirely if empty.)*
|
|
172
|
+
|
|
143
173
|
## 📝 Observations
|
|
144
174
|
|
|
145
175
|
- <note — tradeoff, risk to watch, or design question worth raising>
|
|
@@ -6,5 +6,6 @@ Use the canonical skills directly:
|
|
|
6
6
|
|
|
7
7
|
- `plugins/olko-creative/skills/gallery/SKILL.md`
|
|
8
8
|
- `plugins/olko-creative/skills/fill-music-player/SKILL.md`
|
|
9
|
+
- `plugins/olko-creative/skills/music-to-plex/SKILL.md`
|
|
9
10
|
- `plugins/olko-creative/skills/vinted-listing/SKILL.md`
|
|
10
11
|
- `plugins/olko-creative/skills/wikipedia-uk-editor/SKILL.md`
|