Google déteste que vous écoutiez YouTube gratuitement en arrière-plan. C'est comme ça depuis des années, et ça empire... Par exemple, vous verrouillez l'écran 2 secondes et pouf, plus de son.
YouTube Premium coûte dans les 13 balles par mois pour débloquer ça, ce qui fait quand même plus de 150 euros l'année juste pour écouter de la musique écran éteint. Heureusement, un dev français a trouvé une parade avec
Allformusic
, un site qui contourne le problème en utilisant l'API officielle de YouTube.
Le principe c'est que Allformusic est une sorte de jukebox géant qui tape directement dans le catalogue YouTube. Vous cherchez un artiste, un album, un genre... et ça lance la musique. Sans compte, sans pub et gratos ! Du coup, si vous voulez vous taper l'intégrale de Daft Punk un dimanche après-midi, vous tapez leur nom et c'est parti.
Et là où c'est malin, c'est que sur mobile, comme YouTube coupe le son dès que vous verrouillez l'écran (merci Google...), y'a une astuce simple à connaitre avec Alloformusic.
Vous lancez votre musique, vous verrouillez le téléphone, le son se coupe... normal. Sauf que le mini-lecteur natif du navigateur apparaît dans vos notifications. Appuyez alors sur Play depuis l'écran de verrouillage, et hop, la musique reprend en arrière-plan !
Par contre, attention si votre navigateur a un mode économie d'énergie agressif, ça peut couper au bout de 10-15 min. Dans ce cas, désactivez l'optimisation batterie pour Chrome dans les paramètres Android.
Le site fonctionne comme une PWA, une Progressive Web App, ce qui veut dire que vous pouvez l'ajouter sur votre smartphone comme une appli classique. Sur Android, direction le menu Chrome puis "Ajouter à l'écran d'accueil". Sur iPhone, c'est via Safari, le bouton partage, puis "Sur l'écran d'accueil".
Bruno, le créateur du site, confirme que ça tourne nickel sur Android. Côté iOS, c'est moins testé... perso, j'aurais tendance à dire que ça dépend de la version de Safari et de comment Apple gère la MediaSession API. À vérifier de votre côté.
Allformusic a l'avantage de passer par l'API officielle, du coup en théorie c'est moins susceptible de se faire dégager du jour au lendemain... mais bon, avec Google, on n'est jamais à l'abri.
Après, la qualité audio dépend de ce que YouTube balance, et sur certains titres c'est du 128 kbps donc clairement pas du FLAC hi-fi. Si vous êtes du genre à entendre la différence entre un MP3 et un vinyl, passez donc votre chemin. Mais si vous êtes comme et que c'est juste pour se mettre un fond sonore en cuisinant ou dans les transports, ça fait largement le taf.
Y'a pas non plus de mode hors-ligne, donc sans connexion c'est mort. Et vu que ça streame du YouTube, comptez une cinquantaine de Mo par heure en audio seul... à garder en tête si vous avez un forfait serré.
Le site propose aussi des sélections thématiques... Top du moment, Top soirée, et même un "Top Johnny" pour les fans du Taulier ^^. C'est un projet perso fait par un lecteur du blog passionné de code et de musique, donc ça mérite bien un petit coup de projecteur !
Bref, merci à Bruno pour le partage et encore bravo ! Si vous cherchez un moyen d'écouter de la musique en streaming sans prise de tête,
allformusic.fr
ça vaut le détour.
Vous savez ce qui est super vicieux avec Google Drive ?
C'est que les fichiers .gdoc, .gsheet et .gslides que vous voyez dans votre explorateur de fichiers et bien ce ne sont pas de VRAIS documents. Ce sont en fait des raccourcis JSON de quelques octets qui pointent vers les serveurs de Google. Essayez par exemple de les copier avec
FreeFileSync
... y'a rien dedans ! Vous pensez donc avoir une copie mais le jour où vous fermez votre compte Google, pouf, tout disparaît comme par magie !
Y'a bien sûr Takeout, l'outil officiel d'export de Google, mais cette merde ne résout pas vraiment le problème non plus, car il vous balance un zip géant de tout votre Drive sans garantie de conversion propre des Google Docs en fichiers exploitables. Et l'export manuel via Fichier > Télécharger > Word, quand vous avez des centaines de documents éparpillés dans des dizaines de dossiers... c'est pas trop une option quoi...
Voilà pour notre point petit point d'introduction sur cette situation ubuesque... ^^
Mais heureusement,
un lecteur du blog prénommé Jérémy
(ça me fait penser à la première saison de Beast Games... Argh !) a pondu
Export-GoogleShortcuts
, un script PowerShell (Windows, donc) qui règle ça en utilisant l'API officielle Google Drive. Le principe c'est qu'il parcourt vos dossiers, repère les raccourcis .gdoc/.gsheet/.gslides et les convertit automatiquement en .docx, .xlsx et .pptx. Les fichiers atterrissent alors au même endroit que les originaux, avec un suffixe _from_gdocs pour pas mélanger.
Côté mise en place, faut passer par la Google Cloud Console pour créer un petit projet, activer l'API Drive et générer des identifiants OAuth (l'éternel duo clé secrète + ID client). C'est un one-shot, vous le faites une fois et c'est réglé ! Ensuite, une commande PowerShell avec le chemin de votre Drive et vos identifiants, et ça mouline tout seul.
Le truc bien pensé c'est que le script gère les noms de fichiers foireux (caractères spéciaux que Windows digère mal) via une petite recherche mais par contre, attention, y'a une limite ! Hé oui, Google coupera la connexion si le fichier converti dépasse les 10 Mo environ. Donc vos grosses présentations de darons bourrées d'images HD, faudra les télécharger à la main via le navigateur. Après pour le reste, soit environ 95% des fichiers, ça passe sans broncher.
Voilà donc une bonne bidouille pour sortir des griffes de Google... Car oui, stocker ses docs chez Google c'est pratique... mais comme d'hab, le problème, arrive le jour où ça ne l'est plus. Que ce soit pour migrer vers un
NAS hébergé chez vous
, vers Nextcloud, ou juste pour récupérer une copie locale, ce script fait finalement très bien le boulot.
Et si la conversion de documents entre différents formats c'est votre truc,
Pandoc
reste un compagnon carrément solide pour tout ce qui est markdown, HTML, ODT ou EPUB.
Voilà, donc n'oubliez pas, vos données vous appartiennent... mais encore faudrait-il les extraire avant que Google ne vous mette une carotte !
Générer un signal VGA avec un microcontrôleur 8 bits PIC18 est un défi technique de taille. Ce projet Hackaday montre comment détourner les ressources limitées d'un processeur rudimentaire pour produire une image stable. Une petite plongée dans le bit-banging pur et dur.
Le défi du timing analogique
Le standard VGA impose une rigueur chronométrique absolue à celui qui s'y frotte. Pour obtenir une image stable, typiquement en 640x480 à 60 Hz, le contrôleur doit générer des signaux de synchronisation horizontale (H-sync) et verticale (V-sync) avec une précision de l'ordre de la microseconde. Sur une architecture PIC18 cadencée à quelques dizaines de mégahertz, chaque cycle d'instruction est précieux. L'astuce réside ici dans l'utilisation intelligente des timers internes et des interruptions prioritaires pour maintenir cette cadence sans aucune dérive temporelle, sous peine de voir l'image se désynchroniser immédiatement.
Un DAC rudimentaire pour les couleurs
Côté matériel, la solution retenue est ultra simple (si on peut dire). Pour transformer les sorties numériques binaires du microcontrôleur en signaux analogiques exploitables par un moniteur CRT ou LCD, l'auteur a implémenté une échelle de résistances, aussi appelée DAC R-2R. Ce montage passif permet de convertir des combinaisons de bits en niveaux de tension spécifiques pour les canaux Rouge, Vert et Bleu. C'est une approche classique en électronique "low-cost" qui permet d'obtenir une palette de couleurs certes limitée, mais parfaitement fonctionnelle pour de l'affichage de texte ou de graphismes simples.
L'art du bit-banging et des périphériques détournés
L'envoi des données de pixels vers l'écran nécessite une bande passante que le CPU seul peinerait à fournir en mode pur "bit-banging". Pour optimiser le processus, le développeur détourne souvent le module SPI ou le port série synchrone (MSSP) du PIC pour envoyer les octets de données à la vitesse de l'horloge système. Cela permet de déléguer une partie de la charge de travail au hardware interne et de libérer quelques cycles processeur pour gérer la logique d'affichage. C'est un équilibre précaire où la moindre latence logicielle se traduit par des pixels décalés ou des lignes de travers. Chaud donc.
Ce projet illustre bien l'adage selon lequel la contrainte stimule la créativité. Là où nous utilisons aujourd'hui des processeurs multi-cœurs pour la moindre interface, ce hack prouve qu'un vieux microcontrôleur 8 bits peut encore faire le job. C’est une leçon d'architecture informatique qui permet de comprendre concrètement comment l'information devient image. C'est aussi une forme de résistance face à la démesure logicielle actuelle.
Hé oui, cest chacals d'OpenAI ferment leur plateforme de vidéos IA, et franchement, ça me rend un peu triste. À vrai dire, même si c'était que de la vidéo générée à partir de prompts, moi je me marrais bien. C'était fun de regarder le produit de ses prompts mais aussi de regarder les conneries des autres. Les versions québécoises, aïe aïe aïe, c'était quelque chose quand même !
Mais bon, le plus urgent maintenant, c'est de sauvegarder vos vidéos avant que tout disparaisse. OpenAI n'a pas encore communiqué de date précise pour la coupure, juste un vague « on vous dira bientôt ». Du coup, autant ne pas traîner, parce que quand ce genre de service cloud ferme, en général c'est pas 6 mois de préavis qu'on vous file...
Depuis
la fuite du modèle
jusqu'à aujourd'hui, Sora aura fait parler de lui. Côté raisons, c'est Fidji Simo (la patronne de la division Applications) qui a lâché le morceau : ils éparpillent leurs efforts sur trop d'apps, d'API et de stacks serveur différents, et ça les ralentit. En gros, entre préparer une entrée en bourse pour fin 2026 et cramer du GPU H100 sur des vidéos de chats en IA, le choix est vite fait. L'équipe de recherche Sora, elle, continuera à bosser sur la simulation de mondes 3D... mais pour la robotique. Et le fameux deal à 1 milliard de dollars avec Disney pour des films et séries ? Pouf, magie magie, c'est envolé !!
Faut dire que les chiffres n'étaient pas glorieux non plus. Après un lancement en fanfare fin 2024 (et une app iOS lancée à l'automne 2025 qui avait cartonné dans les charts), les téléchargements sur l'App Store avaient plongé de 32% entre novembre et décembre 2025. La hype, ça dure qu'un temps.
Mais maintenant les gens, on passe aux choses sérieuses !
Sora Backup - le script qui sauve vos vidéos
Je n'avais absolument pas de temps aujourd'hui, mais j'ai quand même taffé pour vous développer un petit script JavaScript qui récupère TOUTES vos vidéos Sora d'un coup, avec les prompts et les métadonnées, et qui vous génère un joli ZIP prêt à archiver. Pas besoin d'installer quoi que ce soit, pas d'extension louche. Vous avez juste besoin d'être connecté à votre profil Sora et d'un navigateur.
Comment ça marche
Allez sur
sora.com
, connectez-vous à votre compte, puis ouvrez la console JavaScript de votre navigateur (F12 sur Chrome ou Firefox, onglet Console). Ensuite, glissez-déplacez ou collez le script ci-dessous dedans et appuyez sur Entrée.
Le script va automatiquement récupérer votre token d'authentification (pas besoin de le chercher vous-même), puis il va paginer sur votre profil Sora pour récupérer tous vos posts publiés. Pour chaque post, il extrait les vidéos attachées (MP4), les télécharge, et empaquette le tout dans un fichier ZIP directement dans votre navigateur.
Y'a même un fichier manifest.json dans le ZIP qui contient tous vos prompts, les dimensions, les durées, les permalinks, les dates de création... bref, tout ce qu'il faut pour retrouver vos petits. Le ZIP est généré en format STORE (pas compressé, parce que compresser du MP4 ça sert à rien), avec un calcul CRC32 maison et sans aucune librairie externe.
Le script complet
Voici le code à coller dans la console :
//==========================================================//SORABACKUP-Sauvegardecomplètevidéos+images+promptsparKorben//==========================================================//Usage:Ouvrirhttps://sora.com,F12>Console,collercescript//Lesfichierssonttéléchargésvialenavigateur(dossierDownloads)//Unfichiermanifest.jsonrécapituletout(prompts,metadata,URLs)//==========================================================(async()=>{//---MiniZIPbuilder(STORE,pasdelibexterne)---constcrc32table=newUint32Array(256);for(leti=0;i<256;i++){letc=i;for(letj=0;j<8;j++)c=(c&1)?(0xEDB88320^(c>>>1)):(c>>>1);crc32table[i]=c;}functioncrc32(buf){letc=0xFFFFFFFF;for(leti=0;i<buf.length;i++)c=crc32table[(c^buf[i])&0xFF]^(c>>>8);return(c^0xFFFFFFFF)>>>0;}constzipFiles=[];//{name,data(Uint8Array),crc,size}constPAGE_SIZE=50;constDELAY_MS=1500;constmanifest=[];lettotalDownloaded=0;lettotalErrors=0;//---Auth:récupérerleBearertoken---//OPTION1:Collertontokenici(Networktab>Authorizationheader)//OPTION2:Laisservide,lescripttenteradelerécupérerautoletAUTH_TOKEN='';asyncfunctiongetAuthToken(){if(AUTH_TOKEN)returnAUTH_TOKEN;//Auto-detect:endpointsessionChatGPTfor(constpathof['/api/auth/session','/backend-api/auth/session']){try{constr=awaitfetch(path,{credentials:'include'});if(r.ok){constjson=awaitr.json();if(json.accessToken){AUTH_TOKEN=json.accessToken;console.log(' 🔑 Token récupéré automatiquement');returnAUTH_TOKEN;}}}catch(e){}}//Fallback:demanderàl'utilisateurconstinput=prompt('Token non trouvé automatiquement.\n\n'+'Pour le récupérer :\n'+'1. F12 > onglet Réseau\n'+'2. Rafraîchis la page\n'+'3. Clique sur une requête /backend/...\n'+'4. Copie le header Authorization\n\n'+'Colle le token ici (Bearer eyJ...):');if(input){AUTH_TOKEN=input.replace(/^Bearer\s+/i,'').trim();returnAUTH_TOKEN;}console.error(' ❌ Pas de token. Annulation.');returnnull;}//---FetchAPIavecauth---asyncfunctionapiFetch(url){consttoken=awaitgetAuthToken();constheaders={};if(token)headers['Authorization']='Bearer '+token;//oai-device-idrequisparcertainsendpointsconstdeviceId=localStorage.getItem('oai-did')||'';if(deviceId)headers['oai-device-id']=deviceId;constresp=awaitfetch(url,{method:'GET',credentials:'include',headers});if(!resp.ok)thrownewError(`HTTP${resp.status}for${url}`);returnresp.json();}//---Paginationgénérique---asyncfunctionfetchAllPages(baseUrl,dataField='data',cursorParam='after',cursorField='last_id'){letallItems=[];letcursor='';letpage=0;while(true){leturl=baseUrl;if(cursor)url+=`&${cursorParam}=${cursor}`;console.log(`📄Page${++page}(${allItems.length}itemssofar)...`);constjson=awaitapiFetch(url);constitems=json[dataField];if(!Array.isArray(items)||items.length===0)break;allItems=allItems.concat(items);cursor=json[cursorField]||'';if(!json.has_more&&!cursor)break;awaitsleep(DELAY_MS);}returnallItems;}//Variantepourlesendpointsproject_y(cursor-based)asyncfunctionfetchAllPagesCursor(baseUrl){letallItems=[];letcursor='';letpage=0;while(true){leturl=baseUrl;if(cursor)url+=`&cursor=${cursor}`;console.log(`📄Page${++page}(${allItems.length}itemssofar)...`);constjson=awaitapiFetch(url);constitems=json.items;if(!Array.isArray(items)||items.length===0)break;allItems=allItems.concat(items);cursor=json.cursor||'';if(!cursor)break;awaitsleep(DELAY_MS);}returnallItems;}functionsleep(ms){returnnewPromise(r=>setTimeout(r,ms));}//---ExtraireURLdumédiadepuisunegeneration---functiongetMediaUrl(gen){returngen?.encodings?.source?.path||gen?.downloadable_url||gen?.url||'';}//---Extraireleprompt(peutêtredansactions,prompt,ouinput_text)---functiongetPrompt(item,gen){//Promptdirectif(gen?.prompt)returngen.prompt;if(item?.prompt)returnitem.prompt;if(item?.input_text)returnitem.input_text;//Storyboard:lesactionssontlesdescriptionsdesscènesif(item?.actions&&typeofitem.actions==='object'){returnObject.entries(item.actions).sort((a,b)=>Number(a[0])-Number(b[0])).map(([frame,desc])=>`[frame${frame}]${desc}`).join(' | ');}if(gen?.actions&&typeofgen.actions==='object'){returnObject.entries(gen.actions).sort((a,b)=>Number(a[0])-Number(b[0])).map(([frame,desc])=>`[frame${frame}]${desc}`).join(' | ');}return'';}//---DéroulerlesitemsduprofilSoraenitemsplats---functionflattenProfileItems(items){constflat=[];for(constitemofitems){constpost=item.post||item;constattachments=post.attachments||[];if(attachments.length===0)continue;for(constattofattachments){consturl=att.encodings?.source?.path||att.downloadable_url||att.url||'';if(!url)continue;flat.push({id:post.id||att.generation_id||'',generation_id:att.generation_id||'',task_id:att.task_id||'',title:att.title||post.discovery_phrase||'',prompt:post.text||'',emoji:post.emoji||'',type:att.generation_type||att.kind||'',width:att.width||0,height:att.height||0,duration_s:att.duration_s||0,is_public:!!post.posted_to_public,created_at:post.posted_at?newDate(post.posted_at*1000).toISOString():'',url:url,permalink:post.permalink||'',username:item.profile?.username||'',});}}returnflat;}//---Sanitizefilename---functionsanitize(name){returnname.replace(/[<>:"\/\\|?*\x00-\x1f]/g, '_').substring(0, 100);}//---AjouterunfichierauZIP---asyncfunctionaddToZip(url,filename){try{constresp=awaitfetch(url);if(!resp.ok)thrownewError(`HTTP${resp.status}`);constbuf=awaitresp.arrayBuffer();constdata=newUint8Array(buf);zipFiles.push({name:filename,data,crc:crc32(data),size:data.length});totalDownloaded++;returntrue;}catch(e){console.warn(`⚠️Erreur${filename}:`,e.message);totalErrors++;returnfalse;}}//---Déduirel'extension ---functiongetExt(url,type){if(!url)returntype==='video'?'.mp4':'.png';constm=url.match(/\.(mp4|webm|mov|png|jpg|jpeg|webp|gif)/i);returnm?'.'+m[1].toLowerCase():(type==='video'?'.mp4':'.png');}//==========================================================//MAIN//==========================================================constorigin=window.location.origin;console.log('🎬 SORA BACKUP - Démarrage');console.log('='.repeat(50));//1.MespostsSora(profil)console.log('\n📦 1/2 - Récupération de mes posts Sora...');letmyPosts=[];try{myPosts=awaitfetchAllPagesCursor(`${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=nf2`);console.log(`✅${myPosts.length}postsdeprofil`);//Debugpremieritemif(myPosts.length>0){constfirst=myPosts[0];console.log(' 🔍 Premier item - clés:',Object.keys(first).join(', '));console.log(' 🔍 URL:',first.url?.substring(0,80)||'none');console.log(' 🔍 DL:',first.downloadable_url?.substring(0,80)||'none');console.log(' 🔍 ENC:',first.encodings?.source?.path?.substring(0,80)||'none');console.log(' 🔍 GENS:',first.generations?.length||'none');console.log(' 🔍 TITLE:',first.title||'none');}}catch(e){console.warn(' ⚠️ profil failed:',e.message);}//2.MeslikessurSoraconsole.log('\n📦 2/2 - Récupération de mes likes Sora...');letmyLikes=[];try{myLikes=awaitfetchAllPagesCursor(`${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=appearances`);if(myCameos.length)console.log(`✅${myCameos.length}cameostrouvés`);}catch(e){}//---Déroulerlesgenerationsetdédupliquer---console.log('\n🔄 Extraction des vidéos...');constrawAll=[...myPosts,...myLikes];constflatItems=flattenProfileItems(rawAll);constseen=newSet();constallItems=[];for(constitemofflatItems){if(item.id&&seen.has(item.id))continue;//Filtrer:vidéosuniquementconstisVideo=item.type==='video_gen'||item.url.includes('/videos/')||item.url.includes('.mp4');if(!isVideo)continue;if(item.id)seen.add(item.id);allItems.push(item);}console.log(`📊Totalunique:${allItems.length}vidéosàtélécharger`);console.log('='.repeat(50));//---Construirelemanifestettélécharger---console.log('\n⬇️ Téléchargement en cours...');console.log('(Les fichiers arrivent dans ton dossier Downloads)');for(leti=0;i<allItems.length;i++){constmeta=allItems[i];consturl=meta.url;if(!url){console.log(`⏭️[${i+1}/${allItems.length}]${meta.id}-pasd'URL, skip`);meta.downloaded=false;manifest.push(meta);continue;}consttype=(meta.task_type==='image_gen'||url.match(/\.(png|jpg|jpeg|webp|gif)/i))?'image':'video';constext=getExt(url,type);constnameBase=meta.title?sanitize(meta.title):(meta.prompt?sanitize(meta.prompt.substring(0,60)):meta.id);constfilename=`sora_${String(i+1).padStart(4,'0')}_${nameBase}${ext}`;console.log(`⬇️[${i+1}/${allItems.length}]${filename}`);meta.filename=filename;meta.downloaded=awaitaddToZip(url,filename);manifest.push(meta);//Pauseentredownloadspourpassurchargerif(i<allItems.length-1)awaitsleep(800);}//---AjouterlemanifestauZIP---console.log('\n📝 Ajout du manifest au ZIP...');constmanifestData=newTextEncoder().encode(JSON.stringify(manifest,null,2));zipFiles.push({name:'manifest.json',data:manifestData,crc:crc32(manifestData),size:manifestData.length});//---GénérerleZIP(formatSTORE,pasdecompression)---console.log('\n📦 Génération du ZIP...');constenc=newTextEncoder();constblobParts=[];constcentralParts=[];letoffset=0;for(constfofzipFiles){constnameBytes=enc.encode(f.name);//Localfileheader(30bytes+name)constlh=newArrayBuffer(30);constlv=newDataView(lh);lv.setUint32(0,0x04034b50,true);lv.setUint16(4,20,true);lv.setUint16(8,0,true);//STORElv.setUint32(14,f.crc,true);lv.setUint32(18,f.size,true);lv.setUint32(22,f.size,true);lv.setUint16(26,nameBytes.length,true);blobParts.push(newUint8Array(lh),nameBytes,f.data);//Centraldirectoryentry(46bytes+name)constch=newArrayBuffer(46);constcv=newDataView(ch);cv.setUint32(0,0x02014b50,true);cv.setUint16(4,20,true);cv.setUint16(6,20,true);cv.setUint16(10,0,true);//STOREcv.setUint32(16,f.crc,true);cv.setUint32(20,f.size,true);cv.setUint32(24,f.size,true);cv.setUint16(28,nameBytes.length,true);cv.setUint32(42,offset,true);centralParts.push(newUint8Array(ch),nameBytes);offset+=30+nameBytes.length+f.size;}constcentralSize=centralParts.reduce((s,p)=>s+p.length,0);consteocd=newArrayBuffer(22);constev=newDataView(eocd);ev.setUint32(0,0x06054b50,true);ev.setUint16(8,zipFiles.length,true);ev.setUint16(10,zipFiles.length,true);ev.setUint32(12,centralSize,true);ev.setUint32(16,offset,true);constzipBlob=newBlob([...blobParts,...centralParts,newUint8Array(eocd)],{type:'application/zip'});constzipName=`sora_backup_${newDate().toISOString().split('T')[0]}.zip`;consta=document.createElement('a');a.href=URL.createObjectURL(zipBlob);a.download=zipName;document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(a.href);//---Résumé---constsizeMB=(zipBlob.size/1024/1024).toFixed(1);console.log('\n'+'='.repeat(50));console.log('🎬 SORA BACKUP TERMINÉ');console.log(`✅VidéosdansleZIP:${totalDownloaded}`);console.log(`❌Erreurs:${totalErrors}`);console.log(`📦Fichier:${zipName}(${sizeMB}MB)`);console.log(`📝manifest.jsoninclusdansleZIP`);console.log('='.repeat(50));})();
Quelques précisions
Si le token n'est pas récupéré automatiquement (ça peut arriver selon votre config), le script vous demandera de le coller manuellement. Pour le trouver, c'est simple : F12 > onglet Réseau > rafraîchissez la page > cliquez sur n'importe quelle requête vers /backend/... > copiez le header Authorization.
D'ailleurs, si la vidéo IA vous branche toujours,
Higgsfield
propose des séries entièrement générées par IA. C'est pas la même approche que Sora, mais c'est un signe que la vidéo IA ne meurt pas avec la fermeture d'un seul service.
Bon, bref, c'est la fin d'un truc sympa. Moi je préférais largement scroller sur Sora que d'aller sur TikTok ou Instagram parce qu'au moins c'était drôle !
Merci à mes
Patreons
qui me permettent de prendre le temps de développer ce genre de petits outils pour vous. Sans eux, j'aurais jamais pu me poser une après-midi pour coder ça.
Un développeur vietnamien a trouvé le moyen de faire fonctionner du code Arduino sur un microcontrôleur 8051, une architecture conçue par Intel en 1980.
L'astuce repose sur un émulateur RISC-V intégré directement dans la puce, et le tout est disponible en open source sur GitHub.
Une puce de 45 ans qui refuse de mourir
Le 8051, c'est un microcontrôleur 8 bits qu'Intel a conçu en 1980. L'anecdote veut que son architecture ait été dessinée en un week-end par l'ingénieur John Wharton.
Depuis, Intel a vendu plus de 100 millions d'unités rien que sur la première décennie, et des variantes compatibles sont encore produites et utilisées un peu partout, des souris d'ordinateur aux puces Bluetooth.
La version ciblée ici, c'est le STC8H8K64U, un dérivé moderne fabriqué par le chinois STC Micro. Il coûte moins d'un dollar et reste populaire en Asie, mais les outils de développement modernes ne le prennent pas en charge. D'où l'idée du projet.
Un émulateur RISC-V dans un 8051
Bùi Trịnh Thế Viên n'a pas cherché à porter le compilateur Arduino directement sur l'architecture 8051, ce qui aurait été un chantier monstre.
Il a opté pour une approche détournée : intégrer un émulateur RISC-V (appelé rv51, écrit en assembleur 8051 par un autre développeur, cyrozap) dans la puce STC8. Le code Arduino est compilé pour RISC-V, puis exécuté via cet émulateur.
Le projet est disponible sur GitHub sous le nom STC_Arduino_Core.
Des limites assumées
L'émulation a un coût. L'émulateur consomme 8 Ko de mémoire flash sur la puce, et la vitesse d'exécution est divisée par 100 à 1 000 par rapport au code natif. Pour le code qui demande du temps réel, comme la gestion des interruptions, il faut repasser sur de l'assembleur 8051 classique.
Et puis il faut le dire, des microcontrôleurs RISC-V natifs existent et coûtent à peine plus cher. Le projet reste donc un exercice technique et pédagogique, pas une solution de production.
C'est le genre de bidouille qui fait sourire. Faire tourner du code Arduino sur une architecture de 1980 via un émulateur RISC-V coincé dans 8 Ko, il fallait quand même y penser.
Bon par contre, on ne va pas se raconter d'histoires, en pratique ça n'a pas beaucoup d'intérêt face à un vrai microcontrôleur RISC-V à 2 euros. Mais l'exercice a le mérite de prouver que le 8051 a encore de la ressource, 45 ans après sa création.
Un bricoleur a assemblé un petit montage à base d'ATtiny85 qui joue automatiquement au jeu du dinosaure caché dans Google Chrome. Le tout pour moins de 10 euros de composants et avec un microcontrôleur pas plus grand qu'un pouce.
Deux capteurs et un microcontrôleur, c'est tout
Le projet est signé Albert David, et le principe est assez malin. Une carte Digispark ATtiny85, qui coûte entre 2 et 5 euros, est branchée en USB sur un PC et se fait passer pour un clavier grâce au protocole HID. Pour le reste, vous avez deux modules LM393 photorésistants qui sont collés directement sur l'écran, le premier au niveau du sol pour voir les cactus, et le second plus haut pour voir les oiseaux.
C'est au passage de chaque obstacle que la luminosité change, et donc que le capteur s'active pour envoyer la touche espace ou la flèche du bas pour sauter et baisser la tête, le tout à travers le microcontrôleur, et seulement 8 ko de mémoire flash.
Un système qui s'adapte à la vitesse du jeu
Encore plus fort, l'ensemble intègre un système de timing interactif, avec un firmware qui mesure la largeur des obstacles, et surtout conserve un historique de cinq mesures, pour estimer au mieux la vitesse du jeu.
Le délai entre la détection et l'appui sur la touche est recalculé en permanence, avec des bornes minimales et maximales pour éviter les ratés. Il y a aussi un délai de 400 millisecondes entre chaque action pour ne pas mitrailler les touches.
Côté calibration, il faut quand même un peu de patience. Les deux capteurs doivent être positionnés à 30-40 mm devant le dinosaure, et les potentiomètres des modules LM393 ajustés pour que le fond blanc de l'écran ne déclenche rien mais que les obstacles foncés soient bien détectés.
Albert David recommande de tester sur une vingtaine d'obstacles avant de considérer le réglage comme bon. Et si le jeu passe en mode nuit, une commande JavaScript dans la console du navigateur empêche l'inversion de contraste qui fausserait les capteurs.
Bref, vous l'avez compris, c'est le genre de projet qui ne sert strictement à rien, et c'est pour ça qu'on aime bien. Avec moins de 10 euros de composants, un bout de code en C et deux capteurs de luminosité scotchés sur un écran, on obtient un système qui joue au jeu du dinosaure mieux que la plupart d'entre nous.
Le code est disponible sur GitHub pour ceux qui voudraient essayer,
et vous avez tous les détails ici
. Tout ceci rappelle quand même que ce petit jeu caché de Chrome, que Google avait glissé là pour meubler les coupures internet, continue de mobiliser les bidouilleurs du dimanche.
Un vieux smartphone Android, c'est quoi en fait ? Un bon petit quad-core, 1 ou 2 Go de RAM, et du WiFi. Soit de quoi largement servir des pages web finalement... Hé bien
CompHost
vous montre comment en faire un serveur en quelques commandes, sans rooter quoi que ce soi. Vous faut juste Termux et basta !
En gros, vous installez
Termux depuis F-Droid
sur n'importe quel Android 7+ (pour Android 5-6, y'a également une version spéciale dispo sur GitHub), vous tapez pkg update && pkg upgrade -y puis termux-setup-storage -y, et hop, vous avez un environnement Linux sur votre téléphone.
Un vieux téléphone qui sert des pages web, la classe quand même
De là, un pkg install python suivi d'un python -m http.server 8080 et votre serveur web tourne ! Pensez surtout à lancer termux-wake-lock pour éviter qu'Android tue le processus en arrière-plan, sinon votre super site web ne sera pas accessible longtemps.
Le wiki fournit aussi des fiches PDF, une cheatsheet Termux et des présentations annotées pour ceux qui voudraient par exemple animer un atelier. Bref, j'ai trouvé ça plutôt bien ficelé !
D'ailleurs, j'sais pas si vous vous souvenais, mais
je vous avais déjà parlé de Far Computer
qui héberge un site sur un Fairphone 2 avec PostmarketOS, sauf que CompHost a une approche un peu différente. En fait y'a pas besoin de flasher l'OS ni besoin d'avoir un PC Linux sous la main et encore moins un bootloader à déverrouiller. Vous installez une app, vous ouvrez un terminal, c'est parti. Du coup c'est bien plus accessible, même si faut quand même être prêt à taper quelques commandes.
Le truc sympa avec Termux, c'est que ça tourne dans une sandbox Android classique, donc sans root et le gestionnaire de paquets pkg donne accès à tout ce qu'il faut pour héberger ce que vous voulez comme Python, Node.js, nginx...
Et aussi bizarre que ça puisse paraitre, votre vieux Samsung de 2018 a largement les specs pour servir un site statique, une petite API ou même un wiki perso. Et vu que ces machins consomment que dalle en électricité (2-3 watts à otut casser), c'est carrément viable comme micro-serveur permanent branché dans un coin (surveillez quand même l'état de la batterie, les vieilles cellules Li-ion n'aiment pas forcement rester en charge 24/7).
Après côté limites, attention, c'est pas pour iPhone et pour les Android vraiment antiques (genre Android 4 et moins), le wiki renvoie vers PostmarketOS qui flashe une vraie distrib Linux sur le mobile... là c'est plus technique, par contre.
Ce projet CompHost est dispo sur
GitLab
et comme ça, au moins, plutôt que de jeter vos appareils, vous leur filez une utilité concrète. Puis ça permet de piger ce qu'est vraiment un serveur web... Et quand je vois que
certains montent même des clusters Kubernetes avec des vieux smartphones
, je me dit que y'a vraiment un filon à creuser côté recyclage / compostage de vieux matos.
Et qui sait, peut-être qu'un jour, Korben.info tournera sur l'un de ces trucs ?
Crawler un site entier, ça devrait pas être aussi compliqué. Et pourtant, entre les scripts maison qui cassent tous les 2 jours et les headless browsers qui bouffent de la RAM comme pas permis, c'est assez la galère ! Du coup, Cloudflare, dans sa grande bonté (lol) vient de sortir un endpoint /crawl (en open beta) dans la section Browser Rendering qui simplifie tout ça... vous balancez une URL dessus et hop, ça ASPIRE tout le site (oui oui).
En gros, vous envoyez une requête POST avec l'URL de départ, et le service se charge de découvrir les pages (via le sitemap, les liens internes, ou les deux), de les générer dans un navigateur headless, et de vous renvoyer le contenu en HTML, Markdown ou même en JSON structuré grâce à Workers AI. Le tout de manière asynchron ! Vous, vous récupérez juste un job ID et vous revenez plus tard chercher les résultats quand c'est prêt.
Créer votre token API
Avant toute chose, il vous faut un token API Cloudflare avec la permission "Browser Rendering - Edit". Rendez-vous dans votre dashboard Cloudflare, section API Tokens, et créez-en un nouveau. Notez aussi votre Account ID (visible dans l'URL du dashboard ou dans la section Overview de n'importe quel domaine).
Lancer un crawl
Là, ensuite c'est hyper simple. Un seul appel curl suffit :
Et là, vous récupérez un job ID en retour (genre c7f8s2d9-a8e7-4b6e-...). Par défaut, le crawler va explorer 10 pages max avec une profondeur quasi illimitée. Mais bon, 10 pages c'est vite limité, du coup vous pouvez ajuster tout ça comme ceci :
Le paramètre render: false permet de récupérer le HTML brut sans lancer de navigateur headless, c'est carrément plus rapide pour les sites statiques. Sachez quand même que pendant la beta, ce mode n'est pas facturé ! Youpi !
Récupérer les résultats
Une fois le crawl lancé, vous interrogez le job avec un GET :
Vous obtenez alors le statut (running, completed, errored...) et la liste des pages crawlées avec leur contenu dans le format demandé. Si le résultat dépasse 10 Mo, un curseur de pagination est inclus pour récupérer la suite.
Les options qui tuent
Y'a quelques paramètres bien pensés pour les cas plus avancés :
modifiedSince et maxAge pour du crawling incrémental (ne re-crawler que les pages modifiées récemment)
source: "sitemaps" pour ne suivre que le sitemap au lieu de parser tous les liens
jsonOptions avec un prompt Workers AI pour extraire des données structurées automatiquement (genre récupérer le nom, le prix et le stock de 500 fiches produit d'un e-commerce en une seule passe)
rejectResourceTypes pour bloquer images, fonts et CSS et accélérer le crawl
authenticate pour les sites protégés par une auth HTTP basique
Attention quand même, y'a quelques subtilités à savoir. Un job peut tourner 7 jours max et les résultats sont conservés 14 jours seulement, du coup pensez à les récupérer vite. Le crawler respecte le robots.txt (y compris le crawl-delay), et si un site vous bloque, les URLs apparaissent comme "disallowed" dans les résultats. Sauf que ça ne vous dit pas pourquoi, faudra aller checker le robots.txt vous-même.
Voilà, cette "merveille" pour les scrappeurs fous est dispo sur les plans Free et Paid de
Workers
, et si vous voulez aller plus loin, Cloudflare propose aussi des endpoints pour les
screenshots, les PDF et le scraping ciblé
.
Voilà, un petit crawler inclus dans le plan Free de Workers, qui respecte le robots.txt et qui sort du Markdown ou du JSON structuré... je vais surveiller ça de près !