6 पॉइंट द्वारा GN⁺ 2024-07-30 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 के क्रम में लागू होती है
      1. global options: सभी downloads के defaults
      2. presets: UI में हर download के लिए चुना जाने वाला named option bundle
      3. 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 टिप्पणियां

 
GN⁺ 2024-07-30
Hacker News की राय
  • Tube Archivist पर भी विचार किया जा सकता है। अगर सिर्फ कुछ वीडियो डाउनलोड करने हैं तो यह ज़रूरत से ज़्यादा हो सकता है, लेकिन मैं इसे अपने पसंदीदा टेक चैनलों को archive और index करने के लिए इस्तेमाल कर रहा हूँ
    transcript/subtitles ही नहीं, बल्कि comments, titles और descriptions तक में full-text और metadata search संभव है, और झुंझलाहट की बात यह है कि यह Alphabet की दी हुई सुविधा से कहीं बेहतर है
    https://www.tubearchivist.com/

    • TubeArchivist को देखते समय मुझे यह बात पसंद नहीं आई कि इसमें 3 containers चाहिए। फिर selfhosted subreddit में Pinchflat मिला, जो single container में चलता है, इसलिए deploy करना आसान था और अब तक अच्छी तरह काम कर रहा है
      https://github.com/kieraneglin/pinchflat
    • मैं इससे बचना चाहूँगा। इसकी file naming database के मौजूद होने की धारणा पर टिकी हुई है
      अगर यह temporary storage के लिए हो तो समझ में आता है, लेकिन जो tool खुद को “archive” software कहता है, उसे यह मानकर चलना चाहिए कि वह शायद उस data से ज़्यादा समय तक न टिके जिसे वह सुरक्षित रखना चाहता है
      यह download feature वाले PeerTube clone जैसा लगा था, इसलिए उम्मीद थी, लेकिन output देखकर उत्साह ठंडा पड़ गया; archive के काम के लिए yt-dlp में समझदारी भरी settings और scripts जोड़ना ज़्यादा सही लगता है
    • Google कभी यह नहीं चाहेगा कि लोग उसके products को किसी structured और advanced तरीके से सुविधाजनक रूप से इस्तेमाल कर सकें। ऐसा करना users के लिए बहुत फायदेमंद होगा और control बहुत ज़्यादा उनके हाथ में चला जाएगा। Google को यह पसंद नहीं है
    • आज पहले homepage पर आया एक और विकल्प भी है: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • मैं लंबे समय से Tube Archivist पर migrate करने के बारे में सोच रहा हूँ, लेकिन TubeSync से जमा किए हुए YouTube videos कई TB के हैं, इसलिए उन्हें फिर से डाउनलोड नहीं करना चाहता
      अच्छी बात यह है कि मेरे पास वह 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 से बाँधे रखना

    • क्या यह YouTube subscriptions से हल नहीं हो जाता? उन 100 channels को subscribe करके subscriptions page को bookmark कर लें, तो आपको एक priority feed मिल जाएगी जिसमें सिर्फ वही चीज़ें होंगी जिन्हें आप देखना चाहते हैं
      अगर आप account नहीं बनाना चाहते तो वह अलग बात है, और तब NewPipe बेहतर हो सकता है, लेकिन जब आपके चुने हुए channels के videos को chronological order में दिखाने वाला dedicated page मौजूद है, तब यह कहना कि “हमें जो पसंद है उसे miss न होने देना YouTube का तरीका नहीं है” थोड़ा अजीब लगता है
    • NewPipe इस काम के लिए काफ़ी ठीक है। main page content में “Default Kiosk” कॉलम हटा दें और सिर्फ “What's New” छोड़ दें, तो आप सिर्फ subscribed channels के videos देख पाएँगे। NewPipe की subscriptions का Google account से कोई integration नहीं है
    • मेरी जानकारी में YouTube अभी भी RSS इस्तेमाल करता है। उसे आज़माया जा सकता है
    • मैं इस काम के लिए Invidious इस्तेमाल करता हूँ। इसमें सिर्फ subscriptions के लिए एक priority feed है, जो अच्छी लगती है
      discoverability अच्छी नहीं है, लेकिन अगर आपका use case वह नहीं है, तो इसे देखना ठीक रहेगा
    • ठीक इसी काम के लिए fraidycat extension है
      https://fraidyc.at/
  • एक बात समझ नहीं आती। इसे सर्वर पर host करने की ज़रूरत क्यों है? क्या Windows/Linux/mac पर चलने वाली standalone app काफ़ी नहीं होगी?
    मैंने हाल ही में yt-dlp इस्तेमाल करना शुरू किया है और सोचा था कि शायद एक simple app बनाऊँ। क्या यह करने लायक है? क्या इस तरह के alternatives पहले से मौजूद हैं?

    • अगर चाहें तो Windows/Linux/OSX डिवाइस, या उसके ऊपर चलने वाली virtual machine/container, सर्वर बन सकती है। इससे बनाने वाले को web UX और native UX अलग-अलग बनाने की ज़रूरत नहीं पड़ती
      बहुत से लोग 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 कर लेना बेहतर होगा। हो सकता है जो आप चाहते हैं, वह पहले से मौजूद हो
    • Celluloid supported URL खोलने को कहने पर अपने-आप yt-dlp से stream करता है। Parabolic yt-dlp इस्तेमाल करने वाला dedicated download tool है
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • अगर आप सिर्फ़ YouTube वीडियो डाउनलोड कर रहे हैं, तो 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 ही इस्तेमाल करते रहे हैं
    • Freetube भी है
      https://freetubeapp.io/
    • हो सकता है आप वीडियो अपने मौजूदा डिवाइस पर नहीं, बल्कि NAS या home server पर डाउनलोड करके स्टोर करना चाहते हों
      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 इस्तेमाल करता हूँ, और यह भी अच्छा है

    • बेहतरीन। इसमें original YouTube audio format को mp3 में transcode किए बिना डाउनलोड करने का option है
  • मुझे पता चला कि 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 रखना अच्छा होता है, लेकिन मेरे मामले में ऐसा बहुत कम होता है। वीडियो देख लिया तो बात ख़त्म, फिर दोबारा न भी देख पाऊँ तो ज़्यादा फ़र्क नहीं पड़ता

    • YouTube से सीधे stream न करके डाउनलोड या archive करने की कई वजहें हैं
      पहली, 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 भी हो सकता है, और कुछ दूसरी वजहें भी होंगी जिन्हें मैंने सोचा या याद नहीं किया
    • मेरे लिए तो वजह वही है, जिस वजह से लोग VCR इस्तेमाल करते थे। यह “copyright infringement” नहीं है, बल्कि बाद में देखने या इंटरनेट न होने/धीमा होने पर देखने के लिए save करना है
      जो ज़्यादातर चीज़ें मैं डाउनलोड करता हूँ, उन्हें एक बार देखकर delete कर देता हूँ
    • बच्चों के home network पर YouTube block है, और उसकी जगह उन्हें मैंने खुद चुना हुआ DadTube access दिया है
    • आप हैरान हैं कि यह tool क्यों मौजूद है, जबकि उसी tool के होने की सबसे बड़ी वजह आप खुद बता रहे हैं
      और YouTube streaming हमेशा संभव भी नहीं होती। इंटरनेट बंद हो सकता है, विदेश में mobile plan महँगा पड़ सकता है, या आप बस बेकार ads से छुटकारा चाहते हों
    • यह bandwidth usage caps की वजह से भी है। अगर आप वही music video playlist बार-बार चलाना चाहते हैं, तो data limit काफ़ी जल्दी खर्च हो सकती है
  • संबंधित: 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 को बाकी काम करने दे। क्या किसी को इससे बेहतर विकल्प पता है?