Allow user to choose fmt= string in Youtube.lua

For questions and discussion that is NOT (I repeat NOT) specific to a certain Operating System.
Alfds029
New Cone
New Cone
Posts: 3
Joined: 27 Mar 2011 21:22

Allow user to choose fmt= string in Youtube.lua

Postby Alfds029 » 27 Mar 2011 21:26

When I play Youtube videos, I am sometimes forced to download the 1080p. My connection and cpu does not allow this. Is there a way to allow the user to choose 240 or 360 resolution? I think the Vimeo lua allows this.
The closest I've come is:

Code: Select all

for itag,url in string.gmatch( fmt_url_map, "(%d+)|([^,]+)" ) do -- Apparently formats are listed in quality order, -- so we can afford to simply take the first one
within the youtube.lua

I can't afford to take the first one, so I guess I need to take the third or fourth one if available. Seeking assistance from someone who has worked on the youtube protocol.

TIA

Alfds029
New Cone
New Cone
Posts: 3
Joined: 27 Mar 2011 21:22

Re: Allow user to choose fmt= string in Youtube.lua

Postby Alfds029 » 27 Mar 2011 21:45

Nevermind. I figured it out. For those who are interested, just add

Code: Select all

&fmt=18
to the end of the url of an HD video and paste into VLC.

So

Code: Select all

http://www.youtube.com/watch?v=lBgsQiQtEFU
becomes

Code: Select all

http://www.youtube.com/watch?v=lBgsQiQtEFU&fmt=18
Works very nicely.

Also, &fmt=18, &fmt=34 and &fmt=35 work too.

And a thank you to all VLC people who put out a great open source media player.*

*<cough> <cough> <cough> Except for HD mkvs which Media Player Classic - Home Theater does without maxing out your CPU. <cough> <cough> <cough>

Rémi Denis-Courmont
Developer
Developer
Posts: 15324
Joined: 07 Jun 2004 16:01
VLC version: master
Operating System: Linux
Contact:

Re: Allow user to choose fmt= string in Youtube.lua

Postby Rémi Denis-Courmont » 27 Mar 2011 22:21

HD maxes out many CPUs if you don't turn hardware acceleration on, or if your GPU is not compatible with VLC.
Rémi Denis-Courmont
https://www.remlab.net/
Private messages soliciting support will be systematically discarded

Alfds029
New Cone
New Cone
Posts: 3
Joined: 27 Mar 2011 21:22

Re: Allow user to choose fmt= string in Youtube.lua

Postby Alfds029 » 28 Mar 2011 05:07

Apparently, constantly adding &fmt=18 gets old pretty quick: here is a Youtube.lua that defaults to 360p resolution:
save as Youtube.lua and replace the existing file in your C:\Program Files\VideoLAN\VLC\lua\playlist folder.

Code: Select all

-- fmt is the format of the video: 18 is HQ (mp4) fmt = get_url_param( vlc.path, "fmt" )
Becomes:

Code: Select all

-- fmt is the format of the video: 18 is HQ (mp4) fmt = 18

Code: Select all

