esse é o código que o Codex gerou e rodou no meu navegador para criar uma playlist com bulk import do spotify
(async()=>{
const ids=["Tj6-fpVO9bQ","SEtc1B2W_kk","SV9KLYeeQ48","du-QXQOTSjM","6LiLxuqmcBw","OiXcvuTSb20","macwfRk36_U","QeL-hC-qpWY","ehLZ1AT8_WA","rQgypQyjukc","HFXQfEW5SxU","9wylfmSS8Qo","WOLpVeEB61I","mqNuNY0qaO4","zRlZsz9c02Q","y1VILRoIZWA","ZJ5VtHnoVOQ","VIJI58OHw4U","BBu58NDWN90","x--Njkhj3Oo","I0jubezBE5Q","MBh28_ND_hg","to2OdlJNF-I","6E91J6_hYr0","a8kE5LcMnWU","dW_q6FZSDO4","xUMkXtoU464","fCocSIdXEZg","V6l8Qv9opTU","v8oA00mC62I","u3nqdUOwmOY","B7etfx8hZt8","FZtxeSIeKsU","TVaoRNNg6-o","hbhdjmLi6jE","54ZmzR5NNZg","k15Pfu6Myf4","3NPxqXMZq7o","ANS6DNaz7es","pEo3v3_7ekk","LtPAl7M01IU","uxkJUpJSQg8","xngygo3EgyU","YGgSh7qppNY","jtUTW4sLJ9Q","IhVHFxA_u_E","nm6DO_7px1I","uuUP8RW0D78","JcW8VNwYvL0","YmLFlhQMDUQ","GpQvN0q8jUo","E1PY23P4UQo","Kszi7bqGsHg","WN-IhnU6v6c","YP1adYUGL3g","GAn9H6DNGSg","c-hd7U9C0Vo","CXJMdpzMfS8","ZPkH8ktv4zU","8Uwj8mkoEaE","FT--5iQA0GA","uHGSK424hxg","2hpnA6dQFwo","6LwSXRj-f_k","bft2cXsp99k","c18BejFiyl4","RkOeZxX7K5o","U_EOxEwbE4g","X-V-8ZtESvA","7WFsLEO6gBQ","4IlGI98epi4","pvPeSkDRKAE","ptjVx0XzZW0","Gz27-ct-CZk","Zvrvitx12Ng","7p6ISIzrIng","UHW3dcodbbw","SU4lUzPdLNs","Zse87KUaAMo","FbW4tJvVAdE","4X2xDRxX-dE","8HnzNY0epzE","5q_mzr1OOkc","pEpOk4d7LKE","JX3BM7yjRQ0","vRam9qfOsEk","_tO9T5Ni764","65Pza3Xc5io","PumNcnEKE7U","vtpGXMbhv60","zIBBEggIXBw","p6ozF0Y-PzU","cEo9feVESCM","XjrWgks36yI","urt3G5Yu1T4","sdE526W3jcM","xTZEb-8wOSo","LFt4x4cXMIQ","YeE-sI4nV-4","naD-bdveCJc","jhx6FTH9oDM","OO_5j2G6DBY","upN2ZIPmToQ","zj6pPWQbIYQ","nEuPueru76U","KM06kNihIJA","hpmKcZV_HWY","XiAhp3e9qYQ","6P-BX6D9As8","dGU12wmPzzs","Jmb_idQBBGQ","PWJQUwEUGdY","Fwj3hKtplmQ","5GGgWm1i4jQ","wHFsf7lKfQs","Ht8WpcoC1-g","LjPkf84IM_A","VLiXVvYm4to","6MpoO4iXAHM","YyBJqtjkPrQ","N3_8yBlTAZQ","8UVvhtsZ3Ls","JxCyKqOE8to","kPE_n-gKtWA","I5_5Tuh7RVo","UT3MJl0Xo-g","3iNFvEVlXLI","-2aShLYiEWA","yEtEyKHBymw","Oa2uBHaA0N8","5lq-zfWtY3Q","_OqQSfdC0Zo","Ng95x0OeBLs","tTB1sv1Q6xI","Khd0pzs6grM","o5vdFUxZeNs","r0ZepaoFHtU","nhGCdlRAd6g","gAbOWU8xzbI","35-hyeA5aEI","-EFChgVZUW4","aD6YlMaXH5Q","Q9QzjGhoq2Y","WvPL6cxiYow","HQ5uFCVG6eE","DmO-_veh2Sg","q5SgIWEos00","jNQRyviczts","ghv5iHYbLs4","i-IQUYmyZkY","xo6UEY4vbqc","CfM_fP05yDI","Qyj7j0FwAeU","BCFrN-mJrS8","dI9VreZBRkc","uxTH-lhomSo","tpi3yAa655k","O72z28EE2F0","Ro4PtNCLUm0","8eVwV3_ekE8","JgRFJyVxYi4","pnzhPantR1s","jpMhhsiE2pg","hQGG9qp50WM","WEgIbJ66Puc","0UfrG3c9M0M","s4CCFXJZoCI","ddKXNvojJqU","qMIzq8xPQGM","sxazo_Ndfvk","eM6Ufn83Doc","jTfCYgoNh6U","bherKr_wIIk","HPd-HIgt78s","zQyud9ENJrc","yxFllvdtDpI","kkNDHrRU31Y","Uj6Ulj4kU0M","5NqfJ6ittbI","fmllbRnd6RA","B-d3ILRV3mI","1Q38-uwa8WQ","XT6uJeOV7-A","nVRTaWqEhDo","i8eH4_2EMC0","ynD8Zl1qBPk","gNpqoMn3Qtc","SlH4Iz2Ly10","RC1uj76N7ic","OWA1cD30orc","dQ1GIaL4xik","81b0EkYR6DI","vPI6pYN6TE0","PSBxHeyZ-Ns","Uxe8sfd-ypE","uAQcFPJ1Fc0","mtPV6cTTK0I","FLCFs4JiKaE","hxjPN_iUiVY","IPx5IbLZ_ZI","_av2XQ7A8Ko","oL5s8Q37ivs","fS8bLadMUtQ","_hoKTHj-Qrw","MFoUIrqYXO0","9EcjWd-O4jI","iitJCe2-IFY","jiXdKVitp6o","1b0_xzEYr1s","tivROQOM1B8","Xk4EyD99qH8","YRBjH4RHOSg","qF9mbfwft0w","fR3_FI_vmaY","Fzf9IOo603s","l5qpWyxLfUo","sdZ6-wnv2PE","U51XWTW_JvE","XOz8FW9eWas","HbM-KCsoWGY","69UwpTw4PmU","cZgQhpI9sX4","wY0qDxksXm4","0ZTV24p0AfE","VuVJMIsY1CY","9UO06d9qsLQ","76GeDSYiUhQ","Avk-SPGLqM8","7n-NlLlkEjY","gy2rjEhdHgA","xv8YfapN37Q","iPNA9baCj2I","ud1DLU539IQ","ixHXd0_2I8k","iLYYna6C8DU","i-nXx-gODUY","P-tdCCcfziI","gjRLbzxz_3Y","87rJCXNLY_c","L9s9Erp3voQ","YZUPnIMMEs8","BGEghauwCQk","RICfWg2BMdU","5cywYseTel0","1issTkDfw4E","aRneKX0rGaE","EYiP2-VlbDs","DlgFuSbXEIY","C1tjdM40R_0","29tjEX-5Pcs","p9oi0xzOLYM","SjJ_S5RUwwE","4fu5BzTLpQw","dBrRBZy8OTs","DaKWDmxQxtw","hf5nxUYTD7Q","fkIz7LyGwmE","kivQQoFMPQw","BdC6HcSr_-M","ICf1eEUGqe8","OPWXD2g1F5k","C0BLKudnyNo","1ObMM3mbd3M","pDzuS05_zEM","ajUMhpotf8k","2Gq7HFROdXA","LfC699eHjD8","ezDxOH-NWe8","gNzNvEeguUk","S7lQter1cWI","ASTbQzDVAjE","uKeCPDqEuug","sRJtuVD7yrc","b6M-CXcoGE0","9DZCpaUP3uw","Ftub3WycfL8","VozPTt8rLt8","XF3pU_sBnmw","PAsTHF-WN_U","Otj9sbHwJUo","uMK_k0QcvjY","47PxVtpPxTk","ghULrkDvaU4","oIgKwj1AhmM","l2Xzk38OZAk","1WDhVpfVFlM","Hd1ABviZpH4","L_GFS1yhWhM","hV_wC3XM7qU","RhLi0b8O7F4","PBAuXmBUdGs","vo1ezP5kzKY","Z0bRHh3P6zM","bVxhpL--Ah0","2KB3HP8q_qY","CpUF3w_uwRk","Go7a55HRPAw","CP1Z2nnOuzU","L3FKRP4fCcM","PyvUlPT_5NI","Yi3lb-r9ZJY","fFixfIawHZw","6p8uQccFK-c","yxjX9auJe1o","snwodR5WO6M","U1Ndpf8jEgo","ngCMeuPUWw0","pgv_AtLxknA","jFOagY4oRg0","kxf_TedCDt8","-bnx_Qwy7w4","2DyLTjVcwaE","LV1IBWrXYEk","RGGsRcZyB64","F5cRjfSwqaY","Er9lxje-xmo","kd7grOn6Dak","ejoZp1rHlCA"];
const title='Tunes and Chat';
const box=document.getElementById('tc-yt-create')||document.createElement('pre');
box.id='tc-yt-create';
Object.assign(
box.style,{position:'fixed',zIndex:999999,top:'10px',right:'10px',width:'560px',maxHeight:'82vh',overflow:'auto',background:'#101010',color:'
#7CFF8C',padding:'12px',font:'12px monospace',whiteSpace:'pre-wrap',border:'1px solid #444',borderRadius:'6px'});
box.textContent=''; if(!box.parentNode) document.body.appendChild(box);
const log=s=>{box.textContent =s '\n';box.scrollTop=box.scrollHeight;document.title=s.slice(0,100);};
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
const cookie=n=>{const p=document.cookie.split('; ').find(x=>x.startsWith(n '=')); return p?decodeURIComponent(p.slice(n.length 1)):'';};
const hex=buf=>Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join('');
const authHeader=async()=>{const sid=cookie('SAPISID')||cookie('__Secure-1PAPISID')||cookie('__Secure-3PAPISID'); if(!sid) return null; const ts=Math.floor(
Date.now()/1000); const h=hex(await crypto.subtle.digest('SHA-1',new TextEncoder().encode(ts ' ' sid '
youtube.com'))); return 'SAPISIDHASH ' ts '_' h;};
try{
if(window.tcYTCreateRunning){log('YT_ALREADY_RUNNING');return;}
window.tcYTCreateRunning=true;
const key=ytcfg.get('INNERTUBE_API_KEY'), ctx=ytcfg.get('INNERTUBE_CONTEXT');
if(!key||!ctx) throw new Error('Missing ytcfg API key/context');
const headers={'content-type':'application/json','x-origin':'
youtube.com','x-youtube-client-name':String(ytcfg.get('INNERTUBE_CONTEXT_CLIENT_NAME')||1),'x-youtube-client-version':String(ytcfg.get('INNERTUBE_CLIENT_VERSION')||ctx.client?.clientVersion||''),'x-goog-authuser':String(ytcfg.get('SESSION_INDEX')||0)};
const auth=await authHeader(); if(auth) headers.authorization=auth;
const post=async(path,body)=>{
const r=await fetch(path '?key=' encodeURIComponent(key) '&prettyPrint=false',{method:'POST',credentials:'include',headers,body:JSON.stringify({context:ctx,...body})});
const text=await r.text(); let j; try{j=JSON.parse(text)}catch{j={raw:text}};
if(!r.ok) throw new Error(path ' ' r.status ' ' text.slice(0,700));
return j;
};
log('YT_CREATE_START unique videos ' ids.length);
const created=await post('/youtubei/v1/playlist/create',{title,description:'',privacyStatus:'PRIVATE'});
const playlistId=created.playlistId||created?.command?.playlistId||created?.playlist?.playlistId;
if(!playlistId) throw new Error('No playlistId ' JSON.stringify(created).slice(0,1000));
const url='
youtube.com/playlist?list=' …;
log('YT_CREATED ' url);
let added=0; const failed=[];
async function addChunk(chunk){
const actions=
chunk.map(id=>({action:'ACTION_ADD_VIDEO',addedVideoId:id}));
await post('/youtubei/v1/browse/edit_playlist',{playlistId,actions});
}
for(let i=0;i<ids.length;i =20){
const chunk=ids.slice(i,i 20);
try{await addChunk(chunk); added =chunk.length;}
catch(chunkErr){
log('YT_CHUNK_RETRY ' (i 1) '-' (i chunk.length) ' ' String(chunkErr.message||chunkErr).slice(0,160));
for(const id of chunk){
try{await addChunk([id]); added ;}
catch(e){failed.push({id,error:String(e.message||e).slice(0,220)}); log('YT_SKIP ' id ' ' failed[failed.length-1].error);}
await sleep(180);
}
}
log('YT_ADDED ' added '/' ids.length ' failed ' failed.length);
await sleep(500);
}
window.tcYTCreateRunning=false; window.tcYTResult={ok:true,playlistId,url,count:ids.length,added,failed};
log('YT_DONE added ' added '/' ids.length ' failed ' failed.length ' ' url);
}catch(e){window.tcYTCreateRunning=false; window.tcYTResult={ok:false,error:String(e&&e.stack||e)}; log('YT_ERR ' String(e&&e.stack||e).slice(0,2000));}
})();void 0