It is easy and comfortable to view youTube video in VLC Media Player in some situations. But if you try to do so, it gives an error as shown below:
You can view YouTube video in VLC Media Player by using a small and easy trick as stated here. Follow the following steps one by one.
1) Select the following code in blue text and copy it.
function get_url_param( url, name ) local _, _, res = string.find( url, "[&?]"..name.."=([^&]*)" )
return res
end
function copy_url_param( url, name )
local value = get_url_param( url, name )
return ( value and "&"..name.."="..value or "" )
end
function get_arturl()
local iurl = get_url_param( vlc.path, "iurl" )
if iurl then
return iurl
end
local video_id = get_url_param( vlc.path, "v" )
if not video_id then
return nil
end
return vlc.access.."://img.youtube.com/vi/"..video_id.."/default.jpg"
end
function get_fmt( fmt_list )
local prefres = vlc.var.inherit(nil, "preferred-resolution")
if prefres < 0 then
return nil
end
local fmt = nil
for itag,height in string.gmatch( fmt_list, "(%d+)/%d+x(%d+)[^,]*" ) do
fmt = itag
if tonumber(height) <= prefres then
break
end
end
return fmt
end
function read_long_line()
local eol
local pos = 0
local len = 32768
repeat
len = len * 2
local line = vlc.peek( len )
if not line then return nil end
eol = string.find( line, "\n", pos + 1 )
pos = len
until eol or len >= 1024 * 1024
return vlc.read( eol or len )
end
function buf_iter( s )
s.i = s.i + 1
local line = s.lines[s.i]
if not line then
repeat
local l = s.stream:readline()
if not l then break end
line = line and line..l or l
until string.match( line, "};$" )
if line then
s.lines[s.i] = line
end
end
return line
end
function js_extract( js, pattern )
js.i = 0 -- Reset to beginning
for line in buf_iter, js do
local ex = string.match( line, pattern )
if ex then
return ex
end
end
return nil
end
function n_descramble( nparam, js )
if not js then
return nil
end
local callsite = js_extract( js, '[^;]*%.set%("n",[^};]*' )
if not callsite then
vlc.msg.dbg( "Couldn't extract YouTube video throttling parameter descrambling function name" )
return nil
end
local descrambler = string.match( callsite, '%.set%("n",.%),...?%.length||(...?)%(' )
local itm = nil
if not descrambler then
descrambler = string.match( callsite, '[=%(,&|]([a-zA-Z0-9_$%[%]]+)%(.%),.%.set%("n",' )
if descrambler then
itm = string.match( descrambler, '^([^%[%]]+)%[' )
if itm then
descrambler = nil
end
else
itm = string.match( callsite, '%.set%("n",.%),(...?)%.length' )
end
end
if not descrambler and itm then
descrambler = js_extract( js, 'var '..itm..'=%[(...?)[%],]' )
end
if not descrambler then
vlc.msg.dbg( "Couldn't extract YouTube video throttling parameter descrambling function name" )
return nil
end
local code = js_extract( js, "^"..descrambler.."=function%([^)]*%){(.-)};" )
if not code then
vlc.msg.dbg( "Couldn't extract YouTube video throttling parameter descrambling code" )
return nil
end
local datac, script = string.match( code, "c=%[(.*)%];.-;try{(.*)}catch%(" )
if ( not datac ) or ( not script ) then
vlc.msg.dbg( "Couldn't extract YouTube video throttling parameter descrambling rules" )
return nil
end
local n = {}
for c in string.gmatch( nparam, "." ) do
table.insert( n, c )
end
local table_len = function( tab )
local len = 0
for i, val in ipairs( tab ) do
len = len + 1
end
return len
end
local compound = function( ntab, str, alphabet )
if ntab ~= n or
type( str ) ~= "string" or
type( alphabet ) ~= "string" then
return true
end
local input = {}
for c in string.gmatch( str, "." ) do
table.insert( input, c )
end
local len = string.len( alphabet )
for i, c in ipairs( ntab ) do
if type( c ) ~= "string" then
return true
end
local pos1 = string.find( alphabet, c, 1, true )
local pos2 = string.find( alphabet, input[i], 1, true )
if ( not pos1 ) or ( not pos2 ) then
return true
end
local pos = ( pos1 - pos2 ) % len
local newc = string.sub( alphabet, pos + 1, pos + 1 )
ntab[i] = newc
table.insert( input, newc )
end
end
local trans = {
reverse = {
func = function( tab )
local len = table_len( tab )
local tmp = {}
for i, val in ipairs( tab ) do
tmp[len - i + 1] = val
end
for i, val in ipairs( tmp ) do
tab[i] = val
end
end,
match = {
"^function%(d%)",
}
},
append = {
func = function( tab, val )
table.insert( tab, val )
end,
match = {
"^function%(d,e%){d%.push%(e%)},",
}
},
remove = {
func = function( tab, i )
if type( i ) ~= "number" then
return true
end
i = i % table_len( tab )
table.remove( tab, i + 1 )
end,
match = {
"^[^}]-;d%.splice%(e,1%)},",
}
},
swap = {
func = function( tab, i )
if type( i ) ~= "number" then
return true
end
i = i % table_len( tab )
local tmp = tab[1]
tab[1] = tab[i + 1]
tab[i + 1] = tmp
end,
match = {
"^[^}]-;var f=d%[0%];d%[0%]=d%[e%];d%[e%]=f},",
"^[^}]-;d%.splice%(0,1,d%.splice%(e,1,d%[0%]%)%[0%]%)},",
}
},
rotate = {
func = function( tab, shift )
if type( shift ) ~= "number" then
return true
end
local len = table_len( tab )
shift = shift % len
local tmp = {}
for i, val in ipairs( tab ) do
tmp[( i - 1 + shift ) % len + 1] = val
end
for i, val in ipairs( tmp ) do
tab[i] = val
end
end,
match = {
"^[^}]-d%.unshift%(d.pop%(%)%)},",
"^[^}]-d%.unshift%(f%)}%)},",
}
},
alphabet1 = {
func = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_",
match = {
"^function%(%){[^}]-case 58:d=96;",
}
},
alphabet2 = {
func = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
match = {
"^function%(%){[^}]-case 58:d%-=14;",
"^function%(%){[^}]-case 58:d=44;",
}
},
compound = {
func = compound,
match = {
"^function%(d,e,f%)",
}
},
compound1 = {
func = function( ntab, str )
return compound( ntab, str, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_" )
end,
match = {
"^function%(d,e%){[^}]-case 58:f=96;",
}
},
compound2 = {
func = function( ntab, str )
return compound( ntab, str,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" )
end,
match = {
"^function%(d,e%){[^}]-case 58:f%-=14;",
"^function%(d,e%){[^}]-case 58:f=44;",
}
},
unid = {
func = function( )
vlc.msg.dbg( "Couldn't apply unidentified YouTube video throttling parameter transformation, aborting descrambling" )
return true
end,
match = {
}
},
}
local data = {}
datac = datac..","
while datac ~= "" do
local el = nil
if string.match( datac, "^function%(" ) then
for name, tr in pairs( trans ) do
for i, match in ipairs( tr.match ) do
if string.match( datac, match ) then
el = tr.func
break
end
end
if el then
break
end
end
if not el then
el = trans.unid.func
vlc.msg.warn( "Couldn't parse unidentified YouTube video throttling parameter transformation" )
end
if el == trans.compound.func or
el == trans.compound1.func or
el == trans.compound2.func then
datac = string.match( datac, '^.-},e%.split%(""%)%)},(.*)$' )
else
datac = string.match( datac, "^.-},(.*)$" )
end
elseif string.match( datac, '^"[^"]*",' ) then
el, datac = string.match( datac, '^"([^"]*)",(.*)$' )
elseif string.match( datac, '^%-?%d+,' ) or
string.match( datac, '^%-?%d+[eE]%-?%d+,' ) then
el, datac = string.match( datac, "^(.-),(.*)$" )
el = tonumber( el )
elseif string.match( datac, '^b,' ) then
el = n
datac = string.match( datac, "^b,(.*)$" )
elseif string.match( datac, '^null,' ) then
el = data
datac = string.match( datac, "^null,(.*)$" )
else
vlc.msg.warn( "Couldn't parse unidentified YouTube video throttling parameter descrambling data" )
el = false
datac = string.match( datac, "^[^,]-,(.*)$" )
end
table.insert( data, el )
end
local prd = function( el, tab )
if not el then
return "???"
elseif el == n then
return "n"
elseif el == data then
return "data"
elseif type( el ) == "string" then
return '"'..el..'"'
elseif type( el ) == "number" then
el = tostring( el )
if type( tab ) == "table" then
el = el.." -> "..( el % table_len( tab ) )
end
return el
else
for name, tr in pairs( trans ) do
if el == tr.func then
return name
end
end
return tostring( el )
end
end
for ifunc, itab, args in string.gmatch( script, "c%[(%d+)%]%(c%[(%d+)%]([^)]-)%)" ) do
local iarg1 = string.match( args, "^,c%[(%d+)%]" )
local iarg2 = string.match( args, "^,[^,]-,c%[(%d+)%]" )
local func = data[tonumber( ifunc ) + 1]
local tab = data[tonumber( itab ) + 1]
local arg1 = iarg1 and data[tonumber( iarg1 ) + 1]
local arg2 = iarg2 and data[tonumber( iarg2 ) + 1]
if type( func ) ~= "function" or type( tab ) ~= "table"
or func( tab, arg1, arg2 ) then
vlc.msg.dbg( "Invalid data type encountered during YouTube video throttling parameter descrambling transformation chain, aborting" )
vlc.msg.dbg( "Couldn't descramble YouTube throttling URL parameter: data transfer will get throttled" )
vlc.msg.err( "Couldn't process youtube video URL, please check for updates to this script" )
break
end
end
return table.concat( n )
end
function sig_descramble( sig, js )
if not js then
return nil
end
local descrambler = js_extract( js, "[=%(,&|](...?)%(decodeURIComponent%(.%.s%)%)" )
if not descrambler then
vlc.msg.dbg( "Couldn't extract youtube video URL signature descrambling function name" )
return nil
end
local rules = js_extract( js, "^"..descrambler.."=function%([^)]*%){(.-)};" )
if not rules then
vlc.msg.dbg( "Couldn't extract youtube video URL signature descrambling rules" )
return nil
end
local helper = string.match( rules, ";(..)%...%(" )
if not helper then
vlc.msg.dbg( "Couldn't extract youtube video URL signature transformation helper name" )
return nil
end
local transformations = js_extract( js, "[ ,]"..helper.."={(.-)};" )
if not transformations then
vlc.msg.dbg( "Couldn't extract youtube video URL signature transformation code" )
return nil
end
local trans = {}
for meth,code in string.gmatch( transformations, "(..):function%([^)]*%){([^}]*)}" ) do
if string.match( code, "%.reverse%(" ) then
trans[meth] = "reverse"
elseif string.match( code, "%.splice%(") then
trans[meth] = "slice"
elseif string.match( code, "var c=" ) then
trans[meth] = "swap"
else
vlc.msg.warn("Couldn't parse unknown youtube video URL signature transformation")
end
end
local missing = false
for meth,idx in string.gmatch( rules, "..%.(..)%([^,]+,(%d+)%)" ) do
idx = tonumber( idx )
if trans[meth] == "reverse" then
sig = string.reverse( sig )
elseif trans[meth] == "slice" then
sig = string.sub( sig, idx + 1 )
elseif trans[meth] == "swap" then
if idx > 1 then
sig = string.gsub( sig, "^(.)("..string.rep( ".", idx - 1 )..")(.)(.*)$", "%3%2%1%4" )
elseif idx == 1 then
sig = string.gsub( sig, "^(.)(.)", "%2%1" )
end
else
vlc.msg.dbg("Couldn't apply unknown youtube video URL signature transformation")
missing = true
end
end
if missing then
vlc.msg.err( "Couldn't process youtube video URL, please check for updates to this script" )
end
return sig
end
function stream_url( params, js )
local url = string.match( params, "url=([^&]+)" )
if not url then
return nil
end
url = vlc.strings.decode_uri( url )
local s = string.match( params, "s=([^&]+)" )
if s then
s = vlc.strings.decode_uri( s )
vlc.msg.dbg( "Found "..string.len( s ).."-character scrambled signature for youtube video URL, attempting to descramble... " )
local ds = sig_descramble( s, js )
if not ds then
vlc.msg.dbg( "Couldn't descramble YouTube video URL signature" )
vlc.msg.err( "Couldn't process youtube video URL, please check for updates to this script" )
ds = s
end
local sp = string.match( params, "sp=([^&]+)" )
if not sp then
vlc.msg.warn( "Couldn't extract signature parameters for youtube video URL, guessing" )
sp = "signature"
end
url = url.."&"..sp.."="..vlc.strings.encode_uri_component( ds )
end
return url
end
function pick_url( url_map, fmt, js_url )
for stream in string.gmatch( url_map, "[^,]+" ) do
local itag = string.match( stream, "itag=(%d+)" )
if not fmt or not itag or tonumber( itag ) == tonumber( fmt ) then
return stream_url( stream, js_url )
end
end
return nil
end
function pick_stream( stream_map, js_url )
local pick = nil
local fmt = tonumber( get_url_param( vlc.path, "fmt" ) )
if fmt then
for stream in string.gmatch( stream_map, '{(.-)}' ) do
local itag = tonumber( string.match( stream, '"itag":(%d+)' ) )
if fmt == itag then
pick = stream
break
end
end
else
local prefres = vlc.var.inherit( nil, "preferred-resolution" )
local bestres = nil
for stream in string.gmatch( stream_map, '{(.-)}' ) do
local height = tonumber( string.match( stream, '"height":(%d+)' ) )
if not pick or ( height and ( not bestres
or ( ( prefres < 0 or height <= prefres ) and height > bestres )
or ( prefres > -1 and bestres > prefres and height < bestres )
) ) then
bestres = height
pick = stream
end
end
end
if not pick then
return nil
end
local js = nil
if js_url then
js = { stream = vlc.stream( js_url ), lines = {}, i = 0 }
if not js.stream then
js.stream = vlc.stream( js_url )
if not js.stream then
js = nil
end
end
end
local url
local cipher = string.match( pick, '"signatureCipher":"(.-)"' )
or string.match( pick, '"[a-zA-Z]*[Cc]ipher":"(.-)"' )
if cipher then
url = stream_url( cipher, js )
end
if not url then
url = string.match( pick, '"url":"(.-)"' )
end
if not url then
return nil
end
local n = string.match( url, "[?&]n=([^&]+)" )
if n then
n = vlc.strings.decode_uri( n )
local dn = n_descramble( n, js )
if dn then
url = string.gsub( url, "([?&])n=[^&]+", "%1n="..vlc.strings.encode_uri_component( dn ), 1 )
else
vlc.msg.dbg( "Couldn't descramble YouTube throttling URL parameter: data transfer will get throttled" )
vlc.msg.err( "Couldn't process youtube video URL, please check for updates to this script" )
end
end
return url
end
function probe()
return ( ( vlc.access == "http" or vlc.access == "https" ) and (
((
string.match( vlc.path, "^www%.youtube%.com/" )
or string.match( vlc.path, "^music%.youtube%.com/" )
or string.match( vlc.path, "^gaming%.youtube%.com/" )
) and (
string.match( vlc.path, "/watch%?" )
or string.match( vlc.path, "/live$" )
or string.match( vlc.path, "/live%?" )
or string.match( vlc.path, "/get_video_info%?" )
or string.match( vlc.path, "/v/" )
or string.match( vlc.path, "/embed/" )
)) or
string.match( vlc.path, "^consent%.youtube%.com/" )
) )
end
function parse()
if string.match( vlc.path, "^consent%.youtube%.com/" ) then
local url = get_url_param( vlc.path, "continue" )
if not url then
vlc.msg.err( "Couldn't handle YouTube cookie consent redirection, please check for updates to this script or try disabling HTTP cookie forwarding" )
return { }
end
return { { path = vlc.strings.decode_uri( url ), options = { ":no-http-forward-cookies" } } }
elseif not string.match( vlc.path, "^www%.youtube%.com/" ) then
return { { path = vlc.access.."://"..string.gsub( vlc.path, "^([^/]*)/", "www.youtube.com/" ) } }
elseif string.match( vlc.path, "/watch%?" )
or string.match( vlc.path, "/live$" )
or string.match( vlc.path, "/live%?" )
then -- This is the HTML page's URL
local js_url
fmt = get_url_param( vlc.path, "fmt" )
while true do
local line = new_layout and read_long_line() or vlc.readline()
if not line then break end
if string.match( line, '^ *<div id="player%-api">' ) then
line = read_long_line()
if not line then break end
end
if not title then
local meta = string.match( line, '<meta property="og:title"( .-)>' )
if meta then
title = string.match( meta, ' content="(.-)"' )
if title then
title = vlc.strings.resolve_xml_special_chars( title )
end
end
end
if not description then
description = string.match( line, '\\"shortDescription\\":\\"(.-[^\\])\\"')
if description then
description = string.gsub( description, '\\(["\\/])', '%1' )
else
description = string.match( line, '"shortDescription":"(.-[^\\])"')
end
if description then
if string.match( description, '^"' ) then
description = ""
end
description = string.gsub( description, '\\(["\\/])', '%1' )
description = string.gsub( description, '\\n', '\n' )
description = string.gsub( description, '\\r', '\r' )
description = string.gsub( description, "\\u0026", "&" )
end
end
if not arturl then
local meta = string.match( line, '<meta property="og:image"( .-)>' )
if meta then
arturl = string.match( meta, ' content="(.-)"' )
if arturl then
arturl = vlc.strings.resolve_xml_special_chars( arturl )
end
end
end
if not artist then
artist = string.match(line, '\\"author\\":\\"(.-)\\"')
if artist then
artist = string.gsub( artist, '\\(["\\/])', '%1' )
else
artist = string.match( line, '"author":"(.-)"' )
end
if artist then
artist = string.gsub( artist, "\\u0026", "&" )
end
end
if not new_layout then
if string.match( line, '<script nonce="' ) then
vlc.msg.dbg( "Detected new YouTube HTML code layout" )
new_layout = true
end
end
if not js_url then
js_url = string.match( line, '"jsUrl":"(.-)"' )
or string.match( line, "\"js\": *\"(.-)\"" )
if js_url then
js_url = string.gsub( js_url, "\\/", "/" )
if string.match( js_url, "^/[^/]" ) then
local authority = string.match( vlc.path, "^([^/]*)/" )
js_url = "//"..authority..js_url
end
js_url = string.gsub( js_url, "^//", vlc.access.."://" )
end
end
if string.match( line, "ytplayer%.config" ) then
if not fmt then
fmt_list = string.match( line, "\"fmt_list\": *\"(.-)\"" )
if fmt_list then
fmt_list = string.gsub( fmt_list, "\\/", "/" )
fmt = get_fmt( fmt_list )
end
end
url_map = string.match( line, "\"url_encoded_fmt_stream_map\": *\"(.-)\"" )
if url_map then
vlc.msg.dbg( "Found classic parameters for youtube video stream, parsing..." )
url_map = string.gsub( url_map, "\\u0026", "&" )
path = pick_url( url_map, fmt, js_url )
end
if not path then
local stream_map = string.match( line, '\\"formats\\":%[(.-)%]' )
if stream_map then
stream_map = string.gsub( stream_map, '\\(["\\/])', '%1' )
else
stream_map = string.match( line, '"formats":%[(.-)%]' )
end
if stream_map then
vlc.msg.dbg( "Found new-style parameters for youtube video stream, parsing..." )
stream_map = string.gsub( stream_map, "\\u0026", "&" )
path = pick_stream( stream_map, js_url )
end
end
if not path then
local hlsvp = string.match( line, '\\"hlsManifestUrl\\": *\\"(.-)\\"' )
or string.match( line, '"hlsManifestUrl":"(.-)"' )
if hlsvp then
hlsvp = string.gsub( hlsvp, "\\/", "/" )
path = hlsvp
end
end
end
end
if not path then
vlc.msg.err( "Couldn't extract youtube video URL, please check for updates to this script" )
return { }
end
if not arturl then
arturl = get_arturl()
end
return { { path = path; name = title; description = description; artist = artist; arturl = arturl } }
elseif string.match( vlc.path, "/get_video_info%?" ) then
local line = vlc.read( 1024*1024 )
if not line then
vlc.msg.err( "YouTube API output missing" )
return { }
end
local js_url = get_url_param( vlc.path, "jsurl" )
if js_url then
js_url= vlc.strings.decode_uri( js_url )
end
local fmt = get_url_param( vlc.path, "fmt" )
if not fmt then
local fmt_list = string.match( line, "&fmt_list=([^&]*)" )
if fmt_list then
fmt_list = vlc.strings.decode_uri( fmt_list )
fmt = get_fmt( fmt_list )
end
end
local url_map = string.match( line, "&url_encoded_fmt_stream_map=([^&]*)" )
if url_map then
vlc.msg.dbg( "Found classic parameters for youtube video stream, parsing..." )
url_map = vlc.strings.decode_uri( url_map )
path = pick_url( url_map, fmt, js_url )
end
if not path then
local stream_map = string.match( line, '%%22formats%%22%%3A%%5B(.-)%%5D' )
if stream_map then
vlc.msg.dbg( "Found new-style parameters for youtube video stream, parsing..." )
stream_map = vlc.strings.decode_uri( stream_map )
stream_map = string.gsub( stream_map, "\\u0026", "&" )
path = pick_stream( stream_map, js_url )
end
end
if not path then
local hlsvp = string.match( line, "%%22hlsManifestUrl%%22%%3A%%22(.-)%%22" )
if hlsvp then
hlsvp = vlc.strings.decode_uri( hlsvp )
path = hlsvp
end
end
if not path and get_url_param( vlc.path, "el" ) ~= "detailpage" then
local video_id = get_url_param( vlc.path, "video_id" )
if video_id then
path = vlc.access.."://www.youtube.com/get_video_info?video_id="..video_id.."&el=detailpage"..copy_url_param( vlc.path, "fmt" )..copy_url_param( vlc.path, "jsurl" )
vlc.msg.warn( "Couldn't extract video URL, retrying with alternate YouTube API parameters" )
end
end
if not path then
vlc.msg.err( "Couldn't extract youtube video URL, please check for updates to this script" )
return { }
end
local title = string.match( line, "%%22title%%22%%3A%%22(.-)%%22" )
if title then
title = string.gsub( title, "+", " " )
title = vlc.strings.decode_uri( title )
title = string.gsub( title, "\\u0026", "&" )
end
local description = string.match( line, "%%22shortDescription%%22%%3A%%22(.-)%%22" )
if description then
description = string.gsub( description, "+", " " )
description = vlc.strings.decode_uri( description )
description = string.gsub( description, '\\(["\\/])', '%1' )
description = string.gsub( description, '\\n', '\n' )
description = string.gsub( description, '\\r', '\r' )
description = string.gsub( description, "\\u0026", "&" )
end
local artist = string.match( line, "%%22author%%22%%3A%%22(.-)%%22" )
if artist then
artist = string.gsub( artist, "+", " " )
artist = vlc.strings.decode_uri( artist )
artist = string.gsub( artist, "\\u0026", "&" )
end
local arturl = string.match( line, "%%22playerMicroformatRenderer%%22%%3A%%7B%%22thumbnail%%22%%3A%%7B%%22thumbnails%%22%%3A%%5B%%7B%%22url%%22%%3A%%22(.-)%%22" )
if arturl then
arturl = vlc.strings.decode_uri( arturl )
end
return { { path = path, name = title, description = description, artist = artist, arturl = arturl } }
else
local video_id = string.match( vlc.path, "/[^/]+/([^?]*)" )
if not video_id then
vlc.msg.err( "Couldn't extract youtube video URL" )
return { }
end
return { { path = vlc.access.."://www.youtube.com/watch?v="..video_id..copy_url_param( vlc.path, "fmt" ) } }
end
end
2) Open notepad and paste it.
4) Select location to save. Select all in file types and and type youtube.lua in file name. Click save button.
5) Go to saved location and copy the file currently saved and named 'youtube.lua'. Open Local Disk(C:).
6) Open the folder named as 'Program files'.
7) Open the folder named as 'VideoLAN'.
8) Open the folder named as 'VLC'. Possibally it is single folder here.
12) If your laptop or computer is not showing file extension, I mean there is a file named youtube but not youtube.luac or youtube.lua. In this situation click on View on the menubar and check before 'File name extension'. The window will start to show file name extension.
13) Paste the file you copied by clicking 'ctrl+v' on your keyboard. The window may ask for permission. Give permission to paste file. Close the window.