media/liveleak.lua: Add support for >1 streams
[libquvi-scripts.git] / share / media / liveleak.lua
blob3c0abfc3b5d36aebc487e3c2720922de7dad7599
1 -- libquvi-scripts
2 -- Copyright (C) 2010-2013 Toni Gundogdu <legatvs@gmail.com>
3 --
4 -- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
5 --
6 -- This program is free software: you can redistribute it and/or
7 -- modify it under the terms of the GNU Affero General Public
8 -- License as published by the Free Software Foundation, either
9 -- version 3 of the License, or (at your option) any later version.
11 -- This program is distributed in the hope that it will be useful,
12 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
13 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 -- GNU Affero General Public License for more details.
16 -- You should have received a copy of the GNU Affero General
17 -- Public License along with this program. If not, see
18 -- <http://www.gnu.org/licenses/>.
21 local LiveLeak = {} -- Utility functions specific to this script
23 -- Identify the media script.
24 function ident(qargs)
25 return {
26 can_parse_url = LiveLeak.can_parse_url(qargs),
27 domains = table.concat({'liveleak.com'}, ',')
29 end
31 -- Parse media properties.
32 function parse(qargs)
33 local p = quvi.http.fetch(qargs.input_url).data
35 qargs.title = p:match("<title>LiveLeak.com%s+%-%s+(.-)</") or ''
37 qargs.id = qargs.input_url:match('view%?i=([%w_]+)') or ''
39 local d = p:match("setup%((.-)%)%.")
41 if not d then -- Try the first iframe
42 qargs.goto_url = p:match('<iframe.-src="(.-)"') or ''
43 if #qargs.goto_url >0 then
44 return qargs
45 else
46 error('no match: setup')
47 end
48 end
49 -- Cleanup the JSON, otherwise 'json' module will croak.
50 d = d:gsub('code:.-%),','')
52 local J = require 'json'
53 local j = J.decode(d)
55 qargs.thumb_url = j['image'] or ''
57 qargs.streams = LiveLeak.iter_streams(j)
59 return qargs
60 end
63 -- Utility functions
66 function LiveLeak.can_parse_url(qargs)
67 local U = require 'socket.url'
68 local t = U.parse(qargs.input_url)
69 if t and t.scheme and t.scheme:lower():match('^http$')
70 and t.host and t.host:lower():match('liveleak%.com$')
71 and t.path and t.path:lower():match('^/view')
72 and t.query and t.query:lower():match('i=[_%w]+')
73 then
74 return true
75 else
76 return false
77 end
78 end
80 function LiveLeak.stream_new(S, t)
81 local v_enc, v_h, c = t['file']:match('%.(%w+)_(%d+)p%.(%w+)%?')
82 local s = S.stream_new(t['file'] or error('no match: media stream URL'))
83 s.video.height = tonumber(v_h or 0)
84 s.video.encoding = v_enc or ''
85 s.container = c or ''
86 LiveLeak.to_id(s,t)
87 return s
88 end
90 function LiveLeak.iter_streams(j)
91 local S = require 'quvi/stream'
92 if j['sources'] then -- >1 streams
93 local r = {}
94 for _,v in pairs(j['sources']) do
95 table.insert(r, LiveLeak.stream_new(S,v))
96 end
97 if #r >1 then -- Pick one stream as the 'best' quality.
98 LiveLeak.ch_best(S, r)
99 end
100 return r
101 else
102 local u = j['file'] or error('no match: media stream URL')
103 return {S.stream_new(u)}
107 function LiveLeak.ch_best(S, t)
108 local r = t[1] -- Make the first one the 'best' by default.
109 r.flags.best = true
110 for _,v in pairs(t) do
111 if v.video.height > r.video.height then
112 r = S.swap_best(r, v)
117 function LiveLeak.to_id(s,t)
118 if s.container then
119 local q = t['label']:match('(%w%w)$'):lower()
120 local r = {q, s.container, s.video.encoding, s.video.height .. 'p'}
121 s.id = table.concat(r, '_')
122 else -- Fallback to 'label'.
123 s.id = t['label']:gsub('%W',''):lower()
127 -- vim: set ts=2 sw=2 tw=72 expandtab: