2013年1月26日 星期六

Youtube-dl

Short Links:
youtube-dl 環境建構

Youtube-dl 官網: http://rg3.github.com/youtube-dl/

Youtube-dl Example
Youtube-dl
上面這張圖我可是特別開了個新使用者,還把電腦名稱改掉才擷出這張圖。


Mac OS X 10.8.2 的使用者,可以不用去額外安裝 Python。因為它已經內建在系統裡了。之前或之後的版本我不確定,因為我現在正在用的就是 Mac OS X 10.8.2。




關於 youtube-dl 的部分其實很簡單。尤其是對 Mac 來說,因為它不用去安裝 Python。

以目前(Jan. 16th, 2013)的網頁來說,就是把 Full source + docs + binary tarball 那個檔案抓下來解壓縮就是了。裡面會有一個無附檔名的檔案叫做 youtube-dl,那就是主程式。

Mac 終端機指令

在講 youtube-dl 的指令前要先講講終端機的指令。因為下載影片儲存的位置要靠命令碼切換到要儲存的目標位置。 Windows 我不確定可不可以這麼做,不過在 Mac 的終端機是可以直接把檔案/資料夾拖到終端機的視窗裡面,終端機這個程式就會自動幫你把路徑給填上去。所以省掉了不少麻煩。

注意:以下範例中,在「$」及一個空格之後才是命令開頭。而需要空白的地方就是顏色分開的地方。

$ cd ~
$ cd /Users/UserName
$ cd ~/Downloads/Youtube\ Download
$ cd /Users/UserName/Downloads/Youtube\ Download


「~」這個波浪符號就代表了使用者的根目錄,也就是「/Users/UserName」。而「cd」是切換目錄/資料夾的指令,所以上面的第一個跟第二個所代表的意思是一樣的。

再來第三跟第四個例子執行結果是一樣的。我要講的是「資料夾名稱中有空白該怎麼辦?」答案就是像上面那樣的用「\」再加上一個「空白」。不過資料夾或檔案的路徑直接用拖的就好,不需要自行輸入。


youtube-dl 基本指令

假設下載 youtube-dl 主程式時是跟我一樣是直接到存到「下載項目(Downloads)」。之後也是直接解壓縮。這樣程式的位置應該就會是像後面這樣:$ ~/Downloads/youtube-dl/youtube-dl而整個指令是先放 youtube-dl 檔案的路徑,一個空格後用雙引號將要下載的網址包起來。如同下面這樣:$ ~/Downloads/youtube-dl/youtube-dl "https://www.youtube.com/watch?v=9sfOCCrR7vQ"
上面這個例子就會按照程式的預設值去下載這個檔案,也就是抓畫質最好,並以影片 ID 做為檔案名稱。

總結來說,執行步驟是開啟終端機後切換到下載要儲存的目錄下(如範例的 Youtube Download)。再來把 youtube-dl 的檔案拖進視窗讓終端機自己幫你把位置加進去。接著加上一個空格,再來把影片網址複製貼上。完成後就可以按 enter 開始下載了。真的好簡單 orz。程式碼如下:
$ cd ~/Downloads/Youtube\ Download
$ ~/Downloads/youtube-dl/youtube-dl "https://www.youtube.com/watch?v=9sfOCCrR7vQ"


如果要切換到的資料夾不存在,這樣當然會無法切換。你可以用 mkdir 這指令來建立資料夾,或者像個正常人的直接開啟 Finder 切到那邊去建立新資料夾。


youtube-dl 指令參數

接下來的參數設定才是重點。

會把這東西叫做「神器」的原因當然不是因為它可以抓單一檔案。它真正強悍的地方是他可以直接抓整個播放清單。你只要給他播放清單的網址,它就自動幫你抓好好。更甚者,丟給它使用者的賬號連結,它可以直接抓使用者所有上傳並公開的影片

以我在用的指令為例:$ ~/Downloads/youtube-dl/youtube-dl -c -i -o "%(autonumber)s %(upload_date)s %(title)s.%(ext)s" -f 18 "http://www.youtube.com/playlist?list=PL2604E51364FE19EA"
各項參數解釋如下:
程式路徑:~/Downloads/youtube-dl/youtube-dl
啓用續傳:-c
忽略錯誤:-i
自定檔名:-o "%(title)s.%(ext)s"
影片格式:-f 18
目標網址:"URL"

對於播放清單中有缺項的,就必須要用「忽略錯誤(-i)」這項指令。而影片格式「-f 18」所代表的是 Youtube 預設畫質中的 360p MP4 這個規格,使用這個參數會讓程式自動抓這個規格的影片。不過如果來源影片沒有這項規格,程式會自動跳過(或許是因為我有加忽略錯誤)。關於 Youtube 的影片格式編號可以由 youtube-dl 的 Documentation 下方的 Youtube formats 解釋連到 Wikipedia 去看。


後來補充的(Mar. 4th, 2016):
下載 YouTube 1080P DASH 影片

發現可以用 -F 指令列出所有 YouTube 支援的格式後,我原本要用 m4v 跟 m4a 各自分開抓完後再手動用 ffmpeg 合併這方法弄出 1080P 的網路連續劇存至電腦觀看。但是尋找資料途中發現《使用 youtube-dl 備份 YouTube 影片,解決 1080p 高畫質影片無法下載問題》中提到的 137+140 這法子。

$ youtube-dl -c -i -f 137+140 "https://www.youtube.com/playlist?list=PLwt5Muke_LXT_YjH_1gksPlMwO96IHa7P"

但在超短的正文(就是上面那一行啊!)開始之前,要先努力整理環境。不然會遇到下面看似「警告」實為「錯誤」的訊息。

WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats won't be merged.
WARNING: jrxDADOUj3c: writing DASH m4a. Only some players support this container. Install ffmpeg or avconv to fix this automatically.

在搞這個的同時,我正在奮力於下載 OS X El Capitan 安裝檔的大業路上邁進。我當時真的沒想到安裝到外接硬碟上的 El Capitan 也能毀掉本機的作業系統。

為了讓 youtube-dl 能夠順利的吃到 ffmpeg,我搜了好多篇文章,但都不是在講 Mac 的。後來發現《How to Download YouTube Videos in Terminal on a Mac》裡面有提到。
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl

Then make youtube-dl executable:
sudo chmod a+x /usr/local/bin/youtube-dl

看起來就是在跟我說把東西丟到 /usr/local/bin 下面去就可以直接在 Terminal 裡面執行了!(而且也可以按 tab 自動完成喔!)
OS X 10.10.3 (Yosemite):
OS X 10.11.2 (El Capitan):

當時沒注意看不知道為何,但在 El Capitan 下需要自行在 local 資料夾下創建 bin 這個資料夾。但放在同位置於 Yosemite 會失效。

這樣下載完 YouTube 1080p 影片及音訊後,自動合併需要用到的 ffmpeg 主程式是需要被放到 bin 下 youtube-dl 才能夠正確執行。

下面這個是舊版就支援,但是我現在才會用的 -F 指令(大小寫 F 有差!)。

$ youtube-dl -c -i -F "https://www.youtube.com/playlist?list=PLwt5Muke_LXT_YjH_1gksPlMwO96IHa7P"

會列出連結所指的影片或播放清單中各個影片支援的格式。
youtube-dl command "-F"


youtube-dl 自定檔案名稱

自定檔名可以看官網的 Output template 裡面有範例以及參數舉例。

前面都沒提到,不過簡單點的話可以用 -t 這個指令直接把影片標題當做檔案名稱。

我目前下載的對象都是英文語系的影片,所以一些關於亂碼問題我還沒遇到。那部分我就沒經驗了。

我常用的是下面這幾個
影片標題
附檔名 %(ext)s
自動遞增數字 %(autonumber)s
上傳日期(YYYYMMDD) %(upload_date)s
上傳日期那像純粹是因為我看的一些歐洲劇,他們日期的排列是「日、月、年」或「月、日、年」。會造成在 Finder /檔案總管排列順序錯誤。這種問題可以靠自動遞增數字解決。

正常來說我在用的時候是用 %(title)s 與 %(ext)s,對於 %(autonumber)s 與 %(upload_date)s 則是視情況而定。


README.md

下面這個按鈕裡的內容其實在下載回來的文件裡也有。就是那個 README.md 檔。




附註

要不是要把那個選項裡的命令粗體化,我可不會一個一個看過去。像它還有限制下載速度、播放清單起始與終止項目,我也根本不知道 youtube-dl 也可以一起下載字幕,還能夠選目標字幕語言!

如果因為下載太多, Youtube 可能會把你擋掉。這時候 youtube-dl 會回傳 error 402。這時候就是開啓 youtube 手動輸入 CAPTCHA 後再繼續下載。所以一開始下載的時候要記得加 -c 這個命令。

還有一點是 youtube 連結網址如果有「&」的話會導致下載失敗,前後用雙引號包起來就可以解決這個問題。


資料來源:
#1GyiWnbJ (Google) [ptt.cc] Re: [詢問] 關於Youtube一次全部下載
http://www.hoyo.idv.tw/wordpress/?p=954

1 則留言:

  1. 我在隱藏版那邊調了超久的排版,結果貼到這邊出現問題。我一氣之下就把全部排版刪掉了。

    文章部分是老早就打好了。只是因為排版問題一直沒發出來。結果竟然是這樣 orz。

    其實隱藏版的部分,排版並沒有真的解決掉啊。在 chrome 會有空格被吃掉的問題。害我用 margin-right 硬是讓他空一格出來。不過 display:table; 這點, Chrome 跟 Firefox 的執行結果倒是一樣的。

    回覆刪除