Guarda cualquier playlist o álbum de Apple Music en una hoja de cálculo o una lista: título, artista, álbum, duración y enlace. Funciona en Windows, Mac, Linux y Chromebook con Apple Music para la web.
Funciona en Apple Music para la web (music.apple.com) en Windows, Mac, Linux y Chromebook. Abre la playlist y ejecuta el script.
// Responsive Muse · Apple Music Playlist Exporter · v1.0 · 2026-10-22
// Saves any Apple Music playlist or album you can open on music.apple.com (your own library
// playlists or public ones) to CSV or TXT: title, artist, album, duration and link. Useful to
// back up a playlist or move it to Spotify, YouTube Music or Tidal. Long playlists load while
// the script scrolls. It makes no network requests of its own and never reads cookies,
// passwords or tokens.
(async () => {
const TOOL = 'Exportar playlist de Apple Music';
const FORMAT = 'csv'; // 'csv' (Excel, Sheets, playlist converters) or 'txt' ("Artist - Title", one per line)
if (location.hostname !== 'music.apple.com' || !/\/(playlist|album|library)\b/.test(location.pathname)) {
alert('Abre primero una playlist en Apple Music para la web, por ejemplo:\nhttps://music.apple.com/library/playlists');
return;
}
// A small box on the page shows progress and asks before changing anything,
// so you never need to read or edit the console.
const many = (n, word) => `${n} ${n === 1 ? word : ({ canal: 'canales', 'canción': 'canciones', 'publicación': 'publicaciones', 'elemento guardado': 'elementos guardados' })[word] || word + 's'}`; // 1 vídeo, 2 vídeos
const panel = (() => {
const box = document.createElement('div');
box.style.cssText = 'position:fixed;right:16px;bottom:16px;z-index:2147483647;width:340px;max-width:calc(100vw - 32px);' +
'background:#111318;color:#e6e8ee;font:14px/1.5 system-ui,sans-serif;border-radius:12px;padding:16px;' +
'box-shadow:0 8px 30px rgba(0,0,0,.4);text-align:left';
const head = document.createElement('strong');
head.textContent = TOOL;
const msg = document.createElement('p');
msg.style.cssText = 'margin:8px 0 12px;white-space:pre-line';
const row = document.createElement('div');
row.style.cssText = 'display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end';
box.append(head, msg, row);
document.body.append(box);
const button = (label, primary, onClick) => {
const b = document.createElement('button');
b.textContent = label;
b.style.cssText = 'font:600 14px system-ui,sans-serif;padding:8px 14px;border-radius:8px;cursor:pointer;' +
(primary ? 'background:#0f766e;color:#fff;border:1px solid #0f766e' : 'background:none;color:#e6e8ee;border:1px solid #3a3f4b');
b.onclick = onClick;
row.append(b);
};
return {
text(t) { msg.textContent = t; },
ask(t, yes) {
msg.textContent = t;
row.replaceChildren();
return new Promise(r => {
button('Cancelar', false, () => { row.replaceChildren(); r(false); });
button(yes, true, () => { row.replaceChildren(); r(true); });
});
},
stoppable(onStop) { row.replaceChildren(); button('Parar', false, onStop); },
actions(t, list) {
msg.textContent = t;
row.replaceChildren();
list.forEach(([label, primary, run]) => button(label, primary, run));
},
finish(t) { this.actions(t, [['Cerrar', true, () => box.remove()]]); },
close() { box.remove(); },
};
})();
// Offer the result as a downloaded file or as clipboard text (a real click, so it always works)
const deliver = (summary, body, file) => {
const save = () => {
const a = document.createElement('a');
a.href = URL.createObjectURL(new Blob([/\.csv$/.test(file) ? '\ufeff' + body : body], { type: 'text/plain;charset=utf-8' }));
a.download = file;
a.click();
setTimeout(() => URL.revokeObjectURL(a.href), 5000);
panel.text(`${summary}\nGuardado como ${file} (mira tu carpeta de Descargas).`);
};
const copy = () => navigator.clipboard.writeText(body)
.then(() => panel.text(`${summary}\nCopiado. Pégalo en una hoja de cálculo o en una nota.`))
.catch(() => panel.text(`${summary}\nEl navegador ha bloqueado el portapapeles: usa Descargar.`));
panel.actions(summary, [['Cerrar', false, () => panel.close()], ['Copiar', false, copy], ['Descargar', true, save]]);
};
const sleep = ms => new Promise(r => setTimeout(r, ms));
const tracks = new Map();
// Apple Music scrolls an inner panel, not the window
const scroller = document.querySelector('#scrollable-page') || document.scrollingElement;
const text = (el, id) => (el.querySelector(`[data-testid="${id}"]`)?.textContent || '').replace(/\s+/g, ' ').trim();
// Read the songs currently on screen
const collect = () => {
for (const row of document.querySelectorAll('[data-testid="track-list-item"]')) {
const title = text(row, 'track-title');
if (!title) continue;
const link = row.querySelector('a[href*="/song/"], a[href*="?i="]');
const artist = text(row, 'track-title-by-line') || text(row, 'track-column-secondary');
const key = link?.href || title + '|' + artist;
if (tracks.has(key)) continue;
tracks.set(key, {
n: tracks.size + 1,
title,
artist,
album: text(row, 'track-column-tertiary'),
duration: text(row, 'track-duration'),
url: link?.href || '',
});
}
};
// 1. Scroll to the end, collecting as we go, until nothing new appears three times in a row
let stop = false;
panel.stoppable(() => { stop = true; });
scroller.scrollTo(0, 0);
await sleep(800);
let idle = 0;
while (idle < 3 && !stop) {
const before = tracks.size;
collect();
scroller.scrollBy(0, scroller.clientHeight * 0.8);
await sleep(1000);
idle = tracks.size === before ? idle + 1 : 0;
panel.text(`Recogiendo canciones… ${tracks.size}`);
}
const list = [...tracks.values()];
if (!list.length) {
panel.finish('No se han encontrado canciones. Puede que Apple Music haya cambiado su diseño: avísanos en responsive-muse.com.');
return 0;
}
// 2. Build the file and offer it
const cell = v => '"' + String(v).replace(/"/g, '""') + '"';
const body = FORMAT === 'txt'
? list.map(t => `${t.artist} - ${t.title}`).join('\n')
: ['#,Título,Artista,Álbum,Duración,URL', ...list.map(t =>
[t.n, t.title, t.artist, t.album, t.duration, t.url].map(cell).join(','))].join('\n');
const name = (document.title.replace(/^/, '').replace(/ - (Playlist|Album).*$/, '') || 'playlist').replace(/[\\/:*?"<>|]+/g, '_');
deliver(`${stop ? 'Parado antes de terminar. ' : ''}Listo: ${many(list.length, 'canción')}.`, body, `${name}.${FORMAT}`);
return list.length;
})();
Marcador: arrastra el botón del medio a tu barra de marcadores, abre music.apple.com y pulsa el marcador. Ejecuta el mismo script con las opciones de arriba.
- No envía nada a ningún sitio. Sin fetch, XHR ni scripts externos. La única actividad de red es la de music.apple.com cargando tu lista.
- No toca tu sesión. No lee cookies, contraseñas, tokens ni el almacenamiento del navegador.
- Solo funciona en music.apple.com. En cualquier otra web se detiene antes de hacer nada.
- Corto y legible. 130 líneas comentadas, sin minificar ni ofuscar.
- Muestra su progreso en la página. Un pequeño recuadro te dice qué está haciendo y al final te ofrece Descargar o Copiar.
- El mismo código para todos. SHA-256 de la versión por defecto:
7bbbd499ce93b2d7…
Compruébalo tú mismo en 30 segundos
- Léelo: todas las líneas están arriba, con comentarios.
- Busca en el código
fetch,XMLHttpRequest,cookie,localStorageoeval. No aparece ninguna. - Abre la pestaña Red (Network) antes de ejecutarlo: solo verás peticiones a music.apple.com.
Cómo usarlo
- Abre la playlist en music.apple.com (inicia sesión para las playlists de tu biblioteca; las públicas y los álbumes funcionan sin sesión).
- Abre la consola: F12 o Ctrl+Mayús+J (Cmd+Opción+J en Mac). Si Chrome te lo pide, escribe
permitir pegar(oallow pastingsi lo tienes en inglés) y pulsa Enter. - Elige las opciones, copia el script, pégalo en la consola y pulsa Enter. Al terminar aparece un recuadro: pulsa Descargar (o Copiar).
Pasarla a Spotify, YouTube Music o Tidal
Usa el CSV con un conversor de playlists que acepte archivos, o elige TXT para tener una línea Artista - Título por canción, el formato que entienden la mayoría de importadores de «pega tu lista».
Preguntas frecuentes
¿Apple Music no tiene botón de exportar?
Solo en la app Música del Mac (Archivo > Biblioteca > Exportar lista). En Windows, iPhone, Android y la web no hay ninguno; por eso existe este script.
¿Puedo pasar la playlist a Spotify o YouTube Music?
Sí. Expórtala en CSV e impórtala con un conversor de playlists, o usa el formato TXT («Artista - Título» por línea) y pégalo en uno.
¿Funciona con las playlists de mi biblioteca?
Sí. Inicia sesión en music.apple.com, abre la playlist desde tu biblioteca y ejecútalo. Las playlists largas se cargan mientras el script se desplaza.
¿Necesito suscripción a Apple Music?
No para playlists públicas y álbumes. Para las playlists de tu biblioteca necesitas iniciar sesión.
Más herramientas gratis
YouTube
8 herramientas- Vaciar Ver más tarde
- Anular todas las suscripciones
- Quitar todos los «me gusta»
- Exportar Ver más tarde
- Exportar publicaciones guardadas
- Borrar todos los comentarios
TikTok
1 herramienta- Exportar vídeos de un perfil
Amazon
2 herramientas- Exportar historial de pedidos
- Exportar lista de deseos
X / Twitter
3 herramientas- Exportar guardados
- Quitar todos los «me gusta»
- Borrar todos los guardados
Chats de IA
4 herramientas- Exportar chat de ChatGPT
- Exportar chat de Claude
- Exportar chat de Gemini
- Exportar hilo de Perplexity
Google Maps
1 herramienta- Exportar reseñas de Google Maps
Steam
1 herramienta- Exportar lista de deseados de Steam
Apple Music
1 herramienta- Exportar playlist de Apple Music
