FIX: media/funnyordie.lua: Stream URL pattern
[libquvi-scripts.git] / share / media / funnyordie.lua
blobbe2d783c1fb7e6131e90a784eef64eb2afa9c00c
1 -- libquvi-scripts
2 -- Copyright (C) 2011,2013 Toni Gundogdu <legatvs@gmail.com>
3 -- Copyright (C) 2010 quvi project
4 --
5 -- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
6 --
7 -- This program is free software: you can redistribute it and/or
8 -- modify it under the terms of the GNU Affero General Public
9 -- License as published by the Free Software Foundation, either
10 -- version 3 of the License, or (at your option) any later version.
12 -- This program is distributed in the hope that it will be useful,
13 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
14 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 -- GNU Affero General Public License for more details.
17 -- You should have received a copy of the GNU Affero General
18 -- Public License along with this program. If not, see
19 -- <http://www.gnu.org/licenses/>.
22 local FunnyOrDie = {} -- Utility functions unique to this script
24 -- Identify the media script.
25 function ident(qargs)
26 return {
27 can_parse_url = FunnyOrDie.can_parse_url(qargs),
28 domains = table.concat({'funnyordie.com'}, ',')
30 end
32 -- Parse media properties.
33 function parse(qargs)
34 local p = quvi.http.fetch(qargs.input_url).data
36 qargs.thumb_url = p:match('"og:image" content="(.-)"') or ''
37 qargs.title = p:match('"og:title" content="(.-)">') or ''
38 qargs.id = p:match('key:%s+"(.-)"') or ''
40 qargs.streams = FunnyOrDie.iter_streams(p)
42 return qargs
43 end
46 -- Utility functions
49 function FunnyOrDie.can_parse_url(qargs)
50 local U = require 'socket.url'
51 local t = U.parse(qargs.input_url)
52 if t and t.scheme and t.scheme:lower():match('^http$')
53 and t.host and t.host:lower():match('funnyordie%.com$')
54 and t.path and t.path:lower():match('^/videos/%w+')
55 then
56 return true
57 else
58 return false
59 end
60 end
62 function FunnyOrDie.iter_streams(p)
63 local t = {}
64 for u in p:gmatch('type: "video/mp4", src: "(.-)"') do
65 table.insert(t, u)
66 end
67 if #t ==0 then error('no match: media stream URL') end
69 local S = require 'quvi/stream'
70 local r = {}
72 -- nostd is a dictionary used by this script only. libquvi ignores it.
73 for _,u in pairs(t) do
74 local q,c = u:match('/(%w+)%.(%w+)$')
75 local s = S.stream_new(u)
76 s.nostd = {quality=q}
77 s.container = c
78 s.id = FunnyOrDie.to_id(s)
79 table.insert(r,s)
80 end
82 if #r >1 then
83 FunnyOrDie.ch_best(r)
84 end
86 return r
87 end
89 function FunnyOrDie.ch_best(t)
90 t[1].flags.best = true
91 end
93 function FunnyOrDie.to_id(t)
94 return string.format("%s_%s", t.nostd.quality, t.container)
95 end
97 -- vim: set ts=2 sw=2 tw=72 expandtab: