-- libquvi-scripts v0.9.20131130 -- Copyright (C) 2011,2013 Toni Gundogdu -- -- This file is part of libquvi-scripts . -- -- This program is free software: you can redistribute it and/or -- modify it under the terms of the GNU Affero General Public -- License as published by the Free Software Foundation, either -- version 3 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 Affero General Public License for more details. -- -- You should have received a copy of the GNU Affero General -- Public License along with this program. If not, see -- . -- local Guardian = {} -- Utility functions unique to this script -- Identify the media script. function ident(qargs) return { can_parse_url = Guardian.can_parse_url(qargs), domains = table.concat({'theguardian.com', 'guardian.co.uk'}, ',') } end -- Parse the media properties. function parse(qargs) local p = Guardian.fetch(qargs) qargs.duration_ms = Guardian.parse_duration(p) qargs.title = (p:match('"og:title" content="(.-)"') or '') qargs.title = qargs.title:gsub('%s+%-%s+video','') qargs.title = qargs.title:gsub('%s+%–%s+video','') -- FIXME this should be more generic qargs.title = qargs.title:gsub(''', "'") qargs.id = (p:match('prop8%s+=%s+["\'](.-)["\']') or '') :match('(%d+)') or '' qargs.thumb_url = p:match('"og:image" content="(.-)"') or p:match('"thumbnail" content="(.-)"') or '' qargs.streams = Guardian.iter_streams(p) return qargs end -- -- Utility functions -- function Guardian.can_parse_url(qargs) local U = require 'socket.url' local t = U.parse(qargs.input_url) if t and t.scheme and t.scheme:lower():match('^https?$') and t.host and (t.host:lower():match('theguardian%.com$') or t.host:lower():match('guardian%.co%.uk$')) and t.path and (t.path:lower():match('/video/') or t.path:lower():match('/audio/')) then return true else return false end end function Guardian.fetch(qargs) local p = quvi.http.fetch(qargs.input_url).data local e = p:match('
.-

(.-)

.-
') or '' if #e >0 then error(e) end return p end function Guardian.iter_streams(p) local u = p:match('&file=(.-)&poster') or error('no match: media stream URL') local S = require 'quvi/stream' local s = S.stream_new(u) s.video.height = tonumber(p:match('itemprop="height" content="(%d+)"') or 0) s.video.width = tonumber(p:match('itemprop="width" content="(%d+)"') or 0) return {s} end function Guardian.parse_duration(p) local n = tonumber(p:match('duration%:%s+"?(%d+)"?') or 0) * 1000 if n == 0 then local m,s = p:match('T(%d+)M(%d+)S') n = ((tonumber(m) or 0) *60 + (tonumber(s) or 0)) * 1000 end if n == 0 then local s = p:match('content="PT(%d+)S"') n = (tonumber(s) or 0) * 1000 end return n end -- vim: set ts=2 sw=2 tw=72 expandtab: