- MeTube,
yt-dlp के लिए एक सेल्फ-होस्टेड वेब UI है, जिससे ब्राउज़र में YouTube और दर्जनों समर्थित साइटों से मीडिया डाउनलोड किया जा सकता है
- यह वीडियो, ऑडियो, सबटाइटल और थंबनेल डाउनलोड को सपोर्ट करता है, और प्लेलिस्ट व चैनल भी आउटपुट फॉर्मैट और डाउनलोड विकल्पों को एडजस्ट करके डाउनलोड किए जा सकते हैं
- चैनल और प्लेलिस्ट को सब्सक्राइब करके समय-समय पर नए आइटम चेक किए जा सकते हैं, और नए अपलोड अपने-आप queue में डाले जा सकते हैं
- इसे Docker या docker-compose से चलाया जाता है, और concurrent downloads की संख्या, सेव पाथ, फ़ाइलनाम टेम्पलेट, HTTPS, CORS, theme, log level आदि environment variables से सेट किए जाते हैं
yt-dlp विकल्प global options, presets और per-download overrides के क्रम में जोड़े जाते हैं; per-download overrides मनमाने विकल्पों की input अनुमति देते हैं, इसलिए इन्हें केवल trusted environment में ही enable करना चाहिए
MeTube क्या करता है
- MeTube,
yt-dlp आधारित सेल्फ-होस्टेड वेब UI है
- YouTube और
yt-dlp द्वारा समर्थित दर्जनों साइटों से मीडिया डाउनलोड किया जा सकता है
- मुख्य फीचर इस प्रकार हैं
- ब्राउज़र UI से वीडियो, ऑडियो, सबटाइटल, थंबनेल डाउनलोड
- प्लेलिस्ट और चैनल डाउनलोड
- आउटपुट पाथ और डाउनलोड विकल्प कॉन्फ़िगर करना
- चैनल·प्लेलिस्ट को सब्सक्राइब करने के बाद नियमित रूप से नए आइटम चेक करना
- नए अपलोड को अपने-आप डाउनलोड queue में जोड़ना
चलाने का तरीका
- Docker से सीधे चलाया जा सकता है
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- docker-compose का उदाहरण
ghcr.io/alexta69/metube image का उपयोग करता है, और container के /downloads को host की download directory पर mount करता है
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
डाउनलोड और storage settings
- MAX_CONCURRENT_DOWNLOADS एक साथ चल सकने वाले downloads की संख्या सीमित करता है, और default
3 है
- अगर DELETE_FILE_ON_TRASHCAN
true हो, तो UI के “Completed” सेक्शन में किसी item को trash में भेजते समय server की downloaded file भी delete हो जाती है
- DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT playlist से डाउनलोड किए जा सकने वाले items की अधिकतम संख्या तय करता है; default
0 का मतलब कोई limit नहीं है
- subscription से जुड़े defaults भी environment variables से adjust किए जाते हैं
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: हर subscription के लिए auto-check interval, default
60 मिनट
- SUBSCRIPTION_SCAN_PLAYLIST_END: subscription check के समय लाए जाने वाले अधिकतम playlist·channel items, default
50
- SUBSCRIPTION_MAX_SEEN_IDS: हर subscription के लिए store किए जाने वाले video IDs की upper limit, default
50000
- DOWNLOAD_DIR download storage path है; Docker image में default
/downloads है
- audio-only downloads के लिए AUDIO_DOWNLOAD_DIR के रूप में अलग storage path रखा जा सकता है
- CUSTOM_DIRS और CREATE_CUSTOM_DIRS के जरिए UI में download subdirectories चुनी या auto-create की जा सकती हैं
- STATE_DIR में
queue.json, pending.json, completed.json, subscriptions.json जैसी persistent state files store होती हैं
- TEMP_DIR intermediate download files का path है; SSD या RAM filesystem इस्तेमाल करने से performance में मदद मिल सकती है, लेकिन RAM filesystem download resume को रोक सकता है
फ़ाइलनाम और yt-dlp options
- OUTPUT_TEMPLATE download filename template है, और default
%(title)s.%(ext)s है
- chapters, playlists और channel downloads के लिए templates अलग से सेट किए जा सकते हैं
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
yt-dlp options JSON object के रूप में दिए जाते हैं
- option hierarchy व्यापक scope से संकरे scope के क्रम में लागू होती है
- global options: सभी downloads के defaults
- presets: UI में हर download के लिए चुना जाने वाला named option bundle
- per-download overrides: केवल किसी specific download पर लागू होने वाले free-input options
- अगर keys conflict करें, तो अधिक specific setting को priority मिलती है
- per-download override, preset से ऊपर priority रखता है
- preset, global options से ऊपर priority रखता है
- JSON में option value को
null सेट करने पर उस download में वह option हट जाता है
YTDL_OPTIONS_FILE और YTDL_OPTIONS_PRESETS_FILE file changes को watch करके अपने-आप reload होते हैं, इसलिए container restart की जरूरत नहीं होती
- files और environment variables साथ इस्तेमाल करते हुए अगर समान key या समान preset name define हो, तो file settings को priority मिलती है
Presets और overrides
- presets UI के Advanced Options के नीचे “Option Presets” के रूप में दिखते हैं
- example presets ये काम करते हैं
- sponsorblock: sponsor, selfpromo, interaction segments हटाता है
- embed-subs: English और German subtitles डाउनलोड करके video file में embed करता है
- limit-rate: download speed को लगभग 5 MB/s तक limit करता है
- कई presets चुनने पर वे क्रम से लागू होते हैं, और समान option को बाद वाला preset पहले वाले preset पर overwrite कर देता है
- ALLOW_YTDL_OPTIONS_OVERRIDES को
true सेट करने पर UI में “Custom yt-dlp Options” free-input JSON field दिखाई देता है
- per-download overrides default रूप से disabled होते हैं
- यह feature enable करने पर UI access करने वाला व्यक्ति मनमाने
yt-dlp API options दे सकता है, और options के आधार पर container के अंदर arbitrary command execution संभव हो सकता है; इसलिए इसे केवल trusted environment में ही activate करना चाहिए
- MeTube initial metadata fetching चरण में अपना
extract_flat, noplaylist behavior enforce करता है, और presets इस चरण की keys को overwrite नहीं कर सकते
Cookies, browser integration, quick execution
- restricted या private videos डाउनलोड करने हों, तो browser cookies का इस्तेमाल किया जा सकता है
- Firefox या Chrome extension से cookies को
cookies.txt में export करें
- MeTube के Advanced Options में Upload Cookies से upload करें
- उसी section के Delete Cookies से uploaded cookies delete करें
- browser extension video पर right-click करके उसे सीधे MeTube में भेजने देता है
- HTTPS page पर इस्तेमाल करने के लिए MeTube instance को HTTPS reverse proxy के पीछे होना चाहिए
- extension
chrome-extension://... या moz-extension://... origins से request भेजता है, इसलिए CORS_ALLOWED_ORIGINS=* setting की जरूरत होती है
- Chrome extension Google Chrome Webstore से install किया जा सकता है या source से install किया जा सकता है
- Firefox extension Firefox Addons से install किया जा सकता है या source इस्तेमाल किया जा सकता है
- iOS Shortcut, Safari share menu से MeTube को URL भेज सकता है
- Bookmarklet अभी खुली web page को MeTube में भेजता है; HTTPS pages पर MeTube को HTTPS पर configured होना चाहिए या HTTPS reverse proxy के पीछे होना चाहिए
- Bookmarklet current page origin से MeTube को cross-origin request भेजता है, इसलिए जिन site origins पर इस्तेमाल करना है उन्हें CORS_ALLOWED_ORIGINS में जोड़ना होगा
- Raycast के लिए MeTube extension, Raycast से सीधे videos add करने देता है
Web server, HTTPS, reverse proxy
- web server से जुड़ी settings environment variables से adjust की जाती हैं
- HOST का default
0.0.0.0 है
- PORT का default
8081 है
- URL_PREFIX reverse proxy के पीछे subpath deployment के लिए इस्तेमाल होता है
- PUBLIC_HOST_URL और PUBLIC_HOST_AUDIO_URL completed file download links के base URL को बदलते हैं
- HTTPS को
true सेट करके और CERTFILE, KEYFILE specify करके MeTube HTTPS mode में चलता है
- reverse proxy का उपयोग HTTPS termination या authentication के लिए किया जा सकता है
linuxserver/swag image में MeTube के लिए subfolder, subdomain config snippets और Authelia authentication config शामिल हैं
- NGINX example
/metube/ path को http://metube:8081 पर proxy करता है, और WebSocket behavior के लिए Upgrade और Connection headers सेट करता है
- Apache और Caddy के लिए reverse proxy examples भी दिए गए हैं
Updates, troubleshooting, local development
- MeTube yt-dlp पर निर्भर करता है, और video site layout changes के कारण
yt-dlp को अक्सर update की जरूरत होती है
- नया
yt-dlp stable release आने पर नई MeTube Docker image अपने-आप publish होती है
- container को latest रखने के तरीके के तौर पर watchtower इस्तेमाल किया जा सकता है
yt-dlp nightly channel follow करने के लिए YTDL_NIGHTLY_UPDATE_TIME में daily upgrade और MeTube restart का समय HH:MM format में सेट करें
- authentication, post-processing, permissions,
YTDL_OPTIONS issues को पहले सीधे yt-dlp में debug करने, फिर working options को MeTube में लाने का flow recommended है
- local build और run के लिए Node.js 22+ और Python 3.13 की जरूरत है
- UI को
pnpm से build करें, Python dependencies को uv sync से install करें, फिर uv run python3 app/main.py से चलाएं
- Docker image को
docker build -t metube . से locally build किया जा सकता है, और इस process में UI भी साथ में build होता है
1 टिप्पणियां
Hacker News की राय
Tube Archivist पर भी विचार किया जा सकता है। अगर सिर्फ कुछ वीडियो डाउनलोड करने हैं तो यह ज़रूरत से ज़्यादा हो सकता है, लेकिन मैं इसे अपने पसंदीदा टेक चैनलों को archive और index करने के लिए इस्तेमाल कर रहा हूँ
transcript/subtitles ही नहीं, बल्कि comments, titles और descriptions तक में full-text और metadata search संभव है, और झुंझलाहट की बात यह है कि यह Alphabet की दी हुई सुविधा से कहीं बेहतर है
https://www.tubearchivist.com/
https://github.com/kieraneglin/pinchflat
अगर यह temporary storage के लिए हो तो समझ में आता है, लेकिन जो tool खुद को “archive” software कहता है, उसे यह मानकर चलना चाहिए कि वह शायद उस data से ज़्यादा समय तक न टिके जिसे वह सुरक्षित रखना चाहता है
यह download feature वाले PeerTube clone जैसा लगा था, इसलिए उम्मीद थी, लेकिन output देखकर उत्साह ठंडा पड़ गया; archive के काम के लिए
yt-dlpमें समझदारी भरी settings और scripts जोड़ना ज़्यादा सही लगता हैhttps://news.ycombinator.com/item?id=41100820
अच्छी बात यह है कि मेरे पास वह format string है जिससे filenames सेव की थीं, और क्योंकि TubeSync Django और PostgreSQL backend इस्तेमाल करता है, शायद YouTube ID से mapping हो सके। फिर भी migration काफ़ी हद तक किसी बुरे सपने जैसा लग रहा है
असल में जो चाहिए वह है YouTube TiVo
लगभग 100 ऐसे channels हैं जिन्हें मैं लगभग धार्मिक निष्ठा से follow करता हूँ, लेकिन वे बहुत कम upload करते हैं, और मैं उनके videos कभी miss नहीं करना चाहता
मैं यह भी नहीं चाहता कि YouTube पर दिन में चार बार upload करने वाले channels के सैकड़ों नए videos खंगालता रहूँ ताकि उनमें से सच में देखने लायक 1-2 videos ढूँढ सकूँ। अंत में चीज़ें छूट ही जाती हैं
अच्छा होगा अगर एक priority feed मिल जाए जिसमें सिर्फ वही चीज़ें हों जिन्हें मैं सच में देखना चाहता हूँ या देखना ज़रूरी है, और अगर सब कुछ download करके DLNA पर देखा जा सके तो और भी बेहतर
हमें जो पसंद है उसे miss न होने देना YouTube के काम करने का तरीका नहीं है। YouTube का तरीका है 3 मिनट के video को 18-22 मिनट तक खींचे गए video में बदलकर आपको feedback loop से बाँधे रखना
अगर आप account नहीं बनाना चाहते तो वह अलग बात है, और तब NewPipe बेहतर हो सकता है, लेकिन जब आपके चुने हुए channels के videos को chronological order में दिखाने वाला dedicated page मौजूद है, तब यह कहना कि “हमें जो पसंद है उसे miss न होने देना YouTube का तरीका नहीं है” थोड़ा अजीब लगता है
discoverability अच्छी नहीं है, लेकिन अगर आपका use case वह नहीं है, तो इसे देखना ठीक रहेगा
https://fraidyc.at/
एक बात समझ नहीं आती। इसे सर्वर पर host करने की ज़रूरत क्यों है? क्या Windows/Linux/mac पर चलने वाली standalone app काफ़ी नहीं होगी?
मैंने हाल ही में
yt-dlpइस्तेमाल करना शुरू किया है और सोचा था कि शायद एक simple app बनाऊँ। क्या यह करने लायक है? क्या इस तरह के alternatives पहले से मौजूद हैं?बहुत से लोग self-hosting apps को external server, homelab, या दोनों के mix पर चलाते हैं, और उन resources को backup वगैरह वाली infrastructure की तरह set up करते हैं। PC/लैपटॉप/टैबलेट/फ़ोन को अपेक्षाकृत simple client या cache की तरह रखा जा सकता है, ताकि खो जाने या खराब होने पर सर्वर से synced local content फिर से लाकर आसानी से replace किया जा सके। self-hosting के इस तरीके के popular होने की यह भी एक वजह है
yt-dlpको wrap करने वाली desktop apps मैंने कुछ देखी हैं। खुद इस्तेमाल नहीं किया, इसलिए उनकी stability या reliability पर कुछ कहना मुश्किल है, लेकिन अगर आप सिर्फ़ मज़े के लिए नया बनाना नहीं चाहते, तो पहले search कर लेना बेहतर होगा। हो सकता है जो आप चाहते हैं, वह पहले से मौजूद होyt-dlpसे stream करता है। Parabolicyt-dlpइस्तेमाल करने वाला dedicated download tool हैhttps://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter
yt-dlpभी ज़रूरी नहीं है। यह उससे कहीं कम code और complexity में किया जा सकता है, और मैं इसे एक बहुत छोटे C program में लिखकर इस्तेमाल करता हूँ। एक छोटी shell script भी काफ़ी अच्छी तरह काम कर लेगीजिस बात का कोई ज़िक्र नहीं कर रहा, वह यह है कि
yt-dlpअब itag 22 डाउनलोड नहीं कर सकता, और itag 18 पर speed limit लग गई है। इसलिएyt-dlpको audio file और video file अलग-अलग लेनी पड़ती हैं, फिरffmpegसे उन्हें merge करना पड़ता हैYouTube ad revenue consensus estimates से थोड़ा कम रह गया है। आगे चलकर YouTube वीडियो accessibility और खराब हो सकती है
अगर आपको specific formats चुनने की आदत नहीं है, तो शायद यह बात ज़्यादा महसूस न हो। उदाहरण के लिए, कुछ लोग सालों से सिर्फ़ itag 18 और 22 ही इस्तेमाल करते रहे हैं
https://freetubeapp.io/
Dockerized web app बनाना और maintain करना, Windows, macOS, Android, iOS, Linux के लिए अलग-अलग desktop/mobile clients बनाने से कहीं आसान है
अगर Jellyfin के साथ integrate होने वाला interface हो, तो अच्छा होगा। मतलब YouTube search करो,
yt-dlpसे डाउनलोड करो, और फिर बिना ads के Jellyfin से stream करोyt-dlpवाला step manual है। Jellyfin plugin हो तो शानदार होगाकाफ़ी बढ़िया है। मैं अभी https://cobalt.tools इस्तेमाल करता हूँ, और यह भी अच्छा है
मुझे पता चला कि iOS पर Brave में playlist button है, जिससे YouTube वीडियो डाउनलोड करके डिवाइस में store किया जा सकता है। PiP और offline playback भी मिलता है, और ads भी नहीं हैं
यह Mozilla iOS backend पर आधारित open license इस्तेमाल करता है, इसलिए सोचता हूँ कि और apps ऐसा क्यों नहीं करते। लगता है उन्होंने Apple से इसे मंज़ूर करवाने का तरीका ढूँढ लिया, और CEO ने यहाँ इस technique को वैध बताते हुए एक post भी लिखी थी
मूल रूप से यह तभी काम करता है जब आप सामान्य YouTube website के अंदर वीडियो load करते हैं, और यह YouTube ही नहीं बल्कि किसी भी video content पर लागू होने वाले reading mode button जैसा है
यह देखकर थोड़ा अजीब लगता है कि YouTube mirroring tools इतने ज़्यादा हैं। अगर आप ऐसा tool इस्तेमाल करते हैं, तो YouTube पर सीधे stream करने के बजाय वीडियो डाउनलोड/संभालकर रखने की वजह क्या है?
मैं समझता हूँ कि कभी-कभी YouTube से delete होने की स्थिति में copy रखना अच्छा होता है, लेकिन मेरे मामले में ऐसा बहुत कम होता है। वीडियो देख लिया तो बात ख़त्म, फिर दोबारा न भी देख पाऊँ तो ज़्यादा फ़र्क नहीं पड़ता
पहली, ads हटाना बहुत से लोगों के लिए बड़ी वजह है
दूसरी, जैसा ऊपर लिखा गया, copyright claim या दूसरी reports की वजह से कोई वीडियो या पूरा channel हट जाए, तो फिर उसे stream नहीं किया जा सकता। आप किस तरह का content देखते हैं, उसके हिसाब से यह बात किसी के लिए आपसे कहीं ज़्यादा महत्वपूर्ण हो सकती है
तीसरी, offline playback के लिए डाउनलोड किया जा सकता है। यह official YouTube app से भी संभव है, लेकिन उसके लिए Premium देना पड़ता है, जिसकी कीमत ज़्यादा लगती है, और फिर भी delete होने की समस्या बनी रहती है
चौथी, local indexing। अगर आप बाद में फिर देखने या share करने के लिए वीडियो refer करना चाहते हैं, तो YouTube copy के bookmark संभालकर रखने या हर बार search करने की बजाय अपनी structure में organize करना ज़्यादा सुविधाजनक हो सकता है
इन वजहों का mix भी हो सकता है, और कुछ दूसरी वजहें भी होंगी जिन्हें मैंने सोचा या याद नहीं किया
जो ज़्यादातर चीज़ें मैं डाउनलोड करता हूँ, उन्हें एक बार देखकर delete कर देता हूँ
और YouTube streaming हमेशा संभव भी नहीं होती। इंटरनेट बंद हो सकता है, विदेश में mobile plan महँगा पड़ सकता है, या आप बस बेकार ads से छुटकारा चाहते हों
संबंधित: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820
अगर
yt-dlpआधारित किसी सर्वर को एक बहुत ही सरल Pi-hole जैसी image creation tool और एक ठीक-ठाक playback frontend client app के साथ पैक कर दिया जाए, तो मुझे लगता है कि यह Pi-hole की तरह कम तकनीकी उपयोगकर्ताओं तक फैलते हुए बहुत बड़ा हो सकता हैमतलब Raspberry Pi खरीदो, microSD card पर image burn करो, अपने पसंदीदा YouTube channels चुनो, client app install करो, और फिर तुम्हारा पसंदीदा सारा YouTube content लोकल में बिना ads के उपलब्ध हो जाए
अभी मैं TubeSync इस्तेमाल कर रहा हूँ। इसकी functionality सरल है और bugs भी काफी हैं, लेकिन मेरे लिए यह काफ़ी अच्छी तरह काम करता है
मुझे बस channels या playlists subscribe करनी हैं, videos को किसी तय path पर download करना है, और दिन में एक बार नया content चेक करना है
मुझे UX में सिर्फ channel settings की ज़रूरत पड़ती है, उसके बाद यह बस files save कर दे और Plex को बाकी काम करने दे। क्या किसी को इससे बेहतर विकल्प पता है?