टर्मिनल में YouTube वीडियो देखें


107

मैं टर्मिनल में YouTube वीडियो देखने का तरीका ढूंढ रहा हूं (ब्राउज़र या किसी अन्य विंडो में नहीं, बल्कि वहीं, किसी भी बैश सत्र में)।

क्या ऐसा करने के लिए एक सरल तरीका है?

मैं कुछ इस तरह की कल्पना करता हूं:

$ youtube <video-url>     

मुझे पहले से ही पता है कि कैसे वीडियो का उपयोग करना है mplayer:

$ mplayer -vo caca local-file.avi

हालाँकि, यह एक नई विंडो खोलता है। इसे टर्मिनल में खेलना अच्छा होगा।

इसके अलावा, यह tmuxसत्रों के साथ संगत होना चाहिए ।


मैंने एक और सवाल पूछा कि नई विंडो खोलने से कैसे रोका जाए


उन लोगों के लिए जो आश्चर्य करते हैं कि मुझे ऐसी कार्यक्षमता की आवश्यकता कहां है, मैंने एक प्रयोगात्मक परियोजना शुरू की जिसका नाम TmuxOS है - इस अवधारणा के साथ कि सब कुछ एक tmuxसत्र के अंदर चलना चाहिए

तो, वास्तव में मुझे स्थानीय और दूरस्थ वीडियो के लिए वीडियो प्लेयर की आवश्यकता है। :-)


2
क्या तुम्हारा यह मतलब था? google.com/…
अराजकता

1
@ अचल बिल्कुल। :-) मैं इसे महीनों से देख रहा हूँ, लेकिन अभी तक कुछ नहीं मिला। यहाँ पूछने का फैसला किया ...
Ionică Bizău

VLC, Youtube वीडियो चला सकता है, यह सुनिश्चित नहीं करता कि उसमें टर्मिनल आउटपुट क्षमताएं हैं या नहीं।

Mpv के साथ आप कर सकते हैं mpv <youtube url>। यह अन्य वीडियो साइटों के एक समूह के लिए भी काम करता है। लेकिन यह एक नई विंडो खोलता है।
गेरार्डो मारसेट

1
यह एक आकर्षक प्रश्न है, और मैंने उत्तरों से बहुत कुछ सीखा है। लेकिन जिज्ञासा से बाहर - पृथ्वी पर आपको ऐसा करने की आवश्यकता क्यों है? ;-)
डिजिटल ट्रॉमा

जवाबों:


132

आप वीडियो और / या सिर्फ ऑडियो डाउनलोड कर सकते हैं और फिर उनका उपयोग करके देख / सुन सकते हैं youtube-dl। स्क्रिप्ट पायथन में लिखी गई है और ffmpegमुझे विश्वास है कि इसका उपयोग करता है।

$ youtube-dl --help
Usage: youtube-dl [options] url [url...]

Options:
  General Options:
    -h, --help                       print this help text and exit
    --version                        print program version and exit
    -U, --update                     update this program to latest version.
                                     Make sure that you have sufficient 
                                     permissions (run with sudo if needed)
...
...

वीडियो डाउनलोड करने के लिए आप बस उसे उस पेज से URL दें जिस पर आपको वीडियो चाहिए और स्क्रिप्ट बाकी है:

$ youtube-dl https://www.youtube.com/watch?v=OwvZemXJhF4
[youtube] Setting language
[youtube] OwvZemXJhF4: Downloading webpage
[youtube] OwvZemXJhF4: Downloading video info webpage
[youtube] OwvZemXJhF4: Extracting video information
[youtube] OwvZemXJhF4: Encrypted signatures detected.
[youtube] OwvZemXJhF4: Downloading js player 7N
[youtube] OwvZemXJhF4: Downloading js player 7N
[download] Destination: Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4
[download] 100% of 21.74MiB in 00:16

आप तब इनका उपयोग कर सकते हैं vlcया mplayerस्थानीय स्तर पर देख सकते हैं:

$ vlc "Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4"
VLC media player 2.1.5 Rincewind (revision 2.1.4-49-gdab6cb5)
[0x1cd1118] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"

ठीक है, लेकिन मैं इन वीडियो को देखना चाहता हूं क्योंकि वे ASCII में स्ट्रीम किए गए हैं

मुझे यह ब्लॉग लेख मिला , जिसका शीर्षक था: एससीआई, यूट्यूब और जाने देना जो उस पद्धति को प्रदर्शित करता है, जिसके बारे में मैंने चैटरूम में चर्चा की, मुख्य youtube-dlरूप से "बैकएंड" के रूप में उपयोग किया गया जो यूट्यूब स्ट्रीम को डाउनलोड करने और फिर इसे किसी अन्य ऐप पर पुनर्निर्देशित कर सकता है।

इस लेख से यह पता चलता है mplayer:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 

वीडियो से डाउनलोड किया जा रहा youtube-dlहै, ऊपर STDOUT के माध्यम से निर्देशित कर दिये है -o -यहाँ प्रभाव का एक डेमो है

          एस एस # 1

अतिरिक्त पुस्तकालयों की स्थापना के साथ ASCII वीडियो को और बढ़ाया जा सकता है।

               एस एस # 2

ठीक है, लेकिन मुझे अपने वास्तविक टर्मिनल में वीडियो चाहिए?

मुझे यह तरकीब मिली जो xtermओ'रेली में एक शीर्षक से वीडियो चलाने की अनुमति देता है जिसका शीर्षक है: ASCII कला में वीडियो देखें

$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4

उपरोक्त परिणाम एक xtermविंडो में खोले जा रहे हैं जहां वीडियो चलता है।

   एस एस # 3

तो मैंने सोचा, क्यों न पीनट बटर और चॉकलेट को एक साथ रखा जाए:

$ xterm -fn 5x7 -geometry 250x80 -e \
    "youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa:driver=curses -"

यह लगभग काम करता है! मुझे यकीन नहीं है कि वीडियो विंडो में क्यों नहीं चल सकता है, लेकिन ऐसा लगता है कि यह सक्षम होना चाहिए। खिड़की ऊपर आती है और खेलना शुरू करती है लेकिन फिर बंद हो जाती है। मैं कुछ सेकंड के लिए वीडियो देखता हूं और फिर कुछ नहीं।

शायद उपरोक्त आपको अपने अंतिम समाधान के करीब ले जाएगा, या शायद इसे विकल्पों पर थोड़ा मोड़ने की आवश्यकता है।

अतिरिक्त पुस्तकालय

यदि आपने libcaca() का रंगीन संस्करण स्थापित किया है aalibऔर आप अपने फॉन्ट का आकार gnome-terminalवास्तव में छोटा करते हैं, जैसे कि 3, निम्न कमांड टर्मिनल के भीतर सीधे ASCII वीडियो को बेहतर तरीके से प्रदर्शित करेगा:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   एस एस # 4

टर्मिनल

ऐसा लगता है कि टर्मिनल का चुनाव एक बड़ी बात बना सकता है कि क्या mplayerवह सीधे टर्मिनल के अंदर खेल सकता है या क्या यह एक अलग विंडो खोलता है। कैशिंग भी mplayerएक नाटकीय अंतर बना दिया है जो सीधे टर्मिनलों में खेलने में सक्षम है।

इस आदेश का उपयोग करने से terminatorपहले मैं वीडियो का पहला 1/4 भाग काटने में सक्षम था:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -

रंगीन संस्करण ने इस कमांड का उपयोग किया:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -

ये वही आदेशों में खेल सकते हैं gnome-terminalऔर xtermभी।

    एसएस असेंबल

    नोट: यही कारण है कि (बाएं से दाएं) है xterm, terminator, gnome-terminal, और terminology


2
आप इसे खेल सकते हैं terminology- और सिर्फ w / caca libs नहीं। आप टर्निनल विंडो के मैप किए गए हिस्से को निर्दिष्ट करने के लिए टर्मिनल एस्केप का उपयोग कर सकते हैं और इसे उच्च-डीफ में वहीं खेल सकते हैं। आप वीडियो को अपनी पृष्ठभूमि पर भी सेट कर सकते हैं और उस पर काम कर सकते हैं। terminologyयूआरआई को भी समझता है - अपने यूट्यूब वीडियो के लिए एक वेबम लिंक प्राप्त करें और printfइसे बस टर्मिनल प्रॉम्प्ट की तरह स्क्रीन पर लाएं।
माइकस

@mikeserv - यह अच्छा है, उस टर्मिनल एमुलेटर के बारे में कभी नहीं सुना। मैंने यह कोशिश की और यह अच्छा है कि आप पृष्ठभूमि में वीडियो चला सकते हैं, tybg my.aviयह करता है।
SLM

हाँ - मुझे printfविधि पसंद है । क्या tybg somefile | sed -n lयह कैसे काम करता है देखने के लिए - यह सिर्फ विस्तारित टर्मिनल पलायन उपयोग करता है। वे manपृष्ठ में प्रलेखित हैं । आप उसी के साथ कर सकते हैं ty{ls,cat}। लेकिन वे छोटे ऐप असली चीज़ के पुराने डेमो रैपर हैं और शायद उतने सक्षम नहीं हैं। वैसे भी, यदि आपका संस्करण पिछले कुछ महीनों में बनाया गया है, तो आप मिनीव्यू को जितना चाहें उतना कर सकते हैं - मैं ctrl + shift + h करता हूं। आत्मज्ञान के सभी बहुत अच्छा है - यही कारण है कि मैंने सुझाव दिया है कि आप इसे हाल ही में आज़माएं। यह भी तेजी से पागल है।
mikeserv

3
उक्त अतिरिक्त ASCII परिवाद क्या हैं?
PythonNut

1
@ एसएलएम बहुत बुरा है, मुझे लगता है कि सिर्फ डिबेट-मल्टीमीडिया बिल्ड ने इसे सक्षम किया है। आश्चर्य है कि अन्य लोग ऐसा क्यों नहीं करते हैं, लगता है कि वे शायद लिबाका को एक मजाक और ब्लोट मानते हैं।
व्युत्पन्न

14

तो, शब्दावली के साथ (शायद सबसे अच्छी बात जो कभी टर्मिनल एमुलेटर के साथ हुई, वैसे) इस लेखन के समय निम्न काम करता है:

ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# \$ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "$1" 's/.*mime=[^/]*.\([^&]*\).*/\1/'
                  )}"
                  init() { loop; }
           else   ! echo 'NO LINK SPECIFIED!' >&3
           fi
    durl() if    [ "${#du}" -eq 0 ]
           then  du=$(for c do printf 's/%%%X/\\%s/g;' "'$c" "$c"; done)
           else  curl -s "$1" | { shift
                 sed '/.*url_encoded_fmt_stream_map[^,]*url=/!d
                      s///;s/,.*//;s/\\u0026/\&/g;'"$du$*"; }
           fi
    loop() if    [ "$((i=$i+1))" -le 5 ] &&
                 sleep "$(($i*2))" 
           then  play || kill "$pid" || :
           else  ! echo 'ERROR RETRIEVING VIDEO!' >&3
           fi
    play() if    [ -s "$f" ]
           then  printf '\033}bt%s\0' "$f"; exit
           fi
    while init "$@" || exit
    do    curl -s "$(durl "$1")" >"$f" & pid=$!
    done  3>&2 2>/dev/null
)

terminologyविशिष्ट बिट है thenमें ब्लॉक play()- printf \033}...लाइन। terminologyस्क्रीन पर मीडिया को प्रिंट करने के लिए विस्तारित टर्मिनल एस्केप स्वीकार करता है - शीघ्र रंगों की तरह थोड़े लेकिन यह भी हाई-डीफ वीडियो और मूल रूप से जो कुछ भी आप चाहते हैं।

बाकी curl | sedस्क्रिप्ट थोड़ी है:

  1. अपने पहले तर्क के रूप में एक नियमित YouTube लिंक स्वीकार करता है ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' और इसी तरह...
  2. HTML खींचता है और वैकल्पिक डाउनलोड स्ट्रीम के लिए प्रासंगिक जावास्क्रिप्ट कोड पाता है ...
    • ऐसा curl "$yturl" | grep url_encoded_fmt_stream_mapपूरे ब्लॉक को देखने के लिए।
  3. उस ब्लॉक के भीतर से यह पहली पेशकश की गई वैकल्पिक स्ट्रीम का चयन करता है।
    • कई की पेशकश की जाती है - यदि आपने grepऊपर किया था तो आपको "उद्धरण-सीमांकित ...stream_map: "फ़ील्ड में सूची मिल जाएगी ।
    • जबकि पहले मैंने सोचा था कि मैं केवल mp4 को अधिक से अधिक प्राप्त करूंगा और मुझे वेब भी मिलेगा। इसलिए मैंने इसे प्रवाह के लिए संपादित किया है और फ़ाइल एक्सटेंशन को माइम प्रकार द्वारा निर्दिष्ट करने के लिए।
    • अब तक - चाहे webm या mp4 - पहली वैकल्पिक स्ट्रीम प्रति वीडियो में दी जाने वाली उच्चतम गुणवत्ता है - आमतौर पर 720p .mp4 - जो कि मैं वैसे भी खोज रहा हूं और इसलिए दूसरों का चयन करने के लिए यहां कोई तर्क नहीं है। मेरे नवीनतम संपादन ने इसे संभव बनाने के लिए कुछ मॉड्यूलर / स्पष्ट परीक्षण जोड़े, हालांकि। मूल रूप से फ़ंक्शन लिखते समय मैंने संदर्भित पर्ल स्क्रिप्ट के लिए इसे देखें ।
  4. %[[:hexdigit:]]\{2\}काम कर रहे लिंक में एन्कोडिंग को पार्स करता है ।
    • मेरे काम के संदर्भ के लिए इसे देखें ।
  5. थोड़ा बैकऑफ़ के साथ फ़ाइल को 5 बार डाउनलोड करने की कोशिश करता है।
    • डिफ़ॉल्ट रूप से फ़ाइल है, /tmp/vid.${mime-type}लेकिन अगर ytplayएक दूसरे तर्क के साथ कहा जाता है , तो यह व्याख्या करेगा कि लक्षित डाउनलोड फ़ाइलनाम के रूप में - अभी भी माइम प्रकार के अनुसार एक्सटेंशन को जोड़ रहा है।
  6. यदि डाउनलोड लक्ष्य शून्य से अधिक आकार में है, तो इसके किसी भी प्रयास के बाद यह डाउनलोड को पृष्ठभूमि में जारी रखने की अनुमति देता है और पृष्ठभूमि में प्रिंट terminologyकी जगह मीडिया अब टर्मिनल से बच जाता है, अन्यथा यह बस देता है और आपको एक त्रुटि संदेश के साथ छोड़ देता है कैप्स में
    • \033}bt[LINK/FILE]\0फुल-विंडो प्ले के लिए। pnयह एक नई विंडो के लिए बाहर पॉप होगा। खेल क्षेत्र को ज्यामितीय रूप से सीमित करने के लिए अन्य हैं - जैसे कि केवल खिड़की के एक हिस्से के लिए, उदाहरण के लिए।

यह बहुत कम परीक्षण से केवल थोड़ा अधिक आया है , लेकिन अब तक बिना असफलता के हर लिंक के लिए काम किया है, लेकिन एक - और क्योंकि मैं वास्तव में उस खेल को देखने में दिलचस्पी नहीं रखता था जो मैंने खेला नहीं था, यह पता लगाने की कोशिश नहीं की। क्यों।

हालांकि यह उन सभी के लिए काम करता था, यह जरूरी नहीं था कि प्रत्येक खेलता था - और यह इसलिए है क्योंकि पहले मैंने आँख बंद करके .mp4लक्ष्य फ़ाइल के विस्तार की जाँच की थी अगर यह सही था। यह संभव है कि जिस पर मैंने पहले गौर नहीं किया था वह केवल यही था। किसी भी मामले में, मैंने इसे संभालने के लिए बदल दिया।

जैसा कि मैंने पहले उल्लेख किया है, एकमात्र terminologyविशिष्ट बिट बहुत अंतिम फ़ंक्शन में है - play()- और इसलिए आप आसानी से बदल सकते हैं कि आप जो कुछ भी करना चाहते हैं उसे डाउनलोड / डाउनलोड की गई वीडियो फ़ाइल के साथ करें - जैसे कि mplayerदूसरे टर्मिनल में सीएसीए के साथ इसका उपयोग करना , या इसे एक vlcखिड़की या जो कुछ भी में बाहर पॉप । लेकिन अगर आप अपने आप को पसंद करते हैं तो आप इसे हाय-डिफेंस में देखेंगे terminology

ओह, और अंतिम, यह आम तौर पर बहुत तेज है - मेरी गति ने हर प्रयास पर अब तक की अवधि के लिए मेरे बैंडविड्थ को अधिकतम किया है, लेकिन terminologyइसे पूरी तरह से खेलना शुरू करने के लिए पूरी फ़ाइल की आवश्यकता नहीं है।

यहाँ यह काम कर रहा है:

शब्दावली चट्टानों


1
/tmp/vid.mp4शायद इसके बजाय आपको उपयोग करना चाहिए mktemp --suffix=.mp4, नहीं?
ब्रिअम

@ ब्रायम - यह एक बहुत अच्छा विचार है, लेकिन फिर मुझे शायद सफाई करने के लिए तर्क जोड़ना होगा। इस तरह कम से कम यह हमेशा खुद को अधिलेखित करता है। जब तक - फ़ाइल कुछ भी है कि यह निष्पादित करने के लिए और इसलिए मैं इसे सदिश पर विचार नहीं करते प्रयास करता है के द्वारा कभी नहीं पढ़ा है terminologyकी gstreamerबैकएंड गलती से एक वीडियो फ़ाइल में निष्पादन योग्य कोड चला सकते हैं ... हो सकता है कि। मुझे इसमें संदेह है, लेकिन मैं यह सुनिश्चित करने के लिए पर्याप्त नहीं हूं। वैसे भी, मैं इसे हमेशा उसी फ़ाइल पर लिखना पसंद करता हूं जब तक कि मैं अन्यथा नहीं कहूं, लेकिन अगर मैं इसे बेहतर बनाने के लिए चारों ओर पहुंचता हूं - जैसे आकार चुनना और ऐसे - मैं निश्चित रूप से इसे भी ठीक कर दूंगा।
मोकेसर

@Braiam - यह reworked - एक नज़र है। संभवतः एक समर्पित tmp dir / mktemp अगला है।
mikeserv

@ रमेश - फिर से देखो। यदि आपने अंतिम संस्करण का उपयोग किया है, तो यह बेहतर है।
mikeserv

1
@DmitriDB - मुद्दा है आपको वे पलायन मुद्रण नहीं कर रहे हैं कि terminologyसभी को एक - उन लोगों के लिए जा रहे हैं tmuxकी ptyवजह से tmuxउन हस्तक्षेप के मालिक पक्ष का मालिक ptyहै और terminologyके मालिक पक्ष का मालिक tmuxहै pty। संभाल करने के लिए आप की तरह कर सकते हैं कि ... PTTY=$(tty) tmux ...तो में tmuxतरह सत्र ... tybg >"$PTTY"। मैं वास्तव में सिर्फ उसी समस्या का जवाब देता हूं जो आप कल से यहां कर रहे हैं । उपरोक्त स्क्रिप्ट को उस तरह ytplay ... >"$PTTY"से एक मल्टीप्लेक्सर के भीतर काम करना चाहिए ।
मिकसेर्व

6

यूट्यूब पर इसके लिए ट्यूटोरियल है:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

उस वीडियो के अनुसार निम्नलिखित कार्य करना चाहिए:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")

आप इस उद्देश्य के लिए एक सरल कार्य बना सकते हैं:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}

यह वही है जो मुझे मेरी मशीन पर मिलता है: paste.ubuntu.com/8527219
Ionică Bizău

1
@ IonicăBizău कोशिश करें:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
मार्टिन वॉन

@MartinvonWittich यह काम कर रहा है, लेकिन यह ASCII वीडियो नहीं है, टर्मिनल में, बल्कि एक और खिड़की में ...: - /
Ionică Bizău

2
किसी को इसे एक कार्यक्रम में लपेटने की आवश्यकता है जो टर्मिनल में यूट्यूब वीडियो की खोज करने और उन्हें बैच डाउनलोड के लिए चिह्नित करने की अनुमति देता है। और फिर इसे एमपी 3 स्ट्रिप करने और mp4 को हटाने के लिए एक बार लपेटें। मैं इसे किसी बिंदु पर कर सकता हूं अगर कोई और नहीं करता है, लेकिन यह अगले कुछ दिनों में नहीं होगा।
मिल्ली स्मिथ

@ IonicăBizău mplayerस्वचालित रूप से सबसे अच्छा आउटपुट ड्राइवर चुनता है, और यदि आपके पास Xorg चल रहा है, तो यह संभवतः xvड्राइवर का चयन करेगा । mplayerकंसोल ASCII आर्ट ड्राइवर चुनने के लिए निम्न विकल्प जोड़ने का प्रयास करें -vo caca:।
मार्टिन वॉन विटिच

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.