Play Music from YouTube
by @whodidthese
Play music on YouTube via browser automation with playwright-cli. Use when the user wants to: (1) play a specific song (e.g. 'play Money Money Money by ABBA') (2) play songs by an artist as a playlist or mix (e.g. 'play Jay Chou's songs') (3) play genre or mood-based music (e.g. 'play relaxing spa music', 'play 60s Chinese oldies') (4) control playback β next, pause, resume, stop, skip ad, change song, close the player. Also handles song/artist name corrections from voice transcription erro
clawhub install my-play-music-from-ytπ About This Skill
name: my-play-music-from-yt description: | Play music on YouTube via browser automation with playwright-cli. Use when the user wants to: (1) play a specific song (e.g. 'play Money Money Money by ABBA') (2) play songs by an artist as a playlist or mix (e.g. 'play Jay Chou's songs') (3) play genre or mood-based music (e.g. 'play relaxing spa music', 'play 60s Chinese oldies') (4) control playback β next, pause, resume, stop, skip ad, change song, close the player. Also handles song/artist name corrections from voice transcription errors. allowed-tools: Bash(playwright-cli:*) metadata: {"openclaw": {"requires": {"bins": ["playwright-cli"]}, "emoji": "π΅"}}
Play Music from YouTube β Clear, Stable, High SNR Instruction Set
This skill controls a visible browser using playwright-cli to search and play YouTube music.
All actions follow snapshot β ref β action pattern. Never guess. Never assume.
CORE PRINCIPLES
1. Always use a named session
-s=music_player
Every command must include it.2. Always snapshot before interacting
playwright-cli -s=music_player snapshot
Never click/fill without fresh refs.3. Only use ref-based actions
click e123
fill e45 "text"
Never use CSS, XPaths, or assumptions.4. Browser must be visible
--headed
Use headed by default unless the user explicitly requests headless.5. Session continues in background
After playback begins, do not block waiting. Continue responding normally.6. Use persistent browser profile
--persistent
Always include --persistent when opening a new session. This saves the browser profile (cookies, localStorage, IndexedDB, cache) to disk, so login state survives session restarts.SNAPSHOT STORAGE
Snapshots generated by playwright-cli may exist in two possible locations:
1. $WORKSPACE/.playwright-cli/ β primary (search here first)
2. ~/.playwright-cli/ β fallback when the workspace folder is empty
Use only these two folders unless the user explicitly authorizes a broader search.
If no .yml snapshots appear here, it is almost always MacOS permission-related. Ask the user to run:
playwright-cli open https://www.youtube.com --headed
This will trigger macOS system dialogs for:
Approve all to enable snapshot generation.
> Note: On Windows and Linux, these permission dialogs do not apply. If snapshots are missing on those platforms, check that the browser launched correctly.
SESSION MANAGEMENT
Check whether the session exists
playwright-cli list
playwright-cli -s=music_player open https://www.youtube.com --headed --persistent
On any unexpected error, run playwright-cli list first to diagnose before retrying.
If the session is frozen or blank
playwright-cli -s=music_player goto https://www.youtube.com
This reliably resets the page without closing the session.SEARCH QUERY CONSTRUCTION
Build the search query based on user intent:
| Intent | Query pattern | Example |
|---|---|---|
| Specific song | [Artist] [Song Title] | ABBA Money Money Money |
| Artist playlist | [Artist] | ε¨ζ°ε« |
| Genre / mood | [descriptor] music playlist | relaxing spa music playlist |
| Era-based | [era] [language/genre] playlist | θ―θͺ 60年代 θζ playlist |
Search tips:
Voice transcription (ASR) and typo handling:
SEARCH WORKFLOW (HIGH SIGNAL, LOW AMBIGUITY)
Step 1 β Reset search state
A clean search state avoids dropdown obstruction.Perform the following every time before a new search:
1. Snapshot.
2. If button "Clear search query" / "ζΈ
ι€ζε°ζ₯θ©’" is present β click it.
3. Else press:
playwright-cli -s=music_player press Escape
4. If suggestions or overlays still block results β reset page:
playwright-cli -s=music_player goto https://www.youtube.com
Then snapshot again.Step 2 β Locate search bar
Snapshot β find:combobox "ζε°" orcombobox "Search"Record its ref (e.g., e34).
Step 3 β Perform search
playwright-cli -s=music_player fill "SEARCH TERM"
playwright-cli -s=music_player press Enter
Then snapshot immediately to avoid suggestion-panel obstruction.Step 4 β Choose best result
Select result based on user intent:
link whose heading matches the song title."Mix - [Artist]" links or playlist links for continuous playback.For guidance on identifying YouTube result types, see ./references/youtube-guide.md.
Important: Do NOT click channel cards (e.g. link "Artist Name ... @handleβ’NNNK subscribers ..." / "Artist Name ... @handleβ’NNNθ¬δ½θ¨ι±θ
..."). They navigate to the channel page, not music. Look for Mix or playlist results below them.
Click using its ref:
playwright-cli -s=music_player click eXYZ
If click is blocked:
1. press Escape
2. Retry click once.
3. If still blocked β goto https://www.youtube.com and restart from Step 1.
AD HANDLING LOOP
After clicking a result:
playwright-cli -s=music_player snapshot
Loop up to 4 iterations:1. Playback detected
If you see:button "Pause (k)" orbutton "Play (k)" (but video advancing)AND no ad indicators β playback is active β report song title to the user.
2. Skip button detected
Any element whose label contains:β click it immediately.
Note: If the skip button is [disabled] (countdown not yet elapsed), do NOT click it β wait ~5 seconds instead (see step 3).
Then snapshot again. YouTube often plays two consecutive ads β always check for a second ad after skipping.
3. Non-skippable ad / countdown
Wait 5 seconds:playwright-cli -s=music_player eval "await new Promise(r=>setTimeout(r,5000))"
Then snapshot again and repeat from step 1.If ads persist >20 seconds
PLAYBACK CONTROLS
Always snapshot first.| Command | Action |
|--------|--------|
| Pause | click button "Pause (k)" |
| Resume / Play | click button "Play (k)" |
| Next | press Shift+n |
| Previous | press Shift+p |
| Change song | Start new search from Step 1 |
| Stop | playwright-cli -s=music_player close |
Keyboard shortcuts (reliable alternative when button refs are hard to locate):
k β play / pause
Shift+n β next track
Shift+p β previous track
m β mute / unmute
f β fullscreen toggle
j β rewind 10s
l β forward 10s
Usage: playwright-cli -s=music_player press
ERROR RECOVERY & EDGE CASES
If snapshot empty or missing critical refs
playwright-cli -s=music_player goto https://www.youtube.com
β restart from Step 1.If browser crashes or session disappears
playwright-cli list shows no music_player.
Inform the user the browser was closed, then recreate session:
playwright-cli -s=music_player open https://www.youtube.com --headed --persistent
Because --persistent is used, the browser profile (including login state) is restored automatically. No need to log in again.YouTube cookie consent / sign-in dialogs
Snapshot β locate dismiss actions:Click dismiss.
YouTube Premium trial popup
Snapshot β look for"No thanks", "δΈη¨δΊοΌθ¬θ¬", or a dismiss/close button β click to dismiss.Video unavailable
Snapshot shows "Video unavailable" or similar error.playwright-cli -s=music_player go-back β snapshot β try the next result link.Cannot find elements in search results
playwright-cli -s=music_player press PageDown β snapshot again.Page frozen or blank
playwright-cli -s=music_player reload β snapshot.playwright-cli -s=music_player close β reopen and retry from Step 1.Persistent profile corrupted or login expired
If the browser opens but login state is lost, or YouTube forces re-authentication: 1. Inform the user they need to log in again in the browser. 2. After login, the persistent profile will be updated automatically.To completely reset the profile (last resort):
playwright-cli -s=music_player close
playwright-cli -s=music_player delete-data
playwright-cli -s=music_player open https://www.youtube.com --headed --persistent