youtube.lua
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. --[[
  2.  $Id$
  3.  Copyright © 2007-2009 the VideoLAN team
  4.  This program is free software; you can redistribute it and/or modify
  5.  it under the terms of the GNU General Public License as published by
  6.  the Free Software Foundation; either version 2 of the License, or
  7.  (at your option) any later version.
  8.  This program is distributed in the hope that it will be useful,
  9.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.  GNU General Public License for more details.
  12.  You should have received a copy of the GNU General Public License
  13.  along with this program; if not, write to the Free Software
  14.  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  15. --]]
  16. -- Helper function to get a parameter's value in a URL
  17. function get_url_param( url, name )
  18.     local _, _, res = string.find( url, "[&?]"..name.."=([^&]*)" )
  19.     return res
  20. end
  21. function get_arturl( path, video_id )
  22.     if string.match( vlc.path, "iurl=" ) then
  23.         return vlc.strings( get_url_param( vlc.path, "iurl" ) )
  24.     end
  25.     if not arturl then
  26.         return "http://img.youtube.com/vi/"..video_id.."/default.jpg"
  27.     end
  28. end
  29. -- Probe function.
  30. function probe()
  31.     if vlc.access ~= "http" then
  32.         return false
  33.     end
  34.     youtube_site = string.match( string.sub( vlc.path, 1, 8 ), "youtube" )
  35.     if not youtube_site then
  36.         -- FIXME we should be using a builtin list of known youtube websites
  37.         -- like "fr.youtube.com", "uk.youtube.com" etc..
  38.         youtube_site = string.find( vlc.path, ".youtube.com" )
  39.         if youtube_site == nil then
  40.             return false
  41.         end
  42.     end
  43.     return (  string.match( vlc.path, "watch%?v=" ) -- the html page
  44.             or string.match( vlc.path, "watch_fullscreen%?video_id=" ) -- the fullscreen page
  45.             or string.match( vlc.path, "p.swf" ) -- the (old?) player url
  46.             or string.match( vlc.path, "jp.swf" ) -- the (new?) player url (as of 24/08/2007)
  47.             or string.match( vlc.path, "player2.swf" ) ) -- another player url
  48. end
  49. -- Parse function.
  50. function parse()
  51.     if string.match( vlc.path, "watch%?v=" )
  52.     then -- This is the HTML page's URL
  53.         while true do
  54.             -- Try to find the video's title
  55.             line = vlc.readline()
  56.             if not line then break end
  57.             if string.match( line, "<meta name="title"" ) then
  58.                 _,_,name = string.find( line, "content="(.-)"" )
  59.             end
  60.             if string.match( line, "<meta name="description"" ) then
  61.                -- Don't ask me why they double encode ...
  62.                 _,_,description = vlc.strings.resolve_xml_special_chars(vlc.strings.resolve_xml_special_chars(string.find( line, "content="(.-)"" )))
  63.             end
  64.             if string.match( line, "subscribe_to_user=" ) then
  65.                 _,_,artist = string.find( line, "subscribe_to_user=([^&]*)" )
  66.             end
  67.             -- OLD: var swfArgs = {hl:'en',BASE_YT_URL:'http://youtube.com/',video_id:'XPJ7d8dq0t8',l:'292',t:'OEgsToPDskLFdOYrrlDm3FQPoQBYaCP1',sk:'0gnr-AE6QZJEZmCMd3lq_AC'};
  68.             -- NEW: var swfArgs = { "BASE_YT_URL": "http://youtube.com", "video_id": "OHVvVmUNBFc", "l": 88, "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA", "tk": "mEL4E7PqHeaZp5OG19NQThHt9mXJU4PbRTOw6lz9osHi4Hixp7RE1w=="};
  69.             -- NEWER: 'SWF_ARGS': { [a lot of stuff...], "video_id": "OHVvVmUNBFc", "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA"};
  70.             if ( string.match( line, "SWF_ARGS" ) or string.match( line, "swfArgs" ) ) and string.match( line, "video_id" ) then
  71.                 if string.match( line, "BASE_YT_URL" ) then
  72.                     _,_,base_yt_url = string.find( line, ""BASE_YT_URL": "(.-)"" )
  73.                 end
  74.                 _,_,t = string.find( line, ""t": "(.-)"" )
  75.                 -- vlc.msg.err( t )
  76.                 -- video_id = string.gsub( line, ".*&video_id:'([^']*)'.*", "%1" )
  77.             end
  78.             if name and description and artist --[[and video_id]] then break end
  79.         end
  80.         if not video_id then
  81.             video_id = get_url_param( vlc.path, "v" )
  82.         end
  83.         if not base_yt_url then
  84.             base_yt_url = "http://youtube.com/"
  85.         end
  86.         arturl = get_arturl( vlc.path, video_id )
  87.         -- fmt is the format of the video: 18 is HQ (mp4)
  88.         fmt = get_url_param( vlc.path, "fmt" )
  89.         if fmt then
  90.             format = "&fmt=" .. fmt
  91.         else
  92.             format = ""
  93.         end
  94.         if t then
  95.             return { { path = base_yt_url .. "get_video?video_id="..video_id.."&t="..t..format; name = name; description = description; artist = artist; arturl = arturl } }
  96.         else
  97.             -- This shouldn't happen ... but keep it as a backup.
  98.             return { { path = "http://www.youtube.com/v/"..video_id; name = name; description = description; artist = artist; arturl = arturl } }
  99.         end
  100.     else -- This is the flash player's URL
  101.         if string.match( vlc.path, "title=" ) then
  102.             name = get_url_param( vlc.path, "title" )
  103.         end
  104.         video_id = get_url_param( vlc.path, "video_id" )
  105.         arturl = get_arturl( vlc.path, video_id )
  106.         fmt = get_url_param( vlc.path, "fmt" )
  107.         if fmt then
  108.             format = "&fmt=" .. fmt
  109.         else
  110.             format = ""
  111.         end
  112.         if not string.match( vlc.path, "t=" ) then
  113.             -- This sucks, we're missing "t" which is now mandatory. Let's
  114.             -- try using another url
  115.             return { { path = "http://www.youtube.com/v/"..video_id; name = name; arturl = arturl } }
  116.         end
  117.         return { { path = "http://www.youtube.com/get_video.php?video_id="..video_id.."&t="..get_url_param( vlc.path, "t" )..format; name = name; arturl = arturl } }
  118.     end
  119. end