--[[ $Id$ Copyright © 2007-2009 the VideoLAN team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. --]] -- Helper function to get a parameter's value in a URL function get_url_param( url, name ) local _, _, res = string.find( url, "[&?]"..name.."=([^&]*)" ) return res end function get_arturl( path, video_id ) if string.match( vlc.path, "iurl=" ) then return vlc.strings( get_url_param( vlc.path, "iurl" ) ) end if not arturl then return "http://img.youtube.com/vi/"..video_id.."/default.jpg" end end -- Probe function. function probe() if vlc.access ~= "http" then return false end options = {":demux=avformat,ffmpeg"} youtube_site = string.match( string.sub( vlc.path, 1, 8 ), "youtube" ) if not youtube_site then -- FIXME we should be using a builtin list of known youtube websites -- like "fr.youtube.com", "uk.youtube.com" etc.. youtube_site = string.find( vlc.path, ".youtube.com" ) if youtube_site == nil then return false end end return ( string.match( vlc.path, "watch%?v=" ) -- the html page or string.match( vlc.path, "watch_fullscreen%?video_id=" ) -- the fullscreen page or string.match( vlc.path, "p.swf" ) -- the (old?) player url or string.match( vlc.path, "jp.swf" ) -- the (new?) player url (as of 24/08/2007) or string.match( vlc.path, "player2.swf" ) ) -- another player url end -- Parse function. function parse() if string.match( vlc.path, "watch%?v=" ) then -- This is the HTML page's URL -- fmt is the format of the video: 18 is HQ (mp4) fmt = 18 while true do -- Try to find the video's title line = vlc.readline() if not line then break end if string.match( line, "<meta name=\"title\"" ) then _,_,name = string.find( line, "content=\"(.-)\"" ) name = vlc.strings.resolve_xml_special_chars( name ) name = vlc.strings.resolve_xml_special_chars( name ) end if string.match( line, "<meta name=\"description\"" ) then -- Don't ask me why they double encode ... _,_,description = vlc.strings.resolve_xml_special_chars(vlc.strings.resolve_xml_special_chars(string.find( line, "content=\"(.-)\"" ))) end if string.match( line, "subscribe_to_user=" ) then _,_,artist = string.find( line, "subscribe_to_user=([^&]*)" ) end -- CURRENT: var swfConfig = { [a lot of stuff...], "video_id": "OHVvVmUNBFc", "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA"}; -- OLD 1: var swfArgs = {hl:'en',BASE_YT_URL:'http://youtube.com/',video_id:'XPJ7d8dq0t8',l:'292',t:'OEgsToPDskLFdOYrrlDm3FQPoQBYaCP1',sk:'0gnr-AE6QZJEZmCMd3lq_AC'}; -- OLD 2: var swfArgs = { "BASE_YT_URL": "http://youtube.com", "video_id": "OHVvVmUNBFc", "l": 88, "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA", "tk": "mEL4E7PqHeaZp5OG19NQThHt9mXJU4PbRTOw6lz9osHi4Hixp7RE1w=="}; -- OLD 3: 'SWF_ARGS': { [a lot of stuff...], "video_id": "OHVvVmUNBFc", "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA"}; if ( string.match( line, "swfConfig" ) or string.match( line, "SWF_ARGS" ) or string.match( line, "swfArgs" ) ) and string.match( line, "video_id" ) then if string.match( line, "BASE_YT_URL" ) then _,_,base_yt_url = string.find( line, "\"BASE_YT_URL\": \"(.-)\"" ) end _,_,t = string.find( line, "\"t\": \"(.-)\"" ) -- vlc.msg.err( t ) -- video_id = string.gsub( line, ".*&video_id:'([^']*)'.*", "%1" ) fmt_url_map = string.match( line, "\"fmt_url_map\": \"(.-)\"" ) if fmt_url_map then for itag,url in string.gmatch( fmt_url_map, "(%d+)|([^,]+)" ) do -- Apparently formats are listed in quality order, -- so we can afford to simply take the first one if not fmt or tonumber( itag ) == tonumber( fmt ) then -- do unescaping of / url = string.gsub( url, '\\/','/' ) -- do convert of unicode 0026 to ampersand url = string.gsub( url, '\\u0026','&' ) path = url break end end end -- Also available on non-HTML5 pages: var swfHTML = (isIE) ? "<object [...]><param name=\"flashvars\" value=\"rv.2.thumbnailUrl=http%3A%2F%2Fi4.ytimg.com%2Fvi%2F3MLp7YNTznE%2Fdefault.jpg&rv.7.length_seconds=384 [...] &video_id=OHVvVmUNBFc [...] &t=OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp [...] elseif string.match( line, "swfHTML" ) and string.match( line, "video_id" ) then _,_,t = string.find( line, "&t=(.-)&" ) -- Also available in HTML5 pages: videoPlayer.setAvailableFormat("http://v6.lscache4.c.youtube.com/videoplayback?ip=82.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&algorithm=throttle-factor&itag=45&ipbits=8&burst=40&sver=3&expire=1275688800&key=yt1&signature=6ED860441298D1157FF3013A5D72727F25831F09.4C196BEA9F8F9B83CE678D79AD918B83D5E98B46&factor=1.25&id=7117715cf57d18d4", "video/webm; codecs="vp8.0, vorbis"", "hd720"); elseif string.match( line, "videoPlayer%.setAvailableFormat" ) then url,itag = string.match( line, "videoPlayer%.setAvailableFormat%(\"(.-itag=(%d+).-)\",.+%)" ) if url then -- For now, WebM formats are listed only in the HTML5 -- section, that is also only when HTML5 is enabled. -- Format 45 is 720p, and 43 is lower resolution. if tonumber( itag ) == 45 or ( tonumber( itag ) == 43 and not webm_path ) then webm_path = url end -- Grab something if fmt_url_map failed if not path and ( not fmt or tonumber( itag ) == tonumber( fmt ) ) then path = url end end end end if not video_id then video_id = get_url_param( vlc.path, "v" ) end arturl = get_arturl( vlc.path, video_id ) if not fmt then -- Prefer WebM formats if this is an &html5=True URL html5 = get_url_param( vlc.path, "html5" ) if html5 == "True" and webm_path then path = webm_path end end if not path then if not base_yt_url then base_yt_url = "http://youtube.com/" end if fmt then format = "&fmt=" .. fmt else format = "" end if t then path = base_yt_url .. "get_video?video_id="..video_id.."&t="..t..format else -- This shouldn't happen ... but keep it as a backup. path = "http://www.youtube.com/v/"..video_id end end return { { path = path; name = name; description = description; artist = artist; arturl = arturl; options = options } } else -- This is the flash player's URL if string.match( vlc.path, "title=" ) then name = vlc.strings.decode_uri(get_url_param( vlc.path, "title" )) end video_id = get_url_param( vlc.path, "video_id" ) arturl = get_arturl( vlc.path, video_id ) fmt = get_url_param( vlc.path, "fmt" ) if fmt then format = "&fmt=" .. fmt else format = "" end if not string.match( vlc.path, "t=" ) then -- This sucks, we're missing "t" which is now mandatory. Let's -- try using another url return { { path = "http://www.youtube.com/v/"..video_id; name = name; arturl = arturl; options=options } } end 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; options=options } } end end
HD maxes out many CPUs if you don't turn hardware acceleration on, or if your GPU is not compatible with VLC.
I use Windows XP. Since VLC does not support GPU acceleration on it, it will always max out my CPU playing HD - or more likely never play it at all. (viewtopic.php?f=14&t=79834&start=0#p263392, viewtopic.php?f=14&t=85061#p281714)

MPC-HC plays the same file, on the same system, with the same hardware, side by side, and it takes up less CPU. There are some HD files that will not play in VLC, but will play in MPC-HC.

MPC is doing something that VLC can not do. Maybe it has GPU acceleration in Windows XP, or if they do not, they can still play HD video with less CPU.

Rémi Denis-Courmont
Developer
Developer
Posts: 15324
Joined: 07 Jun 2004 16:01
VLC version: master
Operating System: Linux
Contact:

Re: Allow user to choose fmt= string in Youtube.lua

Postby Rémi Denis-Courmont » 28 Mar 2011 10:16

As far as I know, DxVA2 is not available on XP, so obviously VLC can't do it.
Rémi Denis-Courmont
https://www.remlab.net/
Private messages soliciting support will be systematically discarded


Return to “General VLC media player Troubleshooting”

Who is online

Users browsing this forum: No registered users and 54 guests