[vlc-devel] commit: A simplistic parser for the new and improved anevia playlist format . (JP Dinger )

git version control git at videolan.org
Fri Jun 12 15:48:00 CEST 2009


vlc | branch: master | JP Dinger <jpd at videolan.org> | Fri Jun 12 15:41:52 2009 +0200| [9f3d2575b9438da25b867c2e8c5c984e8d318b50] | committer: JP Dinger 

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).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9f3d2575b9438da25b867c2e8c5c984e8d318b50
---

 share/lua/playlist/anevia_xml.lua |   86 +++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/share/lua/playlist/anevia_xml.lua b/share/lua/playlist/anevia_xml.lua
new file mode 100644
index 0000000..a6eb8e0
--- /dev/null
+++ b/share/lua/playlist/anevia_xml.lua
@@ -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 at 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




More information about the vlc-devel mailing list