YouTube वीडियो डाउनलोड सीमा को बायपास करना
(blog.0x7d0.dev)- YouTube फ़ाइल URL
/youtubei/v1/playerAPI से मिल सकता है, लेकिन उसे सीधे डाउनलोड करने पर अनौपचारिक डाउनलोड सीमा के कारण स्पीड बेहद धीमी हो जाती है - 2021 के मध्य के बाद URL में जुड़ने वाले
nquery parameter कोbase.jsके JavaScript algorithm से बदलना पड़ता है; असफल होने पर YouTube चुपचाप स्पीड limit कर देता है nको सही तरह से handle करने के बाद भी डाउनलोड समय वीडियो की लंबाई और आकार के हिसाब से adjust होता है; उदाहरण में 1.5GB वीडियो लगभग 4.0MB/s पर डाउनलोड हुआ- HTTP
Rangeheader से फ़ाइल को 10MB टुकड़ों में बांटकर नई connection से लिया जाए, तो limit लगने से पहले हर टुकड़ा तेज़ी से fetched किया जा सकता है - अंतिम फ़ाइल के लिए अलग-अलग दिए गए वीडियो और ऑडियो streams को
ffmpegसे merge करना पड़ता है; yt-dlp, VLC media player, NewPipe और node-ytdl-core भी मिलती-जुलती technique इस्तेमाल करते हैं
YouTube फ़ाइल URL पाने का flow
- वास्तविक media file URL
/youtubei/v1/playerendpoint call से लाया जा सकता है - यह API वीडियो title, description, thumbnail और format जानकारी लौटाता है, और format list से इच्छित quality का file URL चुना जा सकता है
- उदाहरण video ID
aqz-KE-bpKQहै - request body में
videoId,context.client.clientName,context.client.clientVersionजैसी values शामिल होती हैं contextobject की दूसरी values वे preconditions हैं जिन्हें API verify करता है, और web browser request observe करके allowed values ढूंढी जाती हैं
- उदाहरण video ID
- API से मिले
adaptiveFormats[0].urlको सीधे इस्तेमाल करने पर डाउनलोड लगभग बंद जैसा धीमा हो जाता है- उदाहरण में 1.5GB file 66.7kB/s स्तर पर दिखी
- speed आम तौर पर 40~70kB/s तक सीमित रहती है
- 10 मिनट का वीडियो पूरा लेने में लगभग 6 घंटे 30 मिनट लग सकते हैं
n parameter से बनने वाली पहली limit
- 2021 के मध्य के बाद YouTube अधिकतर file URLs में
nquery parameter शामिल करता है - इस value को web page के साथ distribute होने वाले
base.jsके JavaScript algorithm से transform करना पड़ता है - YouTube
nvalue को official client होने या न होने को अलग करने वाले challenge की तरह इस्तेमाल करता हैnन हो या सही तरह transform न हो, तो download speed limit चुपचाप लागू हो जाती है
- transformation algorithm obfuscated होता है और अक्सर बदलता है, इसलिए हर बार content को reverse engineer करने वाला तरीका practical नहीं है
- example implementation वर्तमान player version का
base.jsडाउनलोड करता है,ntransformation code extract करता है, फिर originalnvalue डालकर उसे चलाता है- YouTube embed page से
base.jsURL ढूंढता है - regex से challenge function name और function body extract करता है
- Node.js के
vm.runInNewContextसे transformation function execute करता है - transformed value से URL का
nparameter replace करता है
- YouTube embed page से
n transformation के बाद भी बची हुई speed limit
nparameter को सही तरह transform करने पर शुरुआती extreme limit हट जाती है, लेकिन YouTube अब भी variable download limit लागू करता है- limit का स्तर वीडियो के size और length के हिसाब से बदलता है, और download time को वीडियो length के लगभग आधे के आसपास fit किया जाता है
- अगर media file हमेशा जितनी जल्दी संभव हो उतनी जल्दी serve की जाए, तो streaming service के लिए यह बड़ा bandwidth waste हो सकता है
- example download में 1.5GB file लगभग 4.0MB/s पर डाउनलोड हुई
HTTP Range से छोटे टुकड़े तेज़ी से लेना
- bypass method का core HTTP
Rangeheader से फ़ाइल को कई छोटे ranges में बांटकर download करना है Rangeheader हर request में प्राप्त किए जाने वाले file range को specify करता है- उदाहरण:
Range: bytes=2000-3000
- उदाहरण:
- example code media file को 10MB segments में बांटकर process करता है
- मौजूदा output file delete करता है
- अब तक मिले bytes के आधार पर अगला 10MB range calculate करता है
- हर request में
Rangeheader डालता है औरresponseType: 'stream'के रूप में लेता है - मिले data को file के अंत में append करता है
- progress, total size और per-segment speed print करता है
- यह तरीका इसलिए काम करता है क्योंकि limit rules लागू होने में समय लगता है, और छोटे segments नई connection पर बहुत तेज़ी से मिल सकते हैं
- test output में 1464.99MB file पर ये speeds दिखीं
- 0.68% point: 46.73MB/s
- 1.37% point: 60.98MB/s
- 2.05% point: 71.94MB/s
- 6.14% point: 104.17MB/s
- कुछ downloads ने 1Gb/s connection का लगभग पूरा इस्तेमाल किया, और average speed आम तौर पर 50~70MB/s, यानी 400~560Mb/s range में रही
वीडियो・ऑडियो merge और मौजूदा implementations
- YouTube वीडियो और ऑडियो channels को अलग files के रूप में distribute करता है
- इस structure में HD या UHD video वही audio file reuse कर सकता है, जिससे storage बचती है
- कुछ videos language के हिसाब से अलग audio channels भी provide करते हैं
- अंतिम चरण में
ffmpegसे video file और audio file को एक में merge किया जाता है-c copyसे re-encoding के बिना streams copy किए जाते हैं-map 0:v:0से पहले input का video stream चुना जाता है-map 1:a:0से दूसरे input का audio stream चुना जाता है- merge के बाद temporary video और audio files delete की जाती हैं
- पूरा example code youtube-download.js के रूप में दिया गया है
- कई projects YouTube limits bypass करने के लिए मिलती-जुलती techniques इस्तेमाल करते हैं
- yt-dlp: youtube-dl का Python fork है, और
nparameter transformation के लिए अपना JavaScript interpreter शामिल करता है - VLC media player
- NewPipe
- node-ytdl-core
- yt-dlp: youtube-dl का Python fork है, और
1 टिप्पणियां
Hacker News की राय
yt-dlp repository की चर्चा में जो देखा, उसके मुताबिक यह limitation HTTP Range header से नहीं, बल्कि सिर्फ
range=xxxquery parameter जोड़ने से भी bypass हो सकती थीRange को पूरे file पर set करने पर भी फिर से maximum speed मिल रही थी, और अगर मुझे सही याद है तो YouTube ने यह limitation पहले ही हटा दी थी
संदर्भ: https://github.com/yt-dlp/yt-dlp/issues/6400
YouTube पर तो नहीं आज़माया, लेकिन ज़्यादा संदिग्ध streaming sites के videos मैंने web developer tools से download किए हैं
ज़्यादातर protection ऐसी होती है कि developer tools खोलते ही न skip हो सकने वाला
debuggerstatement बनाया जाता है और CPU-heavy code—शायद infinite loop या cryptocurrency miner जैसा कुछ—चलाकर video रोक दिया जाता हैज़्यादा अहम बात यह है कि यह code network request की जानकारी भी मिटा देता है, जिससे अब तक भेजे गए traffic का analysis मुश्किल हो जाता है, और Firefox का “Preserve logs” सच में logs preserve करना चाहिए
यह कोई perfect defense नहीं है, इसलिए आखिरकार ऐसा कोई video नहीं रहा जो download न हो पाया हो, लेकिन मैं इसके काम करने के तरीके को और गहराई से समझाने वाली material देखना चाहूंगा
debuggerkeyword का नाम बदल देनाहंसी आ जाए ऐसा था
https://news.ycombinator.com/item?id=36961445
इसी तरह की वजह से मैंने पहले कुछ घंटों में बनाया हुआ एक simple extension है
0: https://chrome.google.com/webstore/detail/anti-anti-debug/mn...
developer tools खुले हैं या नहीं, यह web page को कभी पता नहीं चलना चाहिए, और लगता है इसे ठीक से implement किया जा सकता है
shift+right-click→This Frame→Open Frame in New Tabदबाएंनए tab में developer tools काम करते हैं
अंतिम चरण में screen देखते रहने के लिए WorldCoin से payment करना पड़ेगा, और वह non-tradable WorldCoin शायद सिर्फ ads देखकर ही कमाया जा सकेगा
screen में embedded छोटा Orb इसकी निगरानी करेगा, और आपने सच में तो यह नहीं माना था कि यह basic income के लिए है
basic income की समस्या तो bank accounts और customer verification (KYC) से बहुत पहले हल हो चुकी थी
सोच रहा हूं कि क्या इन दिनों किसी को yt-dlp speed limit की समस्या हो रही है
मैं हमेशा
mpvसे YouTube देखता हूं, जो internally yt-dlp इस्तेमाल करता है, और पिछले हफ्ते से हालत बहुत खराब हो गई हैशुरुआत में यह मेरे 500kB/s पर limit किए जाने जितनी तेज़ी से शुरू होता है, लेकिन थोड़ी देर बाद 3 सेकंड download करने पर सिर्फ 1 सेकंड playback मिलता है, इसलिए play करने से पहले काफी देर queue में लगाकर रखना पड़ता है
मैं git version का yt-dlp इस्तेमाल कर रहा हूं, लेकिन इससे जुड़ा issue नहीं देखा
mpvyt-dlp से सिर्फ video URL लेता है और वह URLffmpegको दे देता हैffmpegने Range header से जुड़ा workaround implement नहीं किया है, इसलिए speed limit में फंस जाता हैyt-dlp से सीधे download कराकर उसे
mpvमें pipe करके standard input से play कराया जा सकता है, लेकिन अभी download न हुए हिस्से पर seek करना टूट जाता हैmpv issue tracker में इस problem से जुड़े कई issues हैं
YouTube इस process में छोटी-छोटी चीजें लगातार बदलता रहता है
पहले मैंने YouTube videos के लिए internal editing tool बनाया था, जिसके लिए MP4 file चाहिए थी, और लगभग हर महीने YouTube changes की वजह से editor टूट जाता था, इसलिए debugger से देखना पड़ता था कि क्या बदला है और उसके हिसाब से adjust करना पड़ता था
थोड़ा अलग मुद्दा है, लेकिन सोच रहा हूँ कि क्या यह मेरा भ्रम है कि YouTube पर देखने पर वीडियो बहुत थोड़ा बेहतर दिखता है
मैं अपने पसंदीदा वीडियो डाउनलोड करके VLC या AppleTV के Infuse पर देखता हूँ, और YouTube ऐप के “nerd stats” से पुष्टि कर सकता हूँ कि वही वीडियो/ऑडियो स्ट्रीम चल रही है
लेकिन लगता है कि YouTube कोई बहुत subtle filter लगाता है जिससे blocky compression artifacts ज़्यादा smooth दिखते हैं
यह edges को sharpen करने जैसा नहीं है; बल्कि ऐसा लगता है कि जहाँ edges नहीं हैं, वहाँ color transition वाले areas ढूँढकर blocky artifacts को कम noticeable बनाता है
हो सकता है यह भ्रम हो, लेकिन YouTube पर स्क्रीन ज़्यादा vivid और solid दिखती है, जबकि downloaded वीडियो में background या shadows में बहुत subtle लेकिन दिखने वाले artifacts और हल्का jitter दिखता है, इसलिए 1440p वीडियो भी final quality में कम अच्छे लगते हैं
ऑडियो में भी फर्क साफ़ है: YouTube पर volume आम तौर पर uniform रहता है, लेकिन downloaded वीडियो में volume बढ़ाना पड़ता है, जो असुविधाजनक है
अच्छा होगा अगर VLC या Infuse भी YouTube की तरह वीडियो को बेहतर दिखाने वाली processing करें; यह color या sharpness filter से ज़्यादा channels के बीच experience consistent बनाने वाली audio leveling जैसी processing लगती है
YouTube और Spotify जैसी ज़्यादातर streaming sites ReplayGain नाम की चीज़ इस्तेमाल करती हैं
यह वीडियो या गाने की average loudness calculate करके बना tag होता है, और upload के समय calculate किया जाता है
Official YouTube client playback के दौरान उस tag का उपयोग करके volume adjust करता है, लेकिन download करते समय tag छूट सकता है, या MKV शायद ReplayGain tags को default तौर पर support न करता हो
Original resolution stream को fullscreen में चलाने पर black-and-white edges पर फर्क गायब हो जाना चाहिए
Operating system के हिसाब से, दो fullscreen apps के बीच जल्दी switch करके फर्क test किया जा सकता है, और ISO 29170-2 5Hz की सलाह देता है
Color changes वीडियो color space या monitor profile processing failure से आ सकते हैं, और इस case में screenshot actual app screen से अलग दिख सकता है
Jitter frame drops हो सकता है, और अगर colored objects के edges पर pixelation दिखे तो यह nearest-neighbor chroma upscaling होने की संभावना है
Browser जो stream चुनता है और youtube-dl या उसके fork द्वारा default में चुनी जाने वाली stream अलग हो सकती है
पहले कुछ समय तक default रूप से best combined stream चुनी जाती थी, लेकिन अलग-अलग best audio और video streams की quality ज़्यादा होती है
मुझे खास तौर पर
anime4kshader pack पसंद है; यह machine learning based है, लेकिनmpvमें real time चलता है और शायद VLC में भी चल सकेनाम के मुताबिक यह animation के लिए tuned है, लेकिन noise removal और deblurring ठीक हैं, इसलिए YouTube content को अक्सर देखने में बेहतर बना देता है, और restoration stage compression artifacts को काफ़ी अच्छे से handle करता है
हालांकि यह animation के लिए बहुत ज़्यादा tuned है, इसलिए हमेशा अच्छा काम नहीं करता और कभी-कभी उल्टा खराब भी कर सकता है
https://github.com/bloc97/Anime4K/releases
Local file की ओर point करने वाले
videoelement वाला एक simple HTML document बनाकर compare किया जा सकता हैहर बार जब YT downloaders के खिलाफ फिर कोई आधा-अधूरा measure deploy करता है, तो हैरानी होती है
GOOG के पास Widevine भी है, फिर इस्तेमाल क्यों नहीं करता, यह सोचता हूँ
Users के लिए कुछ नहीं बदलेगा, और YouTube पर केवल Widevine चलाने का operational burden आएगा
Hardware-based version इस्तेमाल करने पर unsupported devices में बहुत सारी problems हो सकती हैं
उसे जिसकी चिंता है वह bandwidth waste है
Ad-based video streaming sites में आम तौर पर bandwidth cost revenue से ज़्यादा होती है, लेकिन Google ने इतनी सस्ती bandwidth हासिल कर ली है कि वह ISPs पर free peering का दबाव डाल सके, इसलिए यह मुश्किल से viable बनता है
ऐसी speed limits का मकसद सारे content को scrape करने वालों के बजाय actual users के लिए bandwidth का ज़्यादातर हिस्सा बचाकर रखना है
Goal हासिल करने में भी यह बहुत effective नहीं है, और बड़ी संख्या में users को platform से बाहर धकेलने की संभावना काफ़ी है
YouTube के scale पर ऐसे systems को जितना हो सके कम रखना चाहेंगे
साथ ही, यह Widevine Level 3 को बहुत बड़ा attack target बना देगा
अंततः यह financial equation है; ad blocking से होने वाला नुकसान अभी Widevine switch दबाने जितना नहीं है, लेकिन weaker measures लेने जितना हो गया है, और record labels का pressure भी होगा, इसलिए अगले कुछ वर्षों में इसके ज़्यादा व्यापक रूप से deploy होने की संभावना है
अनुमान लगाऊँ तो शुरुआत में Content ID से पकड़े गए label music या studio clips वाले videos से होगी, और दूसरे creators को opt-in tag दिया जा सकता है
ऐसे videos monetization के लिए ज़्यादा उपयोगी हैं और CDN का फायदा एक साथ नहीं खोएँगे
चुपचाप ऐसे आधे-अधूरे measures लेना उस goal को हासिल करने का perfect और इकलौता solution है
मैं हमेशा सोचता था कि YouTube वीडियो कैसे deliver करता है
Internet खराब होने पर भी यह ठीक चलता था, और South America में हर platform ठीक से नहीं चलता, लेकिन YouTube सबसे smooth video platform है
सबसे करीब Netflix है, लेकिन वह भी काफ़ी पीछे है
ISP को भी फायदा होता है, इसलिए वे allow करते हैं
ISP का bottleneck उसके अपने network से बड़े internet backbone तक जाने वाला connection होता है, और बड़े CDN के cache servers उस bottleneck से बड़ा load हटा देते हैं
Netflix की similar setup documentation: https://openconnect.netflix.com/
क्या आपने कभी YouTube से सीधे वीडियो डाउनलोड करने की कोशिश की है?
youtube-dl, yt-dlp या ऐसी websites पर निर्भर किए बिना manual तरीके से करने पर यह उम्मीद से कहीं ज़्यादा जटिल है
बेशक, ऐसी scripts की समस्या यह है कि YouTube वीडियो डाउनलोड रोकने के लिए जो बदलाव करता है, उनका लगातार पीछा करना पड़ता है
WEI को देखें तो यह मेरे USER AGENT का इस्तेमाल करने वाला तरीका है, जो शायद लंबे समय तक न चले
signature,
ndecoding और rate-limit function को फिर से implement करने की कोशिश करने के बजाय,player.jsकोmatch(/(?:player\/([a-zA-Z0-9_-]+)\/)?(?:html5player|(?:www|player(?:_ias)?))[-\.]([^/]+?)(?:(?:\/html5player(?:-new)?)?|(?:\/[a-z]{2,3}_[A-Z]{2})?\/base)\.js/)से ढूँढता हूँ, फिर उसके अंदर relevant functions को grep करके सीधे call करता हूँYouTube के नज़रिए से कहा जा सकता है कि उसका अपना DRM function मेरे लिए
.mp4link खोल रहा है, इसलिए यह 100% normal जैसा दिखता हैतकनीकी तौर पर यह सब दिलचस्प है, लेकिन अगर नैतिक रूप से सिर्फ “Google की ऐसी की तैसी” ही नहीं सोच रहे हैं, तो पहली optimization—यानी actual browser check पास करके normal browser speed पाने—तक रुक जाना reasonable लगता है
इतना करने से आप ad-blocking browser user की तुलना में YouTube resources ज़्यादा waste नहीं कर रहे होते
बिना कोई cost दिए पूरी Gb/s speed इस्तेमाल करना, ad-blocking users की पूरी किस्मत को आज़माने जैसा लगता है
हालांकि अंत में बात फिर भी Google की ऐसी की तैसी वाली हो सकती है
YouTube को maximum speed से hit करना मैं अनैतिक तो नहीं कहूँगा, लेकिन अगर YouTube इसे रोकने के उपाय करता है तो उसे दोष भी नहीं दूँगा
मैं एक browser extension इस्तेमाल करता हूँ जो social media images पर mouse hover करने पर उन्हें original size में दिखाता है, और Instagram ने abnormal activity warning और account lock की धमकी दिखा दी
मैंने check किया कि extension background में scraping तो नहीं कर रहा, लेकिन कोई खास समस्या नहीं दिखी; शायद Meta standard client से अलग request order देखकर इसे data scraping मानता है
यह action और counter-action की दोहराई है, और YouTube भी अपने countermeasures implement करेगा ताकि scrapers फिर जवाबी उपाय करें, लेकिन legitimate consumption में official client पर playback speed के 2x से ज़्यादा तेज़ी से चलने की जरूरत नहीं होती, इसलिए कभी न कभी वह download को उसी हद तक limit कर पाएगा
फिर भी मेरा मानना है कि download को अपने-आप में limit नहीं किया जाना चाहिए
content पहले से ही कानून द्वारा protected है, और ज़्यादातर लोग archiving, analysis, review videos बनाने जैसे जायज़ कारणों से videos डाउनलोड करते हैं
YouTube content vacuum में नहीं बनता, और publish होने के बाद यह नए videos बनने का माहौल बनाता है, इसलिए यह creative freedom महत्वपूर्ण है
आखिर वही amount of data कम समय में receive किया जा रहा है, इसलिए bandwidth ज़्यादा लगती है लेकिन जल्दी खत्म भी हो जाती है
normal browser use case शायद उस आम स्थिति के लिए tuned है जहाँ लोग video अंत तक नहीं देखते
अगर शुरू से ही पूरा देखने और archive करने का इरादा है, तो यह कहना मुश्किल है कि इससे Google की bandwidth ज़्यादा खपत होती है; हाँ, connection count की वजह से overhead ज़्यादा हो सकता है
मेरे लिए भी वैसा ही behave करना स्वाभाविक है
क्योंकि YouTube ने दुनिया भर के लगभग सभी ISPs और internet exchange points पर caches रखे हैं, और यह अब तक बना सबसे बड़ा CDN भी हो सकता है
उदाहरण के लिए, लेखक का YouTube URL Canada ISP Videotron की ओर point करता है
https://bgp.he.net/dns/rr1---sn-8qu-t0aee.googlevideo.com
यह इसलिए भी ज़रूरी है कि कोई hate speech फैला रहा हो या मुझे और मेरे परिवार को insult कर रहा हो, तो उसका evidence रखा जा सके
screen को camcorder से record किया जा सकता है, लेकिन वह stone-age solution जैसा लगता है
उदाहरण के लिए, Mac के browser में Netflix screenshot लेने नहीं देता, इसलिए fair use के अंतर्गत आने वाला meme creation तक छीन लिया गया है