media/1tvru.lua: Rewrite ident function
[libquvi-scripts.git] / share / media / liveleak.lua
blob7eed92777c37bacc73e8ad474217ec3546381a7c
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
50 local j = LiveLeak.sanitize_json(d)
52 qargs.thumb_url = j['image'] or ''
54 qargs.streams = LiveLeak.iter_streams(j)
56 return qargs
57 end
60 -- Utility functions
63 function LiveLeak.can_parse_url(qargs)
64 local U = require 'socket.url'
65 local t = U.parse(qargs.input_url)
66 if t and t.scheme and t.scheme:lower():match('^http$')
67 and t.host and t.host:lower():match('liveleak%.com$')
68 and t.path and t.path:lower():match('^/view')
69 and t.query and t.query:lower():match('i=[_%w]+')
70 then
71 return true
72 else
73 return false
74 end
75 end
77 function LiveLeak.stream_new(S, url)
78 local v_enc, v_h, c = url:match('%.(%w+)_(%d+)p%.(%w+)%?')
79 local s = S.stream_new(url)
80 s.video.height = tonumber(v_h or 0)
81 s.video.encoding = v_enc
82 s.container = c
83 return LiveLeak.to_id(s)
84 end
86 function LiveLeak.iter_streams(j)
87 local S = require 'quvi/stream'
88 local U = require 'socket.url'
90 local t = U.parse(j['config'])
91 local r = {}
93 for f_url in t.query:gmatch('file_url=(.-)&') do
94 local u = U.unescape(f_url)
95 table.insert(r, LiveLeak.stream_new(S, u))
96 end
98 if #r ==0 then
99 error('no match: media stream URL')
100 else
101 if #r >1 then -- Pick one stream as the 'best' quality.
102 LiveLeak.ch_best(S, r)
106 return r
109 function LiveLeak.ch_best(S, t)
110 local r = t[1] -- Make the first one the 'best' by default.
111 r.flags.best = true
112 for _,v in pairs(t) do
113 if v.video.height > r.video.height then
114 r = S.swap_best(r, v)
119 function LiveLeak.sanitize_json(d)
120 d = d:gsub('\r\n',''):gsub('%s','') -- Strip CRLFs and wspace
121 d = d:gsub('%+?%w+%(.-%)?,', ',') -- Remove function calls
122 d = d:gsub('%w+:,','') -- Remove empty value names
123 local J = require 'json'
124 return J.decode(d)
127 function LiveLeak.to_id(s)
128 if s.container then
129 local r = {s.container, s.video.encoding, s.video.height .. 'p'}
130 s.id = table.concat(r, '_')
132 return s
135 -- vim: set ts=2 sw=2 tw=72 expandtab: