用awk下載YouTube視頻

來源:互聯網
上載者:User

    上次用gawk搭配curl實現了下載優酷視頻

,相比較而言,YouTube
雖然影響要大於優酷
,但從程式的實做而言,YouTube要簡單的多。

    程式依然是讀取需要下載的列表檔案tube,格式應該是這樣:

     在Cygwin下運行看起來是這樣的:

      下面是代碼:

  1. #! /usr/local/bin/gawk -f
  2. ################################################################################
  3. #一個從youtube上下載flash視頻的程式
  4. #
  5. #Author: ChangHailong
  6. #E-mail: hailongchang@163.com
  7. #
  8. #Date: 2008/10/11
  9. ################################################################################
  10. BEGIN{
  11.     BINMODE = 3
  12. }
  13. {
  14.     filename = $2
  15.     vid = parse_url($1)
  16.     get_vid_info(vid,VID_INFO)
  17.     download_video(VID_INFO[
    "request"
    ],filename)
  18.     print 
    "/nthe "
     NR 
    " file has been downloaded/n"
  19. }
  20. ################################################################################
  21. #parse_url(url)用來從輸入的網址資訊中提取我們關心的資訊
  22. #url通常具有類似下面這樣的形式:http://www.youtube.com/watch?v=vkDAKke56n
  23. #這個函數就是能夠將視頻資訊vkDAKke56n網址中提取出來
  24. ################################################################################
  25. function parse_url(url)
  26. {
  27.     gsub(/http:///
    //,"",url)
  28.     gsub(/www/./,
    ""
    ,url)
  29.     gsub(/youtube/.com//watch/?v=/,
    ""
    ,url)
  30.     
  31.     
    if
    ((p = index(url,
    "&"
    )) > 0)
  32.     url = substr(url, 1, p-1)
  33.     
    return
     url
  34. }
  35. ################################################################################
  36. #
  37. ################################################################################
  38. function get_vid_info(vid, VID_INFO)
  39. {
  40.     InetFile = 
    "/inet/tcp/0/www.youtube.com/80"
  41.     Request = 
    "GET /watch?v="
     vid 
    " HTTP/1.1/r/n"
  42.     Request = Request 
    "Host: www.youtube.com/r/n/r/n"
  43.     print Request |& InetFile
  44.     
    while
    ((InetFile |& getline) >0)
  45.     {
  46.        
    if
     (match($0, /
    "video_id"

    "([^"
    ]+)
    ".+"
    t
    ": "
    ([^
    "]+)"
    /, info_matches)) 
  47.        {
  48.             VID_INFO[
    "request"
    ] = 
    "video_id="
     info_matches[1] 
    "&t="
     info_matches[2]
  49.             close(InetFile)
  50.             
    return
  51.        }
  52.        
    else
  53.        
    continue
  54.     }
  55.    close(InetFile)
  56.    
    return
  57. }
  58. ################################################################################
  59. function get_header_info(Inet,Request,HEADER_INFO)
  60. {
  61.     
    delete
     HEADER_INFO
  62.     OLD_RS=RS
  63.     print Request |& InetFile
  64.     
    if
     (Inet |& getline > 0) 
  65.     {
  66.         HEADER_INFO[
    "_status"
    ] = $2
  67.     }
  68.     
    else
     
  69.     {
  70.         print 
    "I can not redirect net address for you. Quitting!"
  71.         exit 1
  72.     }
  73.     RS=
    "/r/n"
  74.     
    while
     ((Inet |& getline) > 0) 
  75.     {
  76.         
    if
     (match($0, /([^:]+): (.+)/, matches)) 
  77.     {
  78.             HEADER_INFO[matches[1]] = matches[2]
  79.         }
  80.         
    else
     
  81.     { 
  82.         
    break
     
  83.     }
  84.     }
  85.     RS = OLD_RS
  86. }
  87. ################################################################################
  88. function download_video(req,filename)
  89. {
  90.     InetFile = 
    "/inet/tcp/0/www.youtube.com/80"
  91.     Request = 
    "GET /get_video?"
     req 
    " HTTP/1.1/r/n"
  92.     Request = Request 
    "Host: www.youtube.com/r/n/r/n"
  93. #    RS=OLD_RS
  94.     Loop = 0
  95.     
    do
  96.     {
  97.     get_header_info(InetFile,Request,HEADER_INFO)
  98.     
    if
     (
    "Location"
     in HEADER_INFO) 
  99.     { 
  100.         #close www.youtube.com
  101.             close(InetFile)
  102.             parse_location(HEADER_INFO[
    "Location"
    ], GOOGLE_VIDEO)
  103.             InetFile = GOOGLE_VIDEO[
    "InetFile"
    ]
  104.             Request  = 
    "GET "
     GOOGLE_VIDEO[
    "Request"

    " HTTP/1.1/r/n"
  105.             Request  = Request 
    "Host: "
     GOOGLE_VIDEO[
    "Host"

    "/r/n/r/n"
  106.             
    if
     (InetFile == 
    ""
  107.         {
  108.                 print 
    "I can not download flv for you, please check your vid"
  109.                 
    return
  110.             }       
  111.         }
  112.     Loop++
  113.     }
    while
     ((
    "Location"
     in HEADER_INFO) && Loop < 5)
  114.     filename=filename
    ".flv"
  115.     save_file(InetFile,filename,HEADER_INFO)
  116.     close(InetFile)
  117.     
    return
  118. }
  119. ################################################################################
  120. function parse_location(location, GOOGLE_VIDEO) {
  121.     
    if
     (match(location, /http:////([^//]+)(//.+)/, mat)) {
  122.         GOOGLE_VIDEO[
    "InetFile"
    ] = 
    "/inet/tcp/0/"
     mat[1] 
    "/80"
  123.         GOOGLE_VIDEO[
    "Host"
    ]     = mat[1]
  124.     GOOGLE_VIDEO[
    "Request"
    ]  = mat[2]
  125.     }
  126.     
    else
     {
  127.         GOOGLE_VIDEO[
    "InetFile"
    ] = 
    ""
  128.         GOOGLE_VIDEO[
    "Host"
    ]     = 
    ""
  129.         GOOGLE_VIDEO[
    "Request"
    ]  = 
    ""
  130.     }
  131. }
  132. ################################################################################
  133. function save_file(InetFile,filename,HEADER_INFO)
  134. {
  135.     OLD_RS  = RS
  136.     OLD_ORS = ORS
  137.     ORS = 
    ""
  138.     print 
    ""
     > filename
  139.     RS = 
    "@"
  140.     has_read = 0
  141.     printf(
    "The %d flv file has %10d bytes. I have downloaded:            bytes"
    ,NR,HEADER_INFO[
    "Content-Length"
    ]);
  142.     printf(
    " /b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b"
    );
  143.     
    while
     ((InetFile |& getline) > 0)
  144.     {
  145.     has_read += length($0 RT)
  146.     printf(
    "%10d/b/b/b/b/b/b/b/b/b/b"
    ,has_read)
  147.     print $0 RT >> filename
  148.     }
  149.     printf(
    "%10d/b/b/b/b/b/b/b/b/b/b"
    ,has_read)
  150.     RS  = OLD_RS
  151.     ORS = OLD_ORS
  152.     
    return
  153. }
  154. ################################################################################

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.