Skip to content

Instantly share code, notes, and snippets.

@BrianLincoln
Last active June 11, 2025 23:51
Show Gist options
  • Save BrianLincoln/982bd121c4414d89ff3785af93f65c7a to your computer and use it in GitHub Desktop.
Save BrianLincoln/982bd121c4414d89ff3785af93f65c7a to your computer and use it in GitHub Desktop.
YouTube Music Likes to Playlist

Copy Likes to a playlist in YouTube Music

This is a very hacky solution to copy Liked songs to a playlist since YTM still doesn't have the functionality. I'm using this to copy songs out of YTM to another service, then unsubscribing. Thus, I won't be maintaining it (or ever using it again). It will only work while the YTM interface is the same as it is today (3/6/21) and will break once they make updates.

Steps to use:

  1. Create a new playlist
  2. Go to your Likes page (in chrome, on a desktop or laptop). Scroll to the bottom so all songs are loaded
  3. Open Chrome's dev tools (F12 on windows), go to the console
  4. Paste the script below. Edit the first line, replace "YOUR_PLAYLIST_NAME" with your playlist's name
  5. Press enter

If it's working, you will see it log out the song titles and (1 of x).

let TARGET_PLAYLIST = "YOUR_PLAYLIST_NAME";

let songElements = document.querySelectorAll(
  "#contents > .ytmusic-playlist-shelf-renderer"
);
let addToPlaylistXpath = "//yt-formatted-string[text()='Add to playlist']";
let playlistXpath = `//yt-formatted-string[text()='${TARGET_PLAYLIST}']`;

function isHidden(element) {
  return element.offsetParent === null;
}

function waitForElementToDisplay(xpath, callback) {
  const timeout = 5000
  const checkFrequency = 30

  var startTimeInMs = Date.now();
  (function loopSearch() {
    const element = document.evaluate(
      xpath,
      document,
      null,
      XPathResult.FIRST_ORDERED_NODE_TYPE,
      null
    ).singleNodeValue;

    if (element && !isHidden(element)) {
      callback(element);
      return;
    } else {
      setTimeout(function () {
        if (timeout && Date.now() - startTimeInMs > timeout) return;
        loopSearch();
      }, checkFrequency);
    }
  })();
}

function copySong(songElement, index) {
  const dotsElement = songElement.querySelector("#button");
  const songTitle = songElement.querySelector(".yt-simple-endpoint").textContent;

  console.log(`Copying: ${songTitle} (${index} of ${songElements.length})`);

  // click dot action menu
  dotsElement.click();

  waitForElementToDisplay(addToPlaylistXpath, (addToPlaylistElement) => {
    // click "Add to playlist"
    addToPlaylistElement.click();

    waitForElementToDisplay(playlistXpath, (playlistElement) => {
      // click target playlist
      playlistElement.click();

      document.body.click();

      // call function again
      if (index <= songElements.length) {
        const nextIndex = index + 1;
        copySong(songElements[nextIndex], nextIndex);
      }
    });
  });
}

copySong(songElements[0], 0)
@FoxyRealm
Copy link

FoxyRealm commented May 1, 2025

hi ^^ for people in 2025, for the current UI I made this code using ChatGPT it should work for long as long as YTmusic doesn't change their layout
πŸ“ To Use:

Open the YouTube Music "Liked" page.

Hit F12, in the console page, paste the code, and press Enter.

Make sure to replace "YOUR_PLAYLIST_NAME" with your actual playlist name like "JazzMusicplaylist" (keep the quotes!).
and I suggest you don't put spaces in the name.


let TARGET_PLAYLIST = "YOUR_PLAYLIST_NAME"; // πŸ” Replace with your playlist name

let songElements = document.querySelectorAll("ytmusic-responsive-list-item-renderer");
let addToPlaylistXpath = "//yt-formatted-string[text()='Save to playlist']";

function isHidden(element) {
  return element.offsetParent === null;
}

function waitForElementToDisplay(xpath, callback) {
  const timeout = 10000;
  const checkFrequency = 100;
  const startTimeInMs = Date.now();

  (function loopSearch() {
    const element = document.evaluate(
      xpath,
      document,
      null,
      XPathResult.FIRST_ORDERED_NODE_TYPE,
      null
    ).singleNodeValue;

    if (element && !isHidden(element)) {
      callback(element);
    } else if (Date.now() - startTimeInMs < timeout) {
      setTimeout(loopSearch, checkFrequency);
    } else {
      console.warn("Element not found: " + xpath);
    }
  })();
}

function selectPlaylistAndAdd(songElement, index) {
  if (!songElement) {
    console.log("βœ… Done copying all songs.");
    return;
  }

  const dotsElement = songElement.querySelector("#button-shape");
  const songTitle = songElement.querySelector(".yt-simple-endpoint")?.textContent || "Unknown";

  if (!dotsElement) {
    console.warn(`⚠️ Could not find 3 dots. Skipping: ${songTitle}`);
    selectPlaylistAndAdd(songElements[index + 1], index + 1);
    return;
  }

  console.log(`🎡 Adding: ${songTitle} (${index + 1} of ${songElements.length})`);
  dotsElement.click();

  waitForElementToDisplay(addToPlaylistXpath, (addToPlaylistElement) => {
    console.log("Found 'Save to playlist' button.");
    setTimeout(() => {
      addToPlaylistElement.click();

      let playlistOptions = document.querySelectorAll("ytmusic-playlist-add-to-option-renderer");
      let targetPlaylistOption = null;

      for (let option of playlistOptions) {
        let playlistNameElement = option.querySelector("yt-formatted-string");
        console.log(`Checking playlist: ${playlistNameElement?.textContent}`);
        if (playlistNameElement && playlistNameElement.textContent === TARGET_PLAYLIST) {
          targetPlaylistOption = option;
          break;
        }
      }

      if (targetPlaylistOption) {
        console.log(`Found the playlist: ${TARGET_PLAYLIST}`);
        targetPlaylistOption.click();

        setTimeout(() => {
          document.body.click();
          setTimeout(() => {
            selectPlaylistAndAdd(songElements[index + 1], index + 1);
          }, 800);
        }, 500);
      } else {
        console.warn(`⚠️ Could not find playlist: ${TARGET_PLAYLIST}`);
      }
    }, 500);
  });
}

selectPlaylistAndAdd(songElements[0], 0);
js code

@williamdes
Copy link

You can use

```js
js code
```

to have a better code highlight

@as1164
Copy link

as1164 commented Jun 11, 2025

hi ^^ for people in 2025, for the current UI I made this code using ChatGPT it should work for long as long as YTmusic doesn't change their layout πŸ“ To Use:

Open the YouTube Music "Liked" page.

Hit F12, in the console page, paste the code, and press Enter.

Make sure to replace "YOUR_PLAYLIST_NAME" with your actual playlist name like "JazzMusicplaylist" (keep the quotes!). and I suggest you don't put spaces in the name.

This doesn't work. The "Save to Playlist" button is nested within the three dot menu in each song and the script can't find it. It also can't find a recently created playlist.

@as1164
Copy link

as1164 commented Jun 11, 2025

@Tom-Whi @Mrkas121 (sorry for tag)

Hey i found treasure

go to chrome.google.com/webstore/detail/multiselect-for-youtube/gpgbiinpmelaihndlegbgfkmnpofgfei/related Download , install , and eneble

go to the playlist , scroll to bottom , select all videos , three dots , save to playlist and done

This is 100% the correct answer. I still had to scroll all the way to the bottom, but my page didn't crash out

@FoxyRealm
Copy link

FoxyRealm commented Jun 11, 2025

@Tom-Whi @Mrkas121 (sorry for tag)
Hey i found treasure
go to chrome.google.com/webstore/detail/multiselect-for-youtube/gpgbiinpmelaihndlegbgfkmnpofgfei/related Download , install , and eneble
go to the playlist , scroll to bottom , select all videos , three dots , save to playlist and done

This is 100% the correct answer

Yooo that's amazing man thanks for sharing it ^^

btw the method that I shared was made to access the 3 dots menu and go through all that, but I guess thee keep changing something in the code which makes it impossible to keep that working lo

Anyways thanks again :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment