ดูวิดีโอ YouTube ในเทอร์มินัล


107

ฉันกำลังมองหาวิธีดูวิดีโอ YouTube ในเทอร์มินัล (ไม่ใช่ในเบราว์เซอร์หรือหน้าต่างอื่น แต่อยู่ที่นั่นในเซสชัน bash ใด ๆ )

มีวิธีง่าย ๆ ในการทำเช่นนี้?

ฉันจินตนาการถึงสิ่งนี้:

$ youtube <video-url>     

ฉันรู้วิธีเล่นวิดีโอโดยใช้mplayer:

$ mplayer -vo caca local-file.avi

อย่างไรก็ตามจะเป็นการเปิดหน้าต่างใหม่ มันจะเจ๋งที่จะเล่นในเทอร์มินัล

นอกจากนี้ควรเข้ากันได้กับtmuxเซสชัน


ฉันถามคำถามอีกวิธีที่จะป้องกันไม่ให้เปิดหน้าต่างใหม่


สำหรับผู้ที่สงสัยว่าฉันต้องเช่นการทำงานผมเริ่มโครงการทดลองชื่อTmuxOS - กับแนวคิดที่ว่าทุกอย่างควรจะทำงานภายในของ tmuxเซสชั่น

ดังนั้นแน่นอนฉันต้องการเครื่องเล่นวิดีโอสำหรับวิดีโอในพื้นที่และระยะไกล :-)


2
คุณหมายถึงอย่างนี้หรือไม่? google.com/…
โกลาหล

1
@chaos แน่นอน :-) ฉันกำลังมองหาสิ่งนี้เป็นเวลาหลายเดือน แต่ยังไม่พบ ตัดสินใจที่จะถามที่นี่ ...
IonicăBizău

VLC สามารถเล่นวิดีโอ Youtube ไม่แน่ใจว่ามันมีความสามารถในการส่งออกขั้ว

ด้วย MPV mpv <youtube url>ที่คุณสามารถทำได้ มันยังใช้งานได้กับเว็บไซต์วิดีโออื่น ๆ อีกมากมาย แต่นี่เป็นการเปิดหน้าต่างใหม่
Gerardo Marset

1
นี่เป็นคำถามที่น่าสนใจและฉันได้เรียนรู้มากมายจากคำตอบ แต่ด้วยความอยากรู้ - ทำไมคุณต้องทำสิ่งนี้บนโลก? ;-)
Digital Trauma

คำตอบ:


132

คุณสามารถดาวน์โหลดวิดีโอและ / หรือเพียงแค่เสียงแล้วดู / youtube-dlฟังพวกเขาใช้ สคริปต์เขียนด้วย Python และใช้ประโยชน์จาก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

ฉันพบบทความบล็อกนี้ในหัวข้อ: บน ascii, youtube และปล่อยให้ไปซึ่งแสดงให้เห็นถึงวิธีการที่ฉันกล่าวถึงในห้องสนทนาส่วนใหญ่ใช้youtube-dlเป็น "แบ็กเอนด์" ซึ่งสามารถทำการดาวน์โหลดสตรีม YouTube แล้วเปลี่ยนเส้นทางไปยังแอปอื่น ๆ

บทความนี้แสดงให้เห็นว่ามันทำกับ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ใน O'Reilly ฝึกหัดหัวข้อ: ดูวิดีโอในศิลปะ ASCII

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

ผลลัพธ์ด้านบนเป็นxtermหน้าต่างที่เปิดขึ้นเมื่อวิดีโอเล่น

   ss # 3

ดังนั้นฉันจึงคิดว่าทำไมไม่ใส่เนยถั่วและช็อกโกแลตด้วยกันแบบนี้:

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

เกือบจะใช้งานได้! ฉันไม่แน่ใจว่าทำไมวิดีโอไม่สามารถเล่นในหน้าต่าง แต่ดูเหมือนว่ามันควรจะสามารถ หน้าต่างปรากฏขึ้นและเริ่มเล่น แต่ก็ปิด ฉันดูวิดีโอสักครู่แล้วก็ไม่ทำอะไรเลย

บางทีสิ่งที่กล่าวมาข้างต้นจะนำคุณเข้าใกล้ทางออกสุดท้ายของคุณหรืออาจต้องปรับแต่งตัวเลือกเล็กน้อย

ห้องสมุดเพิ่มเติม

หากคุณlibcacaติดตั้ง (เวอร์ชัน colorized aalib) และคุณลดขนาดตัวอักษรของคุณgnome-terminalเป็นขนาดเล็กมากเช่นพูด 3 คำสั่งต่อไปนี้จะแสดงวิดีโอ ASCII ที่ดูดีขึ้นภายในเทอร์มินัลโดยตรง:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 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-terminalterminology


2
คุณสามารถเล่นในterminology- และไม่เพียง แต่มี libs caca คุณสามารถใช้เทอร์มินัล Escape เพื่อระบุส่วนที่แมปของหน้าต่าง terninal และเล่นในส่วนนั้นได้ในระดับสูง คุณสามารถตั้งค่าวิดีโอให้เป็นพื้นหลังและแก้ไขได้ terminologyเข้าใจ URIs ด้วยเช่นกันรับ webm link ไปยังวิดีโอ youtube ของคุณและprintfไปที่หน้าจอเหมือนเทอร์มินัลพรอมต์
mikeserv

@mikeserv - เยี่ยมยอดไม่เคยได้ยินเทอร์มินัลอีมูเลเตอร์นั้น ฉันลองแล้วมันยอดเยี่ยมที่คุณสามารถเล่นวิดีโอในพื้นหลังtybg my.aviได้
slm

ใช่ - ฉันชอบprintfวิธีการมากกว่า สิ่งที่ต้องทำtybg somefile | sed -n lเพื่อดูว่ามันทำงานอย่างไร - เพียงแค่ใช้เทอร์มินัลส่วนขยาย พวกเขากำลังบันทึกไว้ในmanหน้า ty{ls,cat}คุณสามารถทำเช่นเดียวกันกับ แต่แอพเล็ก ๆ เหล่านี้เป็นเพียงแค่ตัวห่อสาธิตเก่าของจริงและอาจไม่สามารถใช้งานได้ อย่างไรก็ตามหากเวอร์ชันของคุณถูกสร้างขึ้นในสองสามเดือนที่ผ่านมาคุณอาจชอบ miniview มากเท่ากับที่ฉันทำ - ทำ ctrl + shift + h การรู้แจ้งทั้งหมดนั้นดีมาก - เป็นเหตุผลที่ฉันแนะนำให้คุณลองใช้งานเมื่อเร็ว ๆ นี้ นอกจากนี้ยังบ้าเร็ว
mikeserv

3
อะไรคือ ASCII เพิ่มเติมที่กล่าวถึง libs?
PythonNut

1
@slm แย่มากฉันเดาว่าบิลเดอร์มัลติมีเดียจะเปิดใช้งานแล้ว สงสัยว่าทำไมคนอื่นไม่คิดว่าพวกเขาอาจพิจารณาเรื่องตลกและการขยายตัวของ libcaca
Derobert

14

ดังนั้นด้วยTerminology (อาจเป็นสิ่งที่ดีที่สุดที่เคยเกิดขึ้นกับเทอร์มินัลอีมูเลเตอร์ตามวิธี) ในขณะที่เขียนผลงานต่อไปนี้:

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()- The printf \033}...บรรทัด terminologyยอมรับการขยายเทอร์มินัล escapes สำหรับสื่อสิ่งพิมพ์ไปที่หน้าจอ - เช่นสีแจ้งเตือน แต่ยังรวมถึงวิดีโอความละเอียดสูงและโดยทั่วไปไม่ว่าคุณต้องการอะไร

ส่วนที่เหลือเป็น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 มากขึ้นเรื่อย ๆ ที่ฉันได้รับจาก webms ด้วย ดังนั้นฉันจึงแก้ไขมันสำหรับโฟลว์และกำหนดนามสกุลไฟล์ตามประเภท mime
    • จนถึงตอนนี้ - ไม่ว่าจะเป็น webm หรือ mp4 - สตรีมสำรองแรกคือคุณภาพสูงสุดที่เสนอต่อวิดีโอ - ปกติคือ 720p .mp4 - ซึ่งเป็นสิ่งที่ฉันกำลังมองหาอยู่แล้วดังนั้นจึงไม่มีเหตุผลที่จะเลือกผู้อื่น การแก้ไขล่าสุดของฉันได้เพิ่มการทดสอบแบบแยกส่วน / ชัดเจนเพื่อให้เป็นไปได้ ดูสิ่งนี้สำหรับสคริปต์ Perl ที่ฉันอ้างอิงเมื่อเริ่มต้นเขียนฟังก์ชัน
  4. แยกวิเคราะห์การ%[[:hexdigit:]]\{2\}เข้ารหัสเป็นลิงค์การทำงาน
    • ดูสิ่งนี้สำหรับการอ้างอิงการทำงานของฉัน
  5. พยายามดาวน์โหลดไฟล์สูงสุด 5 ครั้งด้วยแบ็คออฟ
    • โดยค่าเริ่มต้นไฟล์คือ/tmp/vid.${mime-type}แต่ถ้าytplayเรียกว่ามีอาร์กิวเมนต์ที่สองมันจะตีความว่าเป็นชื่อไฟล์ดาวน์โหลดเป้าหมาย - ในขณะที่ยังคงผนวกนามสกุลตามประเภท mime
  6. ถ้าเป้าหมายของการดาวน์โหลดที่มีขนาดมากกว่าศูนย์ใด ๆ ต่อไปของการพยายามของมันช่วยให้การดาวน์โหลดเพื่อดำเนินการต่อในพื้นหลังและภาพพิมพ์terminologyของสื่อสถานที่ในพื้นหลังขณะนี้สถานีหนีอื่นก็แค่ให้ขึ้นและใบคุณมีข้อผิดพลาดทั้งหมด ในหมวก
    • \033}bt[LINK/FILE]\0สำหรับการเล่นแบบเต็มหน้าต่าง pnจะเปิดมันออกไปที่หน้าต่างใหม่ มีผู้อื่นสำหรับ จำกัด พื้นที่เล่น - เรขาคณิตเช่นเฉพาะบางส่วนของหน้าต่างเช่น

สิ่งนี้ผ่านการทดสอบน้อยมากเพียงเล็กน้อยแต่ได้ทำงานมาแล้วสำหรับทุกลิงก์โดยไม่มีข้อผิดพลาด แต่อย่างใดอย่างหนึ่ง - และเพราะฉันไม่สนใจที่จะดูสิ่งที่ไม่ได้เล่นฉันไม่ได้พยายามค้นหา ทำไม.

ในขณะที่มันใช้งานได้สำหรับทุกคนมันไม่จำเป็นต้องเล่นกัน - และนี่เป็นเพราะในตอนแรกฉันต่อท้าย.mp4ส่วนขยายไปยังไฟล์เป้าหมายโดยไม่ตรวจสอบว่าถูกต้องหรือไม่ เป็นไปได้ว่าคนที่ฉันไม่เคยดูมาก่อนเป็นเช่นนี้เช่นกัน ไม่ว่าในกรณีใดฉันจะเปลี่ยนมันเพื่อจัดการมัน

ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้terminologyบิตที่ระบุเฉพาะนั้นอยู่ในฟังก์ชั่นสุดท้ายplay()- และคุณสามารถปรับเปลี่ยนได้อย่างง่ายดายเพื่อทำทุกสิ่งที่คุณต้องการด้วยไฟล์วิดีโอที่ดาวน์โหลด / ดาวน์โหลดเช่นใช้กับmplayerCACA libs ในเทอร์มินัลอื่น มิฉะนั้นจะปรากฏขึ้นที่vlcหน้าต่างหรืออะไรก็ตาม แต่ถ้าคุณชอบตัวคุณเองคุณจะดูมันในแบบไฮ - terminologyเด

โอ้และสุดท้ายสิ่งนี้เร็วมาก - ความเร็วของฉันเพิ่มแบนด์วิดท์สูงสุดในช่วงเวลาที่ผ่านมาทุกครั้ง แต่terminologyไม่ต้องการไฟล์ทั้งหมดเพื่อเริ่มเล่น

นี่มันใช้งานได้:

หินคำศัพท์


1
แทนที่จะเป็น/tmp/vid.mp4บางทีคุณควรใช้mktemp --suffix=.mp4ใช่ไหม
Braiam

@Braiam - มันเป็นความคิดที่ดีมาก แต่ถ้าอย่างนั้นฉันอาจจะต้องเพิ่มตรรกะในการทำความสะอาด ด้วยวิธีนี้อย่างน้อยมันก็จะเขียนทับตัวเองเสมอ แฟ้มดังกล่าวจะไม่เคยอ่านอะไรที่พยายามที่จะดำเนินการได้และดังนั้นผมจึงไม่คิดว่ามันเป็นเวกเตอร์ - ถ้าterminology's gstreamerแบ็กเอนด์ตั้งใจสามารถเรียกใช้รหัสปฏิบัติการในไฟล์วิดีโอ ... บางที ฉันสงสัยมัน แต่ฉันก็ไม่พอที่จะพูดอย่างแน่นอน อย่างไรก็ตามฉันชอบที่จะเขียนทับไฟล์เดียวกันทุกครั้งเว้นแต่ฉันจะพูดเป็นอย่างอื่น แต่ถ้าฉันได้ทำให้ดีขึ้น - เช่นการเลือกขนาดและเช่นนั้น - ฉันจะแก้ไขด้วยเช่นกัน
mikeserv

@Braiam - ทำใหม่ - ดูสิ อาจเป็นเฉพาะ tmp dir / mktemp ถัดไป
mikeserv

@Ramesh - ดูอีกครั้ง หากคุณใช้รุ่นสุดท้ายจะดีกว่า
mikeserv

1
@DmitriDB - ปัญหาคือว่าคุณไม่ได้พิมพ์หนีเหล่านั้นไปterminologyเลย - ผู้ที่กำลังจะtmuxเป็นptyเพราะtmuxเป็นเจ้าของด้านหลักของผู้ที่แทรกแซงptyและterminologyเป็นเจ้าของด้านต้นแบบของ'stmux ptyเพื่อจัดการกับที่คุณสามารถทำเช่นเดียวกับ ... PTTY=$(tty) tmux ...จากนั้นในtmuxเซสชั่นที่ต้องการ tybg >"$PTTY"... ที่จริงฉันเพิ่งตอบปัญหาเดียวกับที่คุณอยู่ที่นี่เมื่อวานนี้เท่านั้น สคริปต์ด้านบนควรใช้งานได้เหมือนกันytplay ... >"$PTTY"ในมัลติเพล็กเซอร์ในวิธีนั้น
mikeserv

6

มีบทช่วยสอนสำหรับสิ่งนี้ใน youtube:

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")
Martin von Wittich

@MartinvonWittich ใช้งานได้ แต่ไม่ใช่วิดีโอ ASCII ในเทอร์มินัล แต่ในหน้าต่างอื่น ... : - /
IonicăBizău

2
มีคนต้องการปิดสิ่งนี้ในโปรแกรมที่อนุญาตให้ค้นหาวิดีโอ youtube ในเครื่องเทอร์มินัลและทำเครื่องหมายสำหรับการดาวน์โหลดแบบกลุ่ม จากนั้นหุ้มอีกครั้งเพื่อดึง mp3 และลบ mp4 ฉันอาจจะทำมันในบางจุดถ้าไม่มีใครทำ แต่มันจะไม่เกิดขึ้นในอีกไม่กี่วันข้างหน้า
มิลลี่สมิ ธ

@ IonicăBizău mplayerเลือกไดรเวอร์เอาท์พุทที่ดีที่สุดโดยอัตโนมัติและหากคุณมี Xorg ที่ทำงานอยู่ก็อาจจะเลือกxvไดร์เวอร์ ลองเพิ่มตัวเลือกต่อไปนี้เพื่อmplayerที่จะเลือกคนขับคอนโซล ASCII -vo cacaศิลปะ:
Martin von Wittich

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.