-
Notifications
You must be signed in to change notification settings - Fork 2
/
vimeo.lua
82 lines (69 loc) · 3.03 KB
/
vimeo.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
--[[
$Id$
Copyright © 2009-2013 the VideoLAN team
--]]
-- Probe function.
function probe()
local path = vlc.path
path = path:gsub("^www%.", "")
return ( vlc.access == "http" or vlc.access == "https" )
and ( string.match( path, "^vimeo%.com/%d+$" )
or string.match( path, "^vimeo%.com/channels/(.-)/%d+$" )
or string.match( path, "^player%.vimeo%.com/" ) )
-- do not match other addresses,
-- else we'll also try to decode the actual video url
end
-- Parse function.
function parse()
if not string.match( vlc.path, "player%.vimeo%.com" ) then -- Web page URL
while true do
local line = vlc.readline()
if not line then break end
-- Get the appropriate ubiquitous meta tag
-- <meta name="twitter:player" content="https://player.vimeo.com/video/123456789">
local meta = string.match( line, "(<meta[^>]- name=\"twitter:player\"[^>]->)" )
if meta then
local path = string.match( meta, " content=\"(.-)\"" )
if path then
path = vlc.strings.resolve_xml_special_chars( path )
return { { path = path } }
end
end
end
vlc.msg.err( "Couldn't extract vimeo video URL, please check for updates to this script" )
return { }
else -- API URL
local prefres = vlc.var.inherit(nil, "preferred-resolution")
local bestres = nil
local line = vlc.readline() -- data is on one line only
for stream in string.gmatch( line, "{([^}]*\"profile\":[^}]*)}" ) do
local url = string.match( stream, "\"url\":\"(.-)\"" )
if url then
-- Apparently the different formats available are listed
-- in uncertain order of quality, so compare with what
-- we have so far.
local height = string.match( stream, "\"height\":(%d+)" )
height = tonumber( height )
-- Better than nothing
if not path or ( height and ( not bestres
-- Better quality within limits
or ( ( prefres < 0 or height <= prefres ) and height > bestres )
-- Lower quality more suited to limits
or ( prefres > -1 and bestres > prefres and height < bestres )
) ) then
path = url
bestres = height
end
end
end
if not path then
vlc.msg.err( "Couldn't extract vimeo video URL, please check for updates to this script" )
return { }
end
local name = string.match( line, "\"title\":\"(.-)\"" )
local artist = string.match( line, "\"owner\":{[^}]-\"name\":\"(.-)\"" )
local arturl = string.match( line, "\"thumbs\":{\"[^\"]+\":\"(.-)\"" )
local duration = string.match( line, "\"duration\":(%d+)[,}]" )
return { { path = path; name = name; artist = artist; arturl = arturl; duration = duration } }
end
end