Created
October 3, 2026 02:27
-
-
Save 17twenty/0958ed2dc229aaae8247c83003778bd3 to your computer and use it in GitHub Desktop.
Grab Media Streams Bookmarklet for Chrome/Firefox
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| javascript:%28%28%29%20%3D%3E%20%7B%0A%20%20%27use%20strict%27%3B%0A%0A%20%20const%20VERSION%20%3D%20%270.3.4-resolver%27%3B%0A%20%20const%20UI_ID%20%3D%20%27__grab_media_ui%27%3B%0A%20%20const%20RELOAD_KEY%20%3D%20%27__grabMediaReloadRequested%27%3B%0A%0A%20%20%2F%2F%20Tear%20down%20a%20previous%20run%20if%20present.%0A%20%20try%20%7B%20window.__grabMedia%3F.stop%3F.%28%29%3B%20%7D%20catch%20%7B%7D%0A%20%20document.getElementById%28UI_ID%29%3F.remove%28%29%3B%0A%0A%20%20try%20%7B%20performance.setResourceTimingBufferSize%2810000%29%3B%20%7D%20catch%20%7B%7D%0A%0A%20%20const%20startedAt%20%3D%20new%20Date%28%29.toISOString%28%29%3B%0A%20%20const%20observations%20%3D%20new%20Map%28%29%3B%0A%20%20const%20mediaHints%20%3D%20%5B%5D%3B%0A%20%20const%20cleanup%20%3D%20%5B%5D%3B%0A%20%20const%20hlsCache%20%3D%20new%20Map%28%29%3B%0A%20%20const%20hlsProbePending%20%3D%20new%20Set%28%29%3B%0A%20%20const%20qualitySelections%20%3D%20new%20Map%28%29%3B%0A%20%20let%20renderTimer%20%3D%20null%3B%0A%20%20let%20stopped%20%3D%20false%3B%0A%0A%20%20const%20state%20%3D%20%7B%0A%20%20%20%20results%3A%20%5B%5D%2C%0A%20%20%20%20debug%3A%20null%2C%0A%20%20%20%20scanStats%3A%20%7B%7D%2C%0A%20%20%20%20lastScanAt%3A%20null%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20Helpers%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20const%20now%20%3D%20%28%29%20%3D%3E%20new%20Date%28%29.toISOString%28%29%3B%0A%20%20const%20uniq%20%3D%20xs%20%3D%3E%20%5B...new%20Set%28xs%29%5D%3B%0A%0A%20%20const%20esc%20%3D%20s%20%3D%3E%20String%28s%29.replace%28%2F%5B%26%3C%3E%22%27%5D%2Fg%2C%20c%20%3D%3E%20%28%7B%0A%20%20%20%20%27%26%27%3A%20%27%26amp%3B%27%2C%20%27%3C%27%3A%20%27%26lt%3B%27%2C%20%27%3E%27%3A%20%27%26gt%3B%27%2C%20%27%22%27%3A%20%27%26quot%3B%27%2C%20%22%27%22%3A%20%27%26%23039%3B%27%0A%20%20%7D%29%5Bc%5D%29%3B%0A%0A%20%20const%20host%20%3D%20url%20%3D%3E%20%7B%0A%20%20%20%20try%20%7B%20return%20new%20URL%28url%2C%20location.href%29.hostname%3B%20%7D%0A%20%20%20%20catch%20%7B%20return%20%27%27%3B%20%7D%0A%20%20%7D%3B%0A%0A%20%20const%20shellQuote%20%3D%20s%20%3D%3E%20%60%27%24%7BString%28s%29.replace%28%2F%27%2Fg%2C%20%60%27%5C%5C%27%27%60%29%7D%27%60%3B%0A%0A%20%20const%20humanSize%20%3D%20n%20%3D%3E%20%7B%0A%20%20%20%20if%20%28%21n%29%20return%20%27%27%3B%0A%20%20%20%20if%20%28n%20%3C%201024%29%20return%20%60%24%7Bn%7D%20B%60%3B%0A%20%20%20%20if%20%28n%20%3C%201024%20%2A%2A%202%29%20return%20%60%24%7B%28n%20%2F%201024%29.toFixed%281%29%7D%20KB%60%3B%0A%20%20%20%20return%20%60%24%7B%28n%20%2F%201024%20%2A%2A%202%29.toFixed%281%29%7D%20MB%60%3B%0A%20%20%7D%3B%0A%0A%20%20const%20humanTime%20%3D%20ms%20%3D%3E%20%7B%0A%20%20%20%20if%20%28ms%20%3D%3D%20null%20%7C%7C%20%21Number.isFinite%28ms%29%29%20return%20%27%3F%27%3B%0A%20%20%20%20const%20s%20%3D%20ms%20%2F%201000%3B%0A%20%20%20%20if%20%28s%20%3C%2060%29%20return%20%60%24%7Bs.toFixed%28s%20%25%201%20%3F%201%20%3A%200%29%7Ds%60%3B%0A%20%20%20%20const%20m%20%3D%20Math.floor%28s%20%2F%2060%29%3B%0A%20%20%20%20const%20rem%20%3D%20Math.round%28s%20%25%2060%29%3B%0A%20%20%20%20return%20%60%24%7Bm%7Dm%20%24%7Brem%7Ds%60%3B%0A%20%20%7D%3B%0A%0A%0A%20%20const%20humanBitrate%20%3D%20bps%20%3D%3E%20%7B%0A%20%20%20%20const%20n%20%3D%20Number%28bps%20%7C%7C%200%29%3B%0A%20%20%20%20if%20%28%21n%29%20return%20%27%27%3B%0A%20%20%20%20if%20%28n%20%3E%3D%201_000_000%29%20return%20%60%24%7B%28n%20%2F%201_000_000%29.toFixed%28n%20%3E%3D%2010_000_000%20%3F%200%20%3A%202%29%7D%20Mbps%60%3B%0A%20%20%20%20return%20%60%24%7BMath.round%28n%20%2F%201000%29%7D%20kbps%60%3B%0A%20%20%7D%3B%0A%0A%20%20function%20parseM3u8Attrs%28raw%29%20%7B%0A%20%20%20%20const%20out%20%3D%20%7B%7D%3B%0A%20%20%20%20const%20re%20%3D%20%2F%28%5BA-Z0-9-%5D%2B%29%3D%28%22%5B%5E%22%5D%2A%22%7C%5B%5E%2C%5D%2A%29%2Fgi%3B%0A%20%20%20%20let%20m%3B%0A%20%20%20%20while%20%28%28m%20%3D%20re.exec%28raw%20%7C%7C%20%27%27%29%29%29%20%7B%0A%20%20%20%20%20%20let%20v%20%3D%20m%5B2%5D%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20if%20%28v.startsWith%28%27%22%27%29%20%26%26%20v.endsWith%28%27%22%27%29%29%20v%20%3D%20v.slice%281%2C%20-1%29%3B%0A%20%20%20%20%20%20out%5Bm%5B1%5D.toUpperCase%28%29%5D%20%3D%20v%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20out%3B%0A%20%20%7D%0A%0A%20%20function%20absoluteUrl%28raw%2C%20base%29%20%7B%0A%20%20%20%20try%20%7B%20return%20new%20URL%28raw%2C%20base%29.href%3B%20%7D%0A%20%20%20%20catch%20%7B%20return%20raw%3B%20%7D%0A%20%20%7D%0A%0A%20%20function%20inferAudioBitrate%28url%29%20%7B%0A%20%20%20%20const%20m%20%3D%20String%28url%20%7C%7C%20%27%27%29.match%28%2F%5C%2Fmp4a%5C%2F%28%5Cd%2B%29%5C%2F%2Fi%29%3B%0A%20%20%20%20return%20m%20%3F%20Number%28m%5B1%5D%29%20%3A%200%3B%0A%20%20%7D%0A%0A%20%20function%20parseHlsManifest%28text%2C%20manifestUrl%29%20%7B%0A%20%20%20%20const%20lines%20%3D%20String%28text%20%7C%7C%20%27%27%29%0A%20%20%20%20%20%20.split%28%2F%5Cr%3F%5Cn%2F%29%0A%20%20%20%20%20%20.map%28x%20%3D%3E%20x.trim%28%29%29%0A%20%20%20%20%20%20.filter%28Boolean%29%3B%0A%0A%20%20%20%20const%20audioGroups%20%3D%20new%20Map%28%29%3B%0A%20%20%20%20const%20variants%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20for%20%28const%20line%20of%20lines%29%20%7B%0A%20%20%20%20%20%20if%20%28%21line.startsWith%28%27%23EXT-X-MEDIA%3A%27%29%29%20continue%3B%0A%20%20%20%20%20%20const%20attrs%20%3D%20parseM3u8Attrs%28line.slice%28%27%23EXT-X-MEDIA%3A%27.length%29%29%3B%0A%20%20%20%20%20%20if%20%28%28attrs.TYPE%20%7C%7C%20%27%27%29.toUpperCase%28%29%20%21%3D%3D%20%27AUDIO%27%20%7C%7C%20%21attrs.URI%29%20continue%3B%0A%0A%20%20%20%20%20%20const%20groupId%20%3D%20attrs%5B%27GROUP-ID%27%5D%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20if%20%28%21audioGroups.has%28groupId%29%29%20audioGroups.set%28groupId%2C%20%5B%5D%29%3B%0A%0A%20%20%20%20%20%20const%20url%20%3D%20absoluteUrl%28attrs.URI%2C%20manifestUrl%29%3B%0A%20%20%20%20%20%20audioGroups.get%28groupId%29.push%28%7B%0A%20%20%20%20%20%20%20%20groupId%2C%0A%20%20%20%20%20%20%20%20name%3A%20attrs.NAME%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20language%3A%20attrs.LANGUAGE%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20default%3A%20%28attrs.DEFAULT%20%7C%7C%20%27%27%29.toUpperCase%28%29%20%3D%3D%3D%20%27YES%27%2C%0A%20%20%20%20%20%20%20%20autoselect%3A%20%28attrs.AUTOSELECT%20%7C%7C%20%27%27%29.toUpperCase%28%29%20%3D%3D%3D%20%27YES%27%2C%0A%20%20%20%20%20%20%20%20channels%3A%20attrs.CHANNELS%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20bitrate%3A%20inferAudioBitrate%28url%29%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20for%20%28let%20i%20%3D%200%3B%20i%20%3C%20lines.length%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20const%20line%20%3D%20lines%5Bi%5D%3B%0A%20%20%20%20%20%20if%20%28%21line.startsWith%28%27%23EXT-X-STREAM-INF%3A%27%29%29%20continue%3B%0A%0A%20%20%20%20%20%20const%20attrs%20%3D%20parseM3u8Attrs%28line.slice%28%27%23EXT-X-STREAM-INF%3A%27.length%29%29%3B%0A%20%20%20%20%20%20let%20uri%20%3D%20null%3B%0A%20%20%20%20%20%20for%20%28let%20j%20%3D%20i%20%2B%201%3B%20j%20%3C%20lines.length%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21lines%5Bj%5D.startsWith%28%27%23%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20uri%20%3D%20lines%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28%21uri%29%20continue%3B%0A%0A%20%20%20%20%20%20const%20videoUrl%20%3D%20absoluteUrl%28uri%2C%20manifestUrl%29%3B%0A%20%20%20%20%20%20const%20resolution%20%3D%20attrs.RESOLUTION%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20const%20rm%20%3D%20resolution.match%28%2F%5E%28%5Cd%2B%29x%28%5Cd%2B%29%24%2Fi%29%3B%0A%20%20%20%20%20%20const%20width%20%3D%20rm%20%3F%20Number%28rm%5B1%5D%29%20%3A%200%3B%0A%20%20%20%20%20%20const%20height%20%3D%20rm%20%3F%20Number%28rm%5B2%5D%29%20%3A%200%3B%0A%20%20%20%20%20%20const%20bandwidth%20%3D%20Number%28attrs.BANDWIDTH%20%7C%7C%20attrs%5B%27AVERAGE-BANDWIDTH%27%5D%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20audioGroup%20%3D%20attrs.AUDIO%20%7C%7C%20%27%27%3B%0A%0A%20%20%20%20%20%20const%20audios%20%3D%20%5B...%28audioGroups.get%28audioGroup%29%20%7C%7C%20%5B%5D%29%5D.sort%28%28a%2C%20b%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28a.default%20%21%3D%3D%20b.default%29%20return%20a.default%20%3F%20-1%20%3A%201%3B%0A%20%20%20%20%20%20%20%20return%20%28b.bitrate%20%7C%7C%200%29%20-%20%28a.bitrate%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20const%20audio%20%3D%20audios%5B0%5D%20%7C%7C%20null%3B%0A%0A%20%20%20%20%20%20variants.push%28%7B%0A%20%20%20%20%20%20%20%20index%3A%20variants.length%2C%0A%20%20%20%20%20%20%20%20bandwidth%2C%0A%20%20%20%20%20%20%20%20resolution%2C%0A%20%20%20%20%20%20%20%20width%2C%0A%20%20%20%20%20%20%20%20height%2C%0A%20%20%20%20%20%20%20%20codecs%3A%20attrs.CODECS%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20frameRate%3A%20attrs%5B%27FRAME-RATE%27%5D%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20videoUrl%2C%0A%20%20%20%20%20%20%20%20audioUrl%3A%20audio%3F.url%20%7C%7C%20null%2C%0A%20%20%20%20%20%20%20%20audioBitrate%3A%20audio%3F.bitrate%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20audioName%3A%20audio%3F.name%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20audioGroup%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20variants.sort%28%28a%2C%20b%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20ap%20%3D%20%28a.width%20%7C%7C%200%29%20%2A%20%28a.height%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20bp%20%3D%20%28b.width%20%7C%7C%200%29%20%2A%20%28b.height%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20return%20bp%20-%20ap%20%7C%7C%20%28b.bandwidth%20%7C%7C%200%29%20-%20%28a.bandwidth%20%7C%7C%200%29%3B%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20isMaster%3A%20variants.length%20%3E%200%2C%0A%20%20%20%20%20%20variants%2C%0A%20%20%20%20%20%20audioGroups%3A%20%5B...audioGroups.entries%28%29%5D.map%28%28%5BgroupId%2C%20items%5D%29%20%3D%3E%20%28%7B%20groupId%2C%20items%20%7D%29%29%2C%0A%20%20%20%20%20%20rawLineCount%3A%20lines.length%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20hlsVariantLabel%28v%29%20%7B%0A%20%20%20%20const%20bits%20%3D%20%5B%5D%3B%0A%20%20%20%20if%20%28v.resolution%29%20bits.push%28v.resolution%29%3B%0A%20%20%20%20else%20if%20%28v.height%29%20bits.push%28%60%24%7Bv.height%7Dp%60%29%3B%0A%20%20%20%20if%20%28v.bandwidth%29%20bits.push%28humanBitrate%28v.bandwidth%29%29%3B%0A%20%20%20%20if%20%28v.audioBitrate%29%20bits.push%28%60audio%20%24%7BhumanBitrate%28v.audioBitrate%29%7D%60%29%3B%0A%20%20%20%20return%20bits.join%28%27%20%C2%B7%20%27%29%20%7C%7C%20%60Variant%20%24%7Bv.index%20%2B%201%7D%60%3B%0A%20%20%7D%0A%0A%20%20function%20hlsVariantCommand%28v%29%20%7B%0A%20%20%20%20if%20%28v.audioUrl%29%20%7B%0A%20%20%20%20%20%20return%20%5B%0A%20%20%20%20%20%20%20%20%60ffmpeg%20-y%20%5C%5C%60%2C%0A%20%20%20%20%20%20%20%20%60%20%20-i%20%24%7BshellQuote%28v.videoUrl%29%7D%20%5C%5C%60%2C%0A%20%20%20%20%20%20%20%20%60%20%20-i%20%24%7BshellQuote%28v.audioUrl%29%7D%20%5C%5C%60%2C%0A%20%20%20%20%20%20%20%20%60%20%20-map%200%3Av%3A0%20-map%201%3Aa%3A0%20%5C%5C%60%2C%0A%20%20%20%20%20%20%20%20%60%20%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%0A%20%20%20%20%20%20%5D.join%28%27%5Cn%27%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28v.videoUrl%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%3B%0A%20%20%7D%0A%0A%20%20async%20function%20probeHlsManifest%28manifestUrl%29%20%7B%0A%20%20%20%20if%20%28%21manifestUrl%20%7C%7C%20hlsCache.has%28manifestUrl%29%20%7C%7C%20hlsProbePending.has%28manifestUrl%29%29%20return%3B%0A%0A%20%20%20%20hlsProbePending.add%28manifestUrl%29%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20response%20%3D%20await%20fetch%28manifestUrl%2C%20%7B%20credentials%3A%20%27omit%27%20%7D%29%3B%0A%20%20%20%20%20%20if%20%28%21response.ok%29%20throw%20new%20Error%28%60HTTP%20%24%7Bresponse.status%7D%60%29%3B%0A%20%20%20%20%20%20const%20text%20%3D%20await%20response.text%28%29%3B%0A%20%20%20%20%20%20const%20parsed%20%3D%20parseHlsManifest%28text%2C%20manifestUrl%29%3B%0A%20%20%20%20%20%20hlsCache.set%28manifestUrl%2C%20%7B%0A%20%20%20%20%20%20%20%20status%3A%20%27ok%27%2C%0A%20%20%20%20%20%20%20%20...parsed%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%20catch%20%28e%29%20%7B%0A%20%20%20%20%20%20hlsCache.set%28manifestUrl%2C%20%7B%0A%20%20%20%20%20%20%20%20status%3A%20%27error%27%2C%0A%20%20%20%20%20%20%20%20error%3A%20String%28e%3F.message%20%7C%7C%20e%29%2C%0A%20%20%20%20%20%20%20%20isMaster%3A%20false%2C%0A%20%20%20%20%20%20%20%20variants%3A%20%5B%5D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%20finally%20%7B%0A%20%20%20%20%20%20hlsProbePending.delete%28manifestUrl%29%3B%0A%20%20%20%20%20%20scheduleRender%28%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20const%20normalizeUrl%20%3D%20raw%20%3D%3E%20%7B%0A%20%20%20%20if%20%28%21raw%20%7C%7C%20typeof%20raw%20%21%3D%3D%20%27string%27%29%20return%20null%3B%0A%20%20%20%20let%20s%20%3D%20raw.trim%28%29%3B%0A%20%20%20%20if%20%28%21s%29%20return%20null%3B%0A%0A%20%20%20%20%2F%2F%20Common%20JSON%2Fscript%20escaping.%0A%20%20%20%20s%20%3D%20s%0A%20%20%20%20%20%20.replace%28%2F%5C%5Cu002F%2Fgi%2C%20%27%2F%27%29%0A%20%20%20%20%20%20.replace%28%2F%5C%5Cu0026%2Fgi%2C%20%27%26%27%29%0A%20%20%20%20%20%20.replace%28%2F%5C%5C%5C%2F%2Fg%2C%20%27%2F%27%29%3B%0A%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20u%20%3D%20new%20URL%28s%2C%20location.href%29%3B%0A%20%20%20%20%20%20if%20%28%21%2F%5Ehttps%3F%3A%24%2Fi.test%28u.protocol%29%29%20return%20null%3B%0A%20%20%20%20%20%20return%20u.href%3B%0A%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20const%20looksMediaLike%20%3D%20url%20%3D%3E%0A%20%20%20%20%2F%28%3F%3Avideo%5C.twimg%5C.com%7Cdms%5C.licdn%5C.com%7C%5C.m3u8%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C.mpd%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C.m4s%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C.mp4%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C.webm%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C.ts%28%3F%3A%5B%3F%23%5D%7C%24%29%7C%5C%2Fplaylist%5C%2F%7C%5C%2Fvideoplayback%29%2Fi.test%28url%20%7C%7C%20%27%27%29%3B%0A%0A%20%20function%20addObservation%28rawUrl%2C%20source%2C%20meta%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20const%20url%20%3D%20normalizeUrl%28rawUrl%29%3B%0A%20%20%20%20if%20%28%21url%29%20return%3B%0A%0A%20%20%20%20const%20old%20%3D%20observations.get%28url%29%20%7C%7C%20%7B%0A%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20sources%3A%20%5B%5D%2C%0A%20%20%20%20%20%20firstSeen%3A%20now%28%29%2C%0A%20%20%20%20%20%20lastSeen%3A%20now%28%29%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20if%20%28%21old.sources.includes%28source%29%29%20old.sources.push%28source%29%3B%0A%20%20%20%20old.lastSeen%20%3D%20now%28%29%3B%0A%0A%20%20%20%20for%20%28const%20%5Bk%2C%20v%5D%20of%20Object.entries%28meta%29%29%20%7B%0A%20%20%20%20%20%20if%20%28v%20%21%3D%3D%20undefined%20%26%26%20v%20%21%3D%3D%20null%20%26%26%20v%20%21%3D%3D%20%27%27%29%20old%5Bk%5D%20%3D%20v%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20observations.set%28url%2C%20old%29%3B%0A%0A%20%20%20%20if%20%28looksMediaLike%28url%29%29%20scheduleRender%28%29%3B%0A%20%20%7D%0A%0A%20%20function%20addMediaHint%28rawUrl%2C%20source%2C%20meta%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20const%20url%20%3D%20normalizeUrl%28rawUrl%29%3B%0A%20%20%20%20if%20%28%21url%20%7C%7C%20%21looksMediaLike%28url%29%29%20return%3B%0A%0A%20%20%20%20addObservation%28url%2C%20source%2C%20meta%29%3B%0A%0A%20%20%20%20const%20existing%20%3D%20mediaHints.find%28x%20%3D%3E%20x.url%20%3D%3D%3D%20url%29%3B%0A%20%20%20%20const%20hint%20%3D%20existing%20%7C%7C%20%7B%20url%2C%20sources%3A%20%5B%5D%20%7D%3B%0A%20%20%20%20if%20%28%21hint.sources.includes%28source%29%29%20hint.sources.push%28source%29%3B%0A%0A%20%20%20%20for%20%28const%20%5Bk%2C%20v%5D%20of%20Object.entries%28meta%29%29%20%7B%0A%20%20%20%20%20%20if%20%28v%20%21%3D%3D%20undefined%20%26%26%20v%20%21%3D%3D%20null%20%26%26%20v%20%21%3D%3D%20%27%27%29%20hint%5Bk%5D%20%3D%20v%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28%21existing%29%20mediaHints.push%28hint%29%3B%0A%20%20%7D%0A%0A%20%20async%20function%20copyText%28text%2C%20button%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20await%20navigator.clipboard.writeText%28text%29%3B%0A%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20const%20ta%20%3D%20document.createElement%28%27textarea%27%29%3B%0A%20%20%20%20%20%20ta.value%20%3D%20text%3B%0A%20%20%20%20%20%20ta.style.position%20%3D%20%27fixed%27%3B%0A%20%20%20%20%20%20ta.style.left%20%3D%20%27-9999px%27%3B%0A%20%20%20%20%20%20ta.style.top%20%3D%20%27-9999px%27%3B%0A%20%20%20%20%20%20document.body.appendChild%28ta%29%3B%0A%20%20%20%20%20%20ta.focus%28%29%3B%0A%20%20%20%20%20%20ta.select%28%29%3B%0A%20%20%20%20%20%20document.execCommand%28%27copy%27%29%3B%0A%20%20%20%20%20%20ta.remove%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28button%29%20%7B%0A%20%20%20%20%20%20const%20old%20%3D%20button.textContent%3B%0A%20%20%20%20%20%20button.textContent%20%3D%20%27Copied%20%E2%9C%93%27%3B%0A%20%20%20%20%20%20setTimeout%28%28%29%20%3D%3E%20%7B%20button.textContent%20%3D%20old%3B%20%7D%2C%201200%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20makeButton%28label%29%20%7B%0A%20%20%20%20const%20b%20%3D%20document.createElement%28%27button%27%29%3B%0A%20%20%20%20b.textContent%20%3D%20label%3B%0A%20%20%20%20Object.assign%28b.style%2C%20%7B%0A%20%20%20%20%20%20border%3A%20%271px%20solid%20%23666%27%2C%0A%20%20%20%20%20%20background%3A%20%27%23292929%27%2C%0A%20%20%20%20%20%20color%3A%20%27%23eee%27%2C%0A%20%20%20%20%20%20borderRadius%3A%20%276px%27%2C%0A%20%20%20%20%20%20padding%3A%20%277px%2010px%27%2C%0A%20%20%20%20%20%20cursor%3A%20%27pointer%27%2C%0A%20%20%20%20%20%20font%3A%20%27inherit%27%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20b.onmouseenter%20%3D%20%28%29%20%3D%3E%20%7B%20b.style.background%20%3D%20%27%23393939%27%3B%20%7D%3B%0A%20%20%20%20b.onmouseleave%20%3D%20%28%29%20%3D%3E%20%7B%20b.style.background%20%3D%20%27%23292929%27%3B%20%7D%3B%0A%20%20%20%20return%20b%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20Passive%20%2B%20light%20live%20observation%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20function%20seedPerformance%28%29%20%7B%0A%20%20%20%20let%20count%20%3D%200%3B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20for%20%28const%20e%20of%20performance.getEntriesByType%28%27resource%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20count%2B%2B%3B%0A%20%20%20%20%20%20%20%20addObservation%28e.name%2C%20%27performance%27%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20initiator%3A%20e.initiatorType%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20%20%20transferSize%3A%20e.transferSize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20encodedBodySize%3A%20e.encodedBodySize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20decodedBodySize%3A%20e.decodedBodySize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20startTime%3A%20e.startTime%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20duration%3A%20e.duration%20%7C%7C%200%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20return%20count%3B%0A%20%20%7D%0A%0A%20%20function%20armLightCapture%28%29%20%7B%0A%20%20%20%20%2F%2F%20PerformanceObserver%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20po%20%3D%20new%20PerformanceObserver%28list%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20for%20%28const%20e%20of%20list.getEntries%28%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20addObservation%28e.name%2C%20%27performance-live%27%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20initiator%3A%20e.initiatorType%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20transferSize%3A%20e.transferSize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20encodedBodySize%3A%20e.encodedBodySize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20decodedBodySize%3A%20e.decodedBodySize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20startTime%3A%20e.startTime%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20duration%3A%20e.duration%20%7C%7C%200%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20po.observe%28%7B%20type%3A%20%27resource%27%2C%20buffered%3A%20true%20%7D%29%3B%0A%20%20%20%20%20%20cleanup.push%28%28%29%20%3D%3E%20po.disconnect%28%29%29%3B%0A%20%20%20%20%7D%20catch%20%7B%7D%0A%0A%20%20%20%20%2F%2F%20fetch%20URL%20observation%20only%3B%20no%20response-body%20interception.%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20originalFetch%20%3D%20window.fetch%3B%0A%20%20%20%20%20%20const%20wrapped%20%3D%20function%28input%2C%20init%29%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20addObservation%28input%20instanceof%20Request%20%3F%20input.url%20%3A%20String%28input%29%2C%20%27fetch%27%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20method%3A%20init%3F.method%20%7C%7C%20%28input%20instanceof%20Request%20%3F%20input.method%20%3A%20%27GET%27%29%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%20%20return%20originalFetch.apply%28this%2C%20arguments%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20window.fetch%20%3D%20wrapped%3B%0A%20%20%20%20%20%20cleanup.push%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28window.fetch%20%3D%3D%3D%20wrapped%29%20window.fetch%20%3D%20originalFetch%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%20catch%20%7B%7D%0A%0A%20%20%20%20%2F%2F%20XHR%20URL%20observation%20only.%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20const%20originalOpen%20%3D%20XMLHttpRequest.prototype.open%3B%0A%20%20%20%20%20%20const%20wrappedOpen%20%3D%20function%28method%2C%20url%29%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%20addObservation%28String%28url%29%2C%20%27xhr%27%2C%20%7B%20method%3A%20method%20%7C%7C%20%27GET%27%20%7D%29%3B%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%20%20return%20originalOpen.apply%28this%2C%20arguments%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20XMLHttpRequest.prototype.open%20%3D%20wrappedOpen%3B%0A%20%20%20%20%20%20cleanup.push%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28XMLHttpRequest.prototype.open%20%3D%3D%3D%20wrappedOpen%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20XMLHttpRequest.prototype.open%20%3D%20originalOpen%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20DOM%20%2F%20framework-state%20resolver%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20const%20stateUrlRE%20%3D%20%2Fhttps%3F%3A%5C%5C%3F%5C%2F%5C%5C%3F%5C%2F%28%3F%3Avideo%5C.twimg%5C.com%7Cdms%5C.licdn%5C.com%29%5B%5E%22%27%5C%5C%5Cs%3C%3E%5D%2B%7Chttps%3F%3A%5C%5C%3F%5C%2F%5C%5C%3F%5C%2F%5B%5E%22%27%5C%5C%5Cs%3C%3E%5D%2B%3F%5C.%28%3F%3Am3u8%7Cmpd%7Cmp4%7Cm4s%7Cwebm%29%28%3F%3A%5C%3F%5B%5E%22%27%5C%5C%5Cs%3C%3E%5D%2A%29%3F%2Fgi%3B%0A%0A%20%20function%20harvestStrings%28text%2C%20source%2C%20meta%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20if%20%28typeof%20text%20%21%3D%3D%20%27string%27%20%7C%7C%20%21text%29%20return%3B%0A%20%20%20%20const%20matches%20%3D%20text.match%28stateUrlRE%29%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20for%20%28const%20raw%20of%20matches%29%20addMediaHint%28raw%2C%20source%2C%20meta%29%3B%0A%20%20%7D%0A%0A%20%20function%20inspectMediaObject%28obj%2C%20source%2C%20path%29%20%7B%0A%20%20%20%20if%20%28%21obj%20%7C%7C%20typeof%20obj%20%21%3D%3D%20%27object%27%29%20return%3B%0A%0A%20%20%20%20const%20url%20%3D%20typeof%20obj.url%20%3D%3D%3D%20%27string%27%20%3F%20obj.url%20%3A%20null%3B%0A%20%20%20%20if%20%28url%20%26%26%20looksMediaLike%28normalizeUrl%28url%29%29%29%20%7B%0A%20%20%20%20%20%20addMediaHint%28url%2C%20source%2C%20%7B%0A%20%20%20%20%20%20%20%20path%2C%0A%20%20%20%20%20%20%20%20bitrate%3A%20obj.bitrate%20%3F%3F%20obj.bit_rate%20%3F%3F%20null%2C%0A%20%20%20%20%20%20%20%20contentType%3A%20obj.content_type%20%3F%3F%20obj.contentType%20%3F%3F%20obj.mime_type%20%3F%3F%20obj.type%20%3F%3F%20null%2C%0A%20%20%20%20%20%20%20%20width%3A%20obj.width%20%3F%3F%20null%2C%0A%20%20%20%20%20%20%20%20height%3A%20obj.height%20%3F%3F%20null%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20boundedWalk%28root%2C%20source%2C%20opts%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20const%20maxObjects%20%3D%20opts.maxObjects%20%3F%3F%201800%3B%0A%20%20%20%20const%20maxDepth%20%3D%20opts.maxDepth%20%3F%3F%2010%3B%0A%20%20%20%20const%20maxString%20%3D%20opts.maxString%20%3F%3F%202_000_000%3B%0A%0A%20%20%20%20const%20queue%20%3D%20%5B%7B%20value%3A%20root%2C%20path%3A%20%27%24%27%2C%20depth%3A%200%20%7D%5D%3B%0A%20%20%20%20const%20seen%20%3D%20new%20WeakSet%28%29%3B%0A%20%20%20%20let%20objects%20%3D%200%3B%0A%0A%20%20%20%20const%20blockedKeys%20%3D%20new%20Set%28%5B%0A%20%20%20%20%20%20%27window%27%2C%20%27document%27%2C%20%27ownerDocument%27%2C%20%27parentNode%27%2C%20%27parentElement%27%2C%0A%20%20%20%20%20%20%27children%27%2C%20%27childNodes%27%2C%20%27nextSibling%27%2C%20%27previousSibling%27%2C%0A%20%20%20%20%20%20%27return%27%2C%20%27child%27%2C%20%27sibling%27%2C%20%27alternate%27%2C%20%27_owner%27%0A%20%20%20%20%5D%29%3B%0A%0A%20%20%20%20while%20%28queue.length%20%26%26%20objects%20%3C%20maxObjects%29%20%7B%0A%20%20%20%20%20%20const%20%7B%20value%2C%20path%2C%20depth%20%7D%20%3D%20queue.shift%28%29%3B%0A%20%20%20%20%20%20if%20%28value%20%3D%3D%20null%20%7C%7C%20depth%20%3E%20maxDepth%29%20continue%3B%0A%0A%20%20%20%20%20%20if%20%28typeof%20value%20%3D%3D%3D%20%27string%27%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28value.length%20%3C%3D%20maxString%29%20harvestStrings%28value%2C%20source%2C%20%7B%20path%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28typeof%20value%20%21%3D%3D%20%27object%27%20%26%26%20typeof%20value%20%21%3D%3D%20%27function%27%29%20continue%3B%0A%20%20%20%20%20%20if%20%28seen.has%28value%29%29%20continue%3B%0A%20%20%20%20%20%20seen.add%28value%29%3B%0A%20%20%20%20%20%20objects%2B%2B%3B%0A%0A%20%20%20%20%20%20inspectMediaObject%28value%2C%20source%2C%20path%29%3B%0A%0A%20%20%20%20%20%20let%20entries%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20try%20%7B%20entries%20%3D%20Object.entries%28value%29%3B%20%7D%20catch%20%7B%20continue%3B%20%7D%0A%0A%20%20%20%20%20%20for%20%28const%20%5Bkey%2C%20child%5D%20of%20entries%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28blockedKeys.has%28key%29%29%20continue%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28typeof%20child%20%3D%3D%3D%20%27string%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28child.length%20%3C%3D%20maxString%29%20harvestStrings%28child%2C%20source%2C%20%7B%20path%3A%20%60%24%7Bpath%7D.%24%7Bkey%7D%60%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28child%20%26%26%20%28typeof%20child%20%3D%3D%3D%20%27object%27%20%7C%7C%20typeof%20child%20%3D%3D%3D%20%27function%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20queue.push%28%7B%20value%3A%20child%2C%20path%3A%20%60%24%7Bpath%7D.%24%7Bkey%7D%60%2C%20depth%3A%20depth%20%2B%201%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20objects%3B%0A%20%20%7D%0A%0A%20%20function%20findReactFiber%28node%29%20%7B%0A%20%20%20%20if%20%28%21node%29%20return%20null%3B%0A%20%20%20%20let%20keys%20%3D%20%5B%5D%3B%0A%20%20%20%20try%20%7B%20keys%20%3D%20Object.getOwnPropertyNames%28node%29%3B%20%7D%20catch%20%7B%7D%0A%20%20%20%20const%20key%20%3D%20keys.find%28k%20%3D%3E%20%2F%5E__reactFiber%5C%24%2Fi.test%28k%29%29%3B%0A%20%20%20%20if%20%28%21key%29%20return%20null%3B%0A%20%20%20%20try%20%7B%20return%20node%5Bkey%5D%20%7C%7C%20null%3B%20%7D%20catch%20%7B%20return%20null%3B%20%7D%0A%20%20%7D%0A%0A%20%20function%20walkReactAncestors%28startFiber%29%20%7B%0A%20%20%20%20if%20%28%21startFiber%20%7C%7C%20typeof%20startFiber%20%21%3D%3D%20%27object%27%29%20%7B%0A%20%20%20%20%20%20return%20%7B%20fibers%3A%200%2C%20objects%3A%200%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20let%20fiber%20%3D%20startFiber%3B%0A%20%20%20%20let%20fibers%20%3D%200%3B%0A%20%20%20%20let%20objects%20%3D%200%3B%0A%20%20%20%20const%20seen%20%3D%20new%20WeakSet%28%29%3B%0A%0A%20%20%20%20%2F%2F%20React%27s%20useful%20tweet%2Fcomponent%20state%20is%20often%20on%20parent%20fibers.%20The%20generic%0A%20%20%20%20%2F%2F%20bounded%20walker%20deliberately%20blocks%20%60return%60%20to%20avoid%20cycles%2C%20so%20traverse%0A%20%20%20%20%2F%2F%20the%20parent%20chain%20explicitly%20and%20inspect%20only%20state-bearing%20fields.%0A%20%20%20%20while%20%28fiber%20%26%26%20typeof%20fiber%20%3D%3D%3D%20%27object%27%20%26%26%20fibers%20%3C%2032%20%26%26%20%21seen.has%28fiber%29%29%20%7B%0A%20%20%20%20%20%20seen.add%28fiber%29%3B%0A%20%20%20%20%20%20fibers%2B%2B%3B%0A%0A%20%20%20%20%20%20for%20%28const%20field%20of%20%5B%27memoizedProps%27%2C%20%27pendingProps%27%2C%20%27memoizedState%27%5D%29%20%7B%0A%20%20%20%20%20%20%20%20let%20value%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20try%20%7B%20value%20%3D%20fiber%5Bfield%5D%3B%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%20%20if%20%28%21value%29%20continue%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20objects%20%2B%3D%20boundedWalk%28value%2C%20%60react-fiber%3A%24%7Bfield%7D%3Alevel-%24%7Bfibers%7D%60%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20maxObjects%3A%20700%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20maxDepth%3A%2011%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20try%20%7B%20fiber%20%3D%20fiber.return%20%7C%7C%20null%3B%20%7D%0A%20%20%20%20%20%20catch%20%7B%20fiber%20%3D%20null%3B%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%7B%20fibers%2C%20objects%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20scanDomAndFrameworkState%28%29%20%7B%0A%20%20%20%20const%20videos%20%3D%20%5B...document.querySelectorAll%28%27video%27%29%5D%3B%0A%20%20%20%20const%20assetIds%20%3D%20new%20Set%28%29%3B%0A%20%20%20%20let%20rootsWalked%20%3D%200%3B%0A%20%20%20%20let%20objectsWalked%20%3D%200%3B%0A%20%20%20%20let%20reactFibersWalked%20%3D%200%3B%0A%0A%20%20%20%20for%20%28const%20%5Bi%2C%20video%5D%20of%20videos.entries%28%29%29%20%7B%0A%20%20%20%20%20%20const%20poster%20%3D%20video.poster%20%7C%7C%20video.getAttribute%28%27poster%27%29%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20const%20src%20%3D%20video.currentSrc%20%7C%7C%20video.getAttribute%28%27src%27%29%20%7C%7C%20%27%27%3B%0A%0A%20%20%20%20%20%20if%20%28poster%29%20addObservation%28poster%2C%20%27video-poster%27%29%3B%0A%20%20%20%20%20%20if%20%28src%20%26%26%20%2F%5Ehttps%3F%3A%2Fi.test%28src%29%29%20addMediaHint%28src%2C%20%27video-src%27%29%3B%0A%0A%20%20%20%20%20%20const%20pm%20%3D%20poster.match%28%2Famplify_video_thumb%5C%2F%28%5Cd%2B%29%2Fi%29%3B%0A%20%20%20%20%20%20if%20%28pm%29%20assetIds.add%28pm%5B1%5D%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Explicitly%20climb%20React%27s%20parent-fiber%20chain.%20This%20is%20where%20X%20often%20keeps%0A%20%20%20%20%20%20%2F%2F%20the%20tweet%20object%20%2F%20media%20variants%3B%20a%20generic%20object%20walk%20cannot%20safely%0A%20%20%20%20%20%20%2F%2F%20follow%20%60return%60%20because%20it%20creates%20graph%20cycles.%0A%20%20%20%20%20%20let%20fiber%20%3D%20findReactFiber%28video%29%3B%0A%20%20%20%20%20%20if%20%28%21fiber%29%20%7B%0A%20%20%20%20%20%20%20%20let%20ancestor%20%3D%20video.parentElement%3B%0A%20%20%20%20%20%20%20%20for%20%28let%20up%20%3D%200%3B%20ancestor%20%26%26%20up%20%3C%208%20%26%26%20%21fiber%3B%20up%2B%2B%2C%20ancestor%20%3D%20ancestor.parentElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20fiber%20%3D%20findReactFiber%28ancestor%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20%28fiber%29%20%7B%0A%20%20%20%20%20%20%20%20const%20walked%20%3D%20walkReactAncestors%28fiber%29%3B%0A%20%20%20%20%20%20%20%20reactFibersWalked%20%2B%3D%20walked.fibers%3B%0A%20%20%20%20%20%20%20%20objectsWalked%20%2B%3D%20walked.objects%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20%3Csource%3E%20descendants%2Fsiblings.%0A%20%20%20%20%20%20for%20%28const%20source%20of%20video.querySelectorAll%28%27source%27%29%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28source.src%29%20addMediaHint%28source.src%2C%20%27video-source%27%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Walk%20the%20video%20and%20a%20few%20local%20ancestors%20for%20attached%20framework%20state.%0A%20%20%20%20%20%20let%20node%20%3D%20video%3B%0A%20%20%20%20%20%20for%20%28let%20up%20%3D%200%3B%20node%20%26%26%20up%20%3C%207%3B%20up%2B%2B%2C%20node%20%3D%20node.parentElement%29%20%7B%0A%20%20%20%20%20%20%20%20let%20keys%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20try%20%7B%20keys%20%3D%20Object.getOwnPropertyNames%28node%29%3B%20%7D%20catch%20%7B%7D%0A%0A%20%20%20%20%20%20%20%20for%20%28const%20key%20of%20keys%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%2F%5E__react%28%3F%3AProps%7CFiber%29%5C%24%7C%5E__vueParentComponent%24%7C%5E__vue__%24%2Fi.test%28key%29%29%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20rootsWalked%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20objectsWalked%20%2B%3D%20boundedWalk%28node%5Bkey%5D%2C%20%60framework%3A%24%7Bkey%7D%60%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20maxObjects%3A%20900%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20maxDepth%3A%209%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Helpful%20generic%20attributes%20on%20the%20local%20subtree.%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20for%20%28const%20el%20of%20%5Bvideo%2C%20...video.querySelectorAll%28%27%5Bsrc%5D%2C%5Bhref%5D%2C%5Bdata-src%5D%2C%5Bdata-url%5D%27%29%5D.slice%280%2C%20150%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20for%20%28const%20name%20of%20%5B%27src%27%2C%20%27href%27%2C%20%27data-src%27%2C%20%27data-url%27%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20value%20%3D%20el.getAttribute%3F.%28name%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28value%20%26%26%20looksMediaLike%28value%29%29%20addMediaHint%28value%2C%20%60dom%3A%24%7Bname%7D%60%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%0A%20%20%20%20%20%20void%20i%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Script%2Fbootstrap%20state.%20Bounded%20by%20total%20characters%20so%20we%20do%20not%20chew%20through%20huge%20app%20bundles.%0A%20%20%20%20let%20scriptChars%20%3D%200%3B%0A%20%20%20%20for%20%28const%20script%20of%20document.scripts%29%20%7B%0A%20%20%20%20%20%20const%20text%20%3D%20script.textContent%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20if%20%28%21text%20%7C%7C%20scriptChars%20%3E%208_000_000%29%20break%3B%0A%20%20%20%20%20%20scriptChars%20%2B%3D%20text.length%3B%0A%20%20%20%20%20%20if%20%28%2Fvideo%5C.twimg%5C.com%7Cdms%5C.licdn%5C.com%7C%5C.m3u8%7C%5C.mp4%2Fi.test%28text%29%29%20%7B%0A%20%20%20%20%20%20%20%20harvestStrings%28text%2C%20%27script-state%27%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Parse%20JSON%20scripts%20when%20plausible.%0A%20%20%20%20%20%20%20%20if%20%28%2Fapplication%5C%2Fjson%2Fi.test%28script.type%20%7C%7C%20%27%27%29%20%26%26%20text.length%20%3C%205_000_000%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20value%20%3D%20JSON.parse%28text%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20rootsWalked%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20objectsWalked%20%2B%3D%20boundedWalk%28value%2C%20%27script-json%27%2C%20%7B%20maxObjects%3A%201400%2C%20maxDepth%3A%2012%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Common%20bootstrap%20globals%20if%20present.%0A%20%20%20%20for%20%28const%20key%20of%20%5B%27__NEXT_DATA__%27%2C%20%27__INITIAL_STATE__%27%2C%20%27__APOLLO_STATE__%27%5D%29%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20if%20%28window%5Bkey%5D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20rootsWalked%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20objectsWalked%20%2B%3D%20boundedWalk%28window%5Bkey%5D%2C%20%60window.%24%7Bkey%7D%60%2C%20%7B%20maxObjects%3A%201400%2C%20maxDepth%3A%2012%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20catch%20%7B%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20videos%2C%0A%20%20%20%20%20%20assetIds%3A%20%5B...assetIds%5D%2C%0A%20%20%20%20%20%20rootsWalked%2C%0A%20%20%20%20%20%20objectsWalked%2C%0A%20%20%20%20%20%20reactFibersWalked%2C%0A%20%20%20%20%20%20scriptChars%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20Classification%20helpers%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20function%20parseXAsset%28url%29%20%7B%0A%20%20%20%20const%20m%20%3D%20url.match%28%2F%5Ehttps%3A%5C%2F%5C%2Fvideo%5C.twimg%5C.com%5C%2F%28%3F%3Aamplify_video%7Cext_tw_video%7Ctweet_video%29%5C%2F%28%5Cd%2B%29%5C%2F%2Fi%29%3B%0A%20%20%20%20return%20m%3F.%5B1%5D%20%7C%7C%20null%3B%0A%20%20%7D%0A%0A%20%20function%20parseXCmaf%28url%29%20%7B%0A%20%20%20%20const%20m%20%3D%20url.match%28%2F%5C%2F%28vid%7Caud%29%5C%2F%28%5B%5E%2F%5D%2B%29%5C%2F%28%5Cd%2B%29%5C%2F%28%5Cd%2B%29%5C%2F%28%5B%5E%2F%5D%2B%29%5C%2F%28%5B%5E%2F%3F%5D%2B%5C.%28%3F%3Am4s%7Cmp4%7Cwebm%29%29%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi%29%3B%0A%20%20%20%20if%20%28%21m%29%20return%20null%3B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20mediaType%3A%20m%5B1%5D.toLowerCase%28%29%2C%0A%20%20%20%20%20%20codec%3A%20m%5B2%5D%2C%0A%20%20%20%20%20%20start%3A%20Number%28m%5B3%5D%29%2C%0A%20%20%20%20%20%20end%3A%20Number%28m%5B4%5D%29%2C%0A%20%20%20%20%20%20quality%3A%20m%5B5%5D%2C%0A%20%20%20%20%20%20filename%3A%20m%5B6%5D%2C%0A%20%20%20%20%20%20ext%3A%20m%5B6%5D.split%28%27.%27%29.pop%28%29.toLowerCase%28%29%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20calcCoverage%28items%2C%20pageDurationMs%20%3D%20null%29%20%7B%0A%20%20%20%20const%20segs%20%3D%20items%0A%20%20%20%20%20%20.filter%28x%20%3D%3E%20Number.isFinite%28x.start%29%20%26%26%20Number.isFinite%28x.end%29%20%26%26%20x.end%20%3E%20x.start%29%0A%20%20%20%20%20%20.sort%28%28a%2C%20b%29%20%3D%3E%20a.start%20-%20b.start%29%3B%0A%0A%20%20%20%20if%20%28%21segs.length%29%20return%20%7B%20start%3A%20null%2C%20end%3A%20null%2C%20gaps%3A%20%5B%5D%2C%20contiguousFromZero%3A%20false%20%7D%3B%0A%0A%20%20%20%20const%20gaps%20%3D%20%5B%5D%3B%0A%20%20%20%20let%20cursor%20%3D%200%3B%0A%20%20%20%20for%20%28const%20s%20of%20segs%29%20%7B%0A%20%20%20%20%20%20if%20%28s.start%20%3E%20cursor%20%2B%201%29%20gaps.push%28%5Bcursor%2C%20s.start%5D%29%3B%0A%20%20%20%20%20%20cursor%20%3D%20Math.max%28cursor%2C%20s.end%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28pageDurationMs%20%21%3D%20null%20%26%26%20pageDurationMs%20%3E%20cursor%20%2B%201000%29%20gaps.push%28%5Bcursor%2C%20pageDurationMs%5D%29%3B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20start%3A%20segs%5B0%5D.start%2C%0A%20%20%20%20%20%20end%3A%20cursor%2C%0A%20%20%20%20%20%20gaps%2C%0A%20%20%20%20%20%20contiguousFromZero%3A%20segs%5B0%5D.start%20%3C%3D%201%20%26%26%20gaps.length%20%3D%3D%3D%200%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20function%20classify%28domInfo%29%20%7B%0A%20%20%20%20const%20obs%20%3D%20%5B...observations.values%28%29%5D%3B%0A%20%20%20%20const%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20const%20consumed%20%3D%20new%20Set%28%29%3B%0A%20%20%20%20const%20suppressed%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20const%20videos%20%3D%20domInfo.videos%3B%0A%20%20%20%20const%20primaryDurationMs%20%3D%20%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20d%20%3D%20videos.map%28v%20%3D%3E%20v.duration%29.find%28Number.isFinite%29%3B%0A%20%20%20%20%20%20return%20d%20%3F%20d%20%2A%201000%20%3A%20null%3B%0A%20%20%20%20%7D%29%28%29%3B%0A%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%20%20%20%20%2F%2F%20LinkedIn%20ordered%20fragmented%20MP4%20%28proven%20path%29%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%0A%20%20%20%20const%20liRE%20%3D%20%2F%5E%28https%3A%5C%2F%5C%2Fdms%5C.licdn%5C.com%5C%2Fplaylist%5C%2Fvid%5C%2Fv2%5C%2F%5B%5E%2F%5D%2B%5C%2F%28%5B%5E%2F%5D%2B%29%5C%2F%5B%5E%2F%5D%2B%29%5C%2F%28%5Cd%2B%29%5C%2F%28%5Cd%2B%29%28%5C%3F.%2A%29%24%2Fi%3B%0A%20%20%20%20const%20liGroups%20%3D%20new%20Map%28%29%3B%0A%0A%20%20%20%20for%20%28const%20r%20of%20obs%29%20%7B%0A%20%20%20%20%20%20const%20m%20%3D%20r.url.match%28liRE%29%3B%0A%20%20%20%20%20%20if%20%28%21m%29%20continue%3B%0A%20%20%20%20%20%20const%20%5B%2C%20prefix%2C%20rendition%2C%20partStr%2C%20timestamp%5D%20%3D%20m%3B%0A%20%20%20%20%20%20const%20key%20%3D%20%60%24%7Bprefix%7D%2F%24%7Btimestamp%7D%60%3B%0A%20%20%20%20%20%20if%20%28%21liGroups.has%28key%29%29%20liGroups.set%28key%2C%20%7B%20rendition%2C%20parts%3A%20%5B%5D%20%7D%29%3B%0A%20%20%20%20%20%20liGroups.get%28key%29.parts.push%28%7B%20...r%2C%20part%3A%20Number%28partStr%29%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20linkedinOptions%20%3D%20%5B%5D%3B%0A%0A%20%20%20%20const%20linkedinLabel%20%3D%20rendition%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20name%20%3D%20String%28rendition%20%7C%7C%20%27%27%29%3B%0A%20%20%20%20%20%20const%20lower%20%3D%20name.toLowerCase%28%29%3B%0A%20%20%20%20%20%20const%20height%20%3D%20Number%28lower.match%28%2F%28%3F%3A%5E%7C%5B-_%5D%29%28%5Cd%7B3%2C4%7D%29p%28%3F%3A%5B-_%5D%7C%24%29%2F%29%3F.%5B1%5D%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20bitrateMbps%20%3D%20Number%28lower.match%28%2F%28%3F%3A%5E%7C%5B-_%5D%29%28%5Cd%2B%28%3F%3A%5C.%5Cd%2B%29%3F%29mbps%28%3F%3A%5B-_%5D%7C%24%29%2F%29%3F.%5B1%5D%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20fps%20%3D%20Number%28lower.match%28%2F%28%3F%3A%5E%7C%5B-_%5D%29%28%5Cd%2B%29%28%3F%3Afp%7Cfps%29%28%3F%3A%5B-_%5D%7C%24%29%2F%29%3F.%5B1%5D%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20crf%20%3D%20Number%28lower.match%28%2F%28%3F%3A%5E%7C%5B-_%5D%29crf%28%5Cd%2B%29%28%3F%3A%5B-_%5D%7C%24%29%2F%29%3F.%5B1%5D%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20const%20direct%20%3D%20%2F%5Emp4%5B-_%5D%2Fi.test%28name%29%3B%0A%20%20%20%20%20%20const%20av1%20%3D%20%2F%28%3F%3A%5E%7C%5B-_%5D%29av1%28%3F%3A%5B-_%5D%7C%24%29%2Fi.test%28name%29%3B%0A%20%20%20%20%20%20const%20hls%20%3D%20%2F%5Ehls%5B-_%5D%2Fi.test%28name%29%3B%0A%20%20%20%20%20%20const%20premium%20%3D%20%2Fpremium%2Fi.test%28name%29%3B%0A%0A%20%20%20%20%20%20const%20bits%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20if%20%28height%29%20bits.push%28%60%24%7Bheight%7Dp%60%29%3B%0A%20%20%20%20%20%20if%20%28direct%29%20bits.push%28%27MP4%27%29%3B%0A%20%20%20%20%20%20else%20if%20%28av1%20%26%26%20hls%29%20bits.push%28%27AV1%2FHLS%27%29%3B%0A%20%20%20%20%20%20else%20if%20%28hls%29%20bits.push%28%27HLS%27%29%3B%0A%20%20%20%20%20%20if%20%28premium%29%20bits.push%28%27Premium%27%29%3B%0A%20%20%20%20%20%20if%20%28bitrateMbps%29%20bits.push%28%60%24%7BbitrateMbps%7D%20Mbps%60%29%3B%0A%20%20%20%20%20%20if%20%28fps%29%20bits.push%28%60%24%7Bfps%7Dfps%60%29%3B%0A%20%20%20%20%20%20if%20%28crf%29%20bits.push%28%60CRF%24%7Bcrf%7D%60%29%3B%0A%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20label%3A%20bits.join%28%27%20%C2%B7%20%27%29%20%7C%7C%20name%2C%0A%20%20%20%20%20%20%20%20height%2C%0A%20%20%20%20%20%20%20%20bitrate%3A%20bitrateMbps%20%2A%201_000_000%2C%0A%20%20%20%20%20%20%20%20direct%2C%0A%20%20%20%20%20%20%20%20av1%2C%0A%20%20%20%20%20%20%20%20hls%2C%0A%20%20%20%20%20%20%20%20premium%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20for%20%28const%20group%20of%20liGroups.values%28%29%29%20%7B%0A%20%20%20%20%20%20let%20parts%20%3D%20group.parts.sort%28%28a%2C%20b%29%20%3D%3E%20a.part%20-%20b.part%29%3B%0A%20%20%20%20%20%20parts%20%3D%20parts.filter%28%28p%2C%20i%2C%20xs%29%20%3D%3E%20i%20%3D%3D%3D%200%20%7C%7C%20p.part%20%21%3D%3D%20xs%5Bi%20-%201%5D.part%29%3B%0A%20%20%20%20%20%20if%20%28%21parts.length%29%20continue%3B%0A%20%20%20%20%20%20parts.forEach%28p%20%3D%3E%20consumed.add%28p.url%29%29%3B%0A%0A%20%20%20%20%20%20const%20rendition%20%3D%20String%28group.rendition%20%7C%7C%20%27%27%29%3B%0A%20%20%20%20%20%20if%20%28%2Fthumbnail%7Ccaption%7Cwebvtt%7Csubtitle%7Csprite%7Cposter%7Cimage%2Fi.test%28rendition%29%29%20%7B%0A%20%20%20%20%20%20%20%20suppressed.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20url%3A%20parts%5B0%5D%3F.url%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20%20%20reason%3A%20%60LinkedIn%20auxiliary%20asset%3A%20%24%7Brendition%7D%60%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20commands%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%60d%3D%24%28mktemp%20-d%29%60%2C%0A%20%20%20%20%20%20%20%20...parts.map%28%28p%2C%20i%29%20%3D%3E%20%60curl%20-fL%20%24%7BshellQuote%28p.url%29%7D%20-o%20%22%24d%2F%24%7BString%28i%29.padStart%283%2C%20%270%27%29%7D%22%60%29%2C%0A%20%20%20%20%20%20%20%20%60cat%20%22%24d%2F%22%2A%20%3E%20%22%24d%2Finput.mp4%22%60%2C%0A%20%20%20%20%20%20%20%20%60ffmpeg%20-y%20-i%20%22%24d%2Finput.mp4%22%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%2C%0A%20%20%20%20%20%20%20%20%60rm%20-rf%20%22%24d%22%60%0A%20%20%20%20%20%20%5D%3B%0A%0A%20%20%20%20%20%20const%20info%20%3D%20linkedinLabel%28rendition%29%3B%0A%20%20%20%20%20%20const%20totalBytes%20%3D%20parts.reduce%28%28sum%2C%20p%29%20%3D%3E%20sum%20%2B%20Number%28p.encodedBodySize%20%7C%7C%20p.transferSize%20%7C%7C%200%29%2C%200%29%3B%0A%0A%20%20%20%20%20%20linkedinOptions.push%28%7B%0A%20%20%20%20%20%20%20%20label%3A%20info.label%20%3D%3D%3D%20rendition%20%3F%20rendition%20%3A%20%60%24%7Binfo.label%7D%20%E2%80%94%20%24%7Brendition%7D%60%2C%0A%20%20%20%20%20%20%20%20rendition%2C%0A%20%20%20%20%20%20%20%20height%3A%20info.height%2C%0A%20%20%20%20%20%20%20%20bandwidth%3A%20info.bitrate%2C%0A%20%20%20%20%20%20%20%20direct%3A%20info.direct%2C%0A%20%20%20%20%20%20%20%20urls%3A%20parts.map%28p%20%3D%3E%20p.url%29%2C%0A%20%20%20%20%20%20%20%20ffmpeg%3A%20commands.join%28%27%20%26%26%20%5C%5C%5Cn%20%20%27%29%2C%0A%20%20%20%20%20%20%20%20fragmentCount%3A%20parts.length%2C%0A%20%20%20%20%20%20%20%20totalBytes%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20linkedinOptions.sort%28%28a%2C%20b%29%20%3D%3E%0A%20%20%20%20%20%20%28b.height%20%7C%7C%200%29%20-%20%28a.height%20%7C%7C%200%29%20%7C%7C%0A%20%20%20%20%20%20Number%28b.direct%29%20-%20Number%28a.direct%29%20%7C%7C%0A%20%20%20%20%20%20%28b.bandwidth%20%7C%7C%200%29%20-%20%28a.bandwidth%20%7C%7C%200%29%20%7C%7C%0A%20%20%20%20%20%20a.label.localeCompare%28b.label%29%0A%20%20%20%20%29%3B%0A%0A%20%20%20%20if%20%28linkedinOptions.length%29%20%7B%0A%20%20%20%20%20%20const%20best%20%3D%20linkedinOptions%5B0%5D%3B%0A%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20kind%3A%20%27linkedin-variants%27%2C%0A%20%20%20%20%20%20%20%20confidence%3A%20%27high%27%2C%0A%20%20%20%20%20%20%20%20title%3A%20%27LinkedIn%20video%27%2C%0A%20%20%20%20%20%20%20%20subtitle%3A%20%60%24%7BlinkedinOptions.length%7D%20recovered%20rendition%24%7BlinkedinOptions.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%2C%0A%20%20%20%20%20%20%20%20detail%3A%20%27Choose%20the%20rendition%20you%20want%20to%20reconstruct%20locally%27%2C%0A%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20primaryDurationMs%20%3F%20%60page%20duration%3A%20%24%7BhumanTime%28primaryDurationMs%29%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20videos%5B0%5D%3F.videoWidth%20%26%26%20videos%5B0%5D%3F.videoHeight%20%3F%20%60player%3A%20%24%7Bvideos%5B0%5D.videoWidth%7D%C3%97%24%7Bvideos%5B0%5D.videoHeight%7D%60%20%3A%20null%0A%20%20%20%20%20%20%20%20%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20urls%3A%20best.urls%2C%0A%20%20%20%20%20%20%20%20qualityOptions%3A%20linkedinOptions%2C%0A%20%20%20%20%20%20%20%20selectionKey%3A%20%60linkedin%3A%24%7Blocation.pathname%7D%60%2C%0A%20%20%20%20%20%20%20%20optionUrlLabel%3A%20%27Copy%20rendition%20URLs%27%2C%0A%20%20%20%20%20%20%20%20ffmpeg%3A%20best.ffmpeg%2C%0A%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20LinkedIn%20also%20exposes%20dynamic%20playlist%2Fcontrol%20endpoints%20that%20are%20useful%0A%20%20%20%20%2F%2F%20for%20debug%2C%20but%20are%20not%20themselves%20media%20files.%0A%20%20%20%20for%20%28const%20r%20of%20obs%29%20%7B%0A%20%20%20%20%20%20if%20%28consumed.has%28r.url%29%29%20continue%3B%0A%20%20%20%20%20%20if%20%28%2F%5Ehttps%3A%5C%2F%5C%2Fdms%5C.licdn%5C.com%5C%2Fplaylist%5C%2Fvid%5C%2Fdynamic%5C%2F%2Fi.test%28r.url%29%29%20%7B%0A%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20suppressed.push%28%7B%20url%3A%20r.url%2C%20reason%3A%20%27LinkedIn%20dynamic%20playlist%2Fcontrol%20endpoint%27%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%20%20%20%20%2F%2F%20X%20%2F%20Twitter%3A%20prefer%20media%20state%2Fmanifest%2Fdirect%20variants%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%0A%20%20%20%20const%20xObs%20%3D%20obs.filter%28r%20%3D%3E%20%2F%5Ehttps%3A%5C%2F%5C%2Fvideo%5C.twimg%5C.com%5C%2F%2Fi.test%28r.url%29%29%3B%0A%20%20%20%20const%20xAssets%20%3D%20new%20Map%28%29%3B%0A%0A%20%20%20%20for%20%28const%20r%20of%20xObs%29%20%7B%0A%20%20%20%20%20%20const%20asset%20%3D%20parseXAsset%28r.url%29%20%7C%7C%20%27unknown%27%3B%0A%20%20%20%20%20%20if%20%28%21xAssets.has%28asset%29%29%20xAssets.set%28asset%2C%20%5B%5D%29%3B%0A%20%20%20%20%20%20xAssets.get%28asset%29.push%28r%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20If%20the%20page%27s%20active%20video%20poster%20gives%20us%20an%20asset%20ID%2C%20scope%20X%20results%0A%20%20%20%20%2F%2F%20to%20that%20asset.%20This%20avoids%20surfacing%20media%20from%20unrelated%20cards%2Fcomponents.%0A%20%20%20%20const%20allAssetEntries%20%3D%20%5B...xAssets.entries%28%29%5D%3B%0A%20%20%20%20const%20hasTargetAsset%20%3D%20domInfo.assetIds.length%20%3E%200%20%26%26%0A%20%20%20%20%20%20allAssetEntries.some%28%28%5Bid%5D%29%20%3D%3E%20domInfo.assetIds.includes%28id%29%29%3B%0A%0A%20%20%20%20const%20orderedAssets%20%3D%20%28hasTargetAsset%0A%20%20%20%20%20%20%3F%20allAssetEntries.filter%28%28%5Bid%5D%29%20%3D%3E%20domInfo.assetIds.includes%28id%29%29%0A%20%20%20%20%20%20%3A%20allAssetEntries%0A%20%20%20%20%29.sort%28%28%5Ba%5D%2C%20%5Bb%5D%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20ap%20%3D%20domInfo.assetIds.includes%28a%29%20%3F%201%20%3A%200%3B%0A%20%20%20%20%20%20const%20bp%20%3D%20domInfo.assetIds.includes%28b%29%20%3F%201%20%3A%200%3B%0A%20%20%20%20%20%20return%20bp%20-%20ap%3B%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20for%20%28const%20%5Basset%2C%20rs%5D%20of%20orderedAssets%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20HLS%20%2F%20DASH%20manifests%20are%20best.%20For%20HLS%20master%20playlists%2C%20inspect%20the%0A%20%20%20%20%20%20%2F%2F%20playlist%20and%20expose%20the%20actual%20quality%20variants%20rather%20than%20copying%0A%20%20%20%20%20%20%2F%2F%20every%20rendition%20into%20one%20MP4.%0A%20%20%20%20%20%20const%20manifests%20%3D%20rs.filter%28r%20%3D%3E%20%2F%5C.%28%3F%3Am3u8%7Cmpd%29%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%29%3B%0A%20%20%20%20%20%20if%20%28manifests.length%29%20%7B%0A%20%20%20%20%20%20%20%20const%20manifest%20%3D%20manifests.find%28r%20%3D%3E%20%2F%5C.m3u8%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%29%20%7C%7C%20manifests%5B0%5D%3B%0A%20%20%20%20%20%20%20%20rs.forEach%28r%20%3D%3E%20consumed.add%28r.url%29%29%3B%0A%20%20%20%20%20%20%20%20const%20isHls%20%3D%20%2F%5C.m3u8%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28manifest.url%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28isHls%20%26%26%20%21hlsCache.has%28manifest.url%29%29%20probeHlsManifest%28manifest.url%29%3B%0A%20%20%20%20%20%20%20%20const%20hlsInfo%20%3D%20isHls%20%3F%20hlsCache.get%28manifest.url%29%20%3A%20null%3B%0A%20%20%20%20%20%20%20%20const%20qualityOptions%20%3D%20hlsInfo%3F.status%20%3D%3D%3D%20%27ok%27%20%26%26%20hlsInfo.isMaster%0A%20%20%20%20%20%20%20%20%20%20%3F%20hlsInfo.variants.map%28v%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3A%20hlsVariantLabel%28v%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolution%3A%20v.resolution%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20bandwidth%3A%20v.bandwidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoUrl%3A%20v.videoUrl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioUrl%3A%20v.audioUrl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20urls%3A%20%5Bv.videoUrl%2C%20v.audioUrl%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20hlsVariantCommand%28v%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%29%0A%20%20%20%20%20%20%20%20%20%20%3A%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20kind%3A%20isHls%20%3F%20%27twitter-hls%27%20%3A%20%27twitter-dash%27%2C%0A%20%20%20%20%20%20%20%20%20%20confidence%3A%20%27high%27%2C%0A%20%20%20%20%20%20%20%20%20%20title%3A%20%27X%20%2F%20Twitter%20video%27%2C%0A%20%20%20%20%20%20%20%20%20%20subtitle%3A%20isHls%20%3F%20%27HLS%20manifest%27%20%3A%20%27DASH%20manifest%27%2C%0A%20%20%20%20%20%20%20%20%20%20detail%3A%20isHls%20%26%26%20qualityOptions.length%0A%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%60Master%20manifest%20%C2%B7%20%24%7BqualityOptions.length%7D%20quality%20variant%24%7BqualityOptions.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%27Manifest%20recovered%20from%20page%2Fbrowser%20state%27%2C%0A%20%20%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20asset%20%21%3D%3D%20%27unknown%27%20%3F%20%60asset%20%24%7Basset%7D%60%20%3A%20host%28manifest.url%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20isHls%20%26%26%20hlsProbePending.has%28manifest.url%29%20%3F%20%27reading%20quality%20variants%E2%80%A6%27%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20isHls%20%26%26%20hlsInfo%3F.status%20%3D%3D%3D%20%27error%27%20%3F%20%60quality%20probe%20unavailable%3A%20%24%7BhlsInfo.error%7D%60%20%3A%20null%0A%20%20%20%20%20%20%20%20%20%20%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20urls%3A%20%5Bmanifest.url%5D%2C%0A%20%20%20%20%20%20%20%20%20%20manifestUrl%3A%20manifest.url%2C%0A%20%20%20%20%20%20%20%20%20%20qualityOptions%2C%0A%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20isHls%0A%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%28qualityOptions%5B0%5D%3F.ffmpeg%20%7C%7C%20null%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28manifest.url%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%2C%0A%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Direct%20progressive%20variants%3A%20.mp4%20but%20NOT%20the%20start%2Fend%20CMAF%20structure.%0A%20%20%20%20%20%20const%20direct%20%3D%20rs.filter%28r%20%3D%3E%20%2F%5C.mp4%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%20%26%26%20%21parseXCmaf%28r.url%29%29%3B%0A%20%20%20%20%20%20if%20%28direct.length%29%20%7B%0A%20%20%20%20%20%20%20%20const%20rank%20%3D%20r%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20hint%20%3D%20mediaHints.find%28h%20%3D%3E%20h.url%20%3D%3D%3D%20r.url%29%3B%0A%20%20%20%20%20%20%20%20%20%20const%20br%20%3D%20Number%28hint%3F.bitrate%20%7C%7C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20const%20rm%20%3D%20r.url.match%28%2F%5C%2F%28%5Cd%2B%29x%28%5Cd%2B%29%5C%2F%2F%29%3B%0A%20%20%20%20%20%20%20%20%20%20const%20px%20%3D%20rm%20%3F%20Number%28rm%5B1%5D%29%20%2A%20Number%28rm%5B2%5D%29%20%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20return%20br%20%2A%2010_000_000%20%2B%20px%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20const%20best%20%3D%20%5B...direct%5D.sort%28%28a%2C%20b%29%20%3D%3E%20rank%28b%29%20-%20rank%28a%29%29%5B0%5D%3B%0A%20%20%20%20%20%20%20%20rs.forEach%28r%20%3D%3E%20consumed.add%28r.url%29%29%3B%0A%20%20%20%20%20%20%20%20const%20hint%20%3D%20mediaHints.find%28h%20%3D%3E%20h.url%20%3D%3D%3D%20best.url%29%3B%0A%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20kind%3A%20%27twitter-direct%27%2C%0A%20%20%20%20%20%20%20%20%20%20confidence%3A%20%27high%27%2C%0A%20%20%20%20%20%20%20%20%20%20title%3A%20%27X%20%2F%20Twitter%20video%27%2C%0A%20%20%20%20%20%20%20%20%20%20subtitle%3A%20%27direct%20MP4%27%2C%0A%20%20%20%20%20%20%20%20%20%20detail%3A%20%27Standalone%20media%20variant%20recovered%27%2C%0A%20%20%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20hint%3F.bitrate%20%3F%20%60%24%7BMath.round%28hint.bitrate%20%2F%201000%29%7D%20kbps%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20host%28best.url%29%0A%20%20%20%20%20%20%20%20%20%20%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20urls%3A%20%5Bbest.url%5D%2C%0A%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28best.url%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%2C%0A%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20CMAF%20fragments%3A%20only%20emit%20ffmpeg%20if%20we%20have%20init%20%2B%20contiguous%20coverage.%0A%20%20%20%20%20%20const%20parsed%20%3D%20rs%0A%20%20%20%20%20%20%20%20.map%28resource%20%3D%3E%20%28%7B%20resource%2C%20parsed%3A%20parseXCmaf%28resource.url%29%20%7D%29%29%0A%20%20%20%20%20%20%20%20.filter%28x%20%3D%3E%20x.parsed%29%3B%0A%0A%20%20%20%20%20%20if%20%28parsed.length%29%20%7B%0A%20%20%20%20%20%20%20%20rs.forEach%28r%20%3D%3E%20consumed.add%28r.url%29%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20reps%20%3D%20new%20Map%28%29%3B%0A%20%20%20%20%20%20%20%20for%20%28const%20x%20of%20parsed%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20p%20%3D%20x.parsed%3B%0A%20%20%20%20%20%20%20%20%20%20const%20key%20%3D%20%60%24%7Bp.mediaType%7D%3A%24%7Bp.codec%7D%3A%24%7Bp.quality%7D%60%3B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21reps.has%28key%29%29%20reps.set%28key%2C%20%7B%20...p%2C%20items%3A%20%5B%5D%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20reps.get%28key%29.items.push%28x%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20const%20videoReps%20%3D%20%5B...reps.values%28%29%5D.filter%28r%20%3D%3E%20r.mediaType%20%3D%3D%3D%20%27vid%27%29%3B%0A%20%20%20%20%20%20%20%20const%20audioReps%20%3D%20%5B...reps.values%28%29%5D.filter%28r%20%3D%3E%20r.mediaType%20%3D%3D%3D%20%27aud%27%29%3B%0A%0A%20%20%20%20%20%20%20%20videoReps.sort%28%28a%2C%20b%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20am%20%3D%20a.quality.match%28%2F%5E%28%5Cd%2B%29x%28%5Cd%2B%29%24%2F%29%3B%0A%20%20%20%20%20%20%20%20%20%20const%20bm%20%3D%20b.quality.match%28%2F%5E%28%5Cd%2B%29x%28%5Cd%2B%29%24%2F%29%3B%0A%20%20%20%20%20%20%20%20%20%20const%20ap%20%3D%20am%20%3F%20Number%28am%5B1%5D%29%20%2A%20Number%28am%5B2%5D%29%20%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20const%20bp%20%3D%20bm%20%3F%20Number%28bm%5B1%5D%29%20%2A%20Number%28bm%5B2%5D%29%20%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20return%20bp%20-%20ap%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20audioReps.sort%28%28a%2C%20b%29%20%3D%3E%20Number%28b.quality%29%20-%20Number%28a.quality%29%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20vr%20%3D%20videoReps%5B0%5D%20%7C%7C%20null%3B%0A%20%20%20%20%20%20%20%20const%20ar%20%3D%20audioReps%5B0%5D%20%7C%7C%20null%3B%0A%0A%20%20%20%20%20%20%20%20const%20analyse%20%3D%20rep%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21rep%29%20return%20%7B%20init%3A%20null%2C%20segments%3A%20%5B%5D%2C%20coverage%3A%20calcCoverage%28%5B%5D%2C%20primaryDurationMs%29%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20const%20init%20%3D%20rep.items.find%28x%20%3D%3E%20x.parsed.start%20%3D%3D%3D%200%20%26%26%20x.parsed.end%20%3D%3D%3D%200%20%26%26%20x.parsed.ext%20%3D%3D%3D%20%27mp4%27%29%20%7C%7C%20null%3B%0A%20%20%20%20%20%20%20%20%20%20const%20segments%20%3D%20rep.items%0A%20%20%20%20%20%20%20%20%20%20%20%20.filter%28x%20%3D%3E%20%21%28x.parsed.start%20%3D%3D%3D%200%20%26%26%20x.parsed.end%20%3D%3D%3D%200%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20.sort%28%28a%2C%20b%29%20%3D%3E%20a.parsed.start%20-%20b.parsed.start%29%3B%0A%20%20%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20init%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20segments%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20coverage%3A%20calcCoverage%28segments.map%28x%20%3D%3E%20x.parsed%29%2C%20primaryDurationMs%29%0A%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20const%20v%20%3D%20analyse%28vr%29%3B%0A%20%20%20%20%20%20%20%20const%20a%20%3D%20analyse%28ar%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20videoReady%20%3D%20%21%21v.init%20%26%26%20v.segments.length%20%3E%200%20%26%26%20v.coverage.contiguousFromZero%3B%0A%20%20%20%20%20%20%20%20const%20audioReady%20%3D%20%21ar%20%7C%7C%20%28%21%21a.init%20%26%26%20a.segments.length%20%3E%200%20%26%26%20a.coverage.contiguousFromZero%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20urls%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20...%28v.init%20%3F%20%5Bv.init.resource.url%5D%20%3A%20%5B%5D%29%2C%0A%20%20%20%20%20%20%20%20%20%20...v.segments.map%28x%20%3D%3E%20x.resource.url%29%2C%0A%20%20%20%20%20%20%20%20%20%20...%28a.init%20%3F%20%5Ba.init.resource.url%5D%20%3A%20%5B%5D%29%2C%0A%20%20%20%20%20%20%20%20%20%20...a.segments.map%28x%20%3D%3E%20x.resource.url%29%0A%20%20%20%20%20%20%20%20%5D%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28videoReady%20%26%26%20audioReady%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20commands%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%60d%3D%24%28mktemp%20-d%29%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%60curl%20-fL%20%24%7BshellQuote%28v.init.resource.url%29%7D%20-o%20%22%24d%2Fvideo-init.mp4%22%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20...v.segments.map%28%28x%2C%20i%29%20%3D%3E%20%60curl%20-fL%20%24%7BshellQuote%28x.resource.url%29%7D%20-o%20%22%24d%2Fvideo-%24%7BString%28i%29.padStart%284%2C%20%270%27%29%7D.m4s%22%60%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%60cat%20%22%24d%2Fvideo-init.mp4%22%20%22%24d%22%2Fvideo-%2A.m4s%20%3E%20%22%24d%2Fvideo.mp4%22%60%0A%20%20%20%20%20%20%20%20%20%20%5D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20if%20%28ar%20%26%26%20a.init%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20commands.push%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60curl%20-fL%20%24%7BshellQuote%28a.init.resource.url%29%7D%20-o%20%22%24d%2Faudio-init.mp4%22%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20...a.segments.map%28%28x%2C%20i%29%20%3D%3E%20%60curl%20-fL%20%24%7BshellQuote%28x.resource.url%29%7D%20-o%20%22%24d%2Faudio-%24%7BString%28i%29.padStart%284%2C%20%270%27%29%7D.m4s%22%60%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60cat%20%22%24d%2Faudio-init.mp4%22%20%22%24d%22%2Faudio-%2A.m4s%20%3E%20%22%24d%2Faudio.mp4%22%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60ffmpeg%20-y%20-i%20%22%24d%2Fvideo.mp4%22%20-i%20%22%24d%2Faudio.mp4%22%20-map%200%3Av%3A0%20-map%201%3Aa%3A0%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20commands.push%28%60ffmpeg%20-y%20-i%20%22%24d%2Fvideo.mp4%22%20-map%200%3Av%3A0%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20commands.push%28%60rm%20-rf%20%22%24d%22%60%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3A%20%27twitter-cmaf-complete%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confidence%3A%20%27medium%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3A%20%27X%20%2F%20Twitter%20CMAF%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20subtitle%3A%20%5Bvr%3F.quality%2C%20vr%3F.codec%2C%20ar%20%3F%20%60%24%7Bar.codec%7D%20audio%60%20%3A%20null%5D.filter%28Boolean%29.join%28%27%20%C2%B7%20%27%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20detail%3A%20%27Initialization%20data%20and%20contiguous%20media%20captured%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60video%3A%20init%20%2B%20%24%7Bv.segments.length%7D%20fragment%24%7Bv.segments.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20...%28ar%20%3F%20%5B%60audio%3A%20init%20%2B%20%24%7Ba.segments.length%7D%20fragment%24%7Ba.segments.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%5D%20%3A%20%5B%5D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20urls%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20commands.join%28%27%20%26%26%20%5C%5C%5Cn%20%20%27%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20gapText%20%3D%20cov%20%3D%3E%20cov.gaps.slice%280%2C%204%29.map%28%28%5Bs%2C%20e%5D%29%20%3D%3E%20%60%24%7BhumanTime%28s%29%7D%E2%80%93%24%7BhumanTime%28e%29%7D%60%29.join%28%27%2C%20%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3A%20%27twitter-cmaf-incomplete%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confidence%3A%20%27diagnostic%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3A%20%27X%20%2F%20Twitter%20fragmented%20media%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20subtitle%3A%20%5Bvr%3F.quality%2C%20vr%3F.codec%2C%20ar%20%3F%20%60%24%7Bar.codec%7D%20audio%60%20%3A%20null%5D.filter%28Boolean%29.join%28%27%20%C2%B7%20%27%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20detail%3A%20%27Fragments%20detected%2C%20but%20no%20safe%20reconstruction%20command%20yet%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20vr%20%3F%20%60video%3A%20%24%7Bv.segments.length%7D%20fragments%20%C2%B7%20init%20%24%7Bv.init%20%3F%20%27yes%27%20%3A%20%27missing%27%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20vr%20%26%26%20v.coverage.start%20%21%3D%20null%20%3F%20%60video%20observed%3A%20%24%7BhumanTime%28v.coverage.start%29%7D%20%E2%86%92%20%24%7BhumanTime%28v.coverage.end%29%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20vr%20%26%26%20v.coverage.gaps.length%20%3F%20%60video%20gaps%3A%20%24%7BgapText%28v.coverage%29%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ar%20%3F%20%60audio%3A%20%24%7Ba.segments.length%7D%20fragments%20%C2%B7%20init%20%24%7Ba.init%20%3F%20%27yes%27%20%3A%20%27missing%27%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20primaryDurationMs%20%3F%20%60page%20duration%3A%20%24%7BhumanTime%28primaryDurationMs%29%7D%60%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%27A%20fresh%20page%20reload%20may%20expose%20the%20init%2Fmanifest%20in%20browser%20history.%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20urls%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20true%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%20%20%20%20%2F%2F%20Generic%20manifests%2Fdirect%20media%20not%20consumed%20above%0A%20%20%20%20%2F%2F%20----------------------------------------------------------%0A%0A%20%20%20%20for%20%28const%20r%20of%20obs%29%20%7B%0A%20%20%20%20%20%20if%20%28consumed.has%28r.url%29%29%20continue%3B%0A%0A%20%20%20%20%20%20if%20%28%2F%5C.m3u8%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%29%20%7B%0A%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21hlsCache.has%28r.url%29%29%20probeHlsManifest%28r.url%29%3B%0A%20%20%20%20%20%20%20%20const%20hlsInfo%20%3D%20hlsCache.get%28r.url%29%3B%0A%20%20%20%20%20%20%20%20const%20qualityOptions%20%3D%20hlsInfo%3F.status%20%3D%3D%3D%20%27ok%27%20%26%26%20hlsInfo.isMaster%0A%20%20%20%20%20%20%20%20%20%20%3F%20hlsInfo.variants.map%28v%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3A%20hlsVariantLabel%28v%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolution%3A%20v.resolution%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20bandwidth%3A%20v.bandwidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20videoUrl%3A%20v.videoUrl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20audioUrl%3A%20v.audioUrl%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20urls%3A%20%5Bv.videoUrl%2C%20v.audioUrl%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20hlsVariantCommand%28v%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%29%0A%20%20%20%20%20%20%20%20%20%20%3A%20%5B%5D%3B%0A%0A%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20kind%3A%20%27hls%27%2C%20confidence%3A%20%27high%27%2C%20title%3A%20%27HLS%20stream%27%2C%20subtitle%3A%20host%28r.url%29%2C%0A%20%20%20%20%20%20%20%20%20%20detail%3A%20qualityOptions.length%0A%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%60Master%20manifest%20%C2%B7%20%24%7BqualityOptions.length%7D%20quality%20variant%24%7BqualityOptions.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%27M3U8%20manifest%27%2C%0A%20%20%20%20%20%20%20%20%20%20meta%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20hlsProbePending.has%28r.url%29%20%3F%20%27reading%20quality%20variants%E2%80%A6%27%20%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hlsInfo%3F.status%20%3D%3D%3D%20%27error%27%20%3F%20%60quality%20probe%20unavailable%3A%20%24%7BhlsInfo.error%7D%60%20%3A%20null%0A%20%20%20%20%20%20%20%20%20%20%5D.filter%28Boolean%29%2C%0A%20%20%20%20%20%20%20%20%20%20urls%3A%20%5Br.url%5D%2C%0A%20%20%20%20%20%20%20%20%20%20manifestUrl%3A%20r.url%2C%0A%20%20%20%20%20%20%20%20%20%20qualityOptions%2C%0A%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20qualityOptions%5B0%5D%3F.ffmpeg%20%7C%7C%20%28hlsInfo%3F.status%20%3D%3D%3D%20%27ok%27%20%26%26%20%21hlsInfo.isMaster%0A%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28r.url%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%3A%20null%29%2C%0A%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28%2F%5C.mpd%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%29%20%7B%0A%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20kind%3A%20%27dash%27%2C%20confidence%3A%20%27high%27%2C%20title%3A%20%27DASH%20stream%27%2C%20subtitle%3A%20host%28r.url%29%2C%0A%20%20%20%20%20%20%20%20%20%20detail%3A%20%27MPD%20manifest%27%2C%20meta%3A%20%5B%5D%2C%20urls%3A%20%5Br.url%5D%2C%0A%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28r.url%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.mp4%60%2C%0A%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28%2F%5C.%28%3F%3Amp4%7Cwebm%29%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20On%20X%2C%20bootstrap%2Fscript%20state%20contains%20a%20pile%20of%20unrelated%20product%20and%0A%20%20%20%20%20%20%20%20%2F%2F%20promo%20animations%20%28abs.twimg.com%2C%20pbs.twimg.com%29.%20Do%20not%20present%20those%0A%20%20%20%20%20%20%20%20%2F%2F%20as%20tweet%20media%20merely%20because%20they%20end%20in%20.mp4.%0A%20%20%20%20%20%20%20%20const%20h%20%3D%20host%28r.url%29%3B%0A%20%20%20%20%20%20%20%20const%20onX%20%3D%20%2F%28%5E%7C%5C.%29x%5C.com%24%7C%28%5E%7C%5C.%29twitter%5C.com%24%2Fi.test%28location.hostname%29%3B%0A%20%20%20%20%20%20%20%20const%20directSources%20%3D%20r.sources%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20const%20isAttachedToVideo%20%3D%20directSources.some%28src%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%2F%5E%28video-src%7Cvideo-source%7Cdom%3Asrc%7Cdom%3Adata-src%29%24%2Fi.test%28src%29%0A%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20const%20matchesTargetAsset%20%3D%20domInfo.assetIds.some%28id%20%3D%3E%20r.url.includes%28id%29%29%3B%0A%20%20%20%20%20%20%20%20const%20isXMediaCdn%20%3D%20%2F%5Evideo%5C.twimg%5C.com%24%2Fi.test%28h%29%3B%0A%20%20%20%20%20%20%20%20const%20isXStaticChrome%20%3D%20%2F%5E%28%3F%3Aabs%7Cpbs%29%5C.twimg%5C.com%24%2Fi.test%28h%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28onX%20%26%26%20isXStaticChrome%20%26%26%20%21isAttachedToVideo%20%26%26%20%21matchesTargetAsset%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20%20%20suppressed.push%28%7B%20url%3A%20r.url%2C%20reason%3A%20%27X%20static%2Fapp%20asset%2C%20not%20target%20tweet%20media%27%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28onX%20%26%26%20%2F%5E.%2B%5C.twimg%5C.com%24%2Fi.test%28h%29%20%26%26%20%21isXMediaCdn%20%26%26%20%21isAttachedToVideo%20%26%26%20%21matchesTargetAsset%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20%20%20suppressed.push%28%7B%20url%3A%20r.url%2C%20reason%3A%20%27Unrelated%20X%20page%20asset%27%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20consumed.add%28r.url%29%3B%0A%20%20%20%20%20%20%20%20const%20ext%20%3D%20%2F%5C.webm%28%3F%3A%5B%3F%23%5D%7C%24%29%2Fi.test%28r.url%29%20%3F%20%27webm%27%20%3A%20%27mp4%27%3B%0A%20%20%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20%20%20kind%3A%20%27direct%27%2C%20confidence%3A%20isAttachedToVideo%20%7C%7C%20matchesTargetAsset%20%3F%20%27high%27%20%3A%20%27medium%27%2C%0A%20%20%20%20%20%20%20%20%20%20title%3A%20%60Direct%20%24%7Bext.toUpperCase%28%29%7D%20media%60%2C%20subtitle%3A%20h%2C%0A%20%20%20%20%20%20%20%20%20%20detail%3A%20%27Standalone%20media%20resource%27%2C%20meta%3A%20%5B%5D%2C%20urls%3A%20%5Br.url%5D%2C%0A%20%20%20%20%20%20%20%20%20%20ffmpeg%3A%20%60ffmpeg%20-y%20-i%20%24%7BshellQuote%28r.url%29%7D%20-map%200%20-c%20copy%20-movflags%20%2Bfaststart%20output.%24%7Bext%7D%60%2C%0A%20%20%20%20%20%20%20%20%20%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Unknown%20but%20media-like%20observations.%0A%20%20%20%20const%20unknown%20%3D%20obs.filter%28r%20%3D%3E%20looksMediaLike%28r.url%29%20%26%26%20%21consumed.has%28r.url%29%29%3B%0A%20%20%20%20if%20%28unknown.length%29%20%7B%0A%20%20%20%20%20%20results.push%28%7B%0A%20%20%20%20%20%20%20%20kind%3A%20%27unknown%27%2C%20confidence%3A%20%27diagnostic%27%2C%20title%3A%20%27Unclassified%20media%20candidates%27%2C%0A%20%20%20%20%20%20%20%20subtitle%3A%20%60%24%7Bunknown.length%7D%20resource%24%7Bunknown.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%2C%0A%20%20%20%20%20%20%20%20detail%3A%20%27Useful%20for%20debugging%20an%20unsupported%20site%27%2C%0A%20%20%20%20%20%20%20%20meta%3A%20unknown.slice%280%2C%2010%29.map%28r%20%3D%3E%20%60%24%7Bhost%28r.url%29%7D%24%7Br.encodedBodySize%20%7C%7C%20r.transferSize%20%3F%20%60%20%C2%B7%20%24%7BhumanSize%28r.encodedBodySize%20%7C%7C%20r.transferSize%29%7D%60%20%3A%20%27%27%7D%60%29%2C%0A%20%20%20%20%20%20%20%20urls%3A%20unknown.map%28r%20%3D%3E%20r.url%29%2C%20ffmpeg%3A%20null%2C%20reloadHelpful%3A%20false%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20%7B%20results%2C%20unknown%2C%20suppressed%20%7D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20Scan%20%2B%20debug%20bundle%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20function%20scan%28%7B%20silent%20%3D%20false%20%7D%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20const%20perfCount%20%3D%20seedPerformance%28%29%3B%0A%20%20%20%20const%20domInfo%20%3D%20scanDomAndFrameworkState%28%29%3B%0A%20%20%20%20const%20%7B%20results%2C%20unknown%2C%20suppressed%20%7D%20%3D%20classify%28domInfo%29%3B%0A%0A%20%20%20%20const%20videos%20%3D%20domInfo.videos.map%28%28v%2C%20index%29%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20index%2C%0A%20%20%20%20%20%20src%3A%20v.getAttribute%28%27src%27%29%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20currentSrc%3A%20v.currentSrc%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20poster%3A%20v.poster%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20currentTime%3A%20v.currentTime%20%7C%7C%200%2C%0A%20%20%20%20%20%20duration%3A%20Number.isFinite%28v.duration%29%20%3F%20v.duration%20%3A%20null%2C%0A%20%20%20%20%20%20paused%3A%20v.paused%2C%0A%20%20%20%20%20%20ended%3A%20v.ended%2C%0A%20%20%20%20%20%20readyState%3A%20v.readyState%2C%0A%20%20%20%20%20%20networkState%3A%20v.networkState%2C%0A%20%20%20%20%20%20width%3A%20v.videoWidth%20%7C%7C%200%2C%0A%20%20%20%20%20%20height%3A%20v.videoHeight%20%7C%7C%200%0A%20%20%20%20%7D%29%29%3B%0A%0A%20%20%20%20state.results%20%3D%20results%3B%0A%20%20%20%20state.lastScanAt%20%3D%20now%28%29%3B%0A%20%20%20%20state.scanStats%20%3D%20%7B%0A%20%20%20%20%20%20performanceEntriesSeen%3A%20perfCount%2C%0A%20%20%20%20%20%20observationCount%3A%20observations.size%2C%0A%20%20%20%20%20%20mediaHintCount%3A%20mediaHints.length%2C%0A%20%20%20%20%20%20frameworkRootsWalked%3A%20domInfo.rootsWalked%2C%0A%20%20%20%20%20%20frameworkObjectsWalked%3A%20domInfo.objectsWalked%2C%0A%20%20%20%20%20%20reactFibersWalked%3A%20domInfo.reactFibersWalked%2C%0A%20%20%20%20%20%20posterAssetIds%3A%20domInfo.assetIds%2C%0A%20%20%20%20%20%20suppressedPageAssets%3A%20suppressed.length%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20state.debug%20%3D%20%7B%0A%20%20%20%20%20%20grabMediaVersion%3A%20VERSION%2C%0A%20%20%20%20%20%20startedAt%2C%0A%20%20%20%20%20%20scannedAt%3A%20state.lastScanAt%2C%0A%20%20%20%20%20%20page%3A%20%7B%20url%3A%20location.href%2C%20origin%3A%20location.origin%2C%20title%3A%20document.title%20%7D%2C%0A%20%20%20%20%20%20scanStats%3A%20state.scanStats%2C%0A%20%20%20%20%20%20videos%2C%0A%20%20%20%20%20%20classified%3A%20results.map%28r%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20kind%3A%20r.kind%2C%0A%20%20%20%20%20%20%20%20confidence%3A%20r.confidence%2C%0A%20%20%20%20%20%20%20%20title%3A%20r.title%2C%0A%20%20%20%20%20%20%20%20subtitle%3A%20r.subtitle%2C%0A%20%20%20%20%20%20%20%20detail%3A%20r.detail%2C%0A%20%20%20%20%20%20%20%20meta%3A%20r.meta%2C%0A%20%20%20%20%20%20%20%20urls%3A%20r.urls%2C%0A%20%20%20%20%20%20%20%20qualityOptions%3A%20%28r.qualityOptions%20%7C%7C%20%5B%5D%29.map%28o%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20%20%20label%3A%20o.label%2C%0A%20%20%20%20%20%20%20%20%20%20rendition%3A%20o.rendition%20%7C%7C%20null%2C%0A%20%20%20%20%20%20%20%20%20%20fragmentCount%3A%20o.fragmentCount%20%7C%7C%20null%2C%0A%20%20%20%20%20%20%20%20%20%20urls%3A%20o.urls%0A%20%20%20%20%20%20%20%20%7D%29%29%2C%0A%20%20%20%20%20%20%20%20ffmpeg%3A%20r.ffmpeg%0A%20%20%20%20%20%20%7D%29%29%2C%0A%20%20%20%20%20%20mediaHints%3A%20mediaHints.map%28h%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20url%3A%20h.url%2C%0A%20%20%20%20%20%20%20%20sources%3A%20h.sources%2C%0A%20%20%20%20%20%20%20%20bitrate%3A%20h.bitrate%20%3F%3F%20null%2C%0A%20%20%20%20%20%20%20%20contentType%3A%20h.contentType%20%3F%3F%20null%2C%0A%20%20%20%20%20%20%20%20path%3A%20h.path%20%3F%3F%20null%0A%20%20%20%20%20%20%7D%29%29%2C%0A%20%20%20%20%20%20hlsManifests%3A%20%5B...hlsCache.entries%28%29%5D.map%28%28%5Burl%2C%20info%5D%29%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20status%3A%20info.status%2C%0A%20%20%20%20%20%20%20%20isMaster%3A%20%21%21info.isMaster%2C%0A%20%20%20%20%20%20%20%20error%3A%20info.error%20%7C%7C%20null%2C%0A%20%20%20%20%20%20%20%20variants%3A%20%28info.variants%20%7C%7C%20%5B%5D%29.map%28v%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20%20%20label%3A%20hlsVariantLabel%28v%29%2C%0A%20%20%20%20%20%20%20%20%20%20resolution%3A%20v.resolution%2C%0A%20%20%20%20%20%20%20%20%20%20bandwidth%3A%20v.bandwidth%2C%0A%20%20%20%20%20%20%20%20%20%20videoUrl%3A%20v.videoUrl%2C%0A%20%20%20%20%20%20%20%20%20%20audioUrl%3A%20v.audioUrl%2C%0A%20%20%20%20%20%20%20%20%20%20audioBitrate%3A%20v.audioBitrate%0A%20%20%20%20%20%20%20%20%7D%29%29%0A%20%20%20%20%20%20%7D%29%29%2C%0A%20%20%20%20%20%20observations%3A%20%5B...observations.values%28%29%5D%0A%20%20%20%20%20%20%20%20.filter%28r%20%3D%3E%20looksMediaLike%28r.url%29%29%0A%20%20%20%20%20%20%20%20.map%28r%20%3D%3E%20%28%7B%0A%20%20%20%20%20%20%20%20%20%20url%3A%20r.url%2C%0A%20%20%20%20%20%20%20%20%20%20sources%3A%20r.sources%2C%0A%20%20%20%20%20%20%20%20%20%20initiator%3A%20r.initiator%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20%20%20method%3A%20r.method%20%7C%7C%20%27%27%2C%0A%20%20%20%20%20%20%20%20%20%20transferSize%3A%20r.transferSize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20encodedBodySize%3A%20r.encodedBodySize%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20startTime%3A%20r.startTime%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20duration%3A%20r.duration%20%7C%7C%200%2C%0A%20%20%20%20%20%20%20%20%20%20firstSeen%3A%20r.firstSeen%2C%0A%20%20%20%20%20%20%20%20%20%20lastSeen%3A%20r.lastSeen%0A%20%20%20%20%20%20%20%20%7D%29%29%2C%0A%20%20%20%20%20%20unknown%3A%20unknown.map%28r%20%3D%3E%20r.url%29%2C%0A%20%20%20%20%20%20suppressed%3A%20suppressed%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20window.__grabMedia%20%3D%20%7B%0A%20%20%20%20%20%20version%3A%20VERSION%2C%0A%20%20%20%20%20%20get%20debug%28%29%20%7B%20return%20state.debug%3B%20%7D%2C%0A%20%20%20%20%20%20get%20results%28%29%20%7B%20return%20state.results%3B%20%7D%2C%0A%20%20%20%20%20%20get%20observations%28%29%20%7B%20return%20%5B...observations.values%28%29%5D%3B%20%7D%2C%0A%20%20%20%20%20%20rescan%3A%20%28%29%20%3D%3E%20render%28%29%2C%0A%20%20%20%20%20%20stop%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20if%20%28%21silent%29%20%7B%0A%20%20%20%20%20%20console.group%28%60%5BGrab%20Media%20%24%7BVERSION%7D%5D%60%29%3B%0A%20%20%20%20%20%20console.log%28%27Results%3A%27%2C%20results%29%3B%0A%20%20%20%20%20%20console.log%28%27Scan%20stats%3A%27%2C%20state.scanStats%29%3B%0A%20%20%20%20%20%20console.log%28%27Debug%20object%3A%20window.__grabMedia.debug%27%29%3B%0A%20%20%20%20%20%20console.groupEnd%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20results%3B%0A%20%20%7D%0A%0A%20%20function%20scheduleRender%28%29%20%7B%0A%20%20%20%20if%20%28stopped%20%7C%7C%20%21document.getElementById%28UI_ID%29%29%20return%3B%0A%20%20%20%20clearTimeout%28renderTimer%29%3B%0A%20%20%20%20renderTimer%20%3D%20setTimeout%28%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20ui%20%3D%20document.getElementById%28UI_ID%29%3B%0A%20%20%20%20%20%20const%20active%20%3D%20document.activeElement%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Rebuilding%20the%20popup%20while%20a%20native%20%3Cselect%3E%20is%20open%20causes%20Chrome%20to%0A%20%20%20%20%20%20%2F%2F%20collapse%20the%20dropdown.%20Keep%20collecting%20observations%2C%20but%20defer%20the%0A%20%20%20%20%20%20%2F%2F%20visual%20refresh%20until%20the%20user%20has%20finished%20interacting%20with%20it.%0A%20%20%20%20%20%20if%20%28ui%20%26%26%20active%20%26%26%20ui.contains%28active%29%20%26%26%20active.tagName%20%3D%3D%3D%20%27SELECT%27%29%20%7B%0A%20%20%20%20%20%20%20%20renderTimer%20%3D%20setTimeout%28%28%29%20%3D%3E%20scheduleRender%28%29%2C%20350%29%3B%0A%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20try%20%7B%20render%28%7B%20silent%3A%20true%20%7D%29%3B%20%7D%0A%20%20%20%20%20%20catch%20%28e%29%20%7B%20console.warn%28%27%5BGrab%20Media%5D%20auto-rescan%20failed%27%2C%20e%29%3B%20%7D%0A%20%20%20%20%7D%2C%20600%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20------------------------------------------------------------%0A%20%20%2F%2F%20UI%0A%20%20%2F%2F%20------------------------------------------------------------%0A%0A%20%20const%20box%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20box.id%20%3D%20UI_ID%3B%0A%20%20Object.assign%28box.style%2C%20%7B%0A%20%20%20%20position%3A%20%27fixed%27%2C%20right%3A%20%2720px%27%2C%20bottom%3A%20%2720px%27%2C%20zIndex%3A%20%272147483647%27%2C%0A%20%20%20%20width%3A%20%27500px%27%2C%20maxWidth%3A%20%27calc%28100vw%20-%2040px%29%27%2C%20maxHeight%3A%20%2780vh%27%2C%20overflow%3A%20%27auto%27%2C%0A%20%20%20%20background%3A%20%27%23161616%27%2C%20color%3A%20%27%23eee%27%2C%20border%3A%20%271px%20solid%20%23555%27%2C%20borderRadius%3A%20%2712px%27%2C%0A%20%20%20%20boxShadow%3A%20%270%2010px%2040px%20rgba%280%2C0%2C0%2C.5%29%27%2C%0A%20%20%20%20font%3A%20%2713px%20-apple-system%2CBlinkMacSystemFont%2C%22Segoe%20UI%22%2Csans-serif%27%2C%20padding%3A%20%2716px%27%0A%20%20%7D%29%3B%0A%0A%20%20const%20header%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20const%20content%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20box.append%28header%2C%20content%29%3B%0A%20%20document.body.appendChild%28box%29%3B%0A%0A%20%20function%20render%28%7B%20silent%20%3D%20false%20%7D%20%3D%20%7B%7D%29%20%7B%0A%20%20%20%20const%20scrollTop%20%3D%20box.scrollTop%3B%0A%20%20%20%20const%20results%20%3D%20scan%28%7B%20silent%20%7D%29%3B%0A%20%20%20%20const%20reloaded%20%3D%20sessionStorage.getItem%28RELOAD_KEY%29%20%3D%3D%3D%20%271%27%3B%0A%20%20%20%20if%20%28reloaded%29%20sessionStorage.removeItem%28RELOAD_KEY%29%3B%0A%0A%20%20%20%20header.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%3Cdiv%20style%3D%22display%3Aflex%3Bjustify-content%3Aspace-between%3Balign-items%3Acenter%3Bgap%3A10px%22%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cstrong%20style%3D%22font-size%3A20px%22%3EGrab%20Media%3C%2Fstrong%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22color%3A%23777%3Bfont-size%3A11px%3Bmargin-top%3A2px%22%3E%24%7Besc%28VERSION%29%7D%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22display%3Aflex%3Balign-items%3Acenter%3Bgap%3A6px%22%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22__gm_debug%22%20style%3D%22border%3A1px%20solid%20%23666%3Bbackground%3A%23292929%3Bcolor%3A%23eee%3Bborder-radius%3A6px%3Bpadding%3A6px%209px%3Bcursor%3Apointer%3Bfont%3Ainherit%22%3EGrab%20debug%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22__gm_rescan%22%20style%3D%22border%3A1px%20solid%20%23666%3Bbackground%3A%23292929%3Bcolor%3A%23eee%3Bborder-radius%3A6px%3Bpadding%3A6px%209px%3Bcursor%3Apointer%3Bfont%3Ainherit%22%3ERescan%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cbutton%20id%3D%22__gm_close%22%20style%3D%22background%3Anone%3Bborder%3A0%3Bcolor%3A%23aaa%3Bfont-size%3A24px%3Bcursor%3Apointer%3Bline-height%3A1%22%3E%C3%97%3C%2Fbutton%3E%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%3Cdiv%20style%3D%22color%3A%23aaa%3Bmargin-top%3A6px%22%3E%0A%20%20%20%20%20%20%20%20%24%7Bresults.length%20%3F%20%60Found%20%24%7Bresults.length%7D%20media%20candidate%24%7Bresults.length%20%3D%3D%3D%201%20%3F%20%27%27%20%3A%20%27s%27%7D%60%20%3A%20%27No%20obvious%20media%20found%27%7D%0A%20%20%20%20%20%20%20%20%3Cspan%20style%3D%22margin-left%3A8px%3Bcolor%3A%236fa86f%22%3E%E2%97%8F%20observing%3C%2Fspan%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%0A%20%20%20%20%20%20%24%7Breloaded%20%3F%20%27%3Cdiv%20style%3D%22margin-top%3A8px%3Bpadding%3A7px%209px%3Bbackground%3A%23222%3Bborder-radius%3A6px%3Bcolor%3A%23bbb%22%3EFresh%20reload%20detected.%20Browser%20history%20and%20page%20state%20have%20been%20rescanned.%3C%2Fdiv%3E%27%20%3A%20%27%27%7D%0A%20%20%20%20%60%3B%0A%0A%20%20%20%20content.innerHTML%20%3D%20%27%27%3B%0A%0A%20%20%20%20if%20%28%21results.length%29%20%7B%0A%20%20%20%20%20%20const%20empty%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20%20%20%20%20empty.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22border-top%3A1px%20solid%20%23444%3Bmargin-top%3A14px%3Bpadding-top%3A14px%3Bline-height%3A1.5%22%3E%0A%20%20%20%20%20%20%20%20%20%20Nothing%20recoverable%20is%20visible%20yet.%20Grab%20Media%20has%20inspected%20the%20current%20DOM%2C%20attached%20framework%20state%2C%20and%20browser%20resource%20history.%3Cbr%3E%3Cbr%3E%0A%20%20%20%20%20%20%20%20%20%20%3Cstrong%3EGrab%20debug%3C%2Fstrong%3E%20gives%20a%20compact%20diagnostic%20snapshot.%0A%20%20%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20%20%20content.appendChild%28empty%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20for%20%28const%20result%20of%20results%29%20%7B%0A%20%20%20%20%20%20const%20item%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20%20%20%20%20Object.assign%28item.style%2C%20%7B%20borderTop%3A%20%271px%20solid%20%23444%27%2C%20marginTop%3A%20%2714px%27%2C%20paddingTop%3A%20%2714px%27%20%7D%29%3B%0A%0A%20%20%20%20%20%20item.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%20%20%3Cdiv%20style%3D%22font-size%3A16px%22%3E%3Cstrong%3E%24%7Besc%28result.title%29%7D%3C%2Fstrong%3E%3C%2Fdiv%3E%0A%20%20%20%20%20%20%20%20%24%7Bresult.subtitle%20%3F%20%60%3Cdiv%20style%3D%22color%3A%23aaa%3Bmargin-top%3A4px%3Bword-break%3Abreak-word%22%3E%24%7Besc%28result.subtitle%29%7D%3C%2Fdiv%3E%60%20%3A%20%27%27%7D%0A%20%20%20%20%20%20%20%20%24%7Bresult.detail%20%3F%20%60%3Cdiv%20style%3D%22margin-top%3A6px%22%3E%24%7Besc%28result.detail%29%7D%3C%2Fdiv%3E%60%20%3A%20%27%27%7D%0A%20%20%20%20%20%20%20%20%24%7Bresult.meta%3F.length%20%3F%20%60%3Cdiv%20style%3D%22font-family%3Aui-monospace%2CSFMono-Regular%2CMenlo%2CMonaco%2Cmonospace%3Bbackground%3A%23222%3Bpadding%3A8px%3Bborder-radius%3A6px%3Bmargin-top%3A8px%3Bline-height%3A1.5%3Bword-break%3Abreak-word%22%3E%24%7Bresult.meta.map%28esc%29.join%28%27%3Cbr%3E%27%29%7D%3C%2Fdiv%3E%60%20%3A%20%27%27%7D%0A%20%20%20%20%20%20%60%3B%0A%0A%20%20%20%20%20%20const%20controls%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20%20%20%20%20Object.assign%28controls.style%2C%20%7B%20display%3A%20%27flex%27%2C%20flexWrap%3A%20%27wrap%27%2C%20gap%3A%20%277px%27%2C%20marginTop%3A%20%2710px%27%20%7D%29%3B%0A%0A%20%20%20%20%20%20if%20%28result.qualityOptions%3F.length%29%20%7B%0A%20%20%20%20%20%20%20%20const%20key%20%3D%20result.selectionKey%20%7C%7C%20result.manifestUrl%20%7C%7C%20result.urls%3F.%5B0%5D%20%7C%7C%20result.title%3B%0A%20%20%20%20%20%20%20%20let%20selectedIndex%20%3D%20qualitySelections.get%28key%29%20%3F%3F%200%3B%0A%20%20%20%20%20%20%20%20if%20%28selectedIndex%20%3E%3D%20result.qualityOptions.length%29%20selectedIndex%20%3D%200%3B%0A%0A%20%20%20%20%20%20%20%20const%20select%20%3D%20document.createElement%28%27select%27%29%3B%0A%20%20%20%20%20%20%20%20Object.assign%28select.style%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20border%3A%20%271px%20solid%20%23666%27%2C%0A%20%20%20%20%20%20%20%20%20%20background%3A%20%27%23222%27%2C%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%27%23eee%27%2C%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%20%276px%27%2C%0A%20%20%20%20%20%20%20%20%20%20padding%3A%20%277px%209px%27%2C%0A%20%20%20%20%20%20%20%20%20%20cursor%3A%20%27pointer%27%2C%0A%20%20%20%20%20%20%20%20%20%20font%3A%20%27inherit%27%2C%0A%20%20%20%20%20%20%20%20%20%20maxWidth%3A%20%27100%25%27%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20%20%20result.qualityOptions.forEach%28%28opt%2C%20i%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20o%20%3D%20document.createElement%28%27option%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20o.value%20%3D%20String%28i%29%3B%0A%20%20%20%20%20%20%20%20%20%20o.textContent%20%3D%20opt.label%3B%0A%20%20%20%20%20%20%20%20%20%20o.selected%20%3D%20i%20%3D%3D%3D%20selectedIndex%3B%0A%20%20%20%20%20%20%20%20%20%20select.appendChild%28o%29%3B%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20%20%20select.onchange%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20qualitySelections.set%28key%2C%20Number%28select.value%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20select.onblur%20%3D%20%28%29%20%3D%3E%20scheduleRender%28%29%3B%0A%20%20%20%20%20%20%20%20controls.appendChild%28select%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20ff%20%3D%20makeButton%28%27Copy%20ffmpeg%20command%27%29%3B%0A%20%20%20%20%20%20%20%20ff.onclick%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20opt%20%3D%20result.qualityOptions%5BNumber%28select.value%29%20%7C%7C%200%5D%3B%0A%20%20%20%20%20%20%20%20%20%20copyText%28opt.ffmpeg%2C%20ff%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20controls.appendChild%28ff%29%3B%0A%0A%20%20%20%20%20%20%20%20const%20streamUrls%20%3D%20makeButton%28result.optionUrlLabel%20%7C%7C%20%27Copy%20stream%20URLs%27%29%3B%0A%20%20%20%20%20%20%20%20streamUrls.onclick%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20opt%20%3D%20result.qualityOptions%5BNumber%28select.value%29%20%7C%7C%200%5D%3B%0A%20%20%20%20%20%20%20%20%20%20copyText%28opt.urls.join%28%27%5Cn%27%29%2C%20streamUrls%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20controls.appendChild%28streamUrls%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28result.manifestUrl%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20master%20%3D%20makeButton%28%27Copy%20master%20URL%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20master.onclick%20%3D%20%28%29%20%3D%3E%20copyText%28result.manifestUrl%2C%20master%29%3B%0A%20%20%20%20%20%20%20%20%20%20controls.appendChild%28master%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20if%20%28result.ffmpeg%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20ff%20%3D%20makeButton%28%27Copy%20ffmpeg%20command%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20ff.onclick%20%3D%20%28%29%20%3D%3E%20copyText%28result.ffmpeg%2C%20ff%29%3B%0A%20%20%20%20%20%20%20%20%20%20controls.appendChild%28ff%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28result.urls%3F.length%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20u%20%3D%20makeButton%28result.urls.length%20%3D%3D%3D%201%20%3F%20%27Copy%20URL%27%20%3A%20%27Copy%20URLs%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20u.onclick%20%3D%20%28%29%20%3D%3E%20copyText%28result.urls.join%28%27%5Cn%27%29%2C%20u%29%3B%0A%20%20%20%20%20%20%20%20%20%20controls.appendChild%28u%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28result.reloadHelpful%29%20%7B%0A%20%20%20%20%20%20%20%20const%20reload%20%3D%20makeButton%28%27Reload%20page%27%29%3B%0A%20%20%20%20%20%20%20%20reload.title%20%3D%20%27Reload%20the%20page%20to%20repopulate%20browser%20media%20history%2C%20then%20run%20Grab%20Media%20again.%27%3B%0A%20%20%20%20%20%20%20%20reload.onclick%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20sessionStorage.setItem%28RELOAD_KEY%2C%20%271%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20location.reload%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20controls.appendChild%28reload%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20log%20%3D%20makeButton%28%27Log%20details%27%29%3B%0A%20%20%20%20%20%20log.onclick%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20console.group%28%60%5BGrab%20Media%5D%20%24%7Bresult.title%7D%60%29%3B%0A%20%20%20%20%20%20%20%20console.log%28result%29%3B%0A%20%20%20%20%20%20%20%20console.groupEnd%28%29%3B%0A%20%20%20%20%20%20%20%20const%20old%20%3D%20log.textContent%3B%0A%20%20%20%20%20%20%20%20log.textContent%20%3D%20%27Logged%20%E2%9C%93%27%3B%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%20%3D%3E%20%7B%20log.textContent%20%3D%20old%3B%20%7D%2C%201200%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20controls.appendChild%28log%29%3B%0A%0A%20%20%20%20%20%20item.appendChild%28controls%29%3B%0A%20%20%20%20%20%20content.appendChild%28item%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20const%20footer%20%3D%20document.createElement%28%27div%27%29%3B%0A%20%20%20%20footer.innerHTML%20%3D%20%60%0A%20%20%20%20%20%20%3Cdiv%20style%3D%22border-top%3A1px%20solid%20%23444%3Bmargin-top%3A14px%3Bpadding-top%3A10px%3Bcolor%3A%23888%3Bfont-size%3A11px%3Bline-height%3A1.5%22%3E%0A%20%20%20%20%20%20%20%20Resolves%20DOM%2Fframework%20state%20%2B%20resource%20history.%20Live%20observation%20only%20records%20future%20URLs.%3Cbr%3E%0A%20%20%20%20%20%20%20%20Debug%3A%20%3Ccode%20style%3D%22color%3A%23bbb%22%3Ewindow.__grabMedia.debug%3C%2Fcode%3E%0A%20%20%20%20%20%20%3C%2Fdiv%3E%60%3B%0A%20%20%20%20content.appendChild%28footer%29%3B%0A%0A%20%20%20%20document.getElementById%28%27__gm_close%27%29.onclick%20%3D%20%28%29%20%3D%3E%20stop%28%29%3B%0A%20%20%20%20document.getElementById%28%27__gm_rescan%27%29.onclick%20%3D%20%28%29%20%3D%3E%20render%28%7B%20silent%3A%20false%20%7D%29%3B%0A%20%20%20%20document.getElementById%28%27__gm_debug%27%29.onclick%20%3D%20async%20e%20%3D%3E%20%7B%0A%20%20%20%20%20%20await%20copyText%28JSON.stringify%28state.debug%2C%20null%2C%202%29%2C%20e.currentTarget%29%3B%0A%20%20%20%20%20%20console.log%28%27%5BGrab%20Media%5D%20debug%20bundle%20copied%27%2C%20state.debug%29%3B%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20box.scrollTop%20%3D%20scrollTop%3B%0A%20%20%7D%0A%0A%20%20function%20stop%28%29%20%7B%0A%20%20%20%20if%20%28stopped%29%20return%3B%0A%20%20%20%20stopped%20%3D%20true%3B%0A%20%20%20%20clearTimeout%28renderTimer%29%3B%0A%20%20%20%20for%20%28const%20fn%20of%20cleanup.reverse%28%29%29%20%7B%0A%20%20%20%20%20%20try%20%7B%20fn%28%29%3B%20%7D%20catch%20%7B%7D%0A%20%20%20%20%7D%0A%20%20%20%20document.getElementById%28UI_ID%29%3F.remove%28%29%3B%0A%20%20%20%20console.log%28%60%5BGrab%20Media%20%24%7BVERSION%7D%5D%20stopped%60%29%3B%0A%20%20%7D%0A%0A%20%20armLightCapture%28%29%3B%0A%20%20render%28%7B%20silent%3A%20false%20%7D%29%3B%0A%7D%29%28%29%3B%0A |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Grab Media Streams will grab twitter/X and LinkedIn videos as needed: