2 -- Copyright (C) 2013 Thomas Weißschuh
4 -- This file is part of libquvi-scripts <http://quvi.sourceforge.net/>.
6 -- This library is free software; you can redistribute it and/or
7 -- modify it under the terms of the GNU Lesser General Public
8 -- License as published by the Free Software Foundation; either
9 -- version 2.1 of the License, or (at your option) any later version.
11 -- This library 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 GNU
14 -- Lesser General Public License for more details.
16 -- You should have received a copy of the GNU Lesser General Public
17 -- License along with this library; if not, write to the Free Software
18 -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 local C
= require
'quvi/const'
25 local U
= require
'quvi/util'
26 local B
= require
'quvi/bit'
28 r
.domain
= 'www%.ardmediathek%.de'
29 r
.formats
= 'default|best'
30 r
.categories
= B
.bit_or(C
.proto_http
, C
.proto_rtmp
)
31 r
.handles
= U
.handles(self
.page_url
, {r
.domain
},
32 nil, {"documentId=%d+$"})
36 function query_formats(self
)
37 local config
= Ard
.get_config(self
)
38 local formats
= Ard
.iter_formats(config
)
41 for _
,v
in pairs(formats
) do
42 table.insert(t
, Ard
.to_s(v
))
46 self
.formats
= table.concat(t
, "|")
53 local config
= Ard
.get_config(self
)
54 local Util
= require
'quvi/util'
56 Ard
.test_availability(config
)
59 self
.title
= config
:match(
60 '<meta property="og:title" content="([^"]*)'
62 '%s*%- %w-$', '' -- remove name of station
64 '%s*%(FSK.*', '' -- remove FSK nonsense
66 or error('no match: media title')
67 self
.thumbnail_url
= config
:match(
68 '<meta property="og:image" content="([^"]*)'
71 local formats
= Ard
.iter_formats(config
)
72 local format = Util
.choose_format(self
,
77 or error('unable to choose format')
79 if not format.url
then error('no match: media url') end
80 self
.url
= { format.url
}
85 function Ard
.test_availability(page
)
86 -- some films are only scrapable at certain times
88 'Der Clip ist deshalb nur von (%d%d?) bis (%d%d?) Uhr verfügbar'
90 fsk
.from
, fsk
.to
= page
:match(fsk_pattern
)
91 if fsk
.from
and fsk
.to
then
92 error('film only available from ' ..fsk
.from
.. ':00 to '
93 ..fsk
.to
.. ':00 CET (UTC+2)')
97 function Ard
.get_config(self
)
98 local c
= quvi
.fetch(self
.page_url
)
99 self
.id
= self
.page_url
:match('documentId=(%d*)')
100 or error('no match: media id')
101 if c
:match('<title>ARD Mediathek %- Fehlerseite</title>') then
102 error('invalid URL, maybe the media is no longer available')
108 function Ard
.choose_best(t
)
109 return t
[#t
] -- return the last from the array
112 function Ard
.choose_default(t
)
113 return t
[1] -- return the first from the array
120 s
= s
.. '_' .. t
.encoding
124 s
= s
.. '_' .. t
.height
126 s
= s
.. '_' .. t
.webx
128 s
= s
.. '_' .. t
.quality
134 function Ard
.iter_formats(page
)
136 local s
= 'mediaCollection%.addMediaStream'
137 .. '%(0, (%d), "(.-)", "(.-)", "%w+"%);'
139 for quality
, prefix
, suffix
in page
:gmatch(s
) do
140 local u
= prefix
.. suffix
141 -- remove querystring
142 u
= u
:match('^(.-)?') or u
144 -- .webs. or Web-S or .s.
145 local webx
= suffix
:match('%.web(%w)%.') or suffix
:match('%.(%w)%.')
146 or suffix
:match('[=%.]Web%-(%w)')
147 if webx
then webx
= 'web' .. webx
:lower() end
149 local height
= suffix
:match('_%d+x(%d+)[_%.]')
150 if height
then height
= 'p' .. height
end
154 container
= suffix
:match('^(...):') or suffix
:match('%.(...)$')
155 or suffix
:match('%.(...)$') or 'mp4',
156 quality
= tonumber(quality
),
157 encoding
= suffix
:match('%.(h264)%.'),
165 error('no media urls found')
171 -- vim: set ts=4 sw=4 sts=4 tw=72 expandtab: