mirror of
https://code.videolan.org/videolan/vlc
synced 2024-10-11 06:21:30 +02:00
A simplistic parser for the new and improved anevia playlist format.
Instead of depending on a full xml parser --unavailable in our lua-- we just assume one bit of information to occupy one line (jpsaman). In case there are no newlines, fake them (jpd).
This commit is contained in:
parent
fca44948a7
commit
9f3d2575b9
86
share/lua/playlist/anevia_xml.lua
Normal file
86
share/lua/playlist/anevia_xml.lua
Normal file
@ -0,0 +1,86 @@
|
||||
--[[
|
||||
Parse list of available streams on Anevia servers.
|
||||
The URI http://ipaddress/ws/Mgmt/* describes a list of
|
||||
available streams on the server.
|
||||
|
||||
Copyright © 2009 M2X BV
|
||||
|
||||
Authors: Jean-Paul Saman <jpsaman@videolan.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
||||
--]]
|
||||
|
||||
-- Probe function.
|
||||
function probe()
|
||||
return vlc.access == "http"
|
||||
and string.match( vlc.path, "/ws/Mgmt/" )
|
||||
end
|
||||
|
||||
-- Fake readline. Read <>(..*)</> whole, otherwise pretend a newline.
|
||||
-- In lua, indices are from 1, not 0, so no +1 needed.
|
||||
function readline()
|
||||
local n = string.find(vlc.peek(998),"><") -- A random large number
|
||||
return n and vlc.read(n) or vlc.readline()
|
||||
end
|
||||
|
||||
-- Parse function.
|
||||
function parse()
|
||||
local p = {}
|
||||
local line
|
||||
_,_,server = string.find( vlc.path, "(.*)/ws/Mgmt/" )
|
||||
while true do
|
||||
line = readline()
|
||||
if not line then break end
|
||||
if string.match( line, "<struct name=\"stream\">" ) then
|
||||
while true do
|
||||
line = readline()
|
||||
if not line then break end
|
||||
if string.match( line, "<field name=\"name\">" ) then
|
||||
_,_,name = string.find( line, "name=\"name\">(.*)</field>" )
|
||||
end
|
||||
if string.match( line, "<choice name=\"destination\">" ) then
|
||||
while true do
|
||||
line = readline()
|
||||
if not line then break end
|
||||
if string.match( line, "<struct name=\"(.*)\">" ) then
|
||||
_,_,protocol = string.find( line, "<struct name=\"(.*)\">" )
|
||||
while true do
|
||||
line = readline()
|
||||
if not line then break end
|
||||
if string.match( line, "<field name=\"address\">(.*)</field>" ) then
|
||||
_,_,address = string.find( line, "<field name=\"address\">(.*)</field>" )
|
||||
end
|
||||
if string.match( line, "<field name=\"port\">(.*)</field>" ) then
|
||||
_,_,port = string.find( line, "<field name=\"port\">(.*)</field>" )
|
||||
end
|
||||
-- end of struct tag
|
||||
if string.match( line, "</struct>" ) then
|
||||
media = tostring(protocol) .. "://@" .. tostring(address) .. ":" .. tostring(port)
|
||||
table.insert( p, { path = media; name = name, url = media } )
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if not line then break end
|
||||
-- end of choice tag
|
||||
if string.match( line, "</choice>" ) then break end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
return p
|
||||
end
|
Loading…
Reference in New Issue
Block a